recoll-1.23.7/0000755000175000017500000000000013224670235010071 500000000000000recoll-1.23.7/install-sh0000755000175000017500000003546313224670150012024 00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2014-09-12.12; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) # $RANDOM is not portable (e.g. dash); use it when possible to # lower collision chance tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 # As "mkdir -p" follows symlinks and we work in /tmp possibly; so # create the $tmpdir first (and fail if unsuccessful) to make sure # that nobody tries to guess the $tmpdir name. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.23.7/index/0000755000175000017500000000000013224670235011200 500000000000000recoll-1.23.7/index/fsfetcher.cpp0000644000175000017500000000375713125637102013605 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "safesysstat.h" #include "log.h" #include "cstr.h" #include "fetcher.h" #include "fsfetcher.h" #include "fsindexer.h" #include "pathut.h" using std::string; static bool urltopath(RclConfig* cnf, const Rcl::Doc& idoc, string& fn, struct stat& st) { // The url has to be like file:// fn = fileurltolocalpath(idoc.url); if (fn.empty()) { LOGERR("FSDocFetcher::fetch/sig: non fs url: [" << (idoc.url) << "]\n" ); return false; } cnf->setKeyDir(path_getfather(fn)); bool follow = false; cnf->getConfParam("followLinks", &follow); if (path_fileprops(fn, &st, follow) < 0) { LOGERR("FSDocFetcher::fetch: stat errno " << (errno) << " for [" << (fn) << "]\n" ); return false; } return true; } bool FSDocFetcher::fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out) { string fn; if (!urltopath(cnf, idoc, fn, out.st)) return false; out.kind = RawDoc::RDK_FILENAME; out.data = fn; return true; } bool FSDocFetcher::makesig(RclConfig* cnf, const Rcl::Doc& idoc, string& sig) { string fn; struct stat st; if (!urltopath(cnf, idoc, fn, st)) return false; FsIndexer::makesig(&st, sig); return true; } recoll-1.23.7/index/mimetype.h0000644000175000017500000000264213125637102013122 00000000000000/* 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 _MIMETYPE_H_INCLUDED_ #define _MIMETYPE_H_INCLUDED_ #include "safesysstat.h" #include class RclConfig; /** * Try to determine a mime type for file. * * If stp is not null, this may imply more than matching the suffix, * the name must be usable to actually access file data. * @param filename file/path name to use * @param stp if not null use st_mode bits for directories etc. * @param cfg recoll config * @param usfc Use system's 'file' command as last resort (or not) */ std::string mimetype(const std::string &filename, const struct stat *stp, RclConfig *cfg, bool usfc); #endif /* _MIMETYPE_H_INCLUDED_ */ recoll-1.23.7/index/recollindex.cpp0000644000175000017500000006223313224431017014133 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #ifndef _WIN32 #include #include #else #include #endif #include "safesysstat.h" #include "safefcntl.h" #include "safeunistd.h" #include #include #include #include using namespace std; #include "log.h" #include "rclinit.h" #include "indexer.h" #include "smallut.h" #include "chrono.h" #include "pathut.h" #include "rclutil.h" #include "rclmon.h" #include "x11mon.h" #include "cancelcheck.h" #include "rcldb.h" #ifndef DISABLE_WEB_INDEXER #include "beaglequeue.h" #endif #include "recollindex.h" #include "fsindexer.h" #ifndef _WIN32 #include "rclionice.h" #endif #include "execmd.h" #include "checkretryfailed.h" // Command line options static int op_flags; #define OPT_MOINS 0x1 #define OPT_C 0x1 #define OPT_D 0x2 #define OPT_E 0x4 #define OPT_K 0x8 #define OPT_P 0x10 #define OPT_R 0x20 #define OPT_S 0x40 #define OPT_Z 0x80 #define OPT_b 0x100 #define OPT_c 0x200 #define OPT_e 0x400 #define OPT_f 0x800 #define OPT_h 0x1000 #define OPT_i 0x2000 #define OPT_k 0x4000 #define OPT_l 0x8000 #define OPT_m 0x10000 #define OPT_n 0x20000 #define OPT_p 0x40000 #define OPT_r 0x80000 #define OPT_s 0x100000 #define OPT_w 0x200000 #define OPT_x 0x400000 #define OPT_z 0x800000 ReExec *o_reexec; // Globals for atexit cleanup static ConfIndexer *confindexer; // This is set as an atexit routine, static void cleanup() { deleteZ(confindexer); recoll_exitready(); } // Global stop request flag. This is checked in a number of place in the // indexing routines. int stopindexing; // Receive status updates from the ongoing indexing operation // Also check for an interrupt request and return the info to caller which // should subsequently orderly terminate what it is doing. class MyUpdater : public DbIxStatusUpdater { public: MyUpdater(const RclConfig *config) : m_file(config->getIdxStatusFile().c_str()), m_prevphase(DbIxStatus::DBIXS_NONE) { // The total number of files included in the index is actually // difficult to compute from the index itself. For display // purposes, we save it in the status file from indexing to // indexing (mostly...) string stf; if (m_file.get("totfiles", stf)) { status.totfiles = atoi(stf.c_str()); } } virtual bool update() { // Update the status file. Avoid doing it too often. Always do // it at the end (status DONE) if (status.phase == DbIxStatus::DBIXS_DONE || status.phase != m_prevphase || m_chron.millis() > 300) { if (status.totfiles < status.filesdone || status.phase == DbIxStatus::DBIXS_DONE) { status.totfiles = status.filesdone; } m_prevphase = status.phase; m_chron.restart(); m_file.holdWrites(true); m_file.set("phase", int(status.phase)); m_file.set("docsdone", status.docsdone); m_file.set("filesdone", status.filesdone); m_file.set("fileerrors", status.fileerrors); m_file.set("dbtotdocs", status.dbtotdocs); m_file.set("totfiles", status.totfiles); m_file.set("fn", status.fn); m_file.holdWrites(false); } if (stopindexing) { return false; } #ifndef DISABLE_X11MON // If we are in the monitor, we also need to check X11 status // during the initial indexing pass (else the user could log // out and the indexing would go on, not good (ie: if the user // logs in again, the new recollindex will fail). if ((op_flags & OPT_m) && !(op_flags & OPT_x) && !x11IsAlive()) { LOGDEB("X11 session went away during initial indexing pass\n"); stopindexing = true; return false; } #endif return true; } private: ConfSimple m_file; Chrono m_chron; DbIxStatus::Phase m_prevphase; }; static MyUpdater *updater; static void sigcleanup(int sig) { cerr << "Recollindex: got signal " << sig << ", registering stop request\n"; LOGDEB("Got signal " << sig << ", registering stop request\n"); CancelCheck::instance().setCancel(); stopindexing = 1; } static void makeIndexerOrExit(RclConfig *config, bool inPlaceReset) { if (!confindexer) { confindexer = new ConfIndexer(config, updater); if (inPlaceReset) confindexer->setInPlaceReset(); } if (!confindexer) { cerr << "Cannot create indexer" << endl; exit(1); } } void rclIxIonice(const RclConfig *config) { #ifndef _WIN32 string clss, classdata; if (!config->getConfParam("monioniceclass", clss) || clss.empty()) clss = "3"; config->getConfParam("monioniceclassdata", classdata); rclionice(clss, classdata); #endif } class MakeListWalkerCB : public FsTreeWalkerCB { public: MakeListWalkerCB(list& files, const vector& selpats) : m_files(files), m_pats(selpats) { } virtual FsTreeWalker::Status processone(const string& fn, const struct stat *, FsTreeWalker::CbFlag flg) { if (flg== FsTreeWalker::FtwDirEnter || flg == FsTreeWalker::FtwRegular){ if (m_pats.empty()) { cerr << "Selecting " << fn << endl; m_files.push_back(fn); } else { for (vector::const_iterator it = m_pats.begin(); it != m_pats.end(); it++) { if (fnmatch(it->c_str(), fn.c_str(), 0) == 0) { m_files.push_back(fn); break; } } } } return FsTreeWalker::FtwOk; } list& m_files; const vector& m_pats; }; // Build a list of things to index, then call purgefiles and/or // indexfiles. This is basically the same as find xxx | recollindex // -i [-e] without the find (so, simpler but less powerfull) bool recursive_index(RclConfig *config, const string& top, const vector& selpats) { list files; MakeListWalkerCB cb(files, selpats); FsTreeWalker walker; walker.walk(top, cb); bool ret = false; if (op_flags & OPT_e) { if (!(ret = purgefiles(config, files))) { return ret; } } if (!(op_flags & OPT_e) || ((op_flags & OPT_e) &&(op_flags & OPT_i))) { ret = indexfiles(config, files); } return ret; } // Index a list of files. We just call the top indexer method, which // will sort out what belongs to the indexed trees and call the // appropriate indexers. // // This is called either from the command line or from the monitor. In // this case we're called repeatedly in the same process, and the // confindexer is only created once by makeIndexerOrExit (but the db closed and // flushed every time) bool indexfiles(RclConfig *config, list &filenames) { if (filenames.empty()) return true; makeIndexerOrExit(config, (op_flags & OPT_Z) != 0); // The default is to retry failed files int indexerFlags = ConfIndexer::IxFNone; if (op_flags & OPT_K) indexerFlags |= ConfIndexer::IxFNoRetryFailed; if (op_flags & OPT_f) indexerFlags |= ConfIndexer::IxFIgnoreSkip; if (op_flags & OPT_P) { indexerFlags |= ConfIndexer::IxFDoPurge; } return confindexer->indexFiles(filenames, indexerFlags); } // Delete a list of files. Same comments about call contexts as indexfiles. bool purgefiles(RclConfig *config, list &filenames) { if (filenames.empty()) return true; makeIndexerOrExit(config, (op_flags & OPT_Z) != 0); return confindexer->purgeFiles(filenames, ConfIndexer::IxFNone); } // Create stemming and spelling databases bool createAuxDbs(RclConfig *config) { makeIndexerOrExit(config, false); if (!confindexer->createStemmingDatabases()) return false; if (!confindexer->createAspellDict()) return false; return true; } // Create additional stem database static bool createstemdb(RclConfig *config, const string &lang) { makeIndexerOrExit(config, false); return confindexer->createStemDb(lang); } // Check that topdir entries are valid (successfull tilde exp + abs // path) or fail. // In addition, topdirs, skippedPaths, daemSkippedPaths entries should // match existing files or directories. Warn if they don't static bool checktopdirs(RclConfig *config, vector& nonexist) { vector tdl; if (!config->getConfParam("topdirs", &tdl)) { cerr << "No 'topdirs' parameter in configuration\n"; LOGERR("recollindex:No 'topdirs' parameter in configuration\n");; return false; } for (vector::iterator it = tdl.begin(); it != tdl.end(); it++) { *it = path_tildexpand(*it); if (!it->size() || !path_isabsolute(*it)) { if ((*it)[0] == '~') { cerr << "Tilde expansion failed: " << *it << endl; LOGERR("recollindex: tilde expansion failed: " << *it << "\n"); } else { cerr << "Not an absolute path: " << *it << endl; LOGERR("recollindex: not an absolute path: " << *it << "\n"); } return false; } if (!path_exists(*it)) { nonexist.push_back(*it); } } // We'd like to check skippedPaths too, but these are wildcard // exprs, so reasonably can't return true; } bool runWebFilesMoverScript(RclConfig *config) { static string downloadsdir; if (downloadsdir.empty()) { if (!config->getConfParam("webdownloadsdir", downloadsdir)) { downloadsdir = path_tildexpand("~/Downloads"); } } static string cmdpath; if (cmdpath.empty()) { cmdpath = config->findFilter("recoll-we-move-files.py"); if (cmdpath.empty()) { LOGERR("runWFMoverScript: recoll-we-move-files.py not found\n"); return false; } } /* Arrange to not actually run the script if the directory did not change */ static time_t dirmtime; time_t ndirmtime = 0; struct stat st; if (::stat(downloadsdir.c_str(), &st) == 0) { ndirmtime = st.st_mtime; } /* If stat fails, presumably Downloads does not exist or is not accessible, dirmtime and mdirmtime stay at 0, and we never execute the script, which is the right thing. */ if (dirmtime != ndirmtime) { /* The script is going to change the directory, so updating dirmtime before it runs means that we are going to execute it one time too many (it will run without doing anything), but we can't set the mtime to after the run in case files are created during the run. */ dirmtime = ndirmtime; ExecCmd cmd; int status = cmd.doexec(cmdpath, {}); return status == 0; } return true; } static const char *thisprog; static const char usage [] = "\n" "recollindex [-h] \n" " Print help\n" "recollindex [-z|-Z] [-k]\n" " Index everything according to configuration file\n" " -z : reset database before starting indexing\n" " -Z : in place reset: consider all documents as changed. Can also\n" " be combined with -i or -r but not -m\n" " -k : retry files on which we previously failed\n" #ifdef RCL_MONITOR "recollindex -m [-w ] -x [-D] [-C]\n" " Perform real time indexing. Don't become a daemon if -D is set.\n" " -w sets number of seconds to wait before starting.\n" " -C disables monitoring config for changes/reexecuting.\n" " -n disables initial incremental indexing (!and purge!).\n" #ifndef DISABLE_X11MON " -x disables exit on end of x11 session\n" #endif /* DISABLE_X11MON */ #endif /* RCL_MONITOR */ "recollindex -e []\n" " Purge data for individual files. No stem database updates.\n" " Reads paths on stdin if none is given as argument.\n" "recollindex -i [-f] [-Z] []\n" " Index individual files. No database purge or stem database updates\n" " Will read paths on stdin if none is given as argument\n" " -f : ignore skippedPaths and skippedNames while doing this\n" "recollindex -r [-K] [-f] [-Z] [-p pattern] \n" " Recursive partial reindex. \n" " -p : filter file names, multiple instances are allowed, e.g.: \n" " -p *.odt -p *.pdf\n" " -K : skip previously failed files (they are retried by default)\n" "recollindex -l\n" " List available stemming languages\n" "recollindex -s \n" " Build stem database for additional language \n" "recollindex -E\n" " Check configuration file for topdirs and other paths existence\n" #ifdef FUTURE_IMPROVEMENT "recollindex -W\n" " Process the Web queue\n" #endif #ifdef RCL_USE_ASPELL "recollindex -S\n" " Build aspell spelling dictionary.>\n" #endif "Common options:\n" " -c : specify config directory, overriding $RECOLL_CONFDIR\n" ; static void Usage(FILE *where = stderr) { FILE *fp = (op_flags & OPT_h) ? stdout : stderr; fprintf(fp, "%s: Usage: %s", thisprog, usage); fprintf(fp, "Recoll version: %s\n", Rcl::version_string().c_str()); exit((op_flags & OPT_h)==0); } static RclConfig *config; void lockorexit(Pidfile *pidfile) { pid_t pid; if ((pid = pidfile->open()) != 0) { cerr << "Can't become exclusive indexer: " << pidfile->getreason() << ". Return (other pid?): " << pid << endl; exit(1); } if (pidfile->write_pid() != 0) { cerr << "Can't become exclusive indexer: " << pidfile->getreason() << endl; exit(1); } } static string reasonsfile; extern ConfSimple idxreasons; static void flushIdxReasons() { if (reasonsfile.empty()) return; if (reasonsfile == "stdout") { idxreasons.write(cout); } else if (reasonsfile == "stderr") { idxreasons.write(std::cerr); } else { ofstream out; try { out.open(reasonsfile, ofstream::out|ofstream::trunc); idxreasons.write(out); } catch (...) { cerr << "Could not write reasons file " << reasonsfile << endl; idxreasons.write(cerr); } } } int main(int argc, char **argv) { string a_config; int sleepsecs = 60; vector selpatterns; // The reexec struct is used by the daemon to shed memory after // the initial indexing pass and to restart when the configuration // changes #ifndef _WIN32 o_reexec = new ReExec; o_reexec->init(argc, argv); #endif thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) Usage(); while (**argv) switch (*(*argv)++) { case 'b': op_flags |= OPT_b; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); a_config = *(++argv); argc--; goto b1; #ifdef RCL_MONITOR case 'C': op_flags |= OPT_C; break; case 'D': op_flags |= OPT_D; break; #endif case 'E': op_flags |= OPT_E; break; case 'e': op_flags |= OPT_e; break; case 'f': op_flags |= OPT_f; break; case 'h': op_flags |= OPT_h; break; case 'i': op_flags |= OPT_i; break; case 'k': op_flags |= OPT_k; break; case 'K': op_flags |= OPT_K; break; case 'l': op_flags |= OPT_l; break; case 'm': op_flags |= OPT_m; break; case 'n': op_flags |= OPT_n; break; case 'P': op_flags |= OPT_P; break; case 'p': op_flags |= OPT_p; if (argc < 2) Usage(); selpatterns.push_back(*(++argv)); argc--; goto b1; case 'r': op_flags |= OPT_r; break; case 'R': op_flags |= OPT_R; if (argc < 2) Usage(); reasonsfile = *(++argv); argc--; goto b1; case 's': op_flags |= OPT_s; break; #ifdef RCL_USE_ASPELL case 'S': op_flags |= OPT_S; break; #endif case 'w': op_flags |= OPT_w; if (argc < 2) Usage(); if ((sscanf(*(++argv), "%d", &sleepsecs)) != 1) Usage(); argc--; goto b1; case 'x': op_flags |= OPT_x; break; case 'Z': op_flags |= OPT_Z; break; case 'z': op_flags |= OPT_z; break; default: Usage(); break; } b1: argc--; argv++; } if (op_flags & OPT_h) Usage(stdout); #ifndef RCL_MONITOR if (op_flags & (OPT_m | OPT_w|OPT_x)) { cerr << "Sorry, -m not available: real-time monitoring was not " "configured in this build\n"; exit(1); } #endif if ((op_flags & OPT_z) && (op_flags & (OPT_i|OPT_e|OPT_r))) Usage(); if ((op_flags & OPT_Z) && (op_flags & (OPT_m))) Usage(); if ((op_flags & OPT_E) && (op_flags & ~(OPT_E|OPT_c))) { Usage(); } string reason; RclInitFlags flags = (op_flags & OPT_m) && !(op_flags&OPT_D) ? RCLINIT_DAEMON : RCLINIT_IDX; config = recollinit(flags, cleanup, sigcleanup, reason, &a_config); if (config == 0 || !config->ok()) { addIdxReason("init", reason); flushIdxReasons(); cerr << "Configuration problem: " << reason << endl; exit(1); } #ifndef _WIN32 o_reexec->atexit(cleanup); #endif vector nonexist; if (!checktopdirs(config, nonexist)) { addIdxReason("init", "topdirs not set"); flushIdxReasons(); exit(1); } if (nonexist.size()) { ostream& out = (op_flags & OPT_E) ? cout : cerr; if (!(op_flags & OPT_E)) { cerr << "Warning: invalid paths in topdirs, skippedPaths or " "daemSkippedPaths:\n"; } for (vector::const_iterator it = nonexist.begin(); it != nonexist.end(); it++) { out << *it << endl; } } if ((op_flags & OPT_E)) { exit(0); } string rundir; config->getConfParam("idxrundir", rundir); if (!rundir.compare("tmp")) { LOGINFO("recollindex: changing current directory to [" << tmplocation() << "]\n"); if (chdir(tmplocation().c_str()) < 0) { LOGERR("chdir(" << tmplocation() << ") failed, errno " << errno << "\n"); } } else if (!rundir.empty()) { LOGINFO("recollindex: changing current directory to [" << rundir << "]\n"); if (chdir(rundir.c_str()) < 0) { LOGERR("chdir(" << rundir << ") failed, errno " << errno << "\n"); } } bool rezero((op_flags & OPT_z) != 0); bool inPlaceReset((op_flags & OPT_Z) != 0); // We do not retry previously failed files by default. If -k is // set, we do. If the checker script says so, we do too. int indexerFlags = ConfIndexer::IxFNoRetryFailed; if (op_flags & OPT_k) { indexerFlags &= ~ConfIndexer::IxFNoRetryFailed; } else { if (checkRetryFailed(config, false)) { indexerFlags &= ~ConfIndexer::IxFNoRetryFailed; } } Pidfile pidfile(config->getPidfile()); updater = new MyUpdater(config); // Log something at LOGINFO to reset the trace file. Else at level // 3 it's not even truncated if all docs are up to date. LOGINFO("recollindex: starting up\n"); #ifndef _WIN32 if (setpriority(PRIO_PROCESS, 0, 20) != 0) { LOGINFO("recollindex: can't setpriority(), errno " << errno << "\n"); } // Try to ionice. This does not work on all platforms rclIxIonice(config); #endif if (op_flags & OPT_r) { if (argc != 1) Usage(); string top = *argv++; argc--; bool status = recursive_index(config, top, selpatterns); if (confindexer && !confindexer->getReason().empty()) { addIdxReason("indexer", confindexer->getReason()); cerr << confindexer->getReason() << endl; } flushIdxReasons(); exit(status ? 0 : 1); } else if (op_flags & (OPT_i|OPT_e)) { lockorexit(&pidfile); list filenames; if (argc == 0) { // Read from stdin char line[1024]; while (fgets(line, 1023, stdin)) { string sl(line); trimstring(sl, "\n\r"); filenames.push_back(sl); } } else { while (argc--) { filenames.push_back(*argv++); } } // Note that -e and -i may be both set. In this case we first erase, // then index. This is a slightly different from -Z -i because we // warranty that all subdocs are purged. bool status = true; if (op_flags & OPT_e) { status = purgefiles(config, filenames); } if (status && (op_flags & OPT_i)) { status = indexfiles(config, filenames); } if (confindexer && !confindexer->getReason().empty()) { addIdxReason("indexer", confindexer->getReason()); cerr << confindexer->getReason() << endl; } flushIdxReasons(); exit(status ? 0 : 1); } else if (op_flags & OPT_l) { if (argc != 0) Usage(); vector stemmers = ConfIndexer::getStemmerNames(); for (vector::const_iterator it = stemmers.begin(); it != stemmers.end(); it++) { cout << *it << endl; } exit(0); } else if (op_flags & OPT_s) { if (argc != 1) Usage(); string lang = *argv++; argc--; exit(!createstemdb(config, lang)); #ifdef RCL_USE_ASPELL } else if (op_flags & OPT_S) { makeIndexerOrExit(config, false); exit(!confindexer->createAspellDict()); #endif // ASPELL #ifdef RCL_MONITOR } else if (op_flags & OPT_m) { if (argc != 0) Usage(); lockorexit(&pidfile); if (!(op_flags&OPT_D)) { LOGDEB("recollindex: daemonizing\n"); #ifndef _WIN32 if (daemon(0,0) != 0) { addIdxReason("monitor", "daemon() failed"); cerr << "daemon() failed, errno " << errno << endl; LOGERR("daemon() failed, errno " << errno << "\n"); flushIdxReasons(); exit(1); } #endif } // Need to rewrite pid, it changed pidfile.write_pid(); #ifndef _WIN32 // Not too sure if I have to redo the nice thing after daemon(), // can't hurt anyway (easier than testing on all platforms...) if (setpriority(PRIO_PROCESS, 0, 20) != 0) { LOGINFO("recollindex: can't setpriority(), errno " << errno<< "\n"); } // Try to ionice. This does not work on all platforms rclIxIonice(config); #endif if (sleepsecs > 0) { LOGDEB("recollindex: sleeping " << sleepsecs << "\n"); for (int i = 0; i < sleepsecs; i++) { sleep(1); // Check that x11 did not go away while we were sleeping. if (!(op_flags & OPT_x) && !x11IsAlive()) { LOGDEB("X11 session went away during initial sleep period\n"); exit(0); } } } if (!(op_flags & OPT_n)) { makeIndexerOrExit(config, inPlaceReset); LOGDEB("Recollindex: initial indexing pass before monitoring\n"); if (!confindexer->index(rezero, ConfIndexer::IxTAll, indexerFlags) || stopindexing) { LOGERR("recollindex, initial indexing pass failed, " "not going into monitor mode\n"); flushIdxReasons(); exit(1); } else { // Record success of indexing pass with failed files retries. if (!(indexerFlags & ConfIndexer::IxFNoRetryFailed)) { checkRetryFailed(config, true); } } deleteZ(confindexer); #ifndef _WIN32 o_reexec->insertArgs(vector(1, "-n")); LOGINFO("recollindex: reexecuting with -n after initial full " "pass\n"); // Note that -n will be inside the reexec when we come // back, but the monitor will explicitely strip it before // starting a config change exec to ensure that we do a // purging pass in this case. o_reexec->reexec(); #endif } if (updater) { updater->status.phase = DbIxStatus::DBIXS_MONITOR; updater->status.fn.clear(); updater->update(); } int opts = RCLMON_NONE; if (op_flags & OPT_D) opts |= RCLMON_NOFORK; if (op_flags & OPT_C) opts |= RCLMON_NOCONFCHECK; if (op_flags & OPT_x) opts |= RCLMON_NOX11; bool monret = startMonitor(config, opts); MONDEB(("Monitor returned %d, exiting\n", monret)); exit(monret == false); #endif // MONITOR } else if (op_flags & OPT_b) { cerr << "Not yet" << endl; return 1; } else { lockorexit(&pidfile); makeIndexerOrExit(config, inPlaceReset); bool status = confindexer->index(rezero, ConfIndexer::IxTAll, indexerFlags); // Record success of indexing pass with failed files retries. if (status && !(indexerFlags & ConfIndexer::IxFNoRetryFailed)) { checkRetryFailed(config, true); } if (!status) cerr << "Indexing failed" << endl; if (!confindexer->getReason().empty()) { addIdxReason("indexer", confindexer->getReason()); cerr << confindexer->getReason() << endl; } if (updater) { updater->status.phase = DbIxStatus::DBIXS_DONE; updater->status.fn.clear(); updater->update(); } flushIdxReasons(); return !status; } } recoll-1.23.7/index/bglfetcher.h0000644000175000017500000000226013125637102013372 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BGLFETCHER_H_INCLUDED_ #define _BGLFETCHER_H_INCLUDED_ #include "fetcher.h" /** * The Beagle cache fetcher: */ class BGLDocFetcher : public DocFetcher{ virtual bool fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out); virtual bool makesig(RclConfig* cnf, const Rcl::Doc& idoc, std::string& sig); virtual ~BGLDocFetcher() {} }; #endif /* _BGLFETCHER_H_INCLUDED_ */ recoll-1.23.7/index/bglfetcher.cpp0000644000175000017500000000414413125637102013730 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "rcldoc.h" #include "fetcher.h" #include "bglfetcher.h" #include "log.h" #include "beaglequeuecache.h" // We use a single beagle cache object to access beagle data. We protect it // against multiple thread access. static std::mutex o_beagler_mutex; bool BGLDocFetcher::fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out) { string udi; if (!idoc.getmeta(Rcl::Doc::keyudi, &udi) || udi.empty()) { LOGERR("BGLDocFetcher:: no udi in idoc\n" ); return false; } Rcl::Doc dotdoc; { std::unique_lock locker(o_beagler_mutex); // Retrieve from our webcache (beagle data). The beagler // object is created at the first call of this routine and // deleted when the program exits. static BeagleQueueCache o_beagler(cnf); if (!o_beagler.getFromCache(udi, dotdoc, out.data)) { LOGINFO("BGLDocFetcher::fetch: failed for [" << (udi) << "]\n" ); return false; } } if (dotdoc.mimetype.compare(idoc.mimetype)) { LOGINFO("BGLDocFetcher:: udi [" << (udi) << "], mimetp mismatch: in: [" << (idoc.mimetype) << "], bgl [" << (dotdoc.mimetype) << "]\n" ); } out.kind = RawDoc::RDK_DATA; return true; } bool BGLDocFetcher::makesig(RclConfig* cnf, const Rcl::Doc& idoc, string& sig) { // Bgl sigs are empty sig.clear(); return true; } recoll-1.23.7/index/exefetcher.h0000644000175000017500000000417413224431017013412 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EXEFETCHER_H_INCLUDED_ #define _EXEFETCHER_H_INCLUDED_ #include "fetcher.h" class RclConfig; /** * A fetcher which works by executing external programs, defined in a * configuration file. * At this point this is only used with the sample python mbox indexer, * to show how recoll can work with completely external data extraction code. * * Configuration: The external indexer sets the 'rclbes' recoll field * (backend definition, can be FS or BGL -web- in standard recoll) to * a unique value (e.g. MBOX for the python sample). A 'backends' file * in the configuration directory then links the 'rclbes' value with * commands to execute for fetching the data, which recoll uses at * query time for previewing and opening the document. */ class EXEDocFetcher : public DocFetcher { class Internal; EXEDocFetcher(const Internal&); virtual ~EXEDocFetcher() {} virtual bool fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out); /** Calls stat to retrieve file signature data */ virtual bool makesig(RclConfig* cnf, const Rcl::Doc& idoc,std::string& sig); friend EXEDocFetcher *exeDocFetcherMake(RclConfig *, const std::string&); private: Internal *m; }; // Lookup bckid in the config and create an appropriate fetcher. EXEDocFetcher *exeDocFetcherMake(RclConfig *config, const std::string& bckid); #endif /* _EXEFETCHER_H_INCLUDED_ */ recoll-1.23.7/index/beaglequeue.cpp0000644000175000017500000003720013125637102014106 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "safesysstat.h" #include "safeunistd.h" #include "cstr.h" #include "pathut.h" #include "rclutil.h" #include "log.h" #include "fstreewalk.h" #include "beaglequeue.h" #include "beaglequeuecache.h" #include "circache.h" #include "smallut.h" #include "fileudi.h" #include "internfile.h" #include "wipedir.h" #include "indexer.h" #include "readfile.h" #include "conftree.h" #include "transcode.h" #include "cancelcheck.h" #include #include using namespace std; // Beagle creates a file named .xxx (where xxx is the name for the main file // in the queue), to hold external metadata (http or created by Beagle). // This class reads the .xxx, dotfile, and turns it into an Rcl::Doc holder class BeagleDotFile { public: BeagleDotFile(RclConfig *conf, const string& fn) : m_conf(conf), m_fn(fn) {} // Read input line, strip it of eol and return as c++ string bool readLine(string& line) { static const int LL = 2048; char cline[LL]; cline[0] = 0; m_input.getline(cline, LL-1); if (!m_input.good()) { if (m_input.bad()) { LOGERR("beagleDotFileRead: input.bad()\n" ); } return false; } int ll = strlen(cline); while (ll > 0 && (cline[ll-1] == '\n' || cline[ll-1] == '\r')) { cline[ll-1] = 0; ll--; } line.assign(cline, ll); LOGDEB2("BeagleDotFile:readLine: [" << (line) << "]\n" ); return true; } // Process a beagle dot file and set interesting stuff in the doc bool toDoc(Rcl::Doc& doc) { string line; m_input.open(m_fn.c_str(), ios::in); if (!m_input.good()) { LOGERR("BeagleDotFile: open failed for [" << (m_fn) << "]\n" ); return false; } // Read the 3 first lines: // - url // - hit type: we only know about Bookmark and WebHistory for now // - content-type. if (!readLine(line)) return false; doc.url = line; if (!readLine(line)) return false; doc.meta[Rcl::Doc::keybght] = line; if (!readLine(line)) return false; doc.mimetype = line; // We set the bookmarks mtype as html (the text is empty // anyway), so that the html viewer will be called on 'Open' bool isbookmark = false; if (!stringlowercmp("bookmark", doc.meta[Rcl::Doc::keybght])) { isbookmark = true; doc.mimetype = "text/html"; } string confstr; string ss(" "); // Read the rest: fields and keywords. We do a little // massaging of the input lines, then use a ConfSimple to // parse, and finally insert the key/value pairs into the doc // meta[] array for (;;) { if (!readLine(line)) { // Eof hopefully break; } if (line.find("t:") != 0) continue; line = line.substr(2); confstr += line + "\n"; } ConfSimple fields(confstr, 1); vector names = fields.getNames(cstr_null); for (vector::iterator it = names.begin(); it != names.end(); it++) { string value; fields.get(*it, value, cstr_null); if (!value.compare("undefined") || !value.compare("null")) continue; string *valuep = &value; string cvalue; if (isbookmark) { // It appears that bookmarks are stored in the users' // locale charset (not too sure). No idea what to do // for other types, would have to check the plugin. string charset = m_conf->getDefCharset(true); transcode(value, cvalue, charset, "UTF-8"); valuep = &cvalue; } string caname = m_conf->fieldCanon(*it); doc.meta[caname].append(ss + *valuep); } // Finally build the confsimple that we will save to the // cache, from the doc fields. This could also be done in // parallel with the doc.meta build above, but simpler this // way. We need it because not all interesting doc fields are // in the meta array (ie: mimetype, url), and we want // something homogenous and easy to save. for (map::const_iterator it = doc.meta.begin(); it != doc.meta.end(); it++) { m_fields.set((*it).first, (*it).second, cstr_null); } m_fields.set(cstr_url, doc.url, cstr_null); m_fields.set(cstr_bgc_mimetype, doc.mimetype, cstr_null); return true; } RclConfig *m_conf; ConfSimple m_fields; string m_fn; ifstream m_input; }; // Initialize. Compute paths and create a temporary directory that will be // used by internfile() BeagleQueueIndexer::BeagleQueueIndexer(RclConfig *cnf, Rcl::Db *db, DbIxStatusUpdater *updfunc) : m_config(cnf), m_db(db), m_cache(0), m_updater(updfunc), m_nocacheindex(false) { m_queuedir = m_config->getWebQueueDir(); path_catslash(m_queuedir); m_cache = new BeagleQueueCache(cnf); } BeagleQueueIndexer::~BeagleQueueIndexer() { LOGDEB("BeagleQueueIndexer::~\n" ); deleteZ(m_cache); } // Index document stored in the cache. bool BeagleQueueIndexer::indexFromCache(const string& udi) { if (!m_db) return false; CancelCheck::instance().checkCancel(); Rcl::Doc dotdoc; string data; string hittype; if (!m_cache || !m_cache->getFromCache(udi, dotdoc, data, &hittype)) { LOGERR("BeagleQueueIndexer::indexFromCache: cache failed\n" ); return false; } if (hittype.empty()) { LOGERR("BeagleIndexer::index: cc entry has no hit type\n" ); return false; } if (!stringlowercmp("bookmark", hittype)) { // Just index the dotdoc dotdoc.meta[Rcl::Doc::keybcknd] = "BGL"; return m_db->addOrUpdate(udi, cstr_null, dotdoc); } else { Rcl::Doc doc; FileInterner interner(data, m_config, FileInterner::FIF_doUseInputMimetype, dotdoc.mimetype); FileInterner::Status fis; try { fis = interner.internfile(doc); } catch (CancelExcept) { LOGERR("BeagleQueueIndexer: interrupted\n" ); return false; } if (fis != FileInterner::FIDone) { LOGERR("BeagleQueueIndexer: bad status from internfile\n" ); return false; } doc.mimetype = dotdoc.mimetype; doc.fmtime = dotdoc.fmtime; doc.url = dotdoc.url; doc.pcbytes = dotdoc.pcbytes; doc.sig.clear(); doc.meta[Rcl::Doc::keybcknd] = "BGL"; return m_db->addOrUpdate(udi, cstr_null, doc); } } void BeagleQueueIndexer::updstatus(const string& udi) { if (m_updater) { ++(m_updater->status.docsdone); if (m_updater->status.dbtotdocs < m_updater->status.docsdone) m_updater->status.dbtotdocs = m_updater->status.docsdone; m_updater->status.fn = udi; m_updater->update(); } } bool BeagleQueueIndexer::index() { if (!m_db) return false; LOGDEB("BeagleQueueIndexer::processqueue: [" << (m_queuedir) << "]\n" ); m_config->setKeyDir(m_queuedir); if (!path_makepath(m_queuedir, 0700)) { LOGERR("BeagleQueueIndexer:: can't create queuedir [" << (m_queuedir) << "] errno " << (errno) << "\n" ); return false; } if (!m_cache || !m_cache->cc()) { LOGERR("BeagleQueueIndexer: cache initialization failed\n" ); return false; } CirCache *cc = m_cache->cc(); // First check/index files found in the cache. If the index was reset, // this actually does work, else it sets the existence flags (avoid // purging). We don't do this when called from indexFiles if (!m_nocacheindex) { bool eof; if (!cc->rewind(eof)) { // rewind can return eof if the cache is empty if (!eof) return false; } int nentries = 0; do { string udi; if (!cc->getCurrentUdi(udi)) { LOGERR("BeagleQueueIndexer:: cache file damaged\n" ); break; } if (udi.empty()) continue; if (m_db->needUpdate(udi, cstr_null)) { try { // indexFromCache does a CirCache::get(). We could // arrange to use a getCurrent() instead, would be more // efficient indexFromCache(udi); updstatus(udi); } catch (CancelExcept) { LOGERR("BeagleQueueIndexer: interrupted\n" ); return false; } } nentries++; } while (cc->next(eof)); } // Finally index the queue FsTreeWalker walker(FsTreeWalker::FtwNoRecurse); walker.addSkippedName(".*"); FsTreeWalker::Status status = walker.walk(m_queuedir, *this); LOGDEB("BeagleQueueIndexer::processqueue: done: status " << (status) << "\n" ); return true; } // Index a list of files (sent by the real time monitor) bool BeagleQueueIndexer::indexFiles(list& files) { LOGDEB("BeagleQueueIndexer::indexFiles\n" ); if (!m_db) { LOGERR("BeagleQueueIndexer::indexfiles no db??\n" ); return false; } for (list::iterator it = files.begin(); it != files.end();) { if (it->empty()) {//?? it++; continue; } string father = path_getfather(*it); if (father.compare(m_queuedir)) { LOGDEB("BeagleQueueIndexer::indexfiles: skipping [" << *it << "] (nq)\n" ); it++; continue; } // Pb: we are often called with the dot file, before the // normal file exists, and sometimes never called for the // normal file afterwards (ie for bookmarks where the normal // file is empty). So we perform a normal queue run at the end // of the function to catch older stuff. Still this is not // perfect, sometimes some files will not be indexed before // the next run. string fn = path_getsimple(*it); if (fn.empty() || fn.at(0) == '.') { it++; continue; } struct stat st; if (path_fileprops(*it, &st) != 0) { LOGERR("BeagleQueueIndexer::indexfiles: cant stat [" << *it << "]\n" ); it++; continue; } if (!S_ISREG(st.st_mode)) { LOGDEB("BeagleQueueIndexer::indexfiles: skipping [" << *it << "] (nr)\n" ); it++; continue; } processone(*it, &st, FsTreeWalker::FtwRegular); it = files.erase(it); } m_nocacheindex = true; index(); // Note: no need to reset nocacheindex, we're in the monitor now return true; } FsTreeWalker::Status BeagleQueueIndexer::processone(const string &path, const struct stat *stp, FsTreeWalker::CbFlag flg) { if (!m_db) //?? return FsTreeWalker::FtwError; bool dounlink = false; if (flg != FsTreeWalker::FtwRegular) return FsTreeWalker::FtwOk; string dotpath = path_cat(path_getfather(path), string(".") + path_getsimple(path)); LOGDEB("BeagleQueueIndexer: prc1: [" << (path) << "]\n" ); BeagleDotFile dotfile(m_config, dotpath); Rcl::Doc dotdoc; string udi, udipath; if (!dotfile.toDoc(dotdoc)) goto out; //dotdoc.dump(1); // Have to use the hit type for the udi, because the same url can exist // as a bookmark or a page. udipath = path_cat(dotdoc.meta[Rcl::Doc::keybght], url_gpath(dotdoc.url)); make_udi(udipath, cstr_null, udi); LOGDEB("BeagleQueueIndexer: prc1: udi [" << (udi) << "]\n" ); char ascdate[30]; sprintf(ascdate, "%ld", long(stp->st_mtime)); if (!stringlowercmp("bookmark", dotdoc.meta[Rcl::Doc::keybght])) { // For bookmarks, we just index the doc that was built from the // metadata. if (dotdoc.fmtime.empty()) dotdoc.fmtime = ascdate; dotdoc.pcbytes = lltodecstr(stp->st_size); // Document signature for up to date checks: none. dotdoc.sig.clear(); dotdoc.meta[Rcl::Doc::keybcknd] = "BGL"; if (!m_db->addOrUpdate(udi, cstr_null, dotdoc)) return FsTreeWalker::FtwError; } else { Rcl::Doc doc; // Store the dotdoc fields in the future doc. In case someone wants // to use beagle-generated fields like beagle:inurl doc.meta = dotdoc.meta; FileInterner interner(path, stp, m_config, FileInterner::FIF_doUseInputMimetype, &dotdoc.mimetype); FileInterner::Status fis; try { fis = interner.internfile(doc); } catch (CancelExcept) { LOGERR("BeagleQueueIndexer: interrupted\n" ); goto out; } if (fis != FileInterner::FIDone && fis != FileInterner::FIAgain) { LOGERR("BeagleQueueIndexer: bad status from internfile\n" ); // TOBEDONE: internfile can return FIAgain here if it is // paging a big text file, we should loop. Means we're // only indexing the first page for text/plain files // bigger than the page size (dlft: 1MB) for now. goto out; } if (doc.fmtime.empty()) doc.fmtime = ascdate; dotdoc.fmtime = doc.fmtime; doc.pcbytes = lltodecstr(stp->st_size); // Document signature for up to date checks: none. doc.sig.clear(); doc.url = dotdoc.url; doc.meta[Rcl::Doc::keybcknd] = "BGL"; if (!m_db->addOrUpdate(udi, cstr_null, doc)) return FsTreeWalker::FtwError; } // Copy to cache { // doc fields not in meta, needing saving to the cache dotfile.m_fields.set("fmtime", dotdoc.fmtime, cstr_null); // fbytes is used for historical reasons, should be pcbytes, but makes // no sense to change. dotfile.m_fields.set(cstr_fbytes, dotdoc.pcbytes, cstr_null); dotfile.m_fields.set("udi", udi, cstr_null); string fdata; file_to_string(path, fdata); if (!m_cache || !m_cache->cc()) { LOGERR("BeagleQueueIndexer: cache initialization failed\n" ); goto out; } if (!m_cache->cc()->put(udi, &dotfile.m_fields, fdata, 0)) { LOGERR("BeagleQueueIndexer::prc1: cache_put failed; " << (m_cache->cc()->getReason()) << "\n" ); goto out; } } updstatus(udi); dounlink = true; out: if (dounlink) { unlink(path.c_str()); unlink(dotpath.c_str()); } return FsTreeWalker::FtwOk; } recoll-1.23.7/index/checkretryfailed.h0000644000175000017500000000237613125527323014610 00000000000000#ifndef _CHECKRETRYFAILED_H_INCLUDED_ #define _CHECKRETRYFAILED_H_INCLUDED_ /* Copyright (C) 2015 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** Check if retrying failed files may be needed. We execute a shell-script for this. The default one checks if any of the common bin directories changed. @param conf the config @param record if true, record the state instead of testing @return true if retrying should be performed */ class RclConfig; bool checkRetryFailed(RclConfig *conf, bool record); #endif /* _CHECKRETRYFAILED_H_INCLUDED_ */ recoll-1.23.7/index/mimetype.cpp0000644000175000017500000001674013125637102013461 00000000000000/* 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_MIMETYPE #include "autoconfig.h" #include "safesysstat.h" #include #include #include #include "mimetype.h" #include "log.h" #include "execmd.h" #include "rclconfig.h" #include "smallut.h" #include "idfile.h" #include "pxattr.h" using namespace std; /// Identification of file from contents. This is called for files with /// unrecognized extensions. /// /// The system 'file' utility does not always work for us. For exemple /// it will mistake mail folders for simple text files if there is no /// 'Received' header, which would be the case, for exemple in a /// 'Sent' folder. Also "file -i" does not exist on all systems, and /// is quite costly to execute. /// So we first call the internal file identifier, which currently /// only knows about mail, but in which we can add the more /// current/interesting file types. /// As a last resort we execute 'file' or its configured replacement /// (except if forbidden by config) static string mimetypefromdata(RclConfig *cfg, const string &fn, bool usfc) { LOGDEB1("mimetypefromdata: fn [" << fn << "]\n"); // First try the internal identifying routine string mime = idFile(fn.c_str()); #ifdef USE_SYSTEM_FILE_COMMAND if (usfc && mime.empty()) { // Last resort: use "file -i", or its configured replacement. // 'file' fallback if the configured command (default: // xdg-mime) is not found static const vector tradfilecmd = {{FILE_PROG}, {"-i"}}; vector cmd; string scommand; if (cfg->getConfParam("systemfilecommand", scommand)) { LOGDEB2("mimetype: syscmd from config: " << scommand << "\n"); stringToStrings(scommand, cmd); string exe; if (cmd.empty()) { cmd = tradfilecmd; } else if (!ExecCmd::which(cmd[0], exe)) { cmd = tradfilecmd; } else { cmd[0] = exe; } cmd.push_back(fn); } else { LOGDEB("mimetype:systemfilecommand not found, using " << stringsToString(tradfilecmd) << "\n"); cmd = tradfilecmd; } string result; LOGDEB2("mimetype: executing: [" << stringsToString(cmd) << "]\n"); if (!ExecCmd::backtick(cmd, result)) { LOGERR("mimetypefromdata: exec " << stringsToString(cmd) << " failed\n"); return string(); } trimstring(result, " \t\n\r"); LOGDEB2("mimetype: systemfilecommand output [" << result << "]\n"); // The normal output from "file -i" looks like the following: // thefilename.xxx: text/plain; charset=us-ascii // Sometimes the semi-colon is missing like in: // mimetype.cpp: text/x-c charset=us-ascii // And sometimes we only get the mime type. This apparently happens // when 'file' believes that the file name is binary // xdg-mime only outputs the MIME type. // If there is no colon and there is a slash, this is hopefuly // the mime type if (result.find_first_of(":") == string::npos && result.find_first_of("/") != string::npos) { return result; } // Else the result should begin with the file name. Get rid of it: if (result.find(fn) != 0) { // Garbage "file" output. Maybe the result of a charset // conversion attempt? LOGERR("mimetype: can't interpret output from [" << stringsToString(cmd) << "] : [" << result << "]\n"); return string(); } result = result.substr(fn.size()); // Now should look like ": text/plain; charset=us-ascii" // Split it, and take second field list res; stringToStrings(result, res); if (res.size() <= 1) return string(); list::iterator it = res.begin(); mime = *++it; // Remove possible semi-colon at the end trimstring(mime, " \t;"); // File -i will sometimes return strange stuff (ie: "very small file") if(mime.find("/") == string::npos) mime.clear(); } #endif //USE_SYSTEM_FILE_COMMAND return mime; } /// Guess mime type, first from suffix, then from file data. We also /// have a list of suffixes that we don't touch at all. string mimetype(const string &fn, const struct stat *stp, RclConfig *cfg, bool usfc) { // Use stat data if available to check for non regular files if (stp) { // Note: the value used for directories is different from what // file -i would print on Linux (inode/directory). Probably // comes from bsd. Thos may surprise a user trying to use a // 'mime:' filter with the query language, but it's not work // changing (would force a reindex). if (S_ISDIR(stp->st_mode)) return "inode/directory"; if (S_ISLNK(stp->st_mode)) return "inode/symlink"; if (!S_ISREG(stp->st_mode)) return "inode/x-fsspecial"; // Empty files are just this: avoid further errors with actual filters. if (stp->st_size == 0) return "inode/x-empty"; } string mtype; #ifndef _WIN32 // Extended attribute has priority on everything, as per: // http://freedesktop.org/wiki/CommonExtendedAttributes if (pxattr::get(fn, "mime_type", &mtype)) { LOGDEB0("Mimetype: 'mime_type' xattr : [" << mtype << "]\n"); if (mtype.empty()) { LOGDEB0("Mimetype: getxattr() returned empty mime type !\n"); } else { return mtype; } } #endif if (cfg == 0) { LOGERR("Mimetype: null config ??\n"); return mtype; } if (cfg->inStopSuffixes(fn)) { LOGDEB("mimetype: fn [" << fn << "] in stopsuffixes\n"); return mtype; } // Compute file name suffix and search the mimetype map string::size_type dot = fn.find_first_of("."); while (dot != string::npos) { string suff = stringtolower(fn.substr(dot)); mtype = cfg->getMimeTypeFromSuffix(suff); if (!mtype.empty() || dot >= fn.size() - 1) break; dot = fn.find_first_of(".", dot + 1); } // If type was not determined from suffix, examine file data. Can // only do this if we have an actual file (as opposed to a pure // name). if (mtype.empty() && stp) mtype = mimetypefromdata(cfg, fn, usfc); return mtype; } #else // TEST-> #include #include "safesysstat.h" #include #include #include "log.h" #include "rclconfig.h" #include "rclinit.h" #include "mimetype.h" using namespace std; int main(int argc, const char **argv) { string reason; RclConfig *config = recollinit(0, 0, reason); if (config == 0 || !config->ok()) { string str = "Configuration problem: "; str += reason; fprintf(stderr, "%s\n", str.c_str()); exit(1); } while (--argc > 0) { string filename = *++argv; struct stat st; if (lstat(filename.c_str(), &st)) { fprintf(stderr, "Can't stat %s\n", filename.c_str()); continue; } cout << filename << " -> " << mimetype(filename, &st, config, true) << endl; } return 0; } #endif // TEST recoll-1.23.7/index/recollindex.h0000644000175000017500000000356413224431020013574 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _recollindex_h_included_ #define _recollindex_h_included_ #include #include /** Helper methods in recollindex.cpp for initial checks/setup to index * a list of files (either from the monitor or the command line) */ class RclConfig; extern bool indexfiles(RclConfig *config, std::list &filenames); extern bool purgefiles(RclConfig *config, std::list &filenames); extern bool createAuxDbs(RclConfig *config); /** * Helper method for executing the recoll-we (new WebExtensions plugin) helper * script. This moves files from the browser download directory (only * place where the browser accepts to create them), to the web queue * dir). This keeps the c++ code compatible with old and new addon. * The script is executed before a batch pass, or from time to time in * the monitor, if web processing is enabled. */ extern bool runWebFilesMoverScript(RclConfig *); extern int stopindexing; // Try to explain what went wrong... extern void addIdxReason(std::string who, std::string reason); class ReExec; extern ReExec *o_reexec; #endif /* _recollindex_h_included_ */ recoll-1.23.7/index/rclmon.h0000644000175000017500000000660613125637102012567 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLMON_H_INCLUDED_ #define _RCLMON_H_INCLUDED_ #include "autoconfig.h" #ifdef RCL_MONITOR /** * Definitions for the real-time monitoring recoll. * We're interested in file modifications, deletions and renaming. * We use two threads, one to receive events from the source, the * other to perform adequate processing. * * The two threads communicate through an event buffer which is * actually a hash map indexed by file path for easy coalescing of * multiple events to the same file. */ #include #include #include #include #include "rclconfig.h" #ifndef NO_NAMESPACES using std::string; using std::multimap; #endif /** * Monitoring event: something changed in the filesystem */ class RclMonEvent { public: enum EvType {RCLEVT_NONE= 0, RCLEVT_MODIFY=1, RCLEVT_DELETE=2, RCLEVT_DIRCREATE=3, RCLEVT_ISDIR=0x10}; string m_path; // Type and flags int m_etyp; ///// For fast changing files: minimum time interval before reindex // Minimum interval (from config) int m_itvsecs; // Don't process this entry before: time_t m_minclock; // Changed since put in purgatory after reindex bool m_needidx; RclMonEvent() : m_etyp(RCLEVT_NONE), m_itvsecs(0), m_minclock(0), m_needidx(false) {} EvType evtype() {return EvType(m_etyp & 0xf);} int evflags() {return m_etyp & 0xf0;} }; enum RclMonitorOption {RCLMON_NONE=0, RCLMON_NOFORK=1, RCLMON_NOX11=2, RCLMON_NOCONFCHECK=4}; /** * Monitoring event queue. This is the shared object between the main thread * (which does the actual indexing work), and the monitoring thread which * receives events from FAM / inotify / etc. */ class RclEQData; class RclMonEventQueue { public: RclMonEventQueue(); ~RclMonEventQueue(); /** Wait for event or timeout. Returns with the queue locked */ std::unique_lock wait(int secs = -1, bool *timedout = 0); /** Add event. */ bool pushEvent(const RclMonEvent &ev); /** To all threads: end processing */ void setTerminate(); bool ok(); bool empty(); RclMonEvent pop(); void setopts(int opts); // Convenience function for initially communicating config to mon thr void setConfig(RclConfig *conf); RclConfig *getConfig(); private: RclEQData *m_data; }; /** Start monitoring on the topdirs described in conf */ extern bool startMonitor(RclConfig *conf, int flags); /** Main routine for the event receiving thread */ extern void *rclMonRcvRun(void *); // Specific debug macro for monitor synchronization events #define MONDEB LOGDEB2 #endif // RCL_MONITOR #endif /* _RCLMON_H_INCLUDED_ */ recoll-1.23.7/index/fetcher.h0000644000175000017500000000630413224431017012705 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FETCHER_H_INCLUDED_ #define _FETCHER_H_INCLUDED_ #include "safesysstat.h" #include #include "rcldoc.h" class RclConfig; /** * Generic interface to retrieve the data for a document designated by * its index data (udi/ipath/url). This is used to retrieve the data * for previewing. The actual implementation is specific to the kind * of backend (file system, web cache, others?...), and the * implementation may of course share code with the indexing-time * functions from the specific backend. * * This normally gives access the raw document container (either as a * file or as a memory block). The Internfile code will then further * process it to get to the actual document, especially if * de-embedding is involved. * * The DATADIRECT document kind, which holds final extracted data, is only * returned when using an external indexer (only the python demo sample at * this point), in which case the whole extraction is performed by the * external code. */ class DocFetcher { public: /** A RawDoc is the data for a document-holding entity either as a memory block, or pointed to by a file name */ struct RawDoc { enum RawDocKind {RDK_FILENAME, RDK_DATA, RDK_DATADIRECT}; RawDocKind kind; std::string data; // Doc data or file name struct stat st; // Only used if RDK_FILENAME }; /** * Return the data for the requested document, either as a * file-system file or as a memory object (maybe stream too in the * future?) * @param cnf the global config * @param idoc the data gathered from the index for this doc (udi/ipath) * @param out we may return either a file name or the document data. */ virtual bool fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out) = 0; /** * Return the signature for the requested document. This is used for * up-to-date tests performed when not indexing (e.g.: verifying that a * document is not stale before previewing it). * @param cnf the global config * @param idoc the data gathered from the index for this doc (udi/ipath) * @param sig output. */ virtual bool makesig(RclConfig* cnf, const Rcl::Doc& idoc, std::string& sig) = 0; virtual ~DocFetcher() {} }; /** Return an appropriate fetcher object given the backend string * identifier inside idoc*/ DocFetcher *docFetcherMake(RclConfig *config, const Rcl::Doc& idoc); #endif /* _FETCHER_H_INCLUDED_ */ recoll-1.23.7/index/rclmon.sh0000755000175000017500000000357513125527323012762 00000000000000#!/bin/sh # Copyright (C) 2006 J.F.Dockes ####################################################### # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ###################################################### ################### # Start/stop a recollindex program running as permanent real time indexer. # The running program writes its pid in $RECOLL_CONFDIR/index.pid # The portability of this script has not been fully tested. # fatal() { echo $* exit 1 } usage() { fatal "Usage: rclmon.sh " } test $# -eq 1 || usage export LANG=C RECOLL_CONFDIR=${RECOLL_CONFDIR:-$HOME/.recoll} #echo RECOLL_CONFDIR = ${RECOLL_CONFDIR} pidfile="${RECOLL_CONFDIR}/index.pid" opid=0 if test -f $pidfile ; then read opid junk < $pidfile fi if test $opid -gt 0; then out=`kill -0 ${opid} 2>&1` if test $? -ne 0 ; then if test `expr "$out" : '.*such *process.*'` -ne 0 ; then opid=0 else fatal cant test existence of running process fi fi fi #echo "Existing pid $opid" case $1 in start) if test "$opid" -ne 0 ; then fatal "Already running process: $opid" fi recollindex -m ;; stop) if test "$opid" -eq 0 ; then fatal "No process running" fi kill $opid ;; *) usage esac recoll-1.23.7/index/rclmonrcv.cpp0000644000175000017500000005561513125637102013641 00000000000000#include "autoconfig.h" #ifdef RCL_MONITOR /* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "safesysstat.h" #include "safeunistd.h" #include "log.h" #include "rclmon.h" #include "rclinit.h" #include "fstreewalk.h" #include "pathut.h" /** * Recoll real time monitor event receiver. This file has code to interface * to FAM or inotify and place events on the event queue. */ /** A small virtual interface for monitors. Lets * either fam/gamin or raw imonitor hide behind */ class RclMonitor { public: RclMonitor() : saved_errno(0) { } virtual ~RclMonitor() { } virtual bool addWatch(const string& path, bool isDir) = 0; virtual bool getEvent(RclMonEvent& ev, int msecs = -1) = 0; virtual bool ok() const = 0; // Does this monitor generate 'exist' events at startup? virtual bool generatesExist() const = 0; // Save significant errno after monitor calls int saved_errno; }; // Monitor factory. We only have one compiled-in kind at a time, no // need for a 'kind' parameter static RclMonitor *makeMonitor(); /** * Create directory watches during the initial file system tree walk. * * This class is a callback for the file system tree walker * class. The callback method alternatively creates the directory * watches and flushes the event queue (to avoid a possible overflow * while we create the watches) */ class WalkCB : public FsTreeWalkerCB { public: WalkCB(RclConfig *conf, RclMonitor *mon, RclMonEventQueue *queue, FsTreeWalker& walker) : m_config(conf), m_mon(mon), m_queue(queue), m_walker(walker) {} virtual ~WalkCB() {} virtual FsTreeWalker::Status processone(const string &fn, const struct stat *st, FsTreeWalker::CbFlag flg) { MONDEB("rclMonRcvRun: processone " << fn << " m_mon " << m_mon << " m_mon->ok " << (m_mon ? m_mon->ok() : false) << std::endl); if (flg == FsTreeWalker::FtwDirEnter || flg == FsTreeWalker::FtwDirReturn) { m_config->setKeyDir(fn); // Set up skipped patterns for this subtree. m_walker.setSkippedNames(m_config->getSkippedNames()); } if (flg == FsTreeWalker::FtwDirEnter) { // Create watch when entering directory, but first empty // whatever events we may already have on queue while (m_queue->ok() && m_mon->ok()) { RclMonEvent ev; if (m_mon->getEvent(ev, 0)) { if (ev.m_etyp != RclMonEvent::RCLEVT_NONE) m_queue->pushEvent(ev); } else { MONDEB("rclMonRcvRun: no event pending\n"); break; } } if (!m_mon || !m_mon->ok()) return FsTreeWalker::FtwError; // We do nothing special if addWatch fails for a reasonable reason if (!m_mon->addWatch(fn, true)) { if (m_mon->saved_errno != EACCES && m_mon->saved_errno != ENOENT) return FsTreeWalker::FtwError; } } else if (!m_mon->generatesExist() && flg == FsTreeWalker::FtwRegular) { // Have to synthetize events for regular files existence // at startup because the monitor does not do it // Note 2011-09-29: no sure this is actually needed. We just ran // an incremental indexing pass (before starting the // monitor). Why go over the files once more ? The only // reason I can see would be to catch modifications that // happen between the incremental and the start of // monitoring ? There should be another way: maybe start // monitoring without actually handling events (just // queue), then run incremental then start handling // events ? But we also have to do it on a directory // move! So keep it RclMonEvent ev; ev.m_path = fn; ev.m_etyp = RclMonEvent::RCLEVT_MODIFY; m_queue->pushEvent(ev); } return FsTreeWalker::FtwOk; } private: RclConfig *m_config; RclMonitor *m_mon; RclMonEventQueue *m_queue; FsTreeWalker& m_walker; }; // Main thread routine: create watches, then forever wait for and queue events void *rclMonRcvRun(void *q) { RclMonEventQueue *queue = (RclMonEventQueue *)q; LOGDEB("rclMonRcvRun: running\n"); recoll_threadinit(); // Make a local copy of the configuration as it doesn't like // concurrent accesses. It's ok to copy it here as the other // thread will not work before we have sent events. RclConfig lconfig(*queue->getConfig()); // Create the fam/whatever interface object RclMonitor *mon; if ((mon = makeMonitor()) == 0) { LOGERR("rclMonRcvRun: makeMonitor failed\n"); queue->setTerminate(); return 0; } // Get top directories from config vector tdl = lconfig.getTopdirs(); if (tdl.empty()) { LOGERR("rclMonRcvRun:: top directory list (topdirs param.) not found " "in configuration or topdirs list parse error"); queue->setTerminate(); return 0; } // Walk the directory trees to add watches FsTreeWalker walker; walker.setSkippedPaths(lconfig.getDaemSkippedPaths()); WalkCB walkcb(&lconfig, mon, queue, walker); for (auto it = tdl.begin(); it != tdl.end(); it++) { lconfig.setKeyDir(*it); // Adjust the follow symlinks options bool follow; if (lconfig.getConfParam("followLinks", &follow) && follow) { walker.setOpts(FsTreeWalker::FtwFollow); } else { walker.setOpts(FsTreeWalker::FtwOptNone); } // We have to special-case regular files which are part of the topdirs // list because we the tree walker only adds watches for directories struct stat st; if (path_fileprops(*it, &st, follow) != 0) { LOGERR("rclMonRcvRun: stat failed for " << *it << "\n"); continue; } if (S_ISDIR(st.st_mode)) { LOGDEB("rclMonRcvRun: walking " << *it << "\n"); if (walker.walk(*it, walkcb) != FsTreeWalker::FtwOk) { LOGERR("rclMonRcvRun: tree walk failed\n"); goto terminate; } if (walker.getErrCnt() > 0) { LOGINFO("rclMonRcvRun: fs walker errors: " << walker.getReason() << "\n"); } } else { if (!mon->addWatch(*it, false)) { LOGERR("rclMonRcvRun: addWatch failed for " << *it << " errno " << mon->saved_errno << std::endl); } } } { bool doweb = false; lconfig.getConfParam("processwebqueue", &doweb); if (doweb) { string webqueuedir = lconfig.getWebQueueDir(); if (!mon->addWatch(webqueuedir, true)) { LOGERR("rclMonRcvRun: addwatch (webqueuedir) failed\n"); if (mon->saved_errno != EACCES && mon->saved_errno != ENOENT) goto terminate; } } } // Forever wait for monitoring events and add them to queue: MONDEB("rclMonRcvRun: waiting for events. q->ok(): " << queue->ok() << std::endl); while (queue->ok() && mon->ok()) { RclMonEvent ev; // Note: I could find no way to get the select // call to return when a signal is delivered to the process // (it goes to the main thread, from which I tried to close or // write to the select fd, with no effect). So set a // timeout so that an intr will be detected if (mon->getEvent(ev, 2000)) { // Don't push events for skipped files. This would get // filtered on the processing side anyway, but causes // unnecessary wakeups and messages. Do not test // skippedPaths here, this would be incorrect (because a // topdir can be under a skippedPath and this was handled // while adding the watches). lconfig.setKeyDir(path_getfather(ev.m_path)); walker.setSkippedNames(lconfig.getSkippedNames()); if (walker.inSkippedNames(path_getsimple(ev.m_path))) continue; if (ev.m_etyp == RclMonEvent::RCLEVT_DIRCREATE) { // Recursive addwatch: there may already be stuff // inside this directory. Ie: files were quickly // created, or this is actually the target of a // directory move. This is necessary for inotify, but // it seems that fam/gamin is doing the job for us so // that we are generating double events here (no big // deal as prc will sort/merge). LOGDEB("rclMonRcvRun: walking new dir " << ev.m_path << "\n"); if (walker.walk(ev.m_path, walkcb) != FsTreeWalker::FtwOk) { LOGERR("rclMonRcvRun: walking new dir " << ev.m_path << " : " << walker.getReason() << "\n"); goto terminate; } if (walker.getErrCnt() > 0) { LOGINFO("rclMonRcvRun: fs walker errors: " << walker.getReason() << "\n"); } } if (ev.m_etyp != RclMonEvent::RCLEVT_NONE) queue->pushEvent(ev); } } terminate: queue->setTerminate(); LOGINFO("rclMonRcvRun: monrcv thread routine returning\n"); return 0; } // Utility routine used by both the fam/gamin and inotify versions to get // rid of the id-path translation for a moved dir bool eraseWatchSubTree(map& idtopath, const string& top) { bool found = false; MONDEB("Clearing map for [" << top << "]\n"); map::iterator it = idtopath.begin(); while (it != idtopath.end()) { if (it->second.find(top) == 0) { found = true; idtopath.erase(it++); } else { it++; } } return found; } // We dont compile both the inotify and the fam interface and inotify // has preference #ifndef RCL_USE_INOTIFY #ifdef RCL_USE_FAM ////////////////////////////////////////////////////////////////////////// /** Fam/gamin -based monitor class */ #include #include #include #include /** FAM based monitor class. We have to keep a record of FAM watch request numbers to directory names as the event only contain the request number and file name, not the full path */ class RclFAM : public RclMonitor { public: RclFAM(); virtual ~RclFAM(); virtual bool addWatch(const string& path, bool isdir); virtual bool getEvent(RclMonEvent& ev, int msecs = -1); bool ok() const {return m_ok;} virtual bool generatesExist() const {return true;} private: bool m_ok; FAMConnection m_conn; void close() { FAMClose(&m_conn); m_ok = false; } map m_idtopath; const char *event_name(int code); }; // Translate event code to string (debug) const char *RclFAM::event_name(int code) { static const char *famevent[] = { "", "FAMChanged", "FAMDeleted", "FAMStartExecuting", "FAMStopExecuting", "FAMCreated", "FAMMoved", "FAMAcknowledge", "FAMExists", "FAMEndExist" }; static char unknown_event[30]; if (code < FAMChanged || code > FAMEndExist) { sprintf(unknown_event, "unknown (%d)", code); return unknown_event; } return famevent[code]; } RclFAM::RclFAM() : m_ok(false) { if (FAMOpen2(&m_conn, "Recoll")) { LOGERR("RclFAM::RclFAM: FAMOpen2 failed, errno " << errno << "\n"); return; } m_ok = true; } RclFAM::~RclFAM() { if (ok()) FAMClose(&m_conn); } static jmp_buf jbuf; static void onalrm(int sig) { longjmp(jbuf, 1); } bool RclFAM::addWatch(const string& path, bool isdir) { if (!ok()) return false; bool ret = false; MONDEB("RclFAM::addWatch: adding " << path << std::endl); // It happens that the following call block forever. // We'd like to be able to at least terminate on a signal here, but // gamin forever retries its write call on EINTR, so it's not even useful // to unblock signals. SIGALRM is not used by the main thread, so at least // ensure that we exit after gamin gets stuck. if (setjmp(jbuf)) { LOGERR("RclFAM::addWatch: timeout talking to FAM\n"); return false; } signal(SIGALRM, onalrm); alarm(20); FAMRequest req; if (isdir) { if (FAMMonitorDirectory(&m_conn, path.c_str(), &req, 0) != 0) { LOGERR("RclFAM::addWatch: FAMMonitorDirectory failed\n"); goto out; } } else { if (FAMMonitorFile(&m_conn, path.c_str(), &req, 0) != 0) { LOGERR("RclFAM::addWatch: FAMMonitorFile failed\n"); goto out; } } m_idtopath[req.reqnum] = path; ret = true; out: alarm(0); return ret; } // Note: return false only for queue empty or error // Return EVT_NONE for bad event to keep queue processing going bool RclFAM::getEvent(RclMonEvent& ev, int msecs) { if (!ok()) return false; MONDEB("RclFAM::getEvent:\n"); fd_set readfds; int fam_fd = FAMCONNECTION_GETFD(&m_conn); FD_ZERO(&readfds); FD_SET(fam_fd, &readfds); MONDEB("RclFAM::getEvent: select. fam_fd is " << fam_fd << std::endl); // Fam / gamin is sometimes a bit slow to send events. Always add // a little timeout, because if we fail to retrieve enough events, // we risk deadlocking in addwatch() if (msecs == 0) msecs = 2; struct timeval timeout; if (msecs >= 0) { timeout.tv_sec = msecs / 1000; timeout.tv_usec = (msecs % 1000) * 1000; } int ret; if ((ret=select(fam_fd+1, &readfds, 0, 0, msecs >= 0 ? &timeout : 0)) < 0) { LOGERR("RclFAM::getEvent: select failed, errno " << errno << "\n"); close(); return false; } else if (ret == 0) { // timeout MONDEB("RclFAM::getEvent: select timeout\n"); return false; } MONDEB("RclFAM::getEvent: select returned " << ret << std::endl); if (!FD_ISSET(fam_fd, &readfds)) return false; // ?? 2011/03/15 gamin v0.1.10. There is initially a single null // byte on the connection so the first select always succeeds. If // we then call FAMNextEvent we stall. Using FAMPending works // around the issue, but we did not need this in the past and this // is most weird. if (FAMPending(&m_conn) <= 0) { MONDEB("RclFAM::getEvent: FAMPending says no events\n"); return false; } MONDEB("RclFAM::getEvent: call FAMNextEvent\n"); FAMEvent fe; if (FAMNextEvent(&m_conn, &fe) < 0) { LOGERR("RclFAM::getEvent: FAMNextEvent: errno " << errno << "\n"); close(); return false; } MONDEB("RclFAM::getEvent: FAMNextEvent returned\n"); map::const_iterator it; if ((!path_isabsolute(fe.filename)) && (it = m_idtopath.find(fe.fr.reqnum)) != m_idtopath.end()) { ev.m_path = path_cat(it->second, fe.filename); } else { ev.m_path = fe.filename; } MONDEB("RclFAM::getEvent: " << event_name(fe.code) < " " << ev.m_path << std::endl); switch (fe.code) { case FAMCreated: if (path_isdir(ev.m_path)) { ev.m_etyp = RclMonEvent::RCLEVT_DIRCREATE; break; } /* FALLTHROUGH */ case FAMChanged: case FAMExists: // Let the other side sort out the status of this file vs the db ev.m_etyp = RclMonEvent::RCLEVT_MODIFY; break; case FAMMoved: case FAMDeleted: ev.m_etyp = RclMonEvent::RCLEVT_DELETE; // We would like to signal a directory here to enable cleaning // the subtree (on a dir move), but can't test the actual file // which is gone, and fam doesn't tell us if it's a dir or reg. // Let's rely on the fact that a directory should be watched if (eraseWatchSubTree(m_idtopath, ev.m_path)) ev.m_etyp |= RclMonEvent::RCLEVT_ISDIR; break; case FAMStartExecuting: case FAMStopExecuting: case FAMAcknowledge: case FAMEndExist: default: // Have to return something, this is different from an empty queue, // esp if we are trying to empty it... if (fe.code != FAMEndExist) LOGDEB("RclFAM::getEvent: got other event " << fe.code << "!\n"); ev.m_etyp = RclMonEvent::RCLEVT_NONE; break; } return true; } #endif // RCL_USE_FAM #endif // ! INOTIFY #ifdef RCL_USE_INOTIFY ////////////////////////////////////////////////////////////////////////// /** Inotify-based monitor class */ #include #include class RclIntf : public RclMonitor { public: RclIntf() : m_ok(false), m_fd(-1), m_evp(0), m_ep(0) { if ((m_fd = inotify_init()) < 0) { LOGERR("RclIntf:: inotify_init failed, errno " << errno << "\n"); return; } m_ok = true; } virtual ~RclIntf() { close(); } virtual bool addWatch(const string& path, bool isdir); virtual bool getEvent(RclMonEvent& ev, int msecs = -1); bool ok() const {return m_ok;} virtual bool generatesExist() const {return false;} private: bool m_ok; int m_fd; map m_idtopath; // Watch descriptor to name #define EVBUFSIZE (32*1024) char m_evbuf[EVBUFSIZE]; // Event buffer char *m_evp; // Pointer to next event or 0 char *m_ep; // Pointer to end of events const char *event_name(int code); void close() { if (m_fd >= 0) { ::close(m_fd); m_fd = -1; } m_ok = false; } }; const char *RclIntf::event_name(int code) { code &= ~(IN_ISDIR|IN_ONESHOT); switch (code) { case IN_ACCESS: return "IN_ACCESS"; case IN_MODIFY: return "IN_MODIFY"; case IN_ATTRIB: return "IN_ATTRIB"; case IN_CLOSE_WRITE: return "IN_CLOSE_WRITE"; case IN_CLOSE_NOWRITE: return "IN_CLOSE_NOWRITE"; case IN_CLOSE: return "IN_CLOSE"; case IN_OPEN: return "IN_OPEN"; case IN_MOVED_FROM: return "IN_MOVED_FROM"; case IN_MOVED_TO: return "IN_MOVED_TO"; case IN_MOVE: return "IN_MOVE"; case IN_CREATE: return "IN_CREATE"; case IN_DELETE: return "IN_DELETE"; case IN_DELETE_SELF: return "IN_DELETE_SELF"; case IN_MOVE_SELF: return "IN_MOVE_SELF"; case IN_UNMOUNT: return "IN_UNMOUNT"; case IN_Q_OVERFLOW: return "IN_Q_OVERFLOW"; case IN_IGNORED: return "IN_IGNORED"; default: { static char msg[50]; sprintf(msg, "Unknown event 0x%x", code); return msg; } }; } bool RclIntf::addWatch(const string& path, bool) { if (!ok()) return false; MONDEB("RclIntf::addWatch: adding " << path << std::endl); // CLOSE_WRITE is covered through MODIFY. CREATE is needed for mkdirs uint32_t mask = IN_MODIFY | IN_CREATE | IN_MOVED_FROM | IN_MOVED_TO | IN_DELETE // IN_ATTRIB used to be not needed to receive extattr // modification events, which was a bit weird because only ctime is // set, and now it is... | IN_ATTRIB #ifdef IN_DONT_FOLLOW | IN_DONT_FOLLOW #endif #ifdef IN_EXCL_UNLINK | IN_EXCL_UNLINK #endif ; int wd; if ((wd = inotify_add_watch(m_fd, path.c_str(), mask)) < 0) { saved_errno = errno; LOGERR("RclIntf::addWatch: inotify_add_watch failed. errno " << saved_errno << "\n"); if (errno == ENOSPC) { LOGERR("RclIntf::addWatch: ENOSPC error may mean that you should " "increase the inotify kernel constants. See inotify(7)\n"); } return false; } m_idtopath[wd] = path; return true; } // Note: return false only for queue empty or error // Return EVT_NONE for bad event to keep queue processing going bool RclIntf::getEvent(RclMonEvent& ev, int msecs) { if (!ok()) return false; ev.m_etyp = RclMonEvent::RCLEVT_NONE; MONDEB("RclIntf::getEvent:\n"); if (m_evp == 0) { fd_set readfds; FD_ZERO(&readfds); FD_SET(m_fd, &readfds); struct timeval timeout; if (msecs >= 0) { timeout.tv_sec = msecs / 1000; timeout.tv_usec = (msecs % 1000) * 1000; } int ret; MONDEB("RclIntf::getEvent: select\n"); if ((ret = select(m_fd + 1, &readfds, 0, 0, msecs >= 0 ? &timeout : 0)) < 0) { LOGERR("RclIntf::getEvent: select failed, errno " << errno << "\n"); close(); return false; } else if (ret == 0) { MONDEB("RclIntf::getEvent: select timeout\n"); // timeout return false; } MONDEB("RclIntf::getEvent: select returned\n"); if (!FD_ISSET(m_fd, &readfds)) return false; int rret; if ((rret=read(m_fd, m_evbuf, sizeof(m_evbuf))) <= 0) { LOGERR("RclIntf::getEvent: read failed, " << sizeof(m_evbuf) << "->" << rret << " errno " << errno << "\n"); close(); return false; } m_evp = m_evbuf; m_ep = m_evbuf + rret; } struct inotify_event *evp = (struct inotify_event *)m_evp; m_evp += sizeof(struct inotify_event); if (evp->len > 0) m_evp += evp->len; if (m_evp >= m_ep) m_evp = m_ep = 0; map::const_iterator it; if ((it = m_idtopath.find(evp->wd)) == m_idtopath.end()) { LOGERR("RclIntf::getEvent: unknown wd " << evp->wd << "\n"); return true; } ev.m_path = it->second; if (evp->len > 0) { ev.m_path = path_cat(ev.m_path, evp->name); } MONDEB("RclIntf::getEvent: " << event_name(evp->mask) << " " << ev.m_path << std::endl); if ((evp->mask & IN_MOVED_FROM) && (evp->mask & IN_ISDIR)) { // We get this when a directory is renamed. Erase the subtree // entries in the map. The subsequent MOVED_TO will recreate // them. This is probably not needed because the watches // actually still exist in the kernel, so that the wds // returned by future addwatches will be the old ones, and the // map will be updated in place. But still, this feels safer eraseWatchSubTree(m_idtopath, ev.m_path); } // IN_ATTRIB used to be not needed, but now it is if (evp->mask & (IN_MODIFY|IN_ATTRIB)) { ev.m_etyp = RclMonEvent::RCLEVT_MODIFY; } else if (evp->mask & (IN_DELETE | IN_MOVED_FROM)) { ev.m_etyp = RclMonEvent::RCLEVT_DELETE; if (evp->mask & IN_ISDIR) ev.m_etyp |= RclMonEvent::RCLEVT_ISDIR; } else if (evp->mask & (IN_CREATE | IN_MOVED_TO)) { if (evp->mask & IN_ISDIR) { ev.m_etyp = RclMonEvent::RCLEVT_DIRCREATE; } else { // We used to return null event because we would get a // modify event later, but it seems not to be the case any // more (10-2011). So generate MODIFY event ev.m_etyp = RclMonEvent::RCLEVT_MODIFY; } } else if (evp->mask & (IN_IGNORED)) { if (!m_idtopath.erase(evp->wd)) { LOGDEB0("Got IGNORE event for unknown watch\n"); } else { eraseWatchSubTree(m_idtopath, ev.m_path); } } else { LOGDEB("RclIntf::getEvent: unhandled event " << event_name(evp->mask) << " " << evp->mask << " " << ev.m_path << "\n"); return true; } return true; } #endif // RCL_USE_INOTIFY /////////////////////////////////////////////////////////////////////// // The monitor 'factory' static RclMonitor *makeMonitor() { #ifdef RCL_USE_INOTIFY return new RclIntf; #endif #ifndef RCL_USE_INOTIFY #ifdef RCL_USE_FAM return new RclFAM; #endif #endif LOGINFO("RclMonitor: neither Inotify nor Fam was compiled as file system " "change notification interface\n"); return 0; } #endif // RCL_MONITOR recoll-1.23.7/index/indexer.cpp0000644000175000017500000002635713224431017013270 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "cstr.h" #include "log.h" #include "recollindex.h" #include "indexer.h" #include "fsindexer.h" #ifndef DISABLE_WEB_INDEXER #include "beaglequeue.h" #endif #include "mimehandler.h" #include "pathut.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif // This would more logically live in recollindex.cpp, but then librecoll would // have an undefined symbol ConfSimple idxreasons; void addIdxReason(string who, string reason) { reason = neutchars(reason, "\r\n"); if (!idxreasons.set(who, reason)) { std::cerr << "addIdxReason: confsimple set failed\n"; } } ConfIndexer::ConfIndexer(RclConfig *cnf, DbIxStatusUpdater *updfunc) : m_config(cnf), m_db(cnf), m_fsindexer(0), m_doweb(false), m_webindexer(0), m_updater(updfunc) { m_config->getConfParam("processwebqueue", &m_doweb); } ConfIndexer::~ConfIndexer() { deleteZ(m_fsindexer); #ifndef DISABLE_WEB_INDEXER deleteZ(m_webindexer); #endif } // Determine if this is likely the first time that the user runs // indexing. We don't look at the xapiandb as this may have been // explicitely removed for valid reasons, but at the indexing status // file, which should be unexistant-or-empty only before any indexing // has ever run bool ConfIndexer::runFirstIndexing() { // Indexing status file existing and not empty ? if (path_filesize(m_config->getIdxStatusFile()) > 0) { LOGDEB0("ConfIndexer::runFirstIndexing: no: status file not empty\n"); return false; } // And only do this if the user has kept the default topdirs (~). vector tdl = m_config->getTopdirs(); if (tdl.size() != 1 || tdl[0].compare(path_canon(path_tildexpand("~")))) { LOGDEB0("ConfIndexer::runFirstIndexing: no: not home only\n"); return false; } return true; } bool ConfIndexer::firstFsIndexingSequence() { LOGDEB("ConfIndexer::firstFsIndexingSequence\n"); deleteZ(m_fsindexer); m_fsindexer = new FsIndexer(m_config, &m_db, m_updater); if (!m_fsindexer) { return false; } int flushmb = m_db.getFlushMb(); m_db.setFlushMb(2); m_fsindexer->index(IxFQuickShallow); m_db.doFlush(); m_db.setFlushMb(flushmb); return true; } bool ConfIndexer::index(bool resetbefore, ixType typestorun, int flags) { Rcl::Db::OpenMode mode = resetbefore ? Rcl::Db::DbTrunc : Rcl::Db::DbUpd; if (!m_db.open(mode)) { LOGERR("ConfIndexer: error opening database " << m_config->getDbDir() << " : " << m_db.getReason() << "\n"); addIdxReason("indexer", m_db.getReason()); return false; } m_config->setKeyDir(cstr_null); if (typestorun & IxTFs) { if (runFirstIndexing()) { firstFsIndexingSequence(); } deleteZ(m_fsindexer); m_fsindexer = new FsIndexer(m_config, &m_db, m_updater); if (!m_fsindexer || !m_fsindexer->index(flags)) { addIdxReason("indexer", "Index creation failed. See log"); m_db.close(); return false; } } #ifndef DISABLE_WEB_INDEXER if (m_doweb && (typestorun & IxTWebQueue)) { runWebFilesMoverScript(m_config); deleteZ(m_webindexer); m_webindexer = new BeagleQueueIndexer(m_config, &m_db, m_updater); if (!m_webindexer || !m_webindexer->index()) { m_db.close(); addIdxReason("indexer", "Web index creation failed. See log"); return false; } } #endif if (typestorun == IxTAll) { // Get rid of all database entries that don't exist in the // filesystem anymore. Only if all *configured* indexers ran. if (m_updater && !m_updater->update(DbIxStatus::DBIXS_PURGE, "")) { m_db.close(); addIdxReason("indexer", "Index purge failed. See log"); return false; } m_db.purge(); } // The close would be done in our destructor, but we want status // here. Makes no sense to check for cancel, we'll have to close // anyway if (m_updater) m_updater->update(DbIxStatus::DBIXS_CLOSING, string()); if (!m_db.close()) { LOGERR("ConfIndexer::index: error closing database in " << m_config->getDbDir() << "\n"); addIdxReason("indexer", "Index close/flush failed. See log"); return false; } if (m_updater && !m_updater->update(DbIxStatus::DBIXS_CLOSING, string())) return false; bool ret = true; if (!createStemmingDatabases()) { ret = false; } if (m_updater && !m_updater->update(DbIxStatus::DBIXS_CLOSING, string())) return false; // Don't fail indexing because of an aspell issue: we ignore the status. // Messages were written to the reasons output (void)createAspellDict(); clearMimeHandlerCache(); if (m_updater) m_updater->update(DbIxStatus::DBIXS_DONE, string()); return ret; } bool ConfIndexer::indexFiles(list& ifiles, int flag) { list myfiles; string origcwd = m_config->getOrigCwd(); for (list::const_iterator it = ifiles.begin(); it != ifiles.end(); it++) { myfiles.push_back(path_canon(*it, &origcwd)); } myfiles.sort(); if (!m_db.open(Rcl::Db::DbUpd)) { LOGERR("ConfIndexer: indexFiles error opening database " << m_config->getDbDir() << "\n"); return false; } m_config->setKeyDir(cstr_null); bool ret = false; if (!m_fsindexer) m_fsindexer = new FsIndexer(m_config, &m_db, m_updater); if (m_fsindexer) ret = m_fsindexer->indexFiles(myfiles, flag); LOGDEB2("ConfIndexer::indexFiles: fsindexer returned " << ret << ", " << myfiles.size() << " files remainining\n"); #ifndef DISABLE_WEB_INDEXER if (m_doweb && !myfiles.empty() && !(flag & IxFNoWeb)) { if (!m_webindexer) m_webindexer = new BeagleQueueIndexer(m_config, &m_db, m_updater); if (m_webindexer) { ret = ret && m_webindexer->indexFiles(myfiles); } else { ret = false; } } #endif if (flag & IxFDoPurge) { m_db.purge(); } // The close would be done in our destructor, but we want status here if (!m_db.close()) { LOGERR("ConfIndexer::index: error closing database in " << m_config->getDbDir() << "\n"); return false; } ifiles = myfiles; clearMimeHandlerCache(); return ret; } // Update index for specific documents. The docs come from an index // query, so the udi, backend etc. fields are filled. bool ConfIndexer::updateDocs(std::vector &docs, IxFlag flag) { vector paths; docsToPaths(docs, paths); list files(paths.begin(), paths.end()); if (!files.empty()) { return indexFiles(files, flag); } return true; } bool ConfIndexer::purgeFiles(std::list &files, int flag) { list myfiles; string origcwd = m_config->getOrigCwd(); for (list::const_iterator it = files.begin(); it != files.end(); it++) { myfiles.push_back(path_canon(*it, &origcwd)); } myfiles.sort(); if (!m_db.open(Rcl::Db::DbUpd)) { LOGERR("ConfIndexer: purgeFiles error opening database " << m_config->getDbDir() << "\n"); return false; } bool ret = false; m_config->setKeyDir(cstr_null); if (!m_fsindexer) m_fsindexer = new FsIndexer(m_config, &m_db, m_updater); if (m_fsindexer) ret = m_fsindexer->purgeFiles(myfiles); #ifndef DISABLE_WEB_INDEXER if (m_doweb && !myfiles.empty() && !(flag & IxFNoWeb)) { if (!m_webindexer) m_webindexer = new BeagleQueueIndexer(m_config, &m_db, m_updater); if (m_webindexer) { ret = ret && m_webindexer->purgeFiles(myfiles); } else { ret = false; } } #endif // The close would be done in our destructor, but we want status here if (!m_db.close()) { LOGERR("ConfIndexer::purgefiles: error closing database in " << m_config->getDbDir() << "\n"); return false; } return ret; } // Create stemming databases. We also remove those which are not // configured. bool ConfIndexer::createStemmingDatabases() { string slangs; bool ret = true; if (m_config->getConfParam("indexstemminglanguages", slangs)) { if (!m_db.open(Rcl::Db::DbUpd)) { LOGERR("ConfIndexer::createStemmingDb: could not open db\n"); addIdxReason("stemming", "could not open db"); return false; } vector langs; stringToStrings(slangs, langs); // Get the list of existing stem dbs from the database (some may have // been manually created, we just keep those from the config vector dblangs = m_db.getStemLangs(); vector::const_iterator it; for (it = dblangs.begin(); it != dblangs.end(); it++) { if (find(langs.begin(), langs.end(), *it) == langs.end()) m_db.deleteStemDb(*it); } ret = ret && m_db.createStemDbs(langs); if (!ret) { addIdxReason("stemming", "stem db creation failed"); } } m_db.close(); return ret; } bool ConfIndexer::createStemDb(const string &lang) { if (!m_db.open(Rcl::Db::DbUpd)) return false; vector langs; stringToStrings(lang, langs); return m_db.createStemDbs(langs); } // The language for the aspell dictionary is handled internally by the aspell // module, either from a configuration variable or the NLS environment. bool ConfIndexer::createAspellDict() { LOGDEB2("ConfIndexer::createAspellDict()\n"); #ifdef RCL_USE_ASPELL // For the benefit of the real-time indexer, we only initialize // noaspell from the configuration once. It can then be set to // true if dictionary generation fails, which avoids retrying // it forever. static int noaspell = -12345; if (noaspell == -12345) { noaspell = false; m_config->getConfParam("noaspell", &noaspell); } if (noaspell) return true; if (!m_db.open(Rcl::Db::DbRO)) { LOGERR("ConfIndexer::createAspellDict: could not open db\n"); return false; } Aspell aspell(m_config); string reason; if (!aspell.init(reason)) { LOGERR("ConfIndexer::createAspellDict: aspell init failed: " << reason << "\n"); noaspell = true; return false; } LOGDEB("ConfIndexer::createAspellDict: creating dictionary\n"); if (!aspell.buildDict(m_db, reason)) { LOGERR("ConfIndexer::createAspellDict: aspell buildDict failed: " << reason << "\n"); addIdxReason("aspell", reason); noaspell = true; return false; } #endif return true; } vector ConfIndexer::getStemmerNames() { return Rcl::Db::getStemmerNames(); } recoll-1.23.7/index/subtreelist.cpp0000644000175000017500000000612413125637102014170 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_SUBTREELIST #include "autoconfig.h" #include #include "cstr.h" #include "rcldb.h" #include "searchdata.h" #include "rclquery.h" #include "subtreelist.h" #include "log.h" bool subtreelist(RclConfig *config, const string& top, vector& paths) { LOGDEB("subtreelist: top: [" << (top) << "]\n" ); Rcl::Db rcldb(config); if (!rcldb.open(Rcl::Db::DbRO)) { LOGERR("subtreelist: can't open database in [" << (config->getDbDir()) << "]: " << (rcldb.getReason()) << "\n" ); return false; } Rcl::SearchData *sd = new Rcl::SearchData(Rcl::SCLT_OR, cstr_null); std::shared_ptr rq(sd); sd->addClause(new Rcl::SearchDataClausePath(top, false)); Rcl::Query query(&rcldb); query.setQuery(rq); int cnt = query.getResCnt(); for (int i = 0; i < cnt; i++) { Rcl::Doc doc; if (!query.getDoc(i, doc)) break; string path = fileurltolocalpath(doc.url); if (!path.empty()) paths.push_back(path); } return true; } #else // TEST #include #include #include #include #include #include #include using namespace std; #include "subtreelist.h" #include "rclconfig.h" #include "rclinit.h" static char *thisprog; static char usage [] = " : list document paths in this tree\n" ; static void Usage(void) { cerr << thisprog << ": usage:" << endl << usage; exit(1); } static int op_flags; #define OPT_o 0x2 int main(int argc, char **argv) { string top; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { default: Usage(); break; } argc--; argv++; } if (argc < 1) Usage(); top = *argv++;argc--; string reason; RclConfig *config = recollinit(0, 0, reason, 0); if (!config || !config->ok()) { fprintf(stderr, "Recoll init failed: %s\n", reason.c_str()); exit(1); } vector paths; if (!subtreelist(config, top, paths)) { cerr << "subtreelist failed" << endl; exit(1); } for (vector::const_iterator it = paths.begin(); it != paths.end(); it++) { cout << *it << endl; } exit(0); } #endif recoll-1.23.7/index/fsindexer.h0000644000175000017500000001173413125637102013262 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _fsindexer_h_included_ #define _fsindexer_h_included_ #include #include #include "indexer.h" #include "fstreewalk.h" #ifdef IDX_THREADS #include "workqueue.h" #endif // IDX_THREADS class DbIxStatusUpdater; class FIMissingStore; struct stat; class DbUpdTask; class InternfileTask; /** Index selected parts of the file system Tree indexing: we inherits FsTreeWalkerCB so that, the processone() method is called by the file-system tree walk code for each file and directory. We keep all state needed while indexing, and finally call the methods to purge the db of stale entries and create the stemming databases. Single file(s) indexing: there are also calls to index or purge lists of files. No database purging or stem db updating in this case. */ class FsIndexer : public FsTreeWalkerCB { public: /** Constructor does nothing but store parameters * * @param cnf Configuration data * @param updfunc Status updater callback */ FsIndexer(RclConfig *cnf, Rcl::Db *db, DbIxStatusUpdater *updfunc = 0); virtual ~FsIndexer(); /** * Top level file system tree index method for updating a given database. * * We open the database, * then call a file system walk for each top-level directory. */ bool index(int flags); /** Index a list of files. No db cleaning or stemdb updating */ bool indexFiles(std::list &files, int f = ConfIndexer::IxFNone); /** Purge a list of files. */ bool purgeFiles(std::list &files); /** Tree walker callback method */ FsTreeWalker::Status processone(const string &fn, const struct stat *, FsTreeWalker::CbFlag); /** Make signature for file up to date checks */ static void makesig(const struct stat *stp, string& out); private: class PurgeCandidateRecorder { public: PurgeCandidateRecorder() : dorecord(false) {} void setRecord(bool onoff) { dorecord = onoff; } void record(const string& udi) { // This test does not need to be protected: the value is set at // init and never changed. if (!dorecord) return; #ifdef IDX_THREADS std::unique_lock locker(mutex); #endif udis.push_back(udi); } const vector& getCandidates() { return udis; } private: #ifdef IDX_THREADS std::mutex mutex; #endif bool dorecord; std::vector udis; }; FsTreeWalker m_walker; RclConfig *m_config; Rcl::Db *m_db; string m_reason; DbIxStatusUpdater *m_updater; // Top/start directories list std::vector m_tdl; // Store for missing filters and associated mime types FIMissingStore *m_missing; // Recorder for files that may need subdoc purging. PurgeCandidateRecorder m_purgeCandidates; // The configuration can set attribute fields to be inherited by // all files in a file system area. Ie: set "rclaptg = thunderbird" // inside ~/.thunderbird. The boolean is set at init to avoid // further wasteful processing if no local fields are set. // This should probably moved to internfile so that the // localfields get exactly the same processing as those generated by the // filters (as was done for metadatacmds fields) bool m_havelocalfields; string m_slocalfields; map m_localfields; // Activate detection of xattr-only document updates. Experimental, so // needs a config option bool m_detectxattronly; // No retry of previously failed files bool m_noretryfailed; #ifdef IDX_THREADS friend void *FsIndexerDbUpdWorker(void*); friend void *FsIndexerInternfileWorker(void*); WorkQueue m_iwqueue; WorkQueue m_dwqueue; bool m_haveInternQ; bool m_haveSplitQ; RclConfig *m_stableconfig; #endif // IDX_THREADS bool init(); void localfieldsfromconf(); void setlocalfields(const map& flds, Rcl::Doc& doc); string getDbDir() {return m_config->getDbDir();} FsTreeWalker::Status processonefile(RclConfig *config, const string &fn, const struct stat *, const map& localfields); }; #endif /* _fsindexer_h_included_ */ recoll-1.23.7/index/indexer.h0000644000175000017500000001202513224431017012720 00000000000000/* 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 _INDEXER_H_INCLUDED_ #define _INDEXER_H_INCLUDED_ #include "rclconfig.h" #include #include #include #include #include using std::string; using std::list; using std::map; using std::vector; #include "rcldb.h" #include "rcldoc.h" class FsIndexer; class BeagleQueueIndexer; class DbIxStatus { public: enum Phase {DBIXS_NONE, DBIXS_FILES, DBIXS_PURGE, DBIXS_STEMDB, DBIXS_CLOSING, DBIXS_MONITOR, DBIXS_DONE}; Phase phase; string fn; // Last file processed int docsdone; // Documents actually updated int filesdone; // Files tested (updated or not) int fileerrors; // Failed files (e.g.: missing input handler). int dbtotdocs; // Doc count in index at start // Total files in index.This is actually difficult to compute from // the index so it's preserved from last indexing int totfiles; void reset() { phase = DBIXS_FILES; fn.erase(); docsdone = filesdone = fileerrors = dbtotdocs = totfiles = 0; } DbIxStatus() {reset();} }; /** Callback to say what we're doing. If the update func returns false, we * stop as soon as possible without corrupting state */ class DbIxStatusUpdater { public: #ifdef IDX_THREADS std::mutex m_mutex; #endif DbIxStatus status; virtual ~DbIxStatusUpdater(){} // Convenience: change phase/fn and update virtual bool update(DbIxStatus::Phase phase, const string& fn) { #ifdef IDX_THREADS std::unique_lock lock(m_mutex); #endif status.phase = phase; status.fn = fn; return update(); } // To be implemented by user for sending info somewhere virtual bool update() = 0; }; /** * The top level batch indexing object. Processes the configuration, * then invokes file system walking or other to populate/update the * database(s). */ class ConfIndexer { public: enum runStatus {IndexerOk, IndexerError}; ConfIndexer(RclConfig *cnf, DbIxStatusUpdater *updfunc = 0); virtual ~ConfIndexer(); // Indexer types. Maybe we'll have something more dynamic one day enum ixType {IxTNone, IxTFs=1, IxTWebQueue=2, IxTAll = IxTFs | IxTWebQueue}; // Misc indexing flags enum IxFlag {IxFNone = 0, IxFIgnoreSkip = 1, // Ignore skipped lists IxFNoWeb = 2, // Do not process the web queue. // First pass: just do the top files so that the user can // try searching asap. IxFQuickShallow = 4, // Do not retry files which previously failed ('+' sigs) IxFNoRetryFailed = 8, // Do perform purge pass even if we can't be sure we saw // all files IxFDoPurge = 16, }; /** Run indexers */ bool index(bool resetbefore, ixType typestorun, int f = IxFNone); const string &getReason() {return m_reason;} /** Stemming reset to config: create needed, delete unconfigured */ bool createStemmingDatabases(); /** Create stem database for given language */ bool createStemDb(const string &lang); /** Create misspelling expansion dictionary if aspell i/f is available */ bool createAspellDict(); /** List possible stemmer names */ static vector getStemmerNames(); /** Index a list of files. No db cleaning or stemdb updating */ bool indexFiles(list &files, int f = IxFNone); /** Update index for list of documents given as list of docs (out of query) */ bool updateDocs(vector &docs, IxFlag f = IxFNone); /** Purge a list of files. */ bool purgeFiles(list &files, int f = IxFNone); /** Set in place reset mode */ void setInPlaceReset() {m_db.setInPlaceReset();} private: RclConfig *m_config; Rcl::Db m_db; FsIndexer *m_fsindexer; bool m_doweb; BeagleQueueIndexer *m_webindexer; DbIxStatusUpdater *m_updater; string m_reason; // The first time we index, we do things a bit differently to // avoid user frustration (make at least some results available // fast by using several passes, the first ones to index common // interesting locations). bool runFirstIndexing(); bool firstFsIndexingSequence(); }; #endif /* _INDEXER_H_INCLUDED_ */ recoll-1.23.7/index/fsindexer.cpp0000644000175000017500000006623013125637102013616 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "safesysstat.h" #include #include #include #include #include "cstr.h" #include "pathut.h" #include "rclutil.h" #include "conftree.h" #include "rclconfig.h" #include "fstreewalk.h" #include "rcldb.h" #include "readfile.h" #include "indexer.h" #include "fsindexer.h" #include "transcode.h" #include "log.h" #include "internfile.h" #include "smallut.h" #include "chrono.h" #include "wipedir.h" #include "fileudi.h" #include "cancelcheck.h" #include "rclinit.h" #include "extrameta.h" #include "utf8fn.h" using namespace std; #ifdef IDX_THREADS class DbUpdTask { public: // Take some care to avoid sharing string data (if string impl is cow) DbUpdTask(const string& u, const string& p, const Rcl::Doc& d) : udi(u.begin(), u.end()), parent_udi(p.begin(), p.end()) { d.copyto(&doc); } string udi; string parent_udi; Rcl::Doc doc; }; extern void *FsIndexerDbUpdWorker(void*); class InternfileTask { public: // Take some care to avoid sharing string data (if string impl is cow) InternfileTask(const std::string &f, const struct stat *i_stp, map lfields) : fn(f.begin(), f.end()), statbuf(*i_stp) { map_ss_cp_noshr(lfields, &localfields); } string fn; struct stat statbuf; map localfields; }; extern void *FsIndexerInternfileWorker(void*); #endif // IDX_THREADS // Thread safe variation of the "missing helpers" storage. Only the // addMissing method needs protection, the rest are called from the // main thread either before or after the exciting part class FSIFIMissingStore : public FIMissingStore { #ifdef IDX_THREADS std::mutex m_mutex; #endif public: virtual void addMissing(const string& prog, const string& mt) { #ifdef IDX_THREADS std::unique_lock locker(m_mutex); #endif FIMissingStore::addMissing(prog, mt); } }; FsIndexer::FsIndexer(RclConfig *cnf, Rcl::Db *db, DbIxStatusUpdater *updfunc) : m_config(cnf), m_db(db), m_updater(updfunc), m_missing(new FSIFIMissingStore), m_detectxattronly(false), m_noretryfailed(false) #ifdef IDX_THREADS , m_iwqueue("Internfile", cnf->getThrConf(RclConfig::ThrIntern).first), m_dwqueue("Split", cnf->getThrConf(RclConfig::ThrSplit).first) #endif // IDX_THREADS { LOGDEB1("FsIndexer::FsIndexer\n" ); m_havelocalfields = m_config->hasNameAnywhere("localfields"); m_config->getConfParam("detectxattronly", &m_detectxattronly); #ifdef IDX_THREADS m_stableconfig = new RclConfig(*m_config); m_haveInternQ = m_haveSplitQ = false; int internqlen = cnf->getThrConf(RclConfig::ThrIntern).first; int internthreads = cnf->getThrConf(RclConfig::ThrIntern).second; if (internqlen >= 0) { if (!m_iwqueue.start(internthreads, FsIndexerInternfileWorker, this)) { LOGERR("FsIndexer::FsIndexer: intern worker start failed\n" ); return; } m_haveInternQ = true; } int splitqlen = cnf->getThrConf(RclConfig::ThrSplit).first; int splitthreads = cnf->getThrConf(RclConfig::ThrSplit).second; if (splitqlen >= 0) { if (!m_dwqueue.start(splitthreads, FsIndexerDbUpdWorker, this)) { LOGERR("FsIndexer::FsIndexer: split worker start failed\n" ); return; } m_haveSplitQ = true; } LOGDEB("FsIndexer: threads: haveIQ " << (m_haveInternQ) << " iql " << (internqlen) << " iqts " << (internthreads) << " haveSQ " << (m_haveSplitQ) << " sql " << (splitqlen) << " sqts " << (splitthreads) << "\n" ); #endif // IDX_THREADS } FsIndexer::~FsIndexer() { LOGDEB1("FsIndexer::~FsIndexer()\n" ); #ifdef IDX_THREADS void *status; if (m_haveInternQ) { status = m_iwqueue.setTerminateAndWait(); LOGDEB0("FsIndexer: internfile wrkr status: " << (status) << " (1->ok)\n" ); } if (m_haveSplitQ) { status = m_dwqueue.setTerminateAndWait(); LOGDEB0("FsIndexer: dbupd worker status: " << (status) << " (1->ok)\n" ); } delete m_stableconfig; #endif // IDX_THREADS delete m_missing; } bool FsIndexer::init() { if (m_tdl.empty()) { m_tdl = m_config->getTopdirs(); if (m_tdl.empty()) { LOGERR("FsIndexers: no topdirs list defined\n" ); return false; } } return true; } // Recursively index each directory in the topdirs: bool FsIndexer::index(int flags) { bool quickshallow = (flags & ConfIndexer::IxFQuickShallow) != 0; m_noretryfailed = (flags & ConfIndexer::IxFNoRetryFailed) != 0; Chrono chron; if (!init()) return false; if (m_updater) { #ifdef IDX_THREADS std::unique_lock locker(m_updater->m_mutex); #endif m_updater->status.dbtotdocs = m_db->docCnt(); } m_walker.setSkippedPaths(m_config->getSkippedPaths()); if (quickshallow) { m_walker.setOpts(m_walker.getOpts() | FsTreeWalker::FtwSkipDotFiles); m_walker.setMaxDepth(2); } for (vector::const_iterator it = m_tdl.begin(); it != m_tdl.end(); it++) { LOGDEB("FsIndexer::index: Indexing " << *it << " into " << getDbDir() << "\n"); // Set the current directory in config so that subsequent // getConfParams() will get local values m_config->setKeyDir(*it); // Adjust the "follow symlinks" option bool follow; int opts = m_walker.getOpts(); if (m_config->getConfParam("followLinks", &follow) && follow) { opts |= FsTreeWalker::FtwFollow; } else { opts &= ~FsTreeWalker::FtwFollow; } m_walker.setOpts(opts); int abslen; if (m_config->getConfParam("idxabsmlen", &abslen)) m_db->setAbstractParams(abslen, -1, -1); // Walk the directory tree if (m_walker.walk(*it, *this) != FsTreeWalker::FtwOk) { LOGERR("FsIndexer::index: error while indexing " << *it << ": " << m_walker.getReason() << "\n"); return false; } } #ifdef IDX_THREADS if (m_haveInternQ) m_iwqueue.waitIdle(); if (m_haveSplitQ) m_dwqueue.waitIdle(); m_db->waitUpdIdle(); #endif // IDX_THREADS if (m_missing) { string missing; m_missing->getMissingDescription(missing); if (!missing.empty()) { LOGINFO("FsIndexer::index missing helper program(s):\n" << (missing) << "\n" ); } m_config->storeMissingHelperDesc(missing); } LOGINFO("fsindexer index time: " << (chron.millis()) << " mS\n" ); return true; } static bool matchesSkipped(const vector& tdl, FsTreeWalker& walker, const string& path) { // Check path against topdirs and skippedPaths. We go up the // ancestors until we find either a topdirs or a skippedPaths // match. If topdirs is found first-> ok to index (it's possible // and useful to configure a topdir under a skippedPath in the // config). This matches what happens during the normal fs tree // walk. string canonpath = path_canon(path); string mpath = canonpath; string topdir; while (!path_isroot(mpath)) { // we assume root not in skipped paths. for (vector::const_iterator it = tdl.begin(); it != tdl.end(); it++) { // the topdirs members are already canonized. LOGDEB2("matchesSkipped: comparing ancestor [" << (mpath) << "] to topdir [" << (it) << "]\n" ); if (!mpath.compare(*it)) { topdir = *it; goto goodpath; } } if (walker.inSkippedPaths(mpath, false)) { LOGDEB("FsIndexer::indexFiles: skipping [" << (path) << "] (skpp)\n" ); return true; } string::size_type len = mpath.length(); mpath = path_getfather(mpath); // getfather normally returns a path ending with /, canonic // paths don't (except for '/' itself). if (!path_isroot(mpath) && mpath[mpath.size()-1] == '/') mpath.erase(mpath.size()-1); // should not be necessary, but lets be prudent. If the // path did not shorten, something is seriously amiss // (could be an assert actually) if (mpath.length() >= len) { LOGERR("FsIndexer::indexFile: internal Error: path [" << (mpath) << "] did not shorten\n" ); return true; } } // We get there if neither topdirs nor skippedPaths tests matched LOGDEB("FsIndexer::indexFiles: skipping [" << (path) << "] (ntd)\n" ); return true; goodpath: // Then check all path components up to the topdir against skippedNames mpath = canonpath; while (mpath.length() >= topdir.length() && mpath.length() > 1) { string fn = path_getsimple(mpath); if (walker.inSkippedNames(fn)) { LOGDEB("FsIndexer::indexFiles: skipping [" << (path) << "] (skpn)\n" ); return true; } string::size_type len = mpath.length(); mpath = path_getfather(mpath); // getfather normally returns a path ending with /, getsimple // would then return '' if (!mpath.empty() && mpath[mpath.size()-1] == '/') mpath.erase(mpath.size()-1); // should not be necessary, but lets be prudent. If the // path did not shorten, something is seriously amiss // (could be an assert actually) if (mpath.length() >= len) return true; } return false; } /** * Index individual files, out of a full tree run. No database purging */ bool FsIndexer::indexFiles(list& files, int flags) { LOGDEB("FsIndexer::indexFiles\n" ); m_noretryfailed = (flags & ConfIndexer::IxFNoRetryFailed) != 0; bool ret = false; if (!init()) return false; int abslen; if (m_config->getConfParam("idxabsmlen", &abslen)) m_db->setAbstractParams(abslen, -1, -1); m_purgeCandidates.setRecord(true); // We use an FsTreeWalker just for handling the skipped path/name lists FsTreeWalker walker; walker.setSkippedPaths(m_config->getSkippedPaths()); for (list::iterator it = files.begin(); it != files.end(); ) { LOGDEB2("FsIndexer::indexFiles: [" << (it) << "]\n" ); m_config->setKeyDir(path_getfather(*it)); if (m_havelocalfields) localfieldsfromconf(); bool follow = false; m_config->getConfParam("followLinks", &follow); walker.setSkippedNames(m_config->getSkippedNames()); // Check path against indexed areas and skipped names/paths if (!(flags & ConfIndexer::IxFIgnoreSkip) && matchesSkipped(m_tdl, walker, *it)) { it++; continue; } struct stat stb; int ststat = path_fileprops(*it, &stb, follow); if (ststat != 0) { LOGERR("FsIndexer::indexFiles: (l)stat " << *it << ": " << strerror(errno) << "\n"); it++; continue; } if (processone(*it, &stb, FsTreeWalker::FtwRegular) != FsTreeWalker::FtwOk) { LOGERR("FsIndexer::indexFiles: processone failed\n" ); goto out; } it = files.erase(it); } ret = true; out: #ifdef IDX_THREADS if (m_haveInternQ) m_iwqueue.waitIdle(); if (m_haveSplitQ) m_dwqueue.waitIdle(); m_db->waitUpdIdle(); #endif // IDX_THREADS // Purge possible orphan documents if (ret == true) { LOGDEB("Indexfiles: purging orphans\n" ); const vector& purgecandidates = m_purgeCandidates.getCandidates(); for (vector::const_iterator it = purgecandidates.begin(); it != purgecandidates.end(); it++) { LOGDEB("Indexfiles: purging orphans for " << *it << "\n"); m_db->purgeOrphans(*it); } #ifdef IDX_THREADS m_db->waitUpdIdle(); #endif // IDX_THREADS } LOGDEB("FsIndexer::indexFiles: done\n" ); return ret; } /** Purge docs for given files out of the database */ bool FsIndexer::purgeFiles(list& files) { LOGDEB("FsIndexer::purgeFiles\n" ); bool ret = false; if (!init()) return false; for (list::iterator it = files.begin(); it != files.end(); ) { string udi; make_udi(*it, cstr_null, udi); // rcldb::purgefile returns true if the udi was either not // found or deleted, false only in case of actual error bool existed; if (!m_db->purgeFile(udi, &existed)) { LOGERR("FsIndexer::purgeFiles: Database error\n" ); goto out; } // If we actually deleted something, take it off the list if (existed) { it = files.erase(it); } else { it++; } } ret = true; out: #ifdef IDX_THREADS if (m_haveInternQ) m_iwqueue.waitIdle(); if (m_haveSplitQ) m_dwqueue.waitIdle(); m_db->waitUpdIdle(); #endif // IDX_THREADS LOGDEB("FsIndexer::purgeFiles: done\n" ); return ret; } // Local fields can be set for fs subtrees in the configuration file void FsIndexer::localfieldsfromconf() { LOGDEB1("FsIndexer::localfieldsfromconf\n" ); string sfields; m_config->getConfParam("localfields", sfields); if (!sfields.compare(m_slocalfields)) return; m_slocalfields = sfields; m_localfields.clear(); if (sfields.empty()) return; string value; ConfSimple attrs; m_config->valueSplitAttributes(sfields, value, attrs); vector nmlst = attrs.getNames(cstr_null); for (vector::const_iterator it = nmlst.begin(); it != nmlst.end(); it++) { string nm = m_config->fieldCanon(*it); attrs.get(*it, m_localfields[nm]); LOGDEB2("FsIndexer::localfieldsfromconf: [" << (nm) << "]->[" << (m_localfields[nm]) << "]\n" ); } } void FsIndexer::setlocalfields(const map& fields, Rcl::Doc& doc) { for (map::const_iterator it = fields.begin(); it != fields.end(); it++) { // Being chosen by the user, localfields override values from // the filter. The key is already canonic (see // localfieldsfromconf()) doc.meta[it->first] = it->second; } } void FsIndexer::makesig(const struct stat *stp, string& out) { out = lltodecstr(stp->st_size) + lltodecstr(o_uptodate_test_use_mtime ? stp->st_mtime : stp->st_ctime); } #ifdef IDX_THREADS // Called updworker as seen from here, but the first step (and only in // most meaningful configurations) is doing the word-splitting, which // is why the task is referred as "Split" in the grand scheme of // things. An other stage usually deals with the actual index update. void *FsIndexerDbUpdWorker(void * fsp) { recoll_threadinit(); FsIndexer *fip = (FsIndexer*)fsp; WorkQueue *tqp = &fip->m_dwqueue; DbUpdTask *tsk; for (;;) { size_t qsz; if (!tqp->take(&tsk, &qsz)) { tqp->workerExit(); return (void*)1; } LOGDEB0("FsIndexerDbUpdWorker: task ql " << (int(qsz)) << "\n" ); if (!fip->m_db->addOrUpdate(tsk->udi, tsk->parent_udi, tsk->doc)) { LOGERR("FsIndexerDbUpdWorker: addOrUpdate failed\n" ); tqp->workerExit(); return (void*)0; } delete tsk; } } void *FsIndexerInternfileWorker(void * fsp) { recoll_threadinit(); FsIndexer *fip = (FsIndexer*)fsp; WorkQueue *tqp = &fip->m_iwqueue; RclConfig myconf(*(fip->m_stableconfig)); InternfileTask *tsk = 0; for (;;) { if (!tqp->take(&tsk)) { tqp->workerExit(); return (void*)1; } LOGDEB0("FsIndexerInternfileWorker: task fn " << (tsk->fn) << "\n" ); if (fip->processonefile(&myconf, tsk->fn, &tsk->statbuf, tsk->localfields) != FsTreeWalker::FtwOk) { LOGERR("FsIndexerInternfileWorker: processone failed\n" ); tqp->workerExit(); return (void*)0; } LOGDEB1("FsIndexerInternfileWorker: done fn " << (tsk->fn) << "\n" ); delete tsk; } } #endif // IDX_THREADS /// This method gets called for every file and directory found by the /// tree walker. /// /// It checks with the db if the file has changed and needs to be /// reindexed. If so, it calls internfile() which will identify the /// file type and call an appropriate handler to convert the document into /// internal format, which we then add to the database. /// /// Accent and majuscule handling are performed by the db module when doing /// the actual indexing work. The Rcl::Doc created by internfile() /// mostly contains pretty raw utf8 data. FsTreeWalker::Status FsIndexer::processone(const std::string &fn, const struct stat *stp, FsTreeWalker::CbFlag flg) { if (m_updater) { #ifdef IDX_THREADS std::unique_lock locker(m_updater->m_mutex); #endif if (!m_updater->update()) { return FsTreeWalker::FtwStop; } } // If we're changing directories, possibly adjust parameters (set // the current directory in configuration object) if (flg == FsTreeWalker::FtwDirEnter || flg == FsTreeWalker::FtwDirReturn) { m_config->setKeyDir(fn); // Set up skipped patterns for this subtree. m_walker.setSkippedNames(m_config->getSkippedNames()); // Adjust local fields from config for this subtree if (m_havelocalfields) localfieldsfromconf(); if (flg == FsTreeWalker::FtwDirReturn) return FsTreeWalker::FtwOk; } #ifdef IDX_THREADS if (m_haveInternQ) { InternfileTask *tp = new InternfileTask(fn, stp, m_localfields); if (m_iwqueue.put(tp)) { return FsTreeWalker::FtwOk; } else { return FsTreeWalker::FtwError; } } #endif return processonefile(m_config, fn, stp, m_localfields); } FsTreeWalker::Status FsIndexer::processonefile(RclConfig *config, const std::string &fn, const struct stat *stp, const map& localfields) { //////////////////// // Check db up to date ? Doing this before file type // identification means that, if usesystemfilecommand is switched // from on to off it may happen that some files which are now // without mime type will not be purged from the db, resulting // in possible 'cannot intern file' messages at query time... // This is needed if we are in a separate thread than processone() // (mostly always when multithreading). Needed esp. for // excludedmimetypes, etc. config->setKeyDir(path_getfather(fn)); // Document signature. This is based on m/ctime and size and used // for the uptodate check (the value computed here is checked // against the stored one). Changing the computation forces a full // reindex of course. string sig; makesig(stp, sig); string udi; make_udi(fn, cstr_null, udi); unsigned int existingDoc; string oldsig; bool needupdate; if (m_noretryfailed) { needupdate = m_db->needUpdate(udi, sig, &existingDoc, &oldsig); } else { needupdate = m_db->needUpdate(udi, sig, &existingDoc, 0); } // If ctime (which we use for the sig) differs from mtime, then at most // the extended attributes were changed, no need to index content. // This unfortunately leaves open the case where the data was // modified, then the extended attributes, in which case we will // miss the data update. We would have to store both the mtime and // the ctime to avoid this bool xattronly = m_detectxattronly && !m_db->inFullReset() && existingDoc && needupdate && (stp->st_mtime < stp->st_ctime); LOGDEB("processone: needupdate " << (needupdate) << " noretry " << (m_noretryfailed) << " existing " << (existingDoc) << " oldsig [" << (oldsig) << "]\n" ); // If noretryfailed is set, check for a file which previously // failed to index, and avoid re-processing it if (needupdate && m_noretryfailed && existingDoc && !oldsig.empty() && *oldsig.rbegin() == '+') { // Check that the sigs are the same except for the '+'. If the file // actually changed, we always retry (maybe it was fixed) string nold = oldsig.substr(0, oldsig.size()-1); if (!nold.compare(sig)) { LOGDEB("processone: not retrying previously failed file\n" ); m_db->setExistingFlags(udi, existingDoc); needupdate = false; } } if (!needupdate) { LOGDEB0("processone: up to date: " << (fn) << "\n" ); if (m_updater) { #ifdef IDX_THREADS std::unique_lock locker(m_updater->m_mutex); #endif // Status bar update, abort request etc. m_updater->status.fn = fn; ++(m_updater->status.filesdone); if (!m_updater->update()) { return FsTreeWalker::FtwStop; } } return FsTreeWalker::FtwOk; } LOGDEB0("processone: processing: [" << displayableBytes(stp->st_size) << "] " << fn << "\n"); // Note that we used to do the full path here, but I ended up // believing that it made more sense to use only the file name string utf8fn = compute_utf8fn(config, fn, true); // parent_udi is initially the same as udi, it will be used if there // are subdocs. string parent_udi = udi; Rcl::Doc doc; char ascdate[30]; sprintf(ascdate, "%ld", long(stp->st_mtime)); bool hadNullIpath = false; string mimetype; if (!xattronly) { FileInterner interner(fn, stp, config, FileInterner::FIF_none); if (!interner.ok()) { // no indexing whatsoever in this case. This typically means that // indexallfilenames is not set return FsTreeWalker::FtwOk; } mimetype = interner.getMimetype(); interner.setMissingStore(m_missing); FileInterner::Status fis = FileInterner::FIAgain; bool hadNonNullIpath = false; while (fis == FileInterner::FIAgain) { doc.erase(); try { fis = interner.internfile(doc); } catch (CancelExcept) { LOGERR("fsIndexer::processone: interrupted\n" ); return FsTreeWalker::FtwStop; } // We index at least the file name even if there was an error. // We'll change the signature to ensure that the indexing will // be retried every time. // If there is an error and the base doc was already seen, // we're done if (fis == FileInterner::FIError && hadNullIpath) return FsTreeWalker::FtwOk; // Internal access path for multi-document files. If empty, this is // for the main file. if (doc.ipath.empty()) { hadNullIpath = true; if (hadNonNullIpath) { // Note that only the filters can reliably compute // this. What we do is dependant of the doc order (if // we see the top doc first, we won't set the flag) doc.haschildren = true; } } else { hadNonNullIpath = true; make_udi(fn, doc.ipath, udi); } // Set file name, mod time and url if not done by // filter. We used to set the top-level container file // name for all subdocs without a proper file name, but // this did not make sense (resulted in multiple not // useful hits on the subdocs when searching for the // file name). if (doc.fmtime.empty()) doc.fmtime = ascdate; if (doc.url.empty()) doc.url = path_pathtofileurl(fn); const string *fnp = 0; if (doc.ipath.empty()) { if (!doc.peekmeta(Rcl::Doc::keyfn, &fnp) || fnp->empty()) doc.meta[Rcl::Doc::keyfn] = utf8fn; } // Set container file name for all docs, top or subdoc doc.meta[Rcl::Doc::keytcfn] = utf8fn; doc.pcbytes = lltodecstr(stp->st_size); // Document signature for up to date checks. All subdocs inherit the // file's. doc.sig = sig; // If there was an error, ensure indexing will be // retried. This is for the once missing, later installed // filter case. It can make indexing much slower (if there are // myriads of such files, the ext script is executed for them // and fails every time) if (fis == FileInterner::FIError) { doc.sig += cstr_plus; } // Possibly add fields from local config if (m_havelocalfields) setlocalfields(localfields, doc); // Add document to database. If there is an ipath, add it // as a child of the file document. #ifdef IDX_THREADS if (m_haveSplitQ) { DbUpdTask *tp = new DbUpdTask(udi, doc.ipath.empty() ? cstr_null : parent_udi, doc); if (!m_dwqueue.put(tp)) { LOGERR("processonefile: wqueue.put failed\n" ); return FsTreeWalker::FtwError; } } else { #endif if (!m_db->addOrUpdate(udi, doc.ipath.empty() ? cstr_null : parent_udi, doc)) { return FsTreeWalker::FtwError; } #ifdef IDX_THREADS } #endif // Tell what we are doing and check for interrupt request if (m_updater) { #ifdef IDX_THREADS std::unique_lock locker(m_updater->m_mutex); #endif ++(m_updater->status.docsdone); if (m_updater->status.dbtotdocs < m_updater->status.docsdone) m_updater->status.dbtotdocs = m_updater->status.docsdone; m_updater->status.fn = fn; if (!doc.ipath.empty()) { m_updater->status.fn += "|" + doc.ipath; } else { if (fis == FileInterner::FIError) { ++(m_updater->status.fileerrors); } ++(m_updater->status.filesdone); } if (!m_updater->update()) { return FsTreeWalker::FtwStop; } } } // If this doc existed and it's a container, recording for // possible subdoc purge (this will be used only if we don't do a // db-wide purge, e.g. if we're called from indexfiles()). LOGDEB2("processOnefile: existingDoc " << (existingDoc) << " hadNonNullIpath " << (hadNonNullIpath) << "\n" ); if (existingDoc && hadNonNullIpath) { m_purgeCandidates.record(parent_udi); } } // If we had no instance with a null ipath, we create an empty // document to stand for the file itself, to be used mainly for up // to date checks. Typically this happens for an mbox file. // // If xattronly is set, ONLY the extattr metadata is valid and will be used // by the following step. if (xattronly || hadNullIpath == false) { LOGDEB("Creating empty doc for file or pure xattr update\n" ); Rcl::Doc fileDoc; if (xattronly) { map xfields; reapXAttrs(config, fn, xfields); docFieldsFromXattrs(config, xfields, fileDoc); fileDoc.onlyxattr = true; } else { fileDoc.fmtime = ascdate; fileDoc.meta[Rcl::Doc::keyfn] = fileDoc.meta[Rcl::Doc::keytcfn] = utf8fn; fileDoc.haschildren = true; fileDoc.mimetype = mimetype; fileDoc.url = path_pathtofileurl(fn); if (m_havelocalfields) setlocalfields(localfields, fileDoc); fileDoc.pcbytes = lltodecstr(stp->st_size); } fileDoc.sig = sig; #ifdef IDX_THREADS if (m_haveSplitQ) { DbUpdTask *tp = new DbUpdTask(parent_udi, cstr_null, fileDoc); if (!m_dwqueue.put(tp)) return FsTreeWalker::FtwError; else return FsTreeWalker::FtwOk; } #endif if (!m_db->addOrUpdate(parent_udi, cstr_null, fileDoc)) return FsTreeWalker::FtwError; } return FsTreeWalker::FtwOk; } recoll-1.23.7/index/exefetcher.cpp0000644000175000017500000001011513224431017013735 00000000000000/* Copyright (C) 2016 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "exefetcher.h" #include "log.h" #include "pathut.h" #include "rclconfig.h" #include "execmd.h" #include "rcldoc.h" using namespace std; class EXEDocFetcher::Internal { public: string bckid; vector sfetch; vector smkid; bool docmd(const vector& cmd, const Rcl::Doc& idoc, string& out) { ExecCmd ecmd; // We're always called for preview (or Open) ecmd.putenv("RECOLL_FILTER_FORPREVIEW=yes"); string udi; idoc.getmeta(Rcl::Doc::keyudi, &udi); vector args(cmd); args.push_back(udi); args.push_back(idoc.url); args.push_back(idoc.ipath); int status = ecmd.doexec1(args, 0, &out); if (status == 0) { LOGDEB("EXEDocFetcher::Internal: got [" << out << "]\n"); return true; } else { LOGERR("EXEDOcFetcher::fetch: " << bckid << ": " << stringsToString(cmd) << " failed for " << udi << " " << idoc.url << " " << idoc.ipath << "\n"); return false; } } }; EXEDocFetcher::EXEDocFetcher(const EXEDocFetcher::Internal& _m) { m = new Internal(_m); LOGDEB("EXEDocFetcher::EXEDocFetcher: fetch is " << stringsToString(m->sfetch) << "\n"); } bool EXEDocFetcher::fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out) { out.kind = RawDoc::RDK_DATADIRECT; return m->docmd(m->sfetch, idoc, out.data); } bool EXEDocFetcher::makesig(RclConfig* cnf, const Rcl::Doc& idoc, string& sig) { return m->docmd(m->smkid, idoc, sig); } // Lookup bckid in the config and create an appropriate fetcher. EXEDocFetcher *exeDocFetcherMake(RclConfig *config, const string& bckid) { EXEDocFetcher *fetcher = 0; // The config we only read once, not gonna change. static ConfSimple *bconf; if (!bconf) { string bconfname = path_cat(config->getConfDir(), "backends"); LOGDEB("exeDocFetcherMake: using config in " << bconfname << "\n"); bconf = new ConfSimple(bconfname.c_str(), true); if (!bconf->ok()) { delete bconf; bconf = 0; LOGDEB("exeDocFetcherMake: bad/no config: " << bconfname << "\n"); return 0; } } EXEDocFetcher::Internal m; m.bckid = bckid; string sfetch; if (!bconf->get("fetch", sfetch, bckid) || sfetch.empty()) { LOGERR("exeDocFetcherMake: no 'fetch' for [" << bckid << "]\n"); return 0; } stringToStrings(sfetch, m.sfetch); // We look up the command as we do for filters for now m.sfetch[0] = config->findFilter(m.sfetch[0]); if (!path_isabsolute(m.sfetch[0])) { LOGERR("exeDocFetcherMake: " << m.sfetch[0] << " not found in exec path or filters dir\n"); return 0; } string smkid; if (!bconf->get("makesig", smkid, bckid) || smkid.empty()) { LOGDEB("exeDocFetcherMake: no 'makesig' for [" << bckid << "]\n"); return 0; } stringToStrings(smkid, m.smkid); m.smkid[0] = config->findFilter(m.smkid[0]); if (!path_isabsolute(m.smkid[0])) { LOGERR("exeDocFetcherMake: " << m.smkid[0] << " not found in exec path or filters dir\n"); return 0; } return new EXEDocFetcher(m); } recoll-1.23.7/index/checkretryfailed.cpp0000644000175000017500000000324713125637102015136 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "rclconfig.h" #include "execmd.h" #include "log.h" #include "checkretryfailed.h" using namespace std; bool checkRetryFailed(RclConfig *conf, bool record) { #ifdef _WIN32 return true; #else string cmd; if (!conf->getConfParam("checkneedretryindexscript", cmd)) { LOGDEB("checkRetryFailed: 'checkneedretryindexscript' not set in config\n" ); // We could toss a dice ? Say no retry in this case. return false; } // Look in the filters directory (ies). If not found execpath will // be the same as cmd, and we'll let execvp do its thing. string execpath = conf->findFilter(cmd); vector args; if (record) { args.push_back("1"); } ExecCmd ecmd; int status = ecmd.doexec(execpath, args); if (status == 0) { return true; } return false; #endif } recoll-1.23.7/index/beaglequeue.h0000644000175000017500000000515013125527323013555 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _beaglequeue_h_included_ #define _beaglequeue_h_included_ #include using std::list; /** * Process the Beagle indexing queue. * * Beagle MUST NOT be running, else mayhem will ensue. * * This is mainly written to reuse the Beagle Firefox plug-in (which * copies visited pages and bookmarks to the queue). */ #include "fstreewalk.h" #include "rcldoc.h" class DbIxStatusUpdater; class CirCache; class RclConfig; class BeagleQueueCache; namespace Rcl { class Db; } class BeagleQueueIndexer : public FsTreeWalkerCB { public: BeagleQueueIndexer(RclConfig *cnf, Rcl::Db *db, DbIxStatusUpdater *updfunc = 0); ~BeagleQueueIndexer(); /** This is called by the top indexer in recollindex. * Does the walking and the talking */ bool index(); /** Called when we fstreewalk the queue dir */ FsTreeWalker::Status processone(const string &, const struct stat *, FsTreeWalker::CbFlag); /** Index a list of files. No db cleaning or stemdb updating. * Used by the real time monitor */ bool indexFiles(list& files); /** Purge a list of files. No way to do this currently and dont want * to do anything as this is mostly called by the monitor when *I* delete * files inside the queue dir */ bool purgeFiles(list& files) {return true;} /** Called when indexing data from the cache, and from internfile for * search result preview */ bool getFromCache(const string& udi, Rcl::Doc &doc, string& data, string *hittype = 0); private: RclConfig *m_config; Rcl::Db *m_db; BeagleQueueCache *m_cache; string m_queuedir; DbIxStatusUpdater *m_updater; bool m_nocacheindex; bool indexFromCache(const string& udi); void updstatus(const string& udi); }; #endif /* _beaglequeue_h_included_ */ recoll-1.23.7/index/subtreelist.h0000644000175000017500000000243413125527323013640 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SUBTREELIST_H_INCLUDED_ #define _SUBTREELIST_H_INCLUDED_ #include #include class RclConfig; // This queries the database with a pure directory-filter query, to // retrieve all the entries below the specified path. This is used by // the real time indexer to purge entries when a top directory is // renamed. This is really convoluted, I'd like a better way. extern bool subtreelist(RclConfig *config, const string& top, std::vector& paths); #endif /* _SUBTREELIST_H_INCLUDED_ */ recoll-1.23.7/index/fetcher.cpp0000644000175000017500000000304013224431017013232 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "log.h" #include "rclconfig.h" #include "fetcher.h" #include "fsfetcher.h" #include "bglfetcher.h" #include "exefetcher.h" DocFetcher *docFetcherMake(RclConfig *config, const Rcl::Doc& idoc) { if (idoc.url.empty()) { LOGERR("docFetcherMakeg:: no url in doc!\n" ); return 0; } string backend; idoc.getmeta(Rcl::Doc::keybcknd, &backend); if (backend.empty() || !backend.compare("FS")) { return new FSDocFetcher; #ifndef DISABLE_WEB_INDEXER } else if (!backend.compare("BGL")) { return new BGLDocFetcher; #endif } else { DocFetcher *f = exeDocFetcherMake(config, backend); if (!f) { LOGERR("DocFetcherFactory: unknown backend [" << backend << "]\n"); } return f; } } recoll-1.23.7/index/rclmonprc.cpp0000644000175000017500000004606713224431017013631 00000000000000#include "autoconfig.h" #ifdef RCL_MONITOR /* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * Recoll real time monitor processing. This file has the code to retrieve * event from the event queue and do the database-side processing. Also the * initialization function. */ #include #include #include "safeunistd.h" #include #include #include #include #include #include #include #include #include using std::list; using std::vector; #include "log.h" #include "rclmon.h" #include "log.h" #include "execmd.h" #include "recollindex.h" #include "pathut.h" #ifndef _WIN32 #include "x11mon.h" #endif #include "subtreelist.h" typedef unsigned long mttcast; // Seconds between auxiliary db (stem, spell) updates: static const int dfltauxinterval = 60 *60; static int auxinterval = dfltauxinterval; // Seconds between indexing queue processing: for merging events to // fast changing files and saving some of the indexing overhead. static const int dfltixinterval = 30; static int ixinterval = dfltixinterval; static RclMonEventQueue rclEQ; // // Delayed events: this is a special feature for fast changing files. // A list of pattern/delays can be specified in the configuration so // that they don't get re-indexed before some timeout is elapsed. Such // events are kept on a separate queue (m_dqueue) with an auxiliary // list in time-to-reindex order, while the normal events are on // m_iqueue. // Queue management performance: on a typical recoll system there will // be only a few entries on the event queues and no significant time // will be needed to manage them. Even on a busy system, the time used // would most probably be negligible compared to the actual processing // of the indexing events. So this is just for reference. Let I be the // number of immediate events and D the number of delayed ones, N // stands for either. // // Periodic timeout polling: the recollindex process periodically (2S) // wakes up to check for exit requests. At this time it also checks // the queues for new entries (should not happen because the producer // would normally wake up the consumer threads), or ready entries // among the delayed ones. At this time it calls the "empty()" // routine. This has constant time behaviour (checks for stl container // emptiness and the top entry of the delays list). // // Adding a new event (pushEvent()): this performs a search for an // existing event with the same path (O(log(N)), then an insert on the // appropriate queue (O(log(N))) and an insert on the times list (O(D)). // // Popping an event: this is constant time as it just looks at the // tops of the normal and delayed queues. // Indexing event container: a map indexed by file path for fast // insertion of duplicate events to the same file typedef map queue_type; // Entries for delayed events are duplicated (as iterators) on an // auxiliary, sorted by time-to-reindex list. We could get rid of // this, the price would be that the RclEQ.empty() call would have to // walk the whole queue instead of only looking at the first delays // entry. typedef list delays_type; // DelayPat stores a path wildcard pattern and a minimum time between // reindexes, it is read from the recoll configuration struct DelayPat { string pattern; int seconds; DelayPat() : seconds(0) {} }; /** Private part of RclEQ: things that we don't wish to exist in the interface * include file. */ class RclEQData { public: int m_opts; // Queue for normal files (unlimited reindex) queue_type m_iqueue; // Queue for delayed reindex files queue_type m_dqueue; // The delays list stores pointers (iterators) to elements on // m_dqueue. The list is kept in time-to-index order. Elements of // m_dqueue which are also in m_delays can only be deleted while // walking m_delays, so we are certain that the m_dqueue iterators // stored in m_delays remain valid. delays_type m_delays; // Configured intervals for path patterns, read from the configuration. vector m_delaypats; RclConfig *m_config; bool m_ok; std::mutex m_mutex; std::condition_variable m_cond; RclEQData() : m_config(0), m_ok(true) { } void readDelayPats(int dfltsecs); DelayPat searchDelayPats(const string& path) { for (vector::iterator it = m_delaypats.begin(); it != m_delaypats.end(); it++) { if (fnmatch(it->pattern.c_str(), path.c_str(), 0) == 0) { return *it; } } return DelayPat(); } void delayInsert(const queue_type::iterator &qit); }; void RclEQData::readDelayPats(int dfltsecs) { if (m_config == 0) return; string patstring; if (!m_config->getConfParam("mondelaypatterns", patstring) || patstring.empty()) return; vector dplist; if (!stringToStrings(patstring, dplist)) { LOGERR("rclEQData: bad pattern list: [" << (patstring) << "]\n" ); return; } for (vector::iterator it = dplist.begin(); it != dplist.end(); it++) { string::size_type pos = it->find_last_of(":"); DelayPat dp; dp.pattern = it->substr(0, pos); if (pos != string::npos && pos != it->size()-1) { dp.seconds = atoi(it->substr(pos+1).c_str()); } else { dp.seconds = dfltsecs; } m_delaypats.push_back(dp); LOGDEB2("rclmon::readDelayPats: add [" << (dp.pattern) << "] " << (dp.seconds) << "\n" ); } } // Insert event (as queue iterator) into delays list, in time order, // We DO NOT take care of duplicate qits. erase should be called first // when necessary. void RclEQData::delayInsert(const queue_type::iterator &qit) { MONDEB("RclEQData::delayInsert: minclock " << qit->second.m_minclock << std::endl); for (delays_type::iterator dit = m_delays.begin(); dit != m_delays.end(); dit++) { queue_type::iterator qit1 = *dit; if ((*qit1).second.m_minclock > qit->second.m_minclock) { m_delays.insert(dit, qit); return; } } m_delays.push_back(qit); } RclMonEventQueue::RclMonEventQueue() { m_data = new RclEQData; } RclMonEventQueue::~RclMonEventQueue() { delete m_data; } void RclMonEventQueue::setopts(int opts) { if (m_data) m_data->m_opts = opts; } /** Wait until there is something to process on the queue, or timeout. * returns a queue lock */ std::unique_lock RclMonEventQueue::wait(int seconds, bool *top) { std::unique_lock lock(m_data->m_mutex); MONDEB("RclMonEventQueue::wait, seconds: " << seconds << std::endl); if (!empty()) { MONDEB("RclMonEventQueue:: immediate return\n"); return lock; } int err; if (seconds > 0) { if (top) *top = false; if (m_data->m_cond.wait_for(lock, std::chrono::seconds(seconds)) == std::cv_status::timeout) { *top = true; MONDEB("RclMonEventQueue:: timeout\n"); return lock; } } else { m_data->m_cond.wait(lock); } MONDEB("RclMonEventQueue:: non-timeout return\n"); return lock; } void RclMonEventQueue::setConfig(RclConfig *cnf) { m_data->m_config = cnf; // Don't use ixinterval here, could be 0 ! Base the default // delayed reindex delay on the default ixinterval delay m_data->readDelayPats(10 * dfltixinterval); } RclConfig *RclMonEventQueue::getConfig() { return m_data->m_config; } bool RclMonEventQueue::ok() { if (m_data == 0) { LOGINFO("RclMonEventQueue: not ok: bad state\n" ); return false; } if (stopindexing) { LOGINFO("RclMonEventQueue: not ok: stop request\n" ); return false; } if (!m_data->m_ok) { LOGINFO("RclMonEventQueue: not ok: queue terminated\n" ); return false; } return true; } void RclMonEventQueue::setTerminate() { MONDEB("RclMonEventQueue:: setTerminate\n"); std::unique_lock lock(m_data->m_mutex); m_data->m_ok = false; m_data->m_cond.notify_all(); } // Must be called with the queue locked bool RclMonEventQueue::empty() { if (m_data == 0) { MONDEB("RclMonEventQueue::empty(): true (m_data==0)\n"); return true; } if (!m_data->m_iqueue.empty()) { MONDEB("RclMonEventQueue::empty(): false (m_iqueue not empty)\n"); return true; } if (m_data->m_dqueue.empty()) { MONDEB("RclMonEventQueue::empty(): true (m_Xqueue both empty)\n"); return true; } // Only dqueue has events. Have to check the delays (only the // first, earliest one): queue_type::iterator qit = *(m_data->m_delays.begin()); if (qit->second.m_minclock > time(0)) { MONDEB("RclMonEventQueue::empty(): true (no delay ready " << qit->second.m_minclock << ")\n"); return true; } MONDEB("RclMonEventQueue::empty(): returning false (delay expired)\n"); return false; } // Retrieve indexing event for processing. Returns empty event if // nothing interesting is found // Must be called with the queue locked RclMonEvent RclMonEventQueue::pop() { time_t now = time(0); MONDEB("RclMonEventQueue::pop(), now " << now << std::endl); // Look at the delayed events, get rid of the expired/unactive // ones, possibly return an expired/needidx one. while (!m_data->m_delays.empty()) { delays_type::iterator dit = m_data->m_delays.begin(); queue_type::iterator qit = *dit; MONDEB("RclMonEventQueue::pop(): in delays: evt minclock " << qit->second.m_minclock << std::endl); if (qit->second.m_minclock <= now) { if (qit->second.m_needidx) { RclMonEvent ev = qit->second; qit->second.m_minclock = time(0) + qit->second.m_itvsecs; qit->second.m_needidx = false; m_data->m_delays.erase(dit); m_data->delayInsert(qit); return ev; } else { // Delay elapsed without new update, get rid of event. m_data->m_dqueue.erase(qit); m_data->m_delays.erase(dit); } } else { // This and following events are for later processing, we // are done with the delayed event list. break; } } // Look for non-delayed event if (!m_data->m_iqueue.empty()) { queue_type::iterator qit = m_data->m_iqueue.begin(); RclMonEvent ev = qit->second; m_data->m_iqueue.erase(qit); return ev; } return RclMonEvent(); } // Add new event (update or delete) to the processing queue. // It seems that a newer event is always correct to override any // older. TBVerified ? // Some conf-designated files, supposedly updated at a high rate get // special processing to limit their reindexing rate. bool RclMonEventQueue::pushEvent(const RclMonEvent &ev) { MONDEB("RclMonEventQueue::pushEvent for " << ev.m_path << std::endl); std::unique_lock lock(m_data->m_mutex); DelayPat pat = m_data->searchDelayPats(ev.m_path); if (pat.seconds != 0) { // Using delayed reindex queue. Need to take care of minclock and also // insert into the in-minclock-order list queue_type::iterator qit = m_data->m_dqueue.find(ev.m_path); if (qit == m_data->m_dqueue.end()) { // Not there yet, insert new qit = m_data->m_dqueue.insert(queue_type::value_type(ev.m_path, ev)).first; // Set the time to next index to "now" as it has not been // indexed recently (otherwise it would still be in the // queue), and add the iterator to the delay queue. qit->second.m_minclock = time(0); qit->second.m_needidx = true; qit->second.m_itvsecs = pat.seconds; m_data->delayInsert(qit); } else { // Already in queue. Possibly update type but save minclock // (so no need to touch m_delays). Flag as needing indexing time_t saved_clock = qit->second.m_minclock; qit->second = ev; qit->second.m_minclock = saved_clock; qit->second.m_needidx = true; } } else { // Immediate event: just insert it, erasing any previously // existing entry m_data->m_iqueue[ev.m_path] = ev; } m_data->m_cond.notify_all(); return true; } static bool checkfileanddelete(const string& fname) { bool ret; ret = path_exists(fname); unlink(fname.c_str()); return ret; } // It's possible to override the normal indexing delay by creating a // file in the config directory (which we then remove). And yes there // is definitely a race condition (we can suppress the delay and file // before the target doc is queued), and we can't be sure that the // delay suppression will be used for the doc the user intended it // for. But this is used for non-critical function and the race // condition should happen reasonably seldom. // We check for the request file in all possible user config dirs // (usually, there is only the main one) static bool expeditedIndexingRequested(RclConfig *conf) { static vector rqfiles; if (rqfiles.empty()) { rqfiles.push_back(path_cat(conf->getConfDir(), "rclmonixnow")); const char *cp; if ((cp = getenv("RECOLL_CONFTOP"))) { rqfiles.push_back(path_cat(cp, "rclmonixnow")); } if ((cp = getenv("RECOLL_CONFMID"))) { rqfiles.push_back(path_cat(cp, "rclmonixnow")); } } bool found = false; for (vector::const_iterator it = rqfiles.begin(); it != rqfiles.end(); it++) { found = found || checkfileanddelete(*it); } return found; } bool startMonitor(RclConfig *conf, int opts) { if (!conf->getConfParam("monauxinterval", &auxinterval)) auxinterval = dfltauxinterval; if (!conf->getConfParam("monixinterval", &ixinterval)) ixinterval = dfltixinterval; rclEQ.setConfig(conf); rclEQ.setopts(opts); std::thread treceive(rclMonRcvRun, &rclEQ); treceive.detach(); LOGDEB("start_monitoring: entering main loop\n" ); bool timedout; time_t lastauxtime = time(0); time_t lastixtime = lastauxtime; time_t lastmovetime = 0; bool didsomething = false; list modified; list deleted; while (true) { time_t now = time(0); if (now - lastmovetime > ixinterval) { lastmovetime = now; runWebFilesMoverScript(conf); } { // Wait for event or timeout. // Set a relatively short timeout for better monitoring of // exit requests. std::unique_lock lock = rclEQ.wait(2, &timedout); // x11IsAlive() can't be called from ok() because both // threads call it and Xlib is not multithreaded. #ifndef _WIN32 bool x11dead = !(opts & RCLMON_NOX11) && !x11IsAlive(); if (x11dead) LOGDEB("RclMonprc: x11 is dead\n" ); #else bool x11dead = false; #endif if (!rclEQ.ok() || x11dead) { break; } // Process event queue for (;;) { // Retrieve event RclMonEvent ev = rclEQ.pop(); if (ev.m_path.empty()) break; switch (ev.evtype()) { case RclMonEvent::RCLEVT_MODIFY: case RclMonEvent::RCLEVT_DIRCREATE: LOGDEB0("Monitor: Modify/Check on " << ev.m_path << "\n"); modified.push_back(ev.m_path); break; case RclMonEvent::RCLEVT_DELETE: LOGDEB0("Monitor: Delete on " << (ev.m_path) << "\n" ); // If this is for a directory (which the caller should // tell us because he knows), we should purge the db // of all the subtree, because on a directory rename, // inotify will only generate one event for the // renamed top, not the subentries. This is relatively // complicated to do though, and we currently do not // do it, and just wait for a restart to do a full run and // purge. deleted.push_back(ev.m_path); if (ev.evflags() & RclMonEvent::RCLEVT_ISDIR) { vector paths; if (subtreelist(conf, ev.m_path, paths)) { deleted.insert(deleted.end(), paths.begin(), paths.end()); } } break; default: LOGDEB("Monitor: got Other on [" << (ev.m_path) << "]\n" ); } } } now = time(0); // Process. We don't do this every time but let the lists accumulate // a little, this saves processing. Start at once if list is big. if (expeditedIndexingRequested(conf) || (now - lastixtime > ixinterval) || (deleted.size() + modified.size() > 20)) { lastixtime = now; // Used to do the modified list first, but it does seem // smarter to make room first... if (!deleted.empty()) { deleted.sort(); deleted.unique(); if (!purgefiles(conf, deleted)) break; deleted.clear(); didsomething = true; } if (!modified.empty()) { modified.sort(); modified.unique(); if (!indexfiles(conf, modified)) break; modified.clear(); didsomething = true; } } // Recreate the auxiliary dbs every hour at most. now = time(0); if (didsomething && now - lastauxtime > auxinterval) { lastauxtime = now; didsomething = false; if (!createAuxDbs(conf)) { // We used to bail out on error here. Not anymore, // because this is most of the time due to a failure // of aspell dictionary generation, which is not // critical. } } // Check for a config change if (!(opts & RCLMON_NOCONFCHECK) && o_reexec && conf->sourceChanged()) { LOGDEB("Rclmonprc: config changed, reexecuting myself\n" ); // We never want to have a -n option after a config // change. -n was added by the reexec after the initial // pass even if it was not given on the command line o_reexec->removeArg("-n"); o_reexec->reexec(); } } LOGDEB("Rclmonprc: calling queue setTerminate\n" ); rclEQ.setTerminate(); // We used to wait for the receiver thread here before returning, // but this is not useful and may waste time / risk problems // during our limited time window for exiting. To be reviewed if // we ever need several monitor invocations in the same process // (can't foresee any reason why we'd want to do this). LOGDEB("Monitor: returning\n" ); return true; } #endif // RCL_MONITOR recoll-1.23.7/index/fsfetcher.h0000644000175000017500000000240213125527323013237 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FSFETCHER_H_INCLUDED_ #define _FSFETCHER_H_INCLUDED_ #include "fetcher.h" /** * The file-system fetcher: */ class FSDocFetcher : public DocFetcher{ /** FSDocFetcher::fetch always returns a file name */ virtual bool fetch(RclConfig* cnf, const Rcl::Doc& idoc, RawDoc& out); /** Calls stat to retrieve file signature data */ virtual bool makesig(RclConfig* cnf, const Rcl::Doc& idoc, string& sig); virtual ~FSDocFetcher() {} }; #endif /* _FSFETCHER_H_INCLUDED_ */ recoll-1.23.7/rcldb/0000755000175000017500000000000013224670235011157 500000000000000recoll-1.23.7/rcldb/rclquery.cpp0000644000175000017500000003366013224431525013456 00000000000000/* Copyright (C) 2008 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include "xapian.h" #include "cstr.h" #include "rclconfig.h" #include "log.h" #include "rcldb.h" #include "rcldb_p.h" #include "rclquery.h" #include "rclquery_p.h" #include "conftree.h" #include "smallut.h" #include "chrono.h" #include "searchdata.h" #include "unacpp.h" using namespace std; namespace Rcl { // This is used as a marker inside the abstract frag lists, but // normally doesn't remain in final output (which is built with a // custom sep. by our caller). static const string cstr_ellipsis("..."); // Field names inside the index data record may differ from the rcldoc ones // (esp.: caption / title) static const string& docfToDatf(const string& df) { if (!df.compare(Doc::keytt)) { return cstr_caption; } else if (!df.compare(Doc::keymt)) { return cstr_dmtime; } else { return df; } } // Sort helper class. As Xapian sorting is lexicographic, we do some // special processing for special fields like dates and sizes. User // custom field data will have to be processed before insertion to // achieve equivalent results. #if XAPIAN_MAJOR_VERSION == 1 && XAPIAN_MINOR_VERSION < 2 class QSorter : public Xapian::Sorter { #else class QSorter : public Xapian::KeyMaker { #endif public: QSorter(const string& f) : m_fld(docfToDatf(f) + "=") { m_ismtime = !m_fld.compare("dmtime="); if (m_ismtime) m_issize = false; else m_issize = !m_fld.compare("fbytes=") || !m_fld.compare("dbytes=") || !m_fld.compare("pcbytes="); } virtual std::string operator()(const Xapian::Document& xdoc) const { string data = xdoc.get_data(); // It would be simpler to do the record->Rcl::Doc thing, but // hand-doing this will be faster. It makes more assumptions // about the format than a ConfTree though: string::size_type i1, i2; i1 = data.find(m_fld); if (i1 == string::npos) { if (m_ismtime) { // Ugly: specialcase mtime as it's either dmtime or fmtime i1 = data.find("fmtime="); if (i1 == string::npos) { return string(); } } else { return string(); } } i1 += m_fld.length(); if (i1 >= data.length()) return string(); i2 = data.find_first_of("\n\r", i1); if (i2 == string::npos) return string(); string term = data.substr(i1, i2-i1); if (m_ismtime) { return term; } else if (m_issize) { // Left zeropad values for appropriate numeric sorting leftzeropad(term, 12); return term; } // Process data for better sorting. We should actually do the // unicode thing // (http://unicode.org/reports/tr10/#Introduction), but just // removing accents and majuscules will remove the most // glaring weirdnesses (or not, depending on your national // approach to collating...) string sortterm; // We're not even sure the term is utf8 here (ie: url) if (!unacmaybefold(term, sortterm, "UTF-8", UNACOP_UNACFOLD)) { sortterm = term; } // Also remove some common uninteresting starting characters i1 = sortterm.find_first_not_of(" \t\\\"'([*+,.#/"); if (i1 != 0 && i1 != string::npos) { sortterm = sortterm.substr(i1, sortterm.size()-i1); } LOGDEB2("QSorter: [" << (term) << "] -> [" << (sortterm) << "]\n" ); return sortterm; } private: string m_fld; bool m_ismtime; bool m_issize; }; Query::Query(Db *db) : m_nq(new Native(this)), m_db(db), m_sorter(0), m_sortAscending(true), m_collapseDuplicates(false), m_resCnt(-1), m_snipMaxPosWalk(1000000) { if (db) db->getConf()->getConfParam("snippetMaxPosWalk", &m_snipMaxPosWalk); } Query::~Query() { deleteZ(m_nq); if (m_sorter) { delete (QSorter*)m_sorter; m_sorter = 0; } } void Query::setSortBy(const string& fld, bool ascending) { if (fld.empty()) { m_sortField.erase(); } else { m_sortField = m_db->getConf()->fieldQCanon(fld); m_sortAscending = ascending; } LOGDEB0("RclQuery::setSortBy: [" << (m_sortField) << "] " << (m_sortAscending ? "ascending" : "descending") << "\n" ); } //#define ISNULL(X) (X).isNull() #define ISNULL(X) !(X) // Prepare query out of user search data bool Query::setQuery(std::shared_ptr sdata) { LOGDEB("Query::setQuery:\n" ); if (!m_db || ISNULL(m_nq)) { LOGERR("Query::setQuery: not initialised!\n" ); return false; } m_resCnt = -1; m_reason.erase(); m_nq->clear(); m_sd = sdata; Xapian::Query xq; if (!sdata->toNativeQuery(*m_db, &xq)) { m_reason += sdata->getReason(); return false; } m_nq->xquery = xq; string d; for (int tries = 0; tries < 2; tries++) { try { m_nq->xenquire = new Xapian::Enquire(m_db->m_ndb->xrdb); if (m_collapseDuplicates) { m_nq->xenquire->set_collapse_key(Rcl::VALUE_MD5); } else { m_nq->xenquire->set_collapse_key(Xapian::BAD_VALUENO); } m_nq->xenquire->set_docid_order(Xapian::Enquire::DONT_CARE); if (!m_sortField.empty() && stringlowercmp("relevancyrating", m_sortField)) { if (m_sorter) { delete (QSorter*)m_sorter; m_sorter = 0; } m_sorter = new QSorter(m_sortField); // It really seems there is a xapian bug about sort order, we // invert here. m_nq->xenquire->set_sort_by_key((QSorter*)m_sorter, !m_sortAscending); } m_nq->xenquire->set_query(m_nq->xquery); m_nq->xmset = Xapian::MSet(); // Get the query description and trim the "Xapian::Query" d = m_nq->xquery.get_description(); m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_db->m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGDEB("Query::SetQuery: xapian error " << (m_reason) << "\n" ); return false; } if (d.find("Xapian::Query") == 0) d.erase(0, strlen("Xapian::Query")); sdata->setDescription(d); m_sd = sdata; LOGDEB("Query::SetQuery: Q: " << (sdata->getDescription()) << "\n" ); return true; } bool Query::getQueryTerms(vector& terms) { if (ISNULL(m_nq)) return false; terms.clear(); Xapian::TermIterator it; string ermsg; try { for (it = m_nq->xquery.get_terms_begin(); it != m_nq->xquery.get_terms_end(); it++) { terms.push_back(*it); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("getQueryTerms: xapian error: " << (ermsg) << "\n" ); return false; } return true; } int Query::makeDocAbstract(const Doc &doc, vector& abstract, int maxoccs, int ctxwords) { LOGDEB("makeDocAbstract: maxoccs " << (maxoccs) << " ctxwords " << (ctxwords) << "\n" ); if (!m_db || !m_db->m_ndb || !m_db->m_ndb->m_isopen || !m_nq) { LOGERR("Query::makeDocAbstract: no db or no nq\n" ); return ABSRES_ERROR; } int ret = ABSRES_ERROR; XAPTRY(ret = m_nq->makeAbstract(doc.xdocid, abstract, maxoccs, ctxwords), m_db->m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGDEB("makeDocAbstract: makeAbstract error, reason: " << (m_reason) << "\n" ); return ABSRES_ERROR; } return ret; } bool Query::makeDocAbstract(const Doc &doc, vector& abstract) { vector vpabs; if (!makeDocAbstract(doc, vpabs)) return false; for (vector::const_iterator it = vpabs.begin(); it != vpabs.end(); it++) { string chunk; if (it->page > 0) { ostringstream ss; ss << it->page; chunk += string(" [p ") + ss.str() + "] "; } chunk += it->snippet; abstract.push_back(chunk); } return true; } bool Query::makeDocAbstract(const Doc &doc, string& abstract) { vector vpabs; if (!makeDocAbstract(doc, vpabs)) return false; for (vector::const_iterator it = vpabs.begin(); it != vpabs.end(); it++) { abstract.append(it->snippet); abstract.append(cstr_ellipsis); } return m_reason.empty() ? true : false; } int Query::getFirstMatchPage(const Doc &doc, string& term) { LOGDEB1("Db::getFirstMatchPage\n" );; if (!m_nq) { LOGERR("Query::getFirstMatchPage: no nq\n" ); return false; } int pagenum = -1; XAPTRY(pagenum = m_nq->getFirstMatchPage(Xapian::docid(doc.xdocid), term), m_db->m_ndb->xrdb, m_reason); return m_reason.empty() ? pagenum : -1; } // Mset size static const int qquantum = 50; // Get estimated result count for query. Xapian actually does most of // the search job in there, this can be long int Query::getResCnt() { if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR("Query::getResCnt: no query opened\n" ); return -1; } if (m_resCnt >= 0) return m_resCnt; m_resCnt = -1; if (m_nq->xmset.size() <= 0) { Chrono chron; XAPTRY(m_nq->xmset = m_nq->xenquire->get_mset(0, qquantum, 1000); m_resCnt = m_nq->xmset.get_matches_lower_bound(), m_db->m_ndb->xrdb, m_reason); LOGDEB("Query::getResCnt: " << (m_resCnt) << " " << (chron.millis()) << " mS\n" ); if (!m_reason.empty()) LOGERR("xenquire->get_mset: exception: " << (m_reason) << "\n" ); } else { m_resCnt = m_nq->xmset.get_matches_lower_bound(); } return m_resCnt; } // Get document at rank xapi in query results. We check if the // current mset has the doc, else ask for an other one. We use msets // of qquantum documents. // // Note that as stated by a Xapian developer, Enquire searches from // scratch each time get_mset() is called. So the better performance // on subsequent calls is probably only due to disk caching. bool Query::getDoc(int xapi, Doc &doc) { LOGDEB1("Query::getDoc: xapian enquire index " << (xapi) << "\n" ); if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR("Query::getDoc: no query opened\n" ); return false; } int first = m_nq->xmset.get_firstitem(); int last = first + m_nq->xmset.size() -1; if (!(xapi >= first && xapi <= last)) { LOGDEB("Fetching for first " << (xapi) << ", count " << (qquantum) << "\n" ); XAPTRY(m_nq->xmset = m_nq->xenquire->get_mset(xapi, qquantum, (const Xapian::RSet *)0), m_db->m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("enquire->get_mset: exception: " << (m_reason) << "\n" ); return false; } if (m_nq->xmset.empty()) { LOGDEB("enquire->get_mset: got empty result\n" ); return false; } first = m_nq->xmset.get_firstitem(); last = first + m_nq->xmset.size() -1; } Xapian::Document xdoc; Xapian::docid docid = 0; int pc = 0; int collapsecount = 0; string data; string udi; m_reason.erase(); for (int xaptries=0; xaptries < 2; xaptries++) { try { xdoc = m_nq->xmset[xapi-first].get_document(); collapsecount = m_nq->xmset[xapi-first].get_collapse_count(); docid = *(m_nq->xmset[xapi-first]); pc = m_nq->xmset.convert_to_percent(m_nq->xmset[xapi-first]); data = xdoc.get_data(); m_reason.erase(); Chrono chron; m_db->m_ndb->xdocToUdi(xdoc, udi); LOGDEB2("Query::getDoc: " << (chron.millis()) << " ms for udi [" << (udi) << "], collapse count " << (collapsecount) << "\n" ); break; } catch (Xapian::DatabaseModifiedError &error) { // retry or end of loop m_reason = error.get_msg(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR("Query::getDoc: " << (m_reason) << "\n" ); return false; } doc.meta[Rcl::Doc::keyudi] = udi; doc.pc = pc; char buf[200]; if (collapsecount > 0) { sprintf(buf,"%3d%% (%d)", pc, collapsecount + 1); } else { sprintf(buf,"%3d%%", pc); } doc.meta[Doc::keyrr] = buf; if (collapsecount > 0) { sprintf(buf, "%d", collapsecount); doc.meta[Rcl::Doc::keycc] = buf; } // Parse xapian document's data and populate doc fields return m_db->m_ndb->dbDataToRclDoc(docid, data, doc); } vector Query::expand(const Doc &doc) { LOGDEB("Rcl::Query::expand()\n" ); vector res; if (ISNULL(m_nq) || !m_nq->xenquire) { LOGERR("Query::expand: no query opened\n" ); return res; } for (int tries = 0; tries < 2; tries++) { try { Xapian::RSet rset; rset.add_document(Xapian::docid(doc.xdocid)); // We don't exclude the original query terms. Xapian::ESet eset = m_nq->xenquire->get_eset(20, rset, false); LOGDEB("ESet terms:\n" ); // We filter out the special terms for (Xapian::ESetIterator it = eset.begin(); it != eset.end(); it++) { LOGDEB(" [" << ((*it)) << "]\n" ); if ((*it).empty() || has_prefix(*it)) continue; res.push_back(*it); if (res.size() >= 10) break; } m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_db->m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR("Query::expand: xapian error " << (m_reason) << "\n" ); res.clear(); } return res; } } recoll-1.23.7/rcldb/termproc.h0000644000175000017500000002345413125637102013107 00000000000000/* Copyright (C) 2011 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _TERMPROC_H_INCLUDED_ #define _TERMPROC_H_INCLUDED_ #include #include #include "textsplit.h" #include "stoplist.h" #include "smallut.h" #include "utf8iter.h" namespace Rcl { /** * Termproc objects take term tokens as input and do something * with them: transform to lowercase, filter out stop words, generate n-grams, * finally index or generate search clauses, etc. They are chained and can * be arranged to form different pipelines depending on the desired processing * steps: for example, optional stoplist or commongram processing. * * Shared processing steps are defined in this file. The first and last steps * are usually defined in the specific module. * - The front TermProc is typically chained from a TextSplit object * which generates the original terms, and calls takeword() from its * own takeword() method. * - The last TermProc does something with the finalized terms, e.g. adds * them to the index. */ /** * The base class takes care of chaining: all derived classes call its * takeword() and flush() methods to ensure that terms go through the pipe. */ class TermProc { public: TermProc(TermProc* next) : m_next(next) {} virtual ~TermProc() {} virtual bool takeword(const string &term, int pos, int bs, int be) { if (m_next) return m_next->takeword(term, pos, bs, be); else return true; } // newpage() is like takeword(), but for page breaks. virtual void newpage(int pos) { if (m_next) m_next->newpage(pos); } virtual bool flush() { if (m_next) return m_next->flush(); else return true; } private: TermProc *m_next; /* Copyconst and assignment private and forbidden */ TermProc(const TermProc &) {} TermProc& operator=(const TermProc &) { return *this; }; }; /** * Helper specialized TextSplit class, feeds the pipeline: * - The takeword() method calls a TermProc->takeword(). * - The text_to_words() method also takes care of flushing. * Both methods can be further specialized by the user (they should then call * the base methods when they've done the local processing). */ class TextSplitP : public TextSplit { public: TextSplitP(TermProc *prc, Flags flags = Flags(TXTS_NONE)) : TextSplit(flags), m_prc(prc) {} virtual bool text_to_words(const string &in) { bool ret = TextSplit::text_to_words(in); if (m_prc && !m_prc->flush()) return false; return ret; } virtual bool takeword(const string& term, int pos, int bs, int be) { if (m_prc) return m_prc->takeword(term, pos, bs, be); else return true; } virtual void newpage(int pos) { if (m_prc) return m_prc->newpage(pos); } private: TermProc *m_prc; }; /** Unaccent and lowercase term. If the index is * not case/diac-sensitive, this is usually the first step in the pipeline */ class TermProcPrep : public TermProc { public: TermProcPrep(TermProc *nxt) : TermProc(nxt), m_totalterms(0), m_unacerrors(0) { } virtual bool takeword(const string& itrm, int pos, int bs, int be) { m_totalterms++; string otrm; if (!unacmaybefold(itrm, otrm, "UTF-8", UNACOP_UNACFOLD)) { LOGDEB("splitter::takeword: unac [" << itrm << "] failed\n"); m_unacerrors++; // We don't generate a fatal error because of a bad term, // but one has to put the limit somewhere if (m_unacerrors > 500 && (double(m_totalterms) / double(m_unacerrors)) < 2.0) { // More than 1 error for every other term LOGERR("splitter::takeword: too many unac errors " << m_unacerrors << "/" << m_totalterms << "\n"); return false; } return true; } if (otrm.empty()) { // It may happen in some weird cases that the output from // unac is empty (if the word actually consisted entirely // of diacritics ...) The consequence is that a phrase // search won't work without addional slack. return true; } // We should have a Japanese stemmer to handle this, but for // experimenting, let's do it here: remove 'prolounged sound // mark' and its halfwidth variant from the end of terms. if ((unsigned int)otrm[0] > 127) { Utf8Iter it(otrm); if (TextSplit::isKATAKANA(*it)) { Utf8Iter itprev = it; while (*it != (unsigned int)-1) { itprev = it; it++; } if (*itprev == 0x30fc || *itprev == 0xff70) { otrm = otrm.substr(0, itprev.getBpos()); } } } if (otrm.empty()) { return true; } // It may also occur that unac introduces spaces in the string // (when removing isolated accents, may happen for Greek // for example). This is a pathological situation. We // index all the resulting terms at the same pos because // the surrounding code is not designed to handle a pos // change in here. This means that phrase searches and // snippets will be wrong, but at least searching for the // terms will work. bool hasspace = false; for (string::const_iterator it = otrm.begin();it < otrm.end();it++) { if (*it == ' ') { hasspace=true; break; } } if (hasspace) { std::vector terms; stringToTokens(otrm, terms, " ", true); for (std::vector::const_iterator it = terms.begin(); it < terms.end(); it++) { if (!TermProc::takeword(*it, pos, bs, be)) { return false; } } return true; } else { return TermProc::takeword(otrm, pos, bs, be); } } virtual bool flush() { m_totalterms = m_unacerrors = 0; return TermProc::flush(); } private: int m_totalterms; int m_unacerrors; }; /** Compare to stop words list and discard if match found */ class TermProcStop : public TermProc { public: TermProcStop(TermProc *nxt, const Rcl::StopList& stops) : TermProc(nxt), m_stops(stops) { } virtual bool takeword(const string& term, int pos, int bs, int be) { if (m_stops.isStop(term)) { return true; } return TermProc::takeword(term, pos, bs, be); } private: const Rcl::StopList& m_stops; }; /** Handle common-gram generation: combine frequent terms with neighbours to * shorten the positions lists for phrase searches. * NOTE: This does not currently work because of bad interaction with the * spans (ie john@domain.com) generation in textsplit. Not used, kept for * testing only */ class TermProcCommongrams : public TermProc { public: TermProcCommongrams(TermProc *nxt, const Rcl::StopList& stops) : TermProc(nxt), m_stops(stops), m_onlygrams(false) { } virtual bool takeword(const string& term, int pos, int bs, int be) { LOGDEB1("TermProcCom::takeword: pos " << (pos) << " " << (bs) << " " << (be) << " [" << (term) << "]\n" ); bool isstop = m_stops.isStop(term); bool twogramemit = false; if (!m_prevterm.empty() && (m_prevstop || isstop)) { // create 2-gram. space unnecessary but improves // the readability of queries string twogram; twogram.swap(m_prevterm); twogram.append(1, ' '); twogram += term; // When emitting a complex term we set the bps to 0. This may // be used by our clients if (!TermProc::takeword(twogram, m_prevpos, 0, 0)) return false; twogramemit = true; #if 0 if (m_stops.isStop(twogram)) { firstword = twogram; isstop = false; } #endif } m_prevterm = term; m_prevstop = isstop; m_prevpos = pos; m_prevsent = false; m_prevbs = bs; m_prevbe = be; // If flags allow, emit the bare term at the current pos. if (!m_onlygrams || (!isstop && !twogramemit)) { if (!TermProc::takeword(term, pos, bs, be)) return false; m_prevsent = true; } return true; } virtual bool flush() { if (!m_prevsent && !m_prevterm.empty()) if (!TermProc::takeword(m_prevterm, m_prevpos, m_prevbs, m_prevbe)) return false; m_prevterm.clear(); m_prevsent = true; return TermProc::flush(); } void onlygrams(bool on) { m_onlygrams = on; } private: // The stoplist we're using const Rcl::StopList& m_stops; // Remembered data for the last processed term string m_prevterm; bool m_prevstop; int m_prevpos; int m_prevbs; int m_prevbe; bool m_prevsent; // If this is set, we only emit longest grams bool m_onlygrams; }; } // End namespace Rcl #endif /* _TERMPROC_H_INCLUDED_ */ recoll-1.23.7/rcldb/expansiondbs.h0000644000175000017500000000420613125637102013743 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EXPANSIONDBS_H_INCLUDED_ #define _EXPANSIONDBS_H_INCLUDED_ #include #include #include #include "unacpp.h" #include "synfamily.h" /** Specialization and overall creation code for the term expansion mechanism * defined in synfamily.h */ namespace Rcl { /** A Capitals/Diacritics removal functor for using with * XapComputableSynFamMember. The input term transformation always uses * UNACFOLD. Post-expansion filtering uses either UNAC or FOLD */ class SynTermTransUnac : public SynTermTrans { public: /** Constructor * @param op defines if we remove diacritics, case or both */ SynTermTransUnac(UnacOp op) : m_op(op) { } virtual std::string name() { std::string nm("Unac: "); if (m_op & UNACOP_UNAC) nm += "UNAC "; if (m_op & UNACOP_FOLD) nm += "FOLD "; return nm; } virtual std::string operator()(const std::string& in) { string out; unacmaybefold(in, out, "UTF-8", m_op); LOGDEB2("SynTermTransUnac(" << (int(m_op)) << "): in [" << (in) << "] out [" << (out) << "]\n" ); return out; } UnacOp m_op; }; /** Walk the Xapian term list and create all the expansion dbs in one go. */ extern bool createExpansionDbs(Xapian::WritableDatabase& wdb, const std::vector& langs); } #endif /* _EXPANSIONDBS_H_INCLUDED_ */ recoll-1.23.7/rcldb/stemdb.h0000644000175000017500000000731413125637102012527 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STEMDB_H_INCLUDED_ #define _STEMDB_H_INCLUDED_ /** Stem database code * * Stem databases list stems and the set of index terms they expand to. They * are computed from index data by stemming each term and regrouping those * that stem to the same value. * * Stem databases are stored as separate Xapian databases, in * subdirectories of the index (e.g.: stem_french, stem_german2) * * The stem database is generated at the end of an indexing session by * walking the whole index term list, computing the stem for each * term, and building a stem->terms map. * * The map is then stored as a Xapian index where each stem is the * unique term indexing a document, and the list of expansions is stored * as the document data record. It would probably be possible to store * the expansions as the document term list instead (using a prefix to * distinguish the stem term). I tried this (chert, 08-2012) and the stem * db creation is very slightly slower than with the record approach, and * the result is 50% bigger. * * Another possible approach would be to update the stem map as we index. * This would probably be be less efficient for a full index pass because * each term would be seen and stemmed many times, but it might be * more efficient for an incremental pass with a limited number of * updated documents. For a small update, the stem building part often * dominates the indexing time. * * For future reference, I did try to store the map in a gdbm file and * the result is bigger and takes more time to create than the Xapian version. */ #include #include #include #include "synfamily.h" namespace Rcl { /* A stemming functor for using with XapComputableSynFamMember. * We could perform the change to lowercase in there too, as stemdb keys * must be lower case, but then the input conversion would be repeated for each * stemming language, which would be inefficient. So we let our caller make sure * that the input is lower-case */ class SynTermTransStem : public SynTermTrans { public: SynTermTransStem(const std::string& lang) : m_stemmer(lang), m_lang(lang) { } virtual ~SynTermTransStem() {} virtual std::string operator()(const std::string& in) { string out = m_stemmer(in); LOGDEB2("SynTermTransStem(" << (m_lang) << "): in [" << (in) << "] out [" << (out) << "]\n" ); return out; } Xapian::Stem m_stemmer; std::string m_lang; }; /** Stemdb is a bit special as a SynFamily as we may want to expand for one * or several members (languages) */ class StemDb : public XapSynFamily { public: StemDb(Xapian::Database& xdb) : XapSynFamily(xdb, synFamStem) { } /** Expand for a number of languages * @param langs space-separated set of languages * @param term term to expand */ bool stemExpand(const std::string& langs, const std::string& term, std::vector& result); }; } #endif /* _STEMDB_H_INCLUDED_ */ recoll-1.23.7/rcldb/expansiondbs.cpp0000644000175000017500000001167413125637102014305 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "log.h" #include "utf8iter.h" #include "smallut.h" #include "chrono.h" #include "textsplit.h" #include "xmacros.h" #include "rcldb.h" #include "stemdb.h" #include "expansiondbs.h" using namespace std; namespace Rcl { /** * Create all expansion dbs used to transform user input term to widen a query * We use Xapian synonyms subsets to store the expansions. */ bool createExpansionDbs(Xapian::WritableDatabase& wdb, const vector& langs) { LOGDEB("StemDb::createExpansionDbs: languages: " << (stringsToString(langs)) << "\n" ); Chrono cron; // Erase and recreate all the expansion groups // If langs is empty and we don't need casediac expansion, then no need to // walk the big list if (langs.empty()) { if (o_index_stripchars) return true; } // Walk the list of all terms, and stem/unac each. string ermsg; try { // Stem dbs vector stemdbs; // Note: tried to make this to work with stack-allocated objects, couldn't. // Looks like a bug in copy constructors somewhere, can't guess where vector > stemmers; for (unsigned int i = 0; i < langs.size(); i++) { stemmers.push_back(std::shared_ptr (new SynTermTransStem(langs[i]))); stemdbs.push_back( XapWritableComputableSynFamMember(wdb, synFamStem, langs[i], stemmers.back().get())); stemdbs.back().recreate(); } // Unaccented stem dbs vector unacstemdbs; // We can reuse the same stemmer pointers, the objects are stateless. if (!o_index_stripchars) { for (unsigned int i = 0; i < langs.size(); i++) { unacstemdbs.push_back( XapWritableComputableSynFamMember(wdb, synFamStemUnac, langs[i], stemmers.back().get())); unacstemdbs.back().recreate(); } } SynTermTransUnac transunac(UNACOP_UNACFOLD); XapWritableComputableSynFamMember diacasedb(wdb, synFamDiCa, "all", &transunac); if (!o_index_stripchars) diacasedb.recreate(); Xapian::TermIterator it = wdb.allterms_begin(); // We'd want to skip to the first non-prefixed term, but this is a bit // complicated, so we just jump over most of the prefixed term and then // skip the rest one by one. it.skip_to(wrap_prefix("Z")); for ( ;it != wdb.allterms_end(); it++) { if (has_prefix(*it)) continue; // Detect and skip CJK terms. Utf8Iter utfit(*it); if (utfit.eof()) // Empty term?? Seems to happen. continue; if (TextSplit::isCJK(*utfit)) { // LOGDEB("stemskipped: Skipping CJK\n" ); continue; } string lower = *it; // If the index is raw, compute the case-folded term which // is the input to the stem db, and add a synonym from the // stripped term to the cased and accented one, for accent // and case expansion at query time if (!o_index_stripchars) { unacmaybefold(*it, lower, "UTF-8", UNACOP_FOLD); diacasedb.addSynonym(*it); } // Dont' apply stemming to terms which don't look like // natural language words. if (!Db::isSpellingCandidate(*it)) { LOGDEB1("createExpansionDbs: skipped: [" << ((*it)) << "]\n" ); continue; } // Create stemming synonym for every language. The input is the // lowercase accented term for (unsigned int i = 0; i < langs.size(); i++) { stemdbs[i].addSynonym(lower); } // For a raw index, also maybe create a stem expansion for // the unaccented term. While this may be incorrect, it is // also necessary for searching in a diacritic-unsensitive // way on a raw index if (!o_index_stripchars) { string unac; unacmaybefold(lower, unac, "UTF-8", UNACOP_UNAC); if (unac != lower) { for (unsigned int i = 0; i < langs.size(); i++) { unacstemdbs[i].addSynonym(unac); } } } } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::createStemDb: map build failed: " << (ermsg) << "\n" ); return false; } LOGDEB("StemDb::createExpansionDbs: done: " << (cron.secs()) << " S\n" ); return true; } } recoll-1.23.7/rcldb/daterange.h0000644000175000017500000000035613125527323013205 00000000000000#ifndef _DATERANGE_H_INCLUDED_ #define _DATERANGE_H_INCLUDED_ #include namespace Rcl { extern Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2); } #endif /* _DATERANGE_H_INCLUDED_ */ recoll-1.23.7/rcldb/rcldups.cpp0000644000175000017500000000615413125637102013261 00000000000000/* Copyright (C) 2013 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ //////////////////////////////////////////////////////////////////// #include "autoconfig.h" #include using namespace std; #include #include "log.h" #include "rcldb.h" #include "rcldb_p.h" #include "xmacros.h" #include "md5ut.h" #include "searchdata.h" #include "rclquery.h" namespace Rcl { /** Retrieve the dups of a given document. The input has to be a query result * because we use the xdocid. We get the md5 from this, then the dups */ bool Db::docDups(const Doc& idoc, vector& odocs) { if (m_ndb == 0) { LOGERR("Db::docDups: no db\n" ); return false; } if (idoc.xdocid == 0) { LOGERR("Db::docDups: null xdocid in input doc\n" ); return false; } // Get the xapian doc Xapian::Document xdoc; XAPTRY(xdoc = m_ndb->xrdb.get_document(Xapian::docid(idoc.xdocid)), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::docDups: xapian error: " << (m_reason) << "\n" ); return false; } // Get the md5 string digest; XAPTRY(digest = xdoc.get_value(VALUE_MD5), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::docDups: xapian error: " << (m_reason) << "\n" ); return false; } if (digest.empty()) { LOGDEB("Db::docDups: doc has no md5\n" ); return false; } string md5; MD5HexPrint(digest, md5); SearchData *sdp = new SearchData(); std::shared_ptr sd(sdp); SearchDataClauseSimple *sdc = new SearchDataClauseSimple(SCLT_AND, md5, "rclmd5"); sdc->addModifier(SearchDataClause::SDCM_CASESENS); sdc->addModifier(SearchDataClause::SDCM_DIACSENS); sd->addClause(sdc); Query query(this); query.setCollapseDuplicates(0); if (!query.setQuery(sd)) { LOGERR("Db::docDups: setQuery failed\n" ); return false; } int cnt = query.getResCnt(); for (int i = 0; i < cnt; i++) { Doc doc; if (!query.getDoc(i, doc)) { LOGERR("Db::docDups: getDoc failed at " << (i) << " (cnt " << (cnt) << ")\n" ); return false; } odocs.push_back(doc); } return true; } #if 0 { vector dups; bool ret; LOGDEB("DOCDUPS\n" ); ret = m_db->docDups(doc, dups); if (!ret) { LOGDEB("docDups failed\n" ); } else if (dups.size() == 1) { LOGDEB("No dups\n" ); } else { for (unsigned int i = 0; i < dups.size(); i++) { LOGDEB("Dup: " << (dups[i].url) << "\n" ); } } } #endif } recoll-1.23.7/rcldb/searchdata.h0000644000175000017500000003760313224501057013353 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SEARCHDATA_H_INCLUDED_ #define _SEARCHDATA_H_INCLUDED_ /** * Structures to hold data coming almost directly from the gui * and handle its translation to Xapian queries. * This is not generic code, it reflects the choices made for the user * interface, and it also knows some specific of recoll's usage of Xapian * (ie: term prefixes) */ #include #include #include #include "rcldb.h" #include #include "smallut.h" #include "cstr.h" #include "hldata.h" class RclConfig; class AdvSearch; namespace Rcl { /** Search clause types */ enum SClType { SCLT_AND, SCLT_OR, SCLT_FILENAME, SCLT_PHRASE, SCLT_NEAR, SCLT_PATH, SCLT_SUB }; class SearchDataClause; class SearchDataClauseDist; /** A SearchData object represents a Recoll user query, for translation into a Xapian query tree. This could probably better called a 'question'. This is a list of SearchDataClause objects combined through either OR or AND. Clauses either reflect user entry in a query field: some text, a clause type (AND/OR/NEAR etc.), possibly a distance, or are the result of parsing query language input. A clause can also point to another SearchData representing a subquery. The content of each clause when added may not be fully parsed yet (may come directly from a gui field). It will be parsed and may be translated to several queries in the Xapian sense, for exemple several terms and phrases as would result from ["this is a phrase" term1 term2] . This is why the clauses also have an AND/OR/... type. They are an intermediate form between the primary user input and the final Xapian::Query tree. For example, a phrase clause could be added either explicitly or using double quotes: {SCLT_PHRASE, [this is a phrase]} or as {SCLT_XXX, ["this is a phrase"]} */ class SearchData { public: SearchData(SClType tp, const string& stemlang) : m_tp(tp), m_stemlang(stemlang) { if (m_tp != SCLT_OR && m_tp != SCLT_AND) m_tp = SCLT_OR; commoninit(); } SearchData() : m_tp(SCLT_AND) { commoninit(); } ~SearchData(); /** Is there anything but a file name search in here ? */ bool fileNameOnly(); /** Do we have wildcards anywhere apart from filename searches ? */ bool haveWildCards() {return m_haveWildCards;} /** Translate to Xapian query. rcldb knows about the void* */ bool toNativeQuery(Rcl::Db &db, void *); /** We become the owner of cl and will delete it */ bool addClause(SearchDataClause* cl); /** If this is a simple query (one field only, no distance clauses), * add phrase made of query terms to query, so that docs containing the * user terms in order will have higher relevance. This must be called * before toNativeQuery(). * @param threshold: don't use terms more frequent than the value * (proportion of docs where they occur) */ bool maybeAddAutoPhrase(Rcl::Db &db, double threshold); const std::string& getStemLang() {return m_stemlang;} void setMinSize(size_t size) {m_minSize = size;} void setMaxSize(size_t size) {m_maxSize = size;} /** Set date span for filtering results */ void setDateSpan(DateInterval *dip) {m_dates = *dip; m_haveDates = true;} /** Add file type for filtering results */ void addFiletype(const std::string& ft) {m_filetypes.push_back(ft);} /** Add file type to not wanted list */ void remFiletype(const std::string& ft) {m_nfiletypes.push_back(ft);} /** Retrieve error description */ std::string getReason() {return m_reason;} /** Return term expansion data. Mostly used by caller for highlighting */ void getTerms(HighlightData& hldata) const; /** * Get/set the description field which is retrieved from xapian after * initializing the query. It is stored here for usage in the GUI. */ std::string getDescription() {return m_description;} void setDescription(const std::string& d) {m_description = d;} /** Return an XML version of the contents, for storage in search history by the GUI */ string asXML(); void setTp(SClType tp) { m_tp = tp; } SClType getTp() { return m_tp; } void setMaxExpand(int max) { m_softmaxexpand = max; } bool getAutoDiac() {return m_autodiacsens;} bool getAutoCase() {return m_autocasesens;} int getMaxExp() {return m_maxexp;} int getMaxCl() {return m_maxcl;} int getSoftMaxExp() {return m_softmaxexpand;} void dump(ostream& o) const; friend class ::AdvSearch; private: // Combine type. Only SCLT_AND or SCLT_OR here SClType m_tp; // The clauses std::vector m_query; // Restricted set of filetypes if not empty. std::vector m_filetypes; // Excluded set of file types if not empty std::vector m_nfiletypes; // Autophrase if set. Can't be part of the normal chain because // it uses OP_AND_MAYBE std::shared_ptr m_autophrase; // Special stuff produced by input which looks like a clause but means // something else (date and size specs) bool m_haveDates; DateInterval m_dates; // Restrict to date interval size_t m_maxSize; size_t m_minSize; // Printable expanded version of the complete query, retrieved/set // from rcldb after the Xapian::setQuery() call std::string m_description; // Error diag std::string m_reason; bool m_haveWildCards; std::string m_stemlang; // Parameters set at the start of ToNativeQuery because they need // an rclconfig. Actually this does not make sense and it would be // simpler to just pass an rclconfig to the constructor; bool m_autodiacsens; bool m_autocasesens; int m_maxexp; int m_maxcl; // Parameters which are not part of the main query data but may influence // translation in special cases. // Maximum TermMatch (e.g. wildcard) expansion. This is normally set // from the configuration with a high default, but may be set to a lower // value during "find-as-you-type" operations from the GUI int m_softmaxexpand; // Collapse bogus subqueries generated by the query parser, mostly // so that we can check if this is an autophrase candidate (else // Xapian will do it anyway) void simplify(); bool expandFileTypes(Rcl::Db &db, std::vector& exptps); bool clausesToQuery(Rcl::Db &db, SClType tp, std::vector& query, string& reason, void *d); void commoninit(); /* Copyconst and assignment private and forbidden */ SearchData(const SearchData &) {} SearchData& operator=(const SearchData&) {return *this;}; }; class SearchDataClause { public: enum Modifier {SDCM_NONE=0, SDCM_NOSTEMMING=0x1, SDCM_ANCHORSTART=0x2, SDCM_ANCHOREND=0x4, SDCM_CASESENS=0x8, SDCM_DIACSENS=0x10, SDCM_NOTERMS=0x20, // Don't include terms for highlighting SDCM_NOSYNS = 0x40, // Don't perform synonym expansion // Aargh special case. pathelts are case/diac-sensitive // even in a stripped index SDCM_PATHELT = 0x80, }; enum Relation {REL_CONTAINS, REL_EQUALS, REL_LT, REL_LTE, REL_GT, REL_GTE}; SearchDataClause(SClType tp) : m_tp(tp), m_parentSearch(0), m_haveWildCards(0), m_modifiers(SDCM_NONE), m_weight(1.0), m_exclude(false), m_rel(REL_CONTAINS) {} virtual ~SearchDataClause() {} virtual bool toNativeQuery(Rcl::Db &db, void *) = 0; bool isFileName() const {return m_tp == SCLT_FILENAME ? true: false;} virtual std::string getReason() const {return m_reason;} virtual void getTerms(HighlightData&) const {} SClType getTp() const { return m_tp; } void setTp(SClType tp) { m_tp = tp; } void setParent(SearchData *p) { m_parentSearch = p; } string getStemLang() { return (m_modifiers & SDCM_NOSTEMMING) || m_parentSearch == 0 ? cstr_null : m_parentSearch->getStemLang(); } bool getAutoDiac() { return m_parentSearch ? m_parentSearch->getAutoDiac() : false; } bool getAutoCase() { return m_parentSearch ? m_parentSearch->getAutoCase() : true; } int getMaxExp() { return m_parentSearch ? m_parentSearch->getMaxExp() : 10000; } size_t getMaxCl() { return m_parentSearch ? m_parentSearch->getMaxCl() : 100000; } int getSoftMaxExp() { return m_parentSearch ? m_parentSearch->getSoftMaxExp() : -1; } virtual void addModifier(Modifier mod) { m_modifiers = m_modifiers | mod; } virtual unsigned int getmodifiers() { return m_modifiers; } virtual void setWeight(float w) { m_weight = w; } virtual bool getexclude() const { return m_exclude; } virtual void setexclude(bool onoff) { m_exclude = onoff; } virtual void setrel(Relation rel) { m_rel = rel; } virtual Relation getrel() { return m_rel; } virtual void dump(ostream& o) const; friend class SearchData; protected: std::string m_reason; SClType m_tp; SearchData *m_parentSearch; bool m_haveWildCards; unsigned int m_modifiers; float m_weight; bool m_exclude; Relation m_rel; private: SearchDataClause(const SearchDataClause&) { } SearchDataClause& operator=(const SearchDataClause&) { return *this; } }; /** * "Simple" data clause with user-entered query text. This can include * multiple phrases and words, but no specified distance. */ class TermProcQ; class SearchDataClauseSimple : public SearchDataClause { public: SearchDataClauseSimple(SClType tp, const std::string& txt, const std::string& fld = std::string()) : SearchDataClause(tp), m_text(txt), m_field(fld), m_curcl(0) { m_haveWildCards = (txt.find_first_of(cstr_minwilds) != std::string::npos); } SearchDataClauseSimple(const std::string& txt, SClType tp) : SearchDataClause(tp), m_text(txt), m_curcl(0) { m_haveWildCards = (txt.find_first_of(cstr_minwilds) != std::string::npos); } virtual ~SearchDataClauseSimple() { } /** Translate to Xapian query */ virtual bool toNativeQuery(Rcl::Db &, void *); virtual void getTerms(HighlightData& hldata) const { hldata.append(m_hldata); } virtual const std::string& gettext() { return m_text; } virtual const std::string& getfield() { return m_field; } virtual void setfield(const string& field) { m_field = field; } virtual void dump(ostream& o) const; protected: std::string m_text; // Raw user entry text. std::string m_field; // Field specification if any HighlightData m_hldata; // Current count of Xapian clauses, to check against expansion limit size_t m_curcl; bool processUserString(Rcl::Db &db, const string &iq, std::string &ermsg, void* pq, int slack = 0, bool useNear = false); bool expandTerm(Rcl::Db &db, std::string& ermsg, int mods, const std::string& term, std::vector& exp, std::string& sterm, const std::string& prefix, std::vector* multiwords = 0); // After splitting entry on whitespace: process non-phrase element void processSimpleSpan(Rcl::Db &db, string& ermsg, const string& span, int mods, void *pq); // Process phrase/near element void processPhraseOrNear(Rcl::Db &db, string& ermsg, TermProcQ *splitData, int mods, void *pq, bool useNear, int slack); }; /** * Filename search clause. This is special because term expansion is only * performed against the unsplit file name terms. * * There is a big advantage in expanding only against the * field, especially for file names, because this makes searches for * "*xx" much faster (no need to scan the whole main index). */ class SearchDataClauseFilename : public SearchDataClauseSimple { public: SearchDataClauseFilename(const std::string& txt) : SearchDataClauseSimple(txt, SCLT_FILENAME) { // File name searches don't count when looking for wild cards. m_haveWildCards = false; } virtual ~SearchDataClauseFilename() { } virtual bool toNativeQuery(Rcl::Db &, void *); virtual void dump(ostream& o) const; }; /** * Pathname filtering clause. This is special because of history: * - Pathname filtering used to be performed as a post-processing step * done with the url fields of doc data records. * - Then it was done as special phrase searchs on path elements prefixed * with XP. * Up to this point dir filtering data was stored as part of the searchdata * object, not in the SearchDataClause tree. Only one, then a list, * of clauses where stored, and they were always ANDed together. * * In order to allow for OR searching, dir clauses are now stored in a * specific SearchDataClause, but this is still special because the field has * non-standard phrase-like processing, reflected in index storage by * an empty element representing / (as "XP"). * * A future version should use a standard phrase with an anchor to the * start if the path starts with /. As this implies an index format * change but is no important enough to warrant it, this has to wait for * the next format change. */ class SearchDataClausePath : public SearchDataClauseSimple { public: SearchDataClausePath(const std::string& txt, bool excl = false) : SearchDataClauseSimple(SCLT_PATH, txt, "dir") { m_exclude = excl; m_haveWildCards = false; } virtual ~SearchDataClausePath() { } virtual bool toNativeQuery(Rcl::Db &, void *); virtual void dump(ostream& o) const; }; /** * A clause coming from a NEAR or PHRASE entry field. There is only one * std::string group, and a specified distance, which applies to it. */ class SearchDataClauseDist : public SearchDataClauseSimple { public: SearchDataClauseDist(SClType tp, const std::string& txt, int slack, const std::string& fld = std::string()) : SearchDataClauseSimple(tp, txt, fld), m_slack(slack) { } virtual ~SearchDataClauseDist() { } virtual bool toNativeQuery(Rcl::Db &, void *); virtual int getslack() const { return m_slack; } virtual void setslack(int slack) { m_slack = slack; } virtual void dump(ostream& o) const; private: int m_slack; }; /** Subquery */ class SearchDataClauseSub : public SearchDataClause { public: SearchDataClauseSub(std::shared_ptr sub) : SearchDataClause(SCLT_SUB), m_sub(sub) { } virtual bool toNativeQuery(Rcl::Db &db, void *p) { bool ret = m_sub->toNativeQuery(db, p); if (!ret) m_reason = m_sub->getReason(); return ret; } virtual void getTerms(HighlightData& hldata) const { m_sub.get()->getTerms(hldata); } virtual std::shared_ptr getSub() { return m_sub; } virtual void dump(ostream& o) const; protected: std::shared_ptr m_sub; }; } // Namespace Rcl #endif /* _SEARCHDATA_H_INCLUDED_ */ recoll-1.23.7/rcldb/rclquery.h0000644000175000017500000001036213125637102013114 00000000000000/* Copyright (C) 2008 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _rclquery_h_included_ #define _rclquery_h_included_ #include #include #include #include "searchdata.h" #ifndef NO_NAMESPACES namespace Rcl { #endif class Db; class Doc; enum abstract_result { ABSRES_ERROR = 0, ABSRES_OK = 1, ABSRES_TRUNC = 2, ABSRES_TERMMISS = 4 }; // Snippet entry for makeDocAbstract class Snippet { public: Snippet(int page, const std::string& snip) : page(page), snippet(snip) { } Snippet& setTerm(const std::string& trm) { term = trm; return *this; } int page; std::string term; std::string snippet; }; /** * An Rcl::Query is a question (SearchData) applied to a * database. Handles access to the results. Somewhat equivalent to a * cursor in an rdb. * */ class Query { public: Query(Db *db); ~Query(); /** Get explanation about last error */ std::string getReason() const { return m_reason; } /** Choose sort order. Must be called before setQuery */ void setSortBy(const std::string& fld, bool ascending = true); const std::string& getSortBy() const { return m_sortField; } bool getSortAscending() const { return m_sortAscending; } /** Return or filter results with identical content checksum */ void setCollapseDuplicates(bool on) { m_collapseDuplicates = on; } /** Accept data describing the search and query the index. This can * be called repeatedly on the same object which gets reinitialized each * time. */ bool setQuery(std::shared_ptr q); /** Get results count for current query */ int getResCnt(); /** Get document at rank i in current query results. */ bool getDoc(int i, Doc &doc); /** Get possibly expanded list of query terms */ bool getQueryTerms(std::vector& terms); /** Build synthetic abstract for document, extracting chunks relevant for * the input query. This uses index data only (no access to the file) */ // Abstract returned as one string bool makeDocAbstract(const Doc &doc, std::string& abstract); // Returned as a snippets vector bool makeDocAbstract(const Doc &doc, std::vector& abstract); // Returned as a vector of pair page is 0 if unknown int makeDocAbstract(const Doc &doc, std::vector& abst, int maxoccs= -1, int ctxwords = -1); /** Retrieve page number for first match for "significant" query term * @param term returns the chosen term */ int getFirstMatchPage(const Doc &doc, std::string& term); /** Retrieve a reference to the searchData we are using */ std::shared_ptr getSD() { return m_sd; } /** Expand query to look for documents like the one passed in */ std::vector expand(const Doc &doc); /** Return the Db we're set for */ Db *whatDb() const { return m_db; } /* make this public for access from embedded Db::Native */ class Native; Native *m_nq; private: std::string m_reason; // Error explanation Db *m_db; void *m_sorter; std::string m_sortField; bool m_sortAscending; bool m_collapseDuplicates; int m_resCnt; std::shared_ptr m_sd; int m_snipMaxPosWalk; /* Copyconst and assignement private and forbidden */ Query(const Query &) {} Query & operator=(const Query &) {return *this;}; }; #ifndef NO_NAMESPACES } #endif // NO_NAMESPACES #endif /* _rclquery_h_included_ */ recoll-1.23.7/rcldb/rcldoc.cpp0000644000175000017500000001176713125637102013061 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "rcldoc.h" #include "log.h" #include "rclutil.h" using namespace std; namespace Rcl { const string Doc::keyabs("abstract"); const string Doc::keyapptg("rclaptg"); const string Doc::keyau("author"); const string Doc::keybcknd("rclbes"); const string Doc::keybght("beagleHitType"); const string Doc::keycc("collapsecount"); const string Doc::keychildurl("childurl"); const string Doc::keydmt("dmtime"); const string Doc::keyds("dbytes"); const string Doc::keyfmt("fmtime"); const string Doc::keyfn("filename"); const string Doc::keytcfn("containerfilename"); const string Doc::keyfs("fbytes"); const string Doc::keyipt("ipath"); const string Doc::keykw("keywords"); const string Doc::keymd5("md5"); const string Doc::keymt("mtime"); const string Doc::keyoc("origcharset"); const string Doc::keypcs("pcbytes"); const string Doc::keyrr("relevancyrating"); const string Doc::keysig("sig"); const string Doc::keysz("size"); const string Doc::keytp("mtype"); const string Doc::keytt("title"); const string Doc::keyudi("rcludi"); const string Doc::keyurl("url"); void Doc::dump(bool dotext) const { LOGDEB("Rcl::Doc::dump: url: [" << (url) << "]\n" ); LOGDEB("Rcl::Doc::dump: idxurl: [" << (idxurl) << "]\n" ); LOGDEB("Rcl::Doc::dump: ipath: [" << (ipath) << "]\n" ); LOGDEB("Rcl::Doc::dump: mimetype: [" << (mimetype) << "]\n" ); LOGDEB("Rcl::Doc::dump: fmtime: [" << (fmtime) << "]\n" ); LOGDEB("Rcl::Doc::dump: dmtime: [" << (dmtime) << "]\n" ); LOGDEB("Rcl::Doc::dump: origcharset: [" << (origcharset) << "]\n" ); LOGDEB("Rcl::Doc::dump: syntabs: [" << (syntabs) << "]\n" ); LOGDEB("Rcl::Doc::dump: pcbytes: [" << (pcbytes) << "]\n" ); LOGDEB("Rcl::Doc::dump: fbytes: [" << (fbytes) << "]\n" ); LOGDEB("Rcl::Doc::dump: dbytes: [" << (dbytes) << "]\n" ); LOGDEB("Rcl::Doc::dump: sig: [" << (sig) << "]\n" ); LOGDEB("Rcl::Doc::dump: pc: [" << (pc) << "]\n" ); LOGDEB("Rcl::Doc::dump: xdocid: [" << ((unsigned long)xdocid) << "]\n" ); for (map::const_iterator it = meta.begin(); it != meta.end(); it++) { LOGDEB("Rcl::Doc::dump: meta[" << ((*it).first) << "]: [" << ((*it).second) << "]\n" ); } if (dotext) LOGDEB("Rcl::Doc::dump: text: \n[" << (text) << "]\n" ); } // Copy ensuring no shared string data, for threading issues. void Doc::copyto(Doc *d) const { d->url.assign(url.begin(), url.end()); d->idxurl.assign(idxurl.begin(), idxurl.end()); d->idxi = idxi; d->ipath.assign(ipath.begin(), ipath.end()); d->mimetype.assign(mimetype.begin(), mimetype.end()); d->fmtime.assign(fmtime.begin(), fmtime.end()); d->dmtime.assign(dmtime.begin(), dmtime.end()); d->origcharset.assign(origcharset.begin(), origcharset.end()); map_ss_cp_noshr(meta, &d->meta); d->syntabs = syntabs; d->pcbytes.assign(pcbytes.begin(), pcbytes.end()); d->fbytes.assign(fbytes.begin(), fbytes.end()); d->dbytes.assign(dbytes.begin(), dbytes.end()); d->sig.assign(sig.begin(), sig.end()); d->text.assign(text.begin(), text.end()); d->pc = pc; d->xdocid = xdocid; d->idxi = idxi; d->haspages = haspages; d->haschildren = haschildren; d->onlyxattr = onlyxattr; } static const string cstr_fileu("file://"); bool docsToPaths(vector &docs, vector &paths) { for (vector::iterator it = docs.begin(); it != docs.end(); it++) { Rcl::Doc &idoc = *it; string backend; idoc.getmeta(Rcl::Doc::keybcknd, &backend); // This only makes sense for file system files: beagle docs are // always up to date because they can't be updated in the cache, // only added/removed. Same remark as made inside internfile, we // need a generic way to handle backends. if (!backend.empty() && backend.compare("FS")) continue; // Filesystem document. The url has to be like file:// if (idoc.url.find(cstr_fileu) != 0) { LOGERR("idx::docsToPaths: FS backend and non fs url: [" << idoc.url << "]\n"); continue; } paths.push_back(idoc.url.substr(7, string::npos)); } return true; } } recoll-1.23.7/rcldb/rcldb.h0000644000175000017500000005147313224501057012343 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _DB_H_INCLUDED_ #define _DB_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include #include "cstr.h" #include "rcldoc.h" #include "stoplist.h" #include "rclconfig.h" #include "utf8iter.h" #include "textsplit.h" #include "syngroups.h" using std::string; using std::vector; // rcldb defines an interface for a 'real' text database. The current // implementation uses xapian only, and xapian-related code is in rcldb.cpp // If support was added for other backend, the xapian code would be moved in // rclxapian.cpp, another file would be created for the new backend, and the // configuration/compile/link code would be adjusted to allow choosing. There // is no plan for supporting multiple different backends. // // In no case does this try to implement a useful virtualized text-db interface // The main goal is simplicity and good matching to usage inside the recoll // user interface. In other words, this is not exhaustive or well-designed or // reusable. // // Unique Document Identifier: uniquely identifies a document in its // source storage (file system or other). Used for up to date checks // etc. "udi". Our user is responsible for making sure it's not too // big, cause it's stored as a Xapian term (< 150 bytes would be // reasonable) class RclConfig; class Aspell; namespace Rcl { // Omega compatible values. We leave a hole for future omega values. Not sure // it makes any sense to keep any level of omega compat given that the index // is incompatible anyway. enum value_slot { // Omega-compatible values: VALUE_LASTMOD = 0, // 4 byte big endian value - seconds since 1970. VALUE_MD5 = 1, // 16 byte MD5 checksum of original document. VALUE_SIZE = 2, // sortable_serialise() // Recoll only: VALUE_SIG = 10 // Doc sig as chosen by app (ex: mtime+size }; class SearchData; class TermIter; class Query; /** Used for returning result lists for index terms matching some criteria */ class TermMatchEntry { public: TermMatchEntry() : wcf(0) { } TermMatchEntry(const string& t, int f, int d) : term(t), wcf(f), docs(d) { } TermMatchEntry(const string& t) : term(t), wcf(0) { } bool operator==(const TermMatchEntry &o) const { return term == o.term; } bool operator<(const TermMatchEntry &o) const { return term < o.term; } string term; int wcf; // Total count of occurrences within collection. int docs; // Number of documents countaining term. }; /** Term match result list header: statistics and global info */ class TermMatchResult { public: TermMatchResult() { clear(); } void clear() { entries.clear(); } // Term expansion vector entries; // If a field was specified, this is the corresponding index prefix string prefix; }; class DbStats { public: DbStats() :dbdoccount(0), dbavgdoclen(0), mindoclen(0), maxdoclen(0) { } // Index-wide stats unsigned int dbdoccount; double dbavgdoclen; size_t mindoclen; size_t maxdoclen; vector failedurls; /* Only set if requested */ }; inline bool has_prefix(const string& trm) { if (o_index_stripchars) { return !trm.empty() && 'A' <= trm[0] && trm[0] <= 'Z'; } else { return !trm.empty() && trm[0] == ':'; } } inline string strip_prefix(const string& trm) { if (trm.empty()) return trm; string::size_type st = 0; if (o_index_stripchars) { st = trm.find_first_not_of("ABCDEFIJKLMNOPQRSTUVWXYZ"); if (st == string::npos) return string(); } else { if (has_prefix(trm)) { st = trm.find_last_of(":") + 1; } else { return trm; } } return trm.substr(st); } inline string wrap_prefix(const string& pfx) { if (o_index_stripchars) { return pfx; } else { return cstr_colon + pfx + cstr_colon; } } /** * Wrapper class for the native database. */ class Db { public: // A place for things we don't want visible here. class Native; friend class Native; /* General stuff (valid for query or update) ****************************/ Db(const RclConfig *cfp); ~Db(); enum OpenMode {DbRO, DbUpd, DbTrunc}; enum OpenError {DbOpenNoError, DbOpenMainDb, DbOpenExtraDb}; bool open(OpenMode mode, OpenError *error = 0); bool close(); bool isopen(); /** Get explanation about last error */ string getReason() const {return m_reason;} /** Return all possible stemmer names */ static vector getStemmerNames(); /** Return existing stemming databases */ vector getStemLangs(); /** Test word for spelling correction candidate: not too long, no * special chars... * @param with_aspell test for use with aspell, else for xapian speller */ static bool isSpellingCandidate(const string& term, bool with_aspell=true) { if (term.empty() || term.length() > 50) return false; if (has_prefix(term)) return false; Utf8Iter u8i(term); if (with_aspell) { // If spelling with aspell, neither katakana nor other cjk // scripts are candidates if (TextSplit::isCJK(*u8i) || TextSplit::isKATAKANA(*u8i)) return false; } else { #ifdef TESTING_XAPIAN_SPELL // The Xapian speller (purely proximity-based) can be used // for Katakana (when split as words which is not always // completely feasible because of separator-less // compounds). Currently we don't try to use the Xapian // speller with other scripts with which it would be usable // in the absence of aspell (it would indeed be better // than nothing with e.g. european languages). This would // require a few more config variables, maybe one day. if (!TextSplit::isKATAKANA(*u8i)) { return false; } #else return false; #endif } if (term.find_first_of(" !\"#$%&()*+,-./0123456789:;<=>?@[\\]^_`{|}~") != string::npos) return false; return true; } /** Return spelling suggestion */ bool getSpellingSuggestions(const string& word, std::vector& suggs); /* The next two, only for searchdata, should be somehow hidden */ /* Return configured stop words */ const StopList& getStopList() const {return m_stops;} /* Field name to prefix translation (ie: author -> 'A') */ bool fieldToTraits(const string& fldname, const FieldTraits **ftpp, bool isquery = false); /* Update-related methods ******************************************/ /** Test if the db entry for the given udi is up to date. * * This is done by comparing the input and stored sigs. This is * used both when indexing and querying (before opening a document * using stale info). * * **This assumes that the udi pertains to the main index (idxi==0).** * * Side-effect when the db is writeable and the document up to * date: set the existence flag for the file document and all * subdocs if any (for later use by 'purge()') * * @param udi Unique Document Identifier (as chosen by indexer). * @param sig New signature (as computed by indexer). * @param xdocid[output] Non-zero if doc existed. Should be considered * as opaque, to be used for a possible later call to setExistingFlags() * Note that if inplaceReset is set, the return value is non-zero but not * an actual docid, it's only used as a flag in this case. * @param osig[output] old signature. */ bool needUpdate(const string &udi, const string& sig, unsigned int *xdocid = 0, std::string *osig = 0); /** Set the existance flags for the document and its eventual subdocuments * * This can be called by the indexer after needUpdate() has returned true, * if the indexer does not wish to actually re-index (e.g.: the doc is * known to cause errors). */ void setExistingFlags(const string& udi, unsigned int docid); /** Indicate if we are doing a systematic reindex. This complements needUpdate() return */ bool inFullReset() {return o_inPlaceReset || m_mode == DbTrunc;} /** Add or update document identified by unique identifier. * @param config Config object to use. Can be the same as the member config * or a clone, to avoid sharing when called in multithread context. * @param udi the Unique Document Identifier is opaque to us. * Maximum size 150 bytes. * @param parent_udi the UDI for the container document. In case of complex * embedding, this is not always the immediate parent but the UDI for * the container file (which may be a farther ancestor). It is * used for purging subdocuments when a file ceases to exist and * to set the existence flags of all subdocuments of a container * that is found to be up to date. In other words, the * parent_udi is the UDI for the ancestor of the document which * is subject to needUpdate() and physical existence tests (some * kind of file equivalent). Empty for top-level docs. Should * probably be renamed container_udi. * @param doc container for document data. Should have been filled as * much as possible depending on the document type. * ** doc will be modified in a destructive way ** */ bool addOrUpdate(const string &udi, const string &parent_udi, Doc &doc); #ifdef IDX_THREADS void waitUpdIdle(); #endif /** Delete document(s) for given UDI, including subdocs */ bool purgeFile(const string &udi, bool *existed = 0); /** Delete subdocs with an out of date sig. We do this to purge obsolete subdocs during a partial update where no general purge will be done */ bool purgeOrphans(const string &udi); /** Remove documents that no longer exist in the file system. This * depends on the update map, which is built during * indexing (needUpdate() / addOrUpdate()). * * This should only be called after a full walk of * the file system, else the update map will not be complete, and * many documents will be deleted that shouldn't, which is why this * has to be called externally, rcldb can't know if the indexing * pass was complete or partial. */ bool purge(); /** Create stem expansion database for given languages. */ bool createStemDbs(const std::vector &langs); /** Delete stem expansion database for given language. */ bool deleteStemDb(const string &lang); /* Query-related methods ************************************/ /** Return total docs in db */ int docCnt(); /** Return count of docs which have an occurrence of term */ int termDocCnt(const string& term); /** Add extra Xapian database for querying. * @param dir must point to something which can be passed as parameter * to a Xapian::Database constructor (directory or stub). */ bool addQueryDb(const string &dir); /** Remove extra database. if dir == "", remove all. */ bool rmQueryDb(const string &dir); /** Look where the doc result comes from. * @param doc must come from a db query so that "opaque" xdocid is set. * @return: 0 main index, (size_t)-1 don't know, * other: order of database in add_database() sequence. */ size_t whatDbIdx(const Doc& doc); /** Tell if directory seems to hold xapian db */ static bool testDbDir(const string &dir, bool *stripped = 0); /** Return the index terms that match the input string * Expansion is performed either with either wildcard or regexp processing * Stem expansion is performed if lang is not empty * * @param typ_sens defines the kind of expansion: none, wildcard, * regexp or stemming. "none" may still expand case, * diacritics and synonyms, depending on the casesens, diacsens and * synexp flags. * @param lang sets the stemming language(s). Can be a space-separated list * @param term is the term to expand * @param result is the main output * @param max defines the maximum result count * @param field if set, defines the field within with the expansion should * be performed. Only used for wildcards and regexps, stemming is * always global. If this is set, the resulting output terms * will be appropriately prefixed and the prefix value will be set * in the TermMatchResult header */ enum MatchType {ET_NONE=0, ET_WILD=1, ET_REGEXP=2, ET_STEM=3, ET_DIACSENS=8, ET_CASESENS=16, ET_SYNEXP=32, ET_PATHELT=64}; int matchTypeTp(int tp) { return tp & 7; } bool termMatch(int typ_sens, const string &lang, const string &term, TermMatchResult& result, int max = -1, const string& field = "", vector *multiwords = 0); bool dbStats(DbStats& stats, bool listFailed); /** Return min and max years for doc mod times in db */ bool maxYearSpan(int *minyear, int *maxyear); /** Return all mime types in index. This can be different from the ones defined in the config because of 'file' command usage. Inserts the types at the end of the parameter */ bool getAllDbMimeTypes(std::vector&); /** Wildcard expansion specific to file names. Internal/sdata use only */ bool filenameWildExp(const string& exp, vector& names, int max); /** Set parameters for synthetic abstract generation */ void setAbstractParams(int idxTrunc, int synthLen, int syntCtxLen); int getAbsCtxLen() const { return m_synthAbsWordCtxLen; } int getAbsLen() const { return m_synthAbsLen; } /** Get document for given udi * * Used by the 'history' feature, and to retrieve ancestor documents. * @param udi The unique document identifier. * @param idxdoc A document from the same database as an opaque way to pass * the database id (e.g.: when looking for parent in a multi-database * context). * @param[out] doc The output Recoll document. * @return True for success. */ bool getDoc(const string &udi, const Doc& idxdoc, Doc &doc); /** Test if documents has sub-documents. * * This can always be detected for file-level documents, using the * postlist for the parent term constructed with udi. * * For non file-level documents (e.g.: does an email inside an * mbox have attachments ?), detection is dependant on the filter * having set an appropriate flag at index time. Higher level code * can't detect it because the doc for the parent may have been * seen before any children. The flag is stored as a value in the * index. */ bool hasSubDocs(const Doc &idoc); /** Get subdocuments of given document. * * For file-level documents, these are all docs indexed by the * parent term built on idoc.udi. For embedded documents, the * parent doc is looked for, then its subdocs list is * filtered using the idoc ipath as a prefix. */ bool getSubDocs(const Doc& idoc, vector& subdocs); /** Get duplicates (md5) of document */ bool docDups(const Doc& idoc, std::vector& odocs); /* The following are mainly for the aspell module */ /** Whole term list walking. */ TermIter *termWalkOpen(); bool termWalkNext(TermIter *, string &term); void termWalkClose(TermIter *); /** Test term existence */ bool termExists(const string& term); /** Test if terms stem to different roots. */ bool stemDiffers(const string& lang, const string& term, const string& base); const RclConfig *getConf() {return m_config;} /** Activate the "in place reset" mode where all documents are considered as needing update. This is a global/per-process option, and can't be reset. It should be set at the start of the indexing pass. 2012-10: no idea why this is done this way... */ static void setInPlaceReset() {o_inPlaceReset = true;} /** Flush interval get/set. This is used by the first indexing pass to override the config value and flush more rapidly initially so that the user can quickly play with queries */ int getFlushMb() { return m_flushMb; } void setFlushMb(int mb) { m_flushMb = mb; } bool doFlush(); // Use empty fn for no synonyms bool setSynGroupsFile(const std::string& fn); /* This has to be public for access by embedded Query::Native */ Native *m_ndb; private: const RclConfig *m_config; string m_reason; // Error explanation // Xapian directories for additional databases to query vector m_extraDbs; OpenMode m_mode; // File existence vector: this is filled during the indexing pass. Any // document whose bit is not set at the end is purged vector updated; // Text bytes indexed since beginning long long m_curtxtsz; // Text bytes at last flush long long m_flushtxtsz; // Text bytes at last fsoccup check long long m_occtxtsz; // First fs occup check ? int m_occFirstCheck; // Synonym groups. There is no strict reason that this has to be // an Rcl::Db member, as it is only used when building each It // could be a SearchData member, or even a parameter to // Query::setQuery(). Otoh, building the syngroups structure from // a file may be expensive and it's unlikely to change with every // query, so it makes sense to cache it, and Rcl::Db is not a bad // place for this. SynGroups m_syngroups; // Aspell object if needed Aspell *m_aspell = nullptr; /*************** * Parameters cached out of the configuration files. Logically const * after init */ // Stop terms: those don't get indexed. StopList m_stops; // Truncation length for stored meta fields int m_idxMetaStoredLen; // This is how long an abstract we keep or build from beginning of // text when indexing. It only has an influence on the size of the // db as we are free to shorten it again when displaying int m_idxAbsTruncLen; // This is the size of the abstract that we synthetize out of query // term contexts at *query time* int m_synthAbsLen; // This is how many words (context size) we keep around query terms // when building the abstract int m_synthAbsWordCtxLen; // Flush threshold. Megabytes of text indexed before we flush. int m_flushMb; // Maximum file system occupation percentage int m_maxFsOccupPc; // Database directory string m_basedir; // When this is set, all documents are considered as needing a reindex. // This implements an alternative to just erasing the index before // beginning, with the advantage that, for small index formats updates, // between releases the index remains available while being recreated. static bool o_inPlaceReset; /******* End logical constnesss */ #ifdef IDX_THREADS friend void *DbUpdWorker(void*); #endif // IDX_THREADS // Internal form of setExistingFlags: no locking void i_setExistingFlags(const string& udi, unsigned int docid); // Internal form of close, can be called during destruction bool i_close(bool final); // Reinitialize when adding/removing additional dbs bool adjustdbs(); bool idxTermMatch(int typ_sens, const string &lang, const string &term, TermMatchResult& result, int max = -1, const string& field = cstr_null); // Flush when idxflushmb is reached bool maybeflush(int64_t moretext); bool docExists(const string& uniterm); /* Copyconst and assignement private and forbidden */ Db(const Db &) {} Db& operator=(const Db &) {return *this;}; }; // This has to go somewhere, and as it needs the Xapian version, this is // the most reasonable place. string version_string(); extern const string pathelt_prefix; extern const string mimetype_prefix; extern const string unsplitFilenameFieldName; extern string start_of_field_term; extern string end_of_field_term; } #endif /* _DB_H_INCLUDED_ */ recoll-1.23.7/rcldb/rclquery_p.h0000644000175000017500000000415213224431525013434 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _rclquery_p_h_included_ #define _rclquery_p_h_included_ #include #include using std::map; using std::vector; #include #include "rclquery.h" namespace Rcl { class Query::Native { public: /** The query I belong to */ Query *m_q; /** query descriptor: terms and subqueries joined by operators * (or/and etc...) */ Xapian::Query xquery; Xapian::Enquire *xenquire; // Open query descriptor. Xapian::MSet xmset; // Partial result set // Term frequencies for current query. See makeAbstract, setQuery map termfreqs; Native(Query *q) : m_q(q), xenquire(0) { } ~Native() { clear(); } void clear() { delete xenquire; xenquire = 0; termfreqs.clear(); } /** Return a list of terms which matched for a specific result document */ bool getMatchTerms(unsigned long xdocid, std::vector& terms); int makeAbstract(Xapian::docid id, vector&, int maxoccs = -1, int ctxwords = -1); int getFirstMatchPage(Xapian::docid docid, std::string& term); void setDbWideQTermsFreqs(); double qualityTerms(Xapian::docid docid, const std::vector& terms, std::multimap >& byQ); }; } #endif /* _rclquery_p_h_included_ */ recoll-1.23.7/rcldb/rcldb.cpp0000644000175000017500000022027213224431525012673 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "safeunistd.h" #include #include #include #include #include #include #include using namespace std; #include "xapian.h" #include "rclconfig.h" #include "log.h" #include "rcldb.h" #include "rcldb_p.h" #include "stemdb.h" #include "textsplit.h" #include "transcode.h" #include "unacpp.h" #include "conftree.h" #include "pathut.h" #include "rclutil.h" #include "smallut.h" #include "chrono.h" #include "utf8iter.h" #include "searchdata.h" #include "rclquery.h" #include "rclquery_p.h" #include "md5ut.h" #include "rclversion.h" #include "cancelcheck.h" #include "termproc.h" #include "expansiondbs.h" #include "rclinit.h" #include "internfile.h" #include "utf8fn.h" #ifdef RCL_USE_ASPELL #include "rclaspell.h" #endif // Recoll index format version is stored in user metadata. When this change, // we can't open the db and will have to reindex. static const string cstr_RCL_IDX_VERSION_KEY("RCL_IDX_VERSION_KEY"); static const string cstr_RCL_IDX_VERSION("1"); static const string cstr_mbreaks("rclmbreaks"); namespace Rcl { // Some prefixes that we could get from the fields file, but are not going // to ever change. static const string fileext_prefix = "XE"; const string mimetype_prefix = "T"; static const string xapday_prefix = "D"; static const string xapmonth_prefix = "M"; static const string xapyear_prefix = "Y"; const string pathelt_prefix = "XP"; static const string udi_prefix("Q"); static const string parent_prefix("F"); // Special terms to mark begin/end of field (for anchored searches), and // page breaks string start_of_field_term; string end_of_field_term; const string page_break_term = "XXPG/"; // Special term to mark documents with children. const string has_children_term("XXC/"); // Field name for the unsplit file name. Has to exist in the field file // because of usage in termmatch() const string unsplitFilenameFieldName = "rclUnsplitFN"; static const string unsplitfilename_prefix = "XSFS"; // Empty string md5s static const string cstr_md5empty("d41d8cd98f00b204e9800998ecf8427e"); static const int MB = 1024 * 1024; string version_string(){ return string("Recoll ") + string(rclversionstr) + string(" + Xapian ") + string(Xapian::version_string()); } // Synthetic abstract marker (to discriminate from abstract actually // found in document) static const string cstr_syntAbs("?!#@"); // Compute the unique term used to link documents to their origin. // "Q" + external udi static inline string make_uniterm(const string& udi) { string uniterm(wrap_prefix(udi_prefix)); uniterm.append(udi); return uniterm; } // Compute parent term used to link documents to their parent document (if any) // "F" + parent external udi static inline string make_parentterm(const string& udi) { // I prefer to be in possible conflict with omega than with // user-defined fields (Xxxx) that we also allow. "F" is currently // not used by omega (2008-07) string pterm(wrap_prefix(parent_prefix)); pterm.append(udi); return pterm; } static void utf8truncate(string& s, int maxlen) { if (s.size() <= string::size_type(maxlen)) { return; } Utf8Iter iter(s); string::size_type pos = 0; while (iter++ != string::npos) if (iter.getBpos() < string::size_type(maxlen)) { pos = iter.getBpos(); } s.erase(pos); } Db::Native::Native(Db *db) : m_rcldb(db), m_isopen(false), m_iswritable(false), m_noversionwrite(false) #ifdef IDX_THREADS , m_wqueue("DbUpd", m_rcldb->m_config->getThrConf(RclConfig::ThrDbWrite).first), m_totalworkns(0LL), m_havewriteq(false) #endif // IDX_THREADS { LOGDEB1("Native::Native: me " << this << "\n"); } Db::Native::~Native() { LOGDEB1("Native::~Native: me " << this << "\n"); #ifdef IDX_THREADS if (m_havewriteq) { void *status = m_wqueue.setTerminateAndWait(); if (status) { LOGDEB1("Native::~Native: worker status " << status << "\n"); } } #endif // IDX_THREADS } #ifdef IDX_THREADS void *DbUpdWorker(void* vdbp) { recoll_threadinit(); Db::Native *ndbp = (Db::Native *)vdbp; WorkQueue *tqp = &(ndbp->m_wqueue); DbUpdTask *tsk = 0; for (;;) { size_t qsz = -1; if (!tqp->take(&tsk, &qsz)) { tqp->workerExit(); return (void*)1; } bool status = false; switch (tsk->op) { case DbUpdTask::AddOrUpdate: LOGDEB("DbUpdWorker: got add/update task, ql " << qsz << "\n"); status = ndbp->addOrUpdateWrite(tsk->udi, tsk->uniterm, tsk->doc, tsk->txtlen); break; case DbUpdTask::Delete: LOGDEB("DbUpdWorker: got delete task, ql " << qsz << "\n"); status = ndbp->purgeFileWrite(false, tsk->udi, tsk->uniterm); break; case DbUpdTask::PurgeOrphans: LOGDEB("DbUpdWorker: got orphans purge task, ql " << qsz << "\n"); status = ndbp->purgeFileWrite(true, tsk->udi, tsk->uniterm); break; default: LOGERR("DbUpdWorker: unknown op " << tsk->op << " !!\n"); break; } if (!status) { LOGERR("DbUpdWorker: xxWrite failed\n"); tqp->workerExit(); delete tsk; return (void*)0; } delete tsk; } } void Db::Native::maybeStartThreads() { m_havewriteq = false; const RclConfig *cnf = m_rcldb->m_config; int writeqlen = cnf->getThrConf(RclConfig::ThrDbWrite).first; int writethreads = cnf->getThrConf(RclConfig::ThrDbWrite).second; if (writethreads > 1) { LOGINFO("RclDb: write threads count was forced down to 1\n"); writethreads = 1; } if (writeqlen >= 0 && writethreads > 0) { if (!m_wqueue.start(writethreads, DbUpdWorker, this)) { LOGERR("Db::Db: Worker start failed\n"); return; } m_havewriteq = true; } LOGDEB("RclDb:: threads: haveWriteQ " << m_havewriteq << ", wqlen " << writeqlen << " wqts " << writethreads << "\n"); } #endif // IDX_THREADS /* See comment in class declaration: return all subdocuments of a * document given by its unique id. */ bool Db::Native::subDocs(const string &udi, int idxi, vector& docids) { LOGDEB2("subDocs: [" << uniterm << "]\n"); string pterm = make_parentterm(udi); vector candidates; XAPTRY(docids.clear(); candidates.insert(candidates.begin(), xrdb.postlist_begin(pterm), xrdb.postlist_end(pterm)), xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR("Rcl::Db::subDocs: " << m_rcldb->m_reason << "\n"); return false; } else { for (unsigned int i = 0; i < candidates.size(); i++) { if (whatDbIdx(candidates[i]) == (size_t)idxi) { docids.push_back(candidates[i]); } } LOGDEB0("Db::Native::subDocs: returning " << docids.size() << " ids\n"); return true; } } bool Db::Native::xdocToUdi(Xapian::Document& xdoc, string &udi) { Xapian::TermIterator xit; XAPTRY(xit = xdoc.termlist_begin(); xit.skip_to(wrap_prefix(udi_prefix)), xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR("xdocToUdi: xapian error: " << m_rcldb->m_reason << "\n"); return false; } if (xit != xdoc.termlist_end()) { udi = *xit; if (!udi.empty()) { udi = udi.substr(wrap_prefix(udi_prefix).size()); return true; } } return false; } // Clear term from document if its frequency is 0. This should // probably be done by Xapian when the freq goes to 0 when removing a // posting, but we have to do it ourselves bool Db::Native::clearDocTermIfWdf0(Xapian::Document& xdoc, const string& term) { LOGDEB1("Db::clearDocTermIfWdf0: [" << term << "]\n"); // Find the term Xapian::TermIterator xit; XAPTRY(xit = xdoc.termlist_begin(); xit.skip_to(term);, xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR("Db::clearDocTerm...: [" << term << "] skip failed: " << m_rcldb->m_reason << "\n"); return false; } if (xit == xdoc.termlist_end() || term.compare(*xit)) { LOGDEB0("Db::clearDocTermIFWdf0: term [" << term << "] not found. xit: [" << (xit == xdoc.termlist_end() ? "EOL": *xit) << "]\n"); return false; } // Clear the term if its frequency is 0 if (xit.get_wdf() == 0) { LOGDEB1("Db::clearDocTermIfWdf0: clearing [" << term << "]\n"); XAPTRY(xdoc.remove_term(term), xwdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGDEB0("Db::clearDocTermIfWdf0: failed [" << term << "]: " << m_rcldb->m_reason << "\n"); } } return true; } // Holder for term + pos struct DocPosting { DocPosting(string t, Xapian::termpos ps) : term(t), pos(ps) {} string term; Xapian::termpos pos; }; // Clear all terms for given field for given document. // The terms to be cleared are all those with the appropriate // prefix. We also remove the postings for the unprefixed terms (that // is, we undo what we did when indexing). bool Db::Native::clearField(Xapian::Document& xdoc, const string& pfx, Xapian::termcount wdfdec) { LOGDEB1("Db::clearField: clearing prefix [" << pfx << "] for docid " << xdoc.get_docid() << "\n"); vector eraselist; string wrapd = wrap_prefix(pfx); m_rcldb->m_reason.clear(); for (int tries = 0; tries < 2; tries++) { try { Xapian::TermIterator xit; xit = xdoc.termlist_begin(); xit.skip_to(wrapd); while (xit != xdoc.termlist_end() && !(*xit).compare(0, wrapd.size(), wrapd)) { LOGDEB1("Db::clearfield: erasing for [" << *xit << "]\n"); Xapian::PositionIterator posit; for (posit = xit.positionlist_begin(); posit != xit.positionlist_end(); posit++) { eraselist.push_back(DocPosting(*xit, *posit)); eraselist.push_back(DocPosting(strip_prefix(*xit), *posit)); } xit++; } } catch (const Xapian::DatabaseModifiedError &e) { m_rcldb->m_reason = e.get_msg(); xrdb.reopen(); continue; } XCATCHERROR(m_rcldb->m_reason); break; } if (!m_rcldb->m_reason.empty()) { LOGERR("Db::clearField: failed building erase list: " << m_rcldb->m_reason << "\n"); return false; } // Now remove the found positions, and the terms if the wdf is 0 for (vector::const_iterator it = eraselist.begin(); it != eraselist.end(); it++) { LOGDEB1("Db::clearField: remove posting: [" << it->term << "] pos [" << it->pos << "]\n"); XAPTRY(xdoc.remove_posting(it->term, it->pos, wdfdec);, xwdb,m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { // Not that this normally fails for non-prefixed XXST and // ND, don't make a fuss LOGDEB1("Db::clearFiedl: remove_posting failed for [" << it->term << "]," << it->pos << ": " << m_rcldb->m_reason << "\n"); } clearDocTermIfWdf0(xdoc, it->term); } return true; } // Check if doc given by udi is indexed by term bool Db::Native::hasTerm(const string& udi, int idxi, const string& term) { LOGDEB2("Native::hasTerm: udi [" << udi << "] term [" << term << "]\n"); Xapian::Document xdoc; if (getDoc(udi, idxi, xdoc)) { Xapian::TermIterator xit; XAPTRY(xit = xdoc.termlist_begin(); xit.skip_to(term);, xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR("Rcl::Native::hasTerm: " << m_rcldb->m_reason << "\n"); return false; } if (xit != xdoc.termlist_end() && !term.compare(*xit)) { return true; } } return false; } // Retrieve Xapian document, given udi. There may be several identical udis // if we are using multiple indexes. Xapian::docid Db::Native::getDoc(const string& udi, int idxi, Xapian::Document& xdoc) { string uniterm = make_uniterm(udi); for (int tries = 0; tries < 2; tries++) { try { Xapian::PostingIterator docid; for (docid = xrdb.postlist_begin(uniterm); docid != xrdb.postlist_end(uniterm); docid++) { xdoc = xrdb.get_document(*docid); if (whatDbIdx(*docid) == (size_t)idxi) return *docid; } // Udi not in Db. return 0; } catch (const Xapian::DatabaseModifiedError &e) { m_rcldb->m_reason = e.get_msg(); xrdb.reopen(); continue; } XCATCHERROR(m_rcldb->m_reason); break; } LOGERR("Db::Native::getDoc: Xapian error: " << m_rcldb->m_reason << "\n"); return 0; } // Turn data record from db into document fields bool Db::Native::dbDataToRclDoc(Xapian::docid docid, std::string &data, Doc &doc) { LOGDEB2("Db::dbDataToRclDoc: data:\n" << data << "\n"); ConfSimple parms(data); if (!parms.ok()) return false; doc.xdocid = docid; doc.haspages = hasPages(docid); // Compute what index this comes from, and check for path translations string dbdir = m_rcldb->m_basedir; doc.idxi = 0; if (!m_rcldb->m_extraDbs.empty()) { int idxi = int(whatDbIdx(docid)); // idxi is in [0, extraDbs.size()]. 0 is for the main index, // idxi-1 indexes into the additional dbs array. if (idxi) { dbdir = m_rcldb->m_extraDbs[idxi - 1]; doc.idxi = idxi; } } parms.get(Doc::keyurl, doc.idxurl); doc.url = doc.idxurl; m_rcldb->m_config->urlrewrite(dbdir, doc.url); if (!doc.url.compare(doc.idxurl)) doc.idxurl.clear(); // Special cases: parms.get(Doc::keytp, doc.mimetype); parms.get(Doc::keyfmt, doc.fmtime); parms.get(Doc::keydmt, doc.dmtime); parms.get(Doc::keyoc, doc.origcharset); parms.get(cstr_caption, doc.meta[Doc::keytt]); parms.get(Doc::keyabs, doc.meta[Doc::keyabs]); // Possibly remove synthetic abstract indicator (if it's there, we // used to index the beginning of the text as abstract). doc.syntabs = false; if (doc.meta[Doc::keyabs].find(cstr_syntAbs) == 0) { doc.meta[Doc::keyabs] = doc.meta[Doc::keyabs].substr(cstr_syntAbs.length()); doc.syntabs = true; } parms.get(Doc::keyipt, doc.ipath); parms.get(Doc::keypcs, doc.pcbytes); parms.get(Doc::keyfs, doc.fbytes); parms.get(Doc::keyds, doc.dbytes); parms.get(Doc::keysig, doc.sig); // Normal key/value pairs: vector keys = parms.getNames(string()); for (vector::const_iterator it = keys.begin(); it != keys.end(); it++) { if (doc.meta.find(*it) == doc.meta.end()) parms.get(*it, doc.meta[*it]); } doc.meta[Doc::keyurl] = doc.url; doc.meta[Doc::keymt] = doc.dmtime.empty() ? doc.fmtime : doc.dmtime; return true; } bool Db::Native::hasPages(Xapian::docid docid) { string ermsg; Xapian::PositionIterator pos; XAPTRY(pos = xrdb.positionlist_begin(docid, page_break_term); if (pos != xrdb.positionlist_end(docid, page_break_term)) { return true; }, xrdb, ermsg); if (!ermsg.empty()) { LOGERR("Db::Native::hasPages: xapian error: " << ermsg << "\n"); } return false; } // Return the positions list for the page break term bool Db::Native::getPagePositions(Xapian::docid docid, vector& vpos) { vpos.clear(); // Need to retrieve the document record to check for multiple page breaks // that we store there for lack of better place map mbreaksmap; try { Xapian::Document xdoc = xrdb.get_document(docid); string data = xdoc.get_data(); Doc doc; string mbreaks; if (dbDataToRclDoc(docid, data, doc) && doc.getmeta(cstr_mbreaks, &mbreaks)) { vector values; stringToTokens(mbreaks, values, ","); for (unsigned int i = 0; i < values.size() - 1; i += 2) { int pos = atoi(values[i].c_str()) + baseTextPosition; int incr = atoi(values[i+1].c_str()); mbreaksmap[pos] = incr; } } } catch (...) { } string qterm = page_break_term; Xapian::PositionIterator pos; try { for (pos = xrdb.positionlist_begin(docid, qterm); pos != xrdb.positionlist_end(docid, qterm); pos++) { int ipos = *pos; if (ipos < int(baseTextPosition)) { LOGDEB("getPagePositions: got page position " << ipos << " not in body\n"); // Not in text body. Strange... continue; } map::iterator it = mbreaksmap.find(ipos); if (it != mbreaksmap.end()) { LOGDEB1("getPagePositions: found multibreak at " << ipos << " incr " << it->second << "\n"); for (int i = 0 ; i < it->second; i++) vpos.push_back(ipos); } vpos.push_back(ipos); } } catch (...) { // Term does not occur. No problem. } return true; } int Db::Native::getPageNumberForPosition(const vector& pbreaks, int pos) { if (pos < int(baseTextPosition)) // Not in text body return -1; vector::const_iterator it = upper_bound(pbreaks.begin(), pbreaks.end(), pos); return int(it - pbreaks.begin() + 1); } // Note: we're passed a Xapian::Document* because Xapian // reference-counting is not mt-safe. We take ownership and need // to delete it before returning. bool Db::Native::addOrUpdateWrite(const string& udi, const string& uniterm, Xapian::Document *newdocument_ptr, size_t textlen) { #ifdef IDX_THREADS Chrono chron; std::unique_lock lock(m_mutex); #endif std::shared_ptr doc_cleaner(newdocument_ptr); // Check file system full every mbyte of indexed text. It's a bit wasteful // to do this after having prepared the document, but it needs to be in // the single-threaded section. if (m_rcldb->m_maxFsOccupPc > 0 && (m_rcldb->m_occFirstCheck || (m_rcldb->m_curtxtsz - m_rcldb->m_occtxtsz) / MB >= 1)) { LOGDEB("Db::add: checking file system usage\n"); int pc; m_rcldb->m_occFirstCheck = 0; if (fsocc(m_rcldb->m_basedir, &pc) && pc >= m_rcldb->m_maxFsOccupPc) { LOGERR("Db::add: stop indexing: file system " << pc << " %" << " full > max " << m_rcldb->m_maxFsOccupPc << " %" << "\n"); return false; } m_rcldb->m_occtxtsz = m_rcldb->m_curtxtsz; } const char *fnc = udi.c_str(); string ermsg; // Add db entry or update existing entry: try { Xapian::docid did = xwdb.replace_document(uniterm, *newdocument_ptr); if (did < m_rcldb->updated.size()) { // This is necessary because only the file-level docs are tested // by needUpdate(), so the subdocs existence flags are only set // here. m_rcldb->updated[did] = true; LOGINFO("Db::add: docid " << did << " updated [" << fnc << "]\n"); } else { LOGINFO("Db::add: docid " << did << " added [" << fnc << "]\n"); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::add: replace_document failed: " << ermsg << "\n"); ermsg.erase(); // FIXME: is this ever actually needed? try { xwdb.add_document(*newdocument_ptr); LOGDEB("Db::add: " << fnc << " added (failed re-seek for duplicate)\n"); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::add: add_document failed: " << ermsg << "\n"); return false; } } // Test if we're over the flush threshold (limit memory usage): bool ret = m_rcldb->maybeflush(textlen); #ifdef IDX_THREADS m_totalworkns += chron.nanos(); #endif return ret; } bool Db::Native::purgeFileWrite(bool orphansOnly, const string& udi, const string& uniterm) { #if defined(IDX_THREADS) // We need a mutex even if we have a write queue (so we can only // be called by a single thread) to protect about multiple acces // to xrdb from subDocs() which is also called from needupdate() // (called from outside the write thread ! std::unique_lock lock(m_mutex); #endif // IDX_THREADS string ermsg; try { Xapian::PostingIterator docid = xwdb.postlist_begin(uniterm); if (docid == xwdb.postlist_end(uniterm)) { return true; } if (m_rcldb->m_flushMb > 0) { Xapian::termcount trms = xwdb.get_doclength(*docid); m_rcldb->maybeflush(trms * 5); } string sig; if (orphansOnly) { Xapian::Document doc = xwdb.get_document(*docid); sig = doc.get_value(VALUE_SIG); if (sig.empty()) { LOGINFO("purgeFileWrite: got empty sig\n"); return false; } } else { LOGDEB("purgeFile: delete docid " << *docid << "\n"); xwdb.delete_document(*docid); } vector docids; subDocs(udi, 0, docids); LOGDEB("purgeFile: subdocs cnt " << docids.size() << "\n"); for (vector::iterator it = docids.begin(); it != docids.end(); it++) { if (m_rcldb->m_flushMb > 0) { Xapian::termcount trms = xwdb.get_doclength(*it); m_rcldb->maybeflush(trms * 5); } string subdocsig; if (orphansOnly) { Xapian::Document doc = xwdb.get_document(*it); subdocsig = doc.get_value(VALUE_SIG); if (subdocsig.empty()) { LOGINFO("purgeFileWrite: got empty sig for subdoc??\n"); continue; } } if (!orphansOnly || sig != subdocsig) { LOGDEB("Db::purgeFile: delete subdoc " << *it << "\n"); xwdb.delete_document(*it); } } return true; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::purgeFileWrite: " << ermsg << "\n"); } return false; } /* Rcl::Db methods ///////////////////////////////// */ bool Db::o_inPlaceReset; Db::Db(const RclConfig *cfp) : m_ndb(0), m_mode(Db::DbRO), m_curtxtsz(0), m_flushtxtsz(0), m_occtxtsz(0), m_occFirstCheck(1), m_idxMetaStoredLen(150), m_idxAbsTruncLen(250), m_synthAbsLen(250), m_synthAbsWordCtxLen(4), m_flushMb(-1), m_maxFsOccupPc(0) { m_config = new RclConfig(*cfp); if (start_of_field_term.empty()) { if (o_index_stripchars) { start_of_field_term = "XXST"; end_of_field_term = "XXND"; } else { start_of_field_term = "XXST/"; end_of_field_term = "XXND/"; } } m_ndb = new Native(this); if (m_config) { m_config->getConfParam("maxfsoccuppc", &m_maxFsOccupPc); m_config->getConfParam("idxflushmb", &m_flushMb); m_config->getConfParam("idxmetastoredlen", &m_idxMetaStoredLen); } } Db::~Db() { LOGDEB2("Db::~Db\n"); if (m_ndb == 0) return; LOGDEB("Db::~Db: isopen " << m_ndb->m_isopen << " m_iswritable " << m_ndb->m_iswritable << "\n"); i_close(true); delete m_aspell; delete m_config; } vector Db::getStemmerNames() { vector res; stringToStrings(Xapian::Stem::get_available_languages(), res); return res; } bool Db::open(OpenMode mode, OpenError *error) { if (error) *error = DbOpenMainDb; if (m_ndb == 0 || m_config == 0) { m_reason = "Null configuration or Xapian Db"; return false; } LOGDEB("Db::open: m_isopen " << m_ndb->m_isopen << " m_iswritable " << m_ndb->m_iswritable << " mode " << mode << "\n"); if (m_ndb->m_isopen) { // We used to return an error here but I see no reason to if (!close()) return false; } if (!m_config->getStopfile().empty()) m_stops.setFile(m_config->getStopfile()); string dir = m_config->getDbDir(); string ermsg; try { switch (mode) { case DbUpd: case DbTrunc: { int action = (mode == DbUpd) ? Xapian::DB_CREATE_OR_OPEN : Xapian::DB_CREATE_OR_OVERWRITE; if (::access(dir.c_str(), 0) != 0) { // New index. use a stub to force using Chert string stub = path_cat(m_config->getConfDir(), "xapian.stub"); FILE *fp = fopen(stub.c_str(), "w"); if (nullptr == fp) { throw(string("Can't create ") + stub); } fprintf(fp, "chert %s\n", dir.c_str()); fclose(fp); m_ndb->xwdb = Xapian::WritableDatabase(stub, action); } else { m_ndb->xwdb = Xapian::WritableDatabase(dir, action); } // If db is empty, write the data format version at once // to avoid stupid error messages: if (m_ndb->xwdb.get_doccount() == 0) m_ndb->xwdb.set_metadata(cstr_RCL_IDX_VERSION_KEY, cstr_RCL_IDX_VERSION); m_ndb->m_iswritable = true; #ifdef IDX_THREADS m_ndb->maybeStartThreads(); #endif // We used to open a readonly object in addition to // the r/w one because some operations were faster // when performed through a Database: no forced // flushes on allterms_begin(), used in // subDocs(). This issue has been gone for a long time // (now: Xapian 1.2) and the separate objects seem to // trigger other Xapian issues, so the query db is now // a clone of the update one. m_ndb->xrdb = m_ndb->xwdb; LOGDEB("Db::open: lastdocid: " << m_ndb->xwdb.get_lastdocid() << "\n"); LOGDEB2("Db::open: resetting updated\n"); updated.resize(m_ndb->xwdb.get_lastdocid() + 1); for (unsigned int i = 0; i < updated.size(); i++) updated[i] = false; } break; case DbRO: default: m_ndb->m_iswritable = false; m_ndb->xrdb = Xapian::Database(dir); for (vector::iterator it = m_extraDbs.begin(); it != m_extraDbs.end(); it++) { if (error) *error = DbOpenExtraDb; LOGDEB("Db::Open: adding query db [" << &(*it) << "]\n"); // An error here used to be non-fatal (1.13 and older) // but I can't see why m_ndb->xrdb.add_database(Xapian::Database(*it)); } break; } if (error) *error = DbOpenMainDb; // Check index format version. Must not try to check a just created or // truncated db if (mode != DbTrunc && m_ndb->xrdb.get_doccount() > 0) { string version = m_ndb->xrdb.get_metadata(cstr_RCL_IDX_VERSION_KEY); if (version.compare(cstr_RCL_IDX_VERSION)) { m_ndb->m_noversionwrite = true; LOGERR("Rcl::Db::open: file index [" << version << "], software [" << cstr_RCL_IDX_VERSION << "]\n"); throw Xapian::DatabaseError("Recoll index version mismatch", "", ""); } } m_mode = mode; m_ndb->m_isopen = true; m_basedir = dir; if (error) *error = DbOpenNoError; return true; } XCATCHERROR(ermsg); m_reason = ermsg; LOGERR("Db::open: exception while opening [" <m_isopen << " m_iswritable " << m_ndb->m_iswritable << "\n"); if (m_ndb->m_isopen == false && !final) return true; string ermsg; try { bool w = m_ndb->m_iswritable; if (w) { #ifdef IDX_THREADS waitUpdIdle(); #endif if (!m_ndb->m_noversionwrite) m_ndb->xwdb.set_metadata(cstr_RCL_IDX_VERSION_KEY, cstr_RCL_IDX_VERSION); LOGDEB("Rcl::Db:close: xapian will close. May take some time\n"); } deleteZ(m_ndb); if (w) LOGDEB("Rcl::Db:close() xapian close done.\n"); if (final) { return true; } m_ndb = new Native(this); if (m_ndb) { return true; } LOGERR("Rcl::Db::close(): cant recreate db object\n"); return false; } XCATCHERROR(ermsg); LOGERR("Db:close: exception while deleting db: " << ermsg << "\n"); return false; } // Reopen the db with a changed list of additional dbs bool Db::adjustdbs() { if (m_mode != DbRO) { LOGERR("Db::adjustdbs: mode not RO\n"); return false; } if (m_ndb && m_ndb->m_isopen) { if (!close()) return false; if (!open(m_mode)) { return false; } } return true; } int Db::docCnt() { int res = -1; if (!m_ndb || !m_ndb->m_isopen) return -1; XAPTRY(res = m_ndb->xrdb.get_doccount(), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::docCnt: got error: " << m_reason << "\n"); return -1; } return res; } int Db::termDocCnt(const string& _term) { int res = -1; if (!m_ndb || !m_ndb->m_isopen) return -1; string term = _term; if (o_index_stripchars) if (!unacmaybefold(_term, term, "UTF-8", UNACOP_UNACFOLD)) { LOGINFO("Db::termDocCnt: unac failed for [" << _term << "]\n"); return 0; } if (m_stops.isStop(term)) { LOGDEB1("Db::termDocCnt [" << term << "] in stop list\n"); return 0; } XAPTRY(res = m_ndb->xrdb.get_termfreq(term), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::termDocCnt: got error: " << m_reason << "\n"); return -1; } return res; } bool Db::addQueryDb(const string &_dir) { string dir = _dir; LOGDEB0("Db::addQueryDb: ndb " << m_ndb << " iswritable " << ((m_ndb)?m_ndb->m_iswritable:0) << " db [" << dir << "]\n"); if (!m_ndb) return false; if (m_ndb->m_iswritable) return false; dir = path_canon(dir); if (find(m_extraDbs.begin(), m_extraDbs.end(), dir) == m_extraDbs.end()) { m_extraDbs.push_back(dir); } return adjustdbs(); } bool Db::rmQueryDb(const string &dir) { if (!m_ndb) return false; if (m_ndb->m_iswritable) return false; if (dir.empty()) { m_extraDbs.clear(); } else { vector::iterator it = find(m_extraDbs.begin(), m_extraDbs.end(), dir); if (it != m_extraDbs.end()) { m_extraDbs.erase(it); } } return adjustdbs(); } // Determining what index a doc result comes from is based on the // modulo of the docid against the db count. Ref: // http://trac.xapian.org/wiki/FAQ/MultiDatabaseDocumentID size_t Db::whatDbIdx(const Doc& doc) { return m_ndb->whatDbIdx(doc.xdocid); } size_t Db::Native::whatDbIdx(Xapian::docid id) { LOGDEB1("Db::whatDbIdx: xdocid " << id << ", " << m_rcldb->m_extraDbs.size() << " extraDbs\n"); if (id == 0) return (size_t)-1; if (m_rcldb->m_extraDbs.size() == 0) return 0; return (id - 1) % (m_rcldb->m_extraDbs.size() + 1); } bool Db::testDbDir(const string &dir, bool *stripped_p) { string aerr; bool mstripped = true; LOGDEB("Db::testDbDir: [" << dir << "]\n"); try { Xapian::Database db(dir); // If we have terms with a leading ':' it's an // unstripped index Xapian::TermIterator term = db.allterms_begin(":"); if (term == db.allterms_end()) mstripped = true; else mstripped = false; } XCATCHERROR(aerr); if (!aerr.empty()) { LOGERR("Db::Open: error while trying to open database from [" << dir << "]: " << aerr << "\n"); return false; } if (stripped_p) *stripped_p = mstripped; return true; } bool Db::isopen() { if (m_ndb == 0) return false; return m_ndb->m_isopen; } // Try to translate field specification into field prefix. bool Db::fieldToTraits(const string& fld, const FieldTraits **ftpp, bool isquery) { if (m_config && m_config->getFieldTraits(fld, ftpp, isquery)) return true; *ftpp = 0; return false; } // The splitter breaks text into words and adds postings to the Xapian // document. We use a single object to split all of the document // fields and position jumps to separate fields class TextSplitDb : public TextSplitP { public: Xapian::Document &doc; // Xapian document // Base for document section. Gets large increment when we change // sections, to avoid cross-section proximity matches. Xapian::termpos basepos; // Current relative position. This is the remembered value from // the splitter callback. The term position is reset for each call // to text_to_words(), so that the last value of curpos is the // section size (last relative term position), and this is what // gets added to basepos in addition to the inter-section increment // to compute the first position of the next section. Xapian::termpos curpos; Xapian::WritableDatabase& wdb; TextSplitDb(Xapian::WritableDatabase& _wdb, Xapian::Document &d, TermProc *prc) : TextSplitP(prc), doc(d), basepos(1), curpos(0), wdb(_wdb) {} // Reimplement text_to_words to insert the begin and end anchor terms. virtual bool text_to_words(const string &in) { string ermsg; try { // Index the possibly prefixed start term. doc.add_posting(ft.pfx + start_of_field_term, basepos, ft.wdfinc); ++basepos; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db: xapian add_posting error " << ermsg << "\n"); goto out; } if (!TextSplitP::text_to_words(in)) { LOGDEB("TextSplitDb: TextSplit::text_to_words failed\n"); goto out; } try { // Index the possibly prefixed end term. doc.add_posting(ft.pfx + end_of_field_term, basepos + curpos + 1, ft.wdfinc); ++basepos; } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db: xapian add_posting error " << ermsg << "\n"); goto out; } out: basepos += curpos + 100; return true; } void setTraits(const FieldTraits& ftp) { ft = ftp; if (!ft.pfx.empty()) ft.pfx = wrap_prefix(ft.pfx); } friend class TermProcIdx; private: FieldTraits ft; }; class TermProcIdx : public TermProc { public: TermProcIdx() : TermProc(0), m_ts(0), m_lastpagepos(0), m_pageincr(0) {} void setTSD(TextSplitDb *ts) {m_ts = ts;} bool takeword(const std::string &term, int pos, int, int) { // Compute absolute position (pos is relative to current segment), // and remember relative. m_ts->curpos = pos; pos += m_ts->basepos; // Don't try to add empty term Xapian doesnt like it... Safety check // this should not happen. if (term.empty()) return true; string ermsg; try { // Index without prefix, using the field-specific weighting LOGDEB1("Emitting term at " << pos << " : [" << term << "]\n"); if (!m_ts->ft.pfxonly) m_ts->doc.add_posting(term, pos, m_ts->ft.wdfinc); #ifdef TESTING_XAPIAN_SPELL if (Db::isSpellingCandidate(term, false)) { m_ts->wdb.add_spelling(term); } #endif // Index the prefixed term. if (!m_ts->ft.pfx.empty()) { m_ts->doc.add_posting(m_ts->ft.pfx + term, pos, m_ts->ft.wdfinc); } return true; } XCATCHERROR(ermsg); LOGERR("Db: xapian add_posting error " << ermsg << "\n"); return false; } void newpage(int pos) { pos += m_ts->basepos; if (pos < int(baseTextPosition)) { LOGDEB("newpage: not in body: " << pos << "\n"); return; } m_ts->doc.add_posting(m_ts->ft.pfx + page_break_term, pos); if (pos == m_lastpagepos) { m_pageincr++; LOGDEB2("newpage: same pos, pageincr " << m_pageincr << " lastpagepos " << m_lastpagepos << "\n"); } else { LOGDEB2("newpage: pos change, pageincr " << m_pageincr << " lastpagepos " << m_lastpagepos << "\n"); if (m_pageincr > 0) { // Remember the multiple page break at this position unsigned int relpos = m_lastpagepos - baseTextPosition; LOGDEB2("Remembering multiple page break. Relpos " << relpos << " cnt " << m_pageincr << "\n"); m_pageincrvec.push_back(pair(relpos, m_pageincr)); } m_pageincr = 0; } m_lastpagepos = pos; } virtual bool flush() { if (m_pageincr > 0) { unsigned int relpos = m_lastpagepos - baseTextPosition; LOGDEB2("Remembering multiple page break. Position " << relpos << " cnt " << m_pageincr << "\n"); m_pageincrvec.push_back(pair(relpos, m_pageincr)); m_pageincr = 0; } return TermProc::flush(); } TextSplitDb *m_ts; // Auxiliary page breaks data for positions with multiple page breaks. int m_lastpagepos; // increment of page breaks at same pos. Normally 0, 1.. when several // breaks at the same pos int m_pageincr; vector > m_pageincrvec; }; // At the moment, we normally use the Xapian speller for Katakana and // aspell for everything else bool Db::getSpellingSuggestions(const string& word, vector& suggs) { LOGDEB("Db::getSpellingSuggestions:[" << word << "]\n"); suggs.clear(); if (nullptr == m_ndb) { return false; } string term = word; if (isSpellingCandidate(term, true)) { // Term is candidate for aspell processing #ifdef RCL_USE_ASPELL bool noaspell = false; m_config->getConfParam("noaspell", &noaspell); if (noaspell) { return false; } if (nullptr == m_aspell) { m_aspell = new Aspell(m_config); if (m_aspell) { string reason; m_aspell->init(reason); if (!m_aspell->ok()) { LOGDEB("Aspell speller init failed: " << reason << endl); delete m_aspell; m_aspell = 0; } } } if (nullptr == m_aspell) { LOGERR("Db::getSpellingSuggestions: aspell not initialized\n"); return false; } list asuggs; string reason; if (!m_aspell->suggest(*this, term, asuggs, reason)) { LOGERR("Db::getSpellingSuggestions: aspell failed: " << reason << "\n"); return false; } suggs = vector(asuggs.begin(), asuggs.end()); #endif } else { #ifdef TESTING_XAPIAN_SPELL // Was not aspell candidate (e.g.: katakana). Maybe use Xapian // speller? if (isSpellingCandidate(term, false)) { if (!o_index_stripchars) { if (!unacmaybefold(word, term, "UTF-8", UNACOP_UNACFOLD)) { LOGINFO("Db::getSpelling: unac failed for [" << word << "]\n"); return false; } } string sugg = m_ndb->xrdb.get_spelling_suggestion(term); if (!sugg.empty()) { suggs.push_back(sugg); } } #endif } return true; } // Let our user set the parameters for abstract processing void Db::setAbstractParams(int idxtrunc, int syntlen, int syntctxlen) { LOGDEB1("Db::setAbstractParams: trunc " << idxtrunc << " syntlen " << syntlen << " ctxlen " << syntctxlen << "\n"); if (idxtrunc >= 0) m_idxAbsTruncLen = idxtrunc; if (syntlen > 0) m_synthAbsLen = syntlen; if (syntctxlen > 0) m_synthAbsWordCtxLen = syntctxlen; } bool Db::setSynGroupsFile(const string& fn) { return m_syngroups.setfile(fn); } static const string cstr_nc("\n\r\x0c\\"); #define RECORD_APPEND(R, NM, VAL) {R += NM + "=" + VAL + "\n";} // Add document in internal form to the database: index the terms in // the title abstract and body and add special terms for file name, // date, mime type etc. , create the document data record (more // metadata), and update database bool Db::addOrUpdate(const string &udi, const string &parent_udi, Doc &doc) { LOGDEB("Db::add: udi [" << udi << "] parent [" << parent_udi << "]\n"); if (m_ndb == 0) return false; // This document is potentially going to be passed to the index // update thread. The reference counters are not mt-safe, so we // need to do this through a pointer. The reference is just there // to avoid changing too much code (the previous version passed a copy). Xapian::Document *newdocument_ptr = new Xapian::Document; Xapian::Document &newdocument(*newdocument_ptr); // The term processing pipeline: TermProcIdx tpidx; TermProc *nxt = &tpidx; TermProcStop tpstop(nxt, m_stops);nxt = &tpstop; //TermProcCommongrams tpcommon(nxt, m_stops); nxt = &tpcommon; TermProcPrep tpprep(nxt); if (o_index_stripchars) nxt = &tpprep; TextSplitDb splitter(m_ndb->xwdb, newdocument, nxt); tpidx.setTSD(&splitter); // Udi unique term: this is used for file existence/uptodate // checks, and unique id for the replace_document() call. string uniterm = make_uniterm(udi); if (doc.onlyxattr) { // Only updating an existing doc with new extended attributes // data. Need to read the old doc and its data record // first. This is so different from the normal processing that // it uses a fully separate code path (with some duplication // unfortunately) if (!m_ndb->docToXdocXattrOnly(&splitter, udi, doc, newdocument)) { delete newdocument_ptr; return false; } } else { // If the ipath is like a path, index the last element. This is // for compound documents like zip and chm for which the filter // uses the file path as ipath. if (!doc.ipath.empty() && doc.ipath.find_first_not_of("0123456789") != string::npos) { string utf8ipathlast; // There is no way in hell we could have an idea of the // charset here, so let's hope it's ascii or utf-8. We call // transcode to strip the bad chars and pray if (transcode(path_getsimple(doc.ipath), utf8ipathlast, "UTF-8", "UTF-8")) { splitter.text_to_words(utf8ipathlast); } } // Split and index the path from the url for path-based filtering { string path = url_gpathS(doc.url); #ifdef _WIN32 // Windows file names are case-insensitive, so we // translate to UTF-8 and lowercase string upath = compute_utf8fn(m_config, path, false); unacmaybefold(upath, path, "UTF-8", UNACOP_FOLD); #endif vector vpath; stringToTokens(path, vpath, "/"); // If vpath is not /, the last elt is the file/dir name, not a // part of the path. if (vpath.size()) vpath.resize(vpath.size()-1); splitter.curpos = 0; newdocument.add_posting(wrap_prefix(pathelt_prefix), splitter.basepos + splitter.curpos++); for (vector::iterator it = vpath.begin(); it != vpath.end(); it++){ if (it->length() > 230) { // Just truncate it. May still be useful because of wildcards *it = it->substr(0, 230); } newdocument.add_posting(wrap_prefix(pathelt_prefix) + *it, splitter.basepos + splitter.curpos++); } splitter.basepos += splitter.curpos + 100; } // Index textual metadata. These are all indexed as text with // positions, as we may want to do phrase searches with them (this // makes no sense for keywords by the way). // // The order has no importance, and we set a position gap of 100 // between fields to avoid false proximity matches. map::iterator meta_it; for (meta_it = doc.meta.begin(); meta_it != doc.meta.end(); meta_it++) { if (!meta_it->second.empty()) { const FieldTraits *ftp; // We don't test for an empty prefix here. Some fields are part // of the internal conf with an empty prefix (ie: abstract). if (!fieldToTraits(meta_it->first, &ftp)) { LOGDEB0("Db::add: no prefix for field [" << meta_it->first << "], no indexing\n"); continue; } LOGDEB0("Db::add: field [" << meta_it->first << "] pfx [" << ftp->pfx << "] inc " << ftp->wdfinc << ": [" << meta_it->second << "]\n"); splitter.setTraits(*ftp); if (!splitter.text_to_words(meta_it->second)) { LOGDEB("Db::addOrUpdate: split failed for " << meta_it->first << "\n"); } } } // Reset to no prefix and default params splitter.setTraits(FieldTraits()); if (splitter.curpos < baseTextPosition) splitter.basepos = baseTextPosition; // Split and index body text LOGDEB2("Db::add: split body: [" << doc.text << "]\n"); #ifdef TEXTSPLIT_STATS splitter.resetStats(); #endif if (!splitter.text_to_words(doc.text)) LOGDEB("Db::addOrUpdate: split failed for main text\n"); #ifdef TEXTSPLIT_STATS // Reject bad data. unrecognized base64 text is characterized by // high avg word length and high variation (because there are // word-splitters like +/ inside the data). TextSplit::Stats::Values v = splitter.getStats(); // v.avglen > 15 && v.sigma > 12 if (v.count > 200 && (v.avglen > 10 && v.sigma / v.avglen > 0.8)) { LOGINFO("RclDb::addOrUpdate: rejecting doc for bad stats count " << v.count << " avglen " << v.avglen << " sigma " << v.sigma << " url [" << doc.url << "] ipath [" << doc.ipath << "] text " << doc.text << "\n"); delete newdocument_ptr; return true; } #endif ////// Special terms for other metadata. No positions for these. // Mime type newdocument.add_boolean_term(wrap_prefix(mimetype_prefix) + doc.mimetype); // Simple file name indexed unsplit for specific "file name" // searches. This is not the same as a filename: clause inside the // query language. // We also add a term for the filename extension if any. string utf8fn; if (doc.getmeta(Doc::keyfn, &utf8fn) && !utf8fn.empty()) { string fn; if (unacmaybefold(utf8fn, fn, "UTF-8", UNACOP_UNACFOLD)) { // We should truncate after extracting the extension, but this is // a pathological case anyway if (fn.size() > 230) utf8truncate(fn, 230); string::size_type pos = fn.rfind('.'); if (pos != string::npos && pos != fn.length() - 1) { newdocument.add_boolean_term(wrap_prefix(fileext_prefix) + fn.substr(pos + 1)); } newdocument.add_term(wrap_prefix(unsplitfilename_prefix) + fn, 0); } } newdocument.add_boolean_term(uniterm); // Parent term. This is used to find all descendents, mostly // to delete them when the parent goes away if (!parent_udi.empty()) { newdocument.add_boolean_term(make_parentterm(parent_udi)); } // Dates etc. time_t mtime = atoll(doc.dmtime.empty() ? doc.fmtime.c_str() : doc.dmtime.c_str()); struct tm tmb; localtime_r(&mtime, &tmb); char buf[9]; snprintf(buf, 9, "%04d%02d%02d", tmb.tm_year+1900, tmb.tm_mon + 1, tmb.tm_mday); // Date (YYYYMMDD) newdocument.add_boolean_term(wrap_prefix(xapday_prefix) + string(buf)); // Month (YYYYMM) buf[6] = '\0'; newdocument.add_boolean_term(wrap_prefix(xapmonth_prefix) + string(buf)); // Year (YYYY) buf[4] = '\0'; newdocument.add_boolean_term(wrap_prefix(xapyear_prefix) + string(buf)); ////////////////////////////////////////////////////////////////// // Document data record. omindex has the following nl separated fields: // - url // - sample // - caption (title limited to 100 chars) // - mime type // // The title, author, abstract and keywords fields are special, // they always get stored in the document data // record. Configurable other fields can be, too. // // We truncate stored fields abstract, title and keywords to // reasonable lengths and suppress newlines (so that the data // record can keep a simple syntax) string record; RECORD_APPEND(record, Doc::keyurl, doc.url); RECORD_APPEND(record, Doc::keytp, doc.mimetype); // We left-zero-pad the times so that they are lexico-sortable leftzeropad(doc.fmtime, 11); RECORD_APPEND(record, Doc::keyfmt, doc.fmtime); if (!doc.dmtime.empty()) { leftzeropad(doc.dmtime, 11); RECORD_APPEND(record, Doc::keydmt, doc.dmtime); } RECORD_APPEND(record, Doc::keyoc, doc.origcharset); if (doc.fbytes.empty()) doc.fbytes = doc.pcbytes; if (!doc.fbytes.empty()) { RECORD_APPEND(record, Doc::keyfs, doc.fbytes); leftzeropad(doc.fbytes, 12); newdocument.add_value(VALUE_SIZE, doc.fbytes); } if (doc.haschildren) { newdocument.add_boolean_term(has_children_term); } if (!doc.pcbytes.empty()) RECORD_APPEND(record, Doc::keypcs, doc.pcbytes); char sizebuf[30]; sprintf(sizebuf, "%u", (unsigned int)doc.text.length()); RECORD_APPEND(record, Doc::keyds, sizebuf); // Note that we add the signature both as a value and in the data record if (!doc.sig.empty()) { RECORD_APPEND(record, Doc::keysig, doc.sig); newdocument.add_value(VALUE_SIG, doc.sig); } if (!doc.ipath.empty()) RECORD_APPEND(record, Doc::keyipt, doc.ipath); // Fields from the Meta array. Handle title specially because it has a // different name inside the data record (history...) string& ttref = doc.meta[Doc::keytt]; ttref = neutchars(truncate_to_word(ttref, m_idxMetaStoredLen), cstr_nc); if (!ttref.empty()) { RECORD_APPEND(record, cstr_caption, ttref); ttref.clear(); } // If abstract is empty, we make up one with the beginning of the // document. This is then not indexed, but part of the doc data so // that we can return it to a query without having to decode the // original file. // Note that the map accesses by operator[] create empty entries if they // don't exist yet. if (m_idxAbsTruncLen > 0) { string& absref = doc.meta[Doc::keyabs]; trimstring(absref, " \t\r\n"); if (absref.empty()) { if (!doc.text.empty()) absref = cstr_syntAbs + neutchars(truncate_to_word(doc.text, m_idxAbsTruncLen), cstr_nc); } else { absref = neutchars(truncate_to_word(absref, m_idxAbsTruncLen), cstr_nc); } // Do the append here to avoid the different truncation done // in the regular "stored" loop if (!absref.empty()) { RECORD_APPEND(record, Doc::keyabs, absref); absref.clear(); } } // Append all regular "stored" meta fields const set& stored = m_config->getStoredFields(); for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { string nm = m_config->fieldCanon(*it); if (!doc.meta[nm].empty()) { string value = neutchars(truncate_to_word(doc.meta[nm], m_idxMetaStoredLen), cstr_nc); RECORD_APPEND(record, nm, value); } } // At this point, if the document "filename" field was empty, // try to store the "container file name" value. This is done // after indexing because we don't want search matches on // this, but the filename is often useful for display // purposes. const string *fnp = 0; if (!doc.peekmeta(Rcl::Doc::keyfn, &fnp) || fnp->empty()) { if (doc.peekmeta(Rcl::Doc::keytcfn, &fnp) && !fnp->empty()) { string value = neutchars(truncate_to_word(*fnp, m_idxMetaStoredLen), cstr_nc); RECORD_APPEND(record, Rcl::Doc::keyfn, value); } } // If empty pages (multiple break at same pos) were recorded, save // them (this is because we have no way to record them in the // Xapian list if (!tpidx.m_pageincrvec.empty()) { ostringstream multibreaks; for (unsigned int i = 0; i < tpidx.m_pageincrvec.size(); i++) { if (i != 0) multibreaks << ","; multibreaks << tpidx.m_pageincrvec[i].first << "," << tpidx.m_pageincrvec[i].second; } RECORD_APPEND(record, string(cstr_mbreaks), multibreaks.str()); } // If the file's md5 was computed, add value and term. // The value is optionally used for query result duplicate elimination, // and the term to find the duplicates. // We don't do this for empty docs. const string *md5; if (doc.peekmeta(Doc::keymd5, &md5) && !md5->empty() && md5->compare(cstr_md5empty)) { string digest; MD5HexScan(*md5, digest); newdocument.add_value(VALUE_MD5, digest); newdocument.add_boolean_term(wrap_prefix("XM") + *md5); } LOGDEB0("Rcl::Db::add: new doc record:\n" << record << "\n"); newdocument.set_data(record); } #ifdef IDX_THREADS if (m_ndb->m_havewriteq) { DbUpdTask *tp = new DbUpdTask(DbUpdTask::AddOrUpdate, udi, uniterm, newdocument_ptr, doc.text.length()); if (!m_ndb->m_wqueue.put(tp)) { LOGERR("Db::addOrUpdate:Cant queue task\n"); delete newdocument_ptr; return false; } else { return true; } } #endif return m_ndb->addOrUpdateWrite(udi, uniterm, newdocument_ptr, doc.text.length()); } bool Db::Native::docToXdocXattrOnly(TextSplitDb *splitter, const string &udi, Doc &doc, Xapian::Document& xdoc) { LOGDEB0("Db::docToXdocXattrOnly\n"); #ifdef IDX_THREADS std::unique_lock lock(m_mutex); #endif // Read existing document and its data record if (getDoc(udi, 0, xdoc) == 0) { LOGERR("docToXdocXattrOnly: existing doc not found\n"); return false; } string data; XAPTRY(data = xdoc.get_data(), xrdb, m_rcldb->m_reason); if (!m_rcldb->m_reason.empty()) { LOGERR("Db::xattrOnly: got error: " << m_rcldb->m_reason << "\n"); return false; } // Clear the term lists for the incoming fields and index the new values map::iterator meta_it; for (meta_it = doc.meta.begin(); meta_it != doc.meta.end(); meta_it++) { const FieldTraits *ftp; if (!m_rcldb->fieldToTraits(meta_it->first, &ftp) || ftp->pfx.empty()) { LOGDEB0("Db::xattrOnly: no prefix for field [" << meta_it->first << "], skipped\n"); continue; } // Clear the previous terms for the field clearField(xdoc, ftp->pfx, ftp->wdfinc); LOGDEB0("Db::xattrOnly: field [" << meta_it->first << "] pfx [" << ftp->pfx << "] inc " << ftp->wdfinc << ": [" << meta_it->second << "]\n"); splitter->setTraits(*ftp); if (!splitter->text_to_words(meta_it->second)) { LOGDEB("Db::xattrOnly: split failed for " << meta_it->first << "\n"); } } xdoc.add_value(VALUE_SIG, doc.sig); // Parse current data record into a dict for ease of processing ConfSimple datadic(data); if (!datadic.ok()) { LOGERR("db::docToXdocXattrOnly: failed turning data rec to dict\n"); return false; } // For each "stored" field, check if set in doc metadata and // update the value if it is const set& stored = m_rcldb->m_config->getStoredFields(); for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { string nm = m_rcldb->m_config->fieldCanon(*it); if (doc.getmeta(nm, 0)) { string value = neutchars( truncate_to_word(doc.meta[nm], m_rcldb->m_idxMetaStoredLen), cstr_nc); datadic.set(nm, value, ""); } } // Recreate the record. We want to do this with the local RECORD_APPEND // method for consistency in format, instead of using ConfSimple print vector names = datadic.getNames(""); data.clear(); for (vector::const_iterator it = names.begin(); it != names.end(); it++) { string value; datadic.get(*it, value, ""); RECORD_APPEND(data, *it, value); } RECORD_APPEND(data, Doc::keysig, doc.sig); xdoc.set_data(data); return true; } #ifdef IDX_THREADS void Db::waitUpdIdle() { if (m_ndb->m_iswritable && m_ndb->m_havewriteq) { Chrono chron; m_ndb->m_wqueue.waitIdle(); // We flush here just for correct measurement of the thread work time string ermsg; try { m_ndb->xwdb.commit(); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::waitUpdIdle: flush() failed: " << ermsg << "\n"); } m_ndb->m_totalworkns += chron.nanos(); LOGINFO("Db::waitUpdIdle: total xapian work " << lltodecstr(m_ndb->m_totalworkns/1000000) << " mS\n"); } } #endif // Flush when idxflushmbs is reached bool Db::maybeflush(int64_t moretext) { if (m_flushMb > 0) { m_curtxtsz += moretext; if ((m_curtxtsz - m_flushtxtsz) / MB >= m_flushMb) { LOGDEB("Db::add/delete: txt size >= " << m_flushMb << " Mb, flushing\n"); return doFlush(); } } return true; } bool Db::doFlush() { if (!m_ndb) { LOGERR("Db::doFLush: no ndb??\n"); return false; } string ermsg; try { m_ndb->xwdb.commit(); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::doFlush: flush() failed: " << ermsg << "\n"); return false; } m_flushtxtsz = m_curtxtsz; return true; } void Db::setExistingFlags(const string& udi, unsigned int docid) { if (m_mode == DbRO) return; if (docid == (unsigned int)-1) { LOGERR("Db::setExistingFlags: called with bogus docid !!\n"); return; } #ifdef IDX_THREADS std::unique_lock lock(m_ndb->m_mutex); #endif i_setExistingFlags(udi, docid); } void Db::i_setExistingFlags(const string& udi, unsigned int docid) { // Set the up to date flag for the document and its subdocs if (docid >= updated.size()) { LOGERR("needUpdate: existing docid beyond updated.size(). Udi [" << udi << "], docid " << docid << ", updated.size() " << updated.size() << "\n"); return; } else { updated[docid] = true; } // Set the existence flag for all the subdocs (if any) vector docids; if (!m_ndb->subDocs(udi, 0, docids)) { LOGERR("Rcl::Db::needUpdate: can't get subdocs\n"); return; } for (vector::iterator it = docids.begin(); it != docids.end(); it++) { if (*it < updated.size()) { LOGDEB2("Db::needUpdate: docid " << (*it) << " set\n"); updated[*it] = true; } } } // Test if doc given by udi has changed since last indexed (test sigs) bool Db::needUpdate(const string &udi, const string& sig, unsigned int *docidp, string *osigp) { if (m_ndb == 0) return false; if (osigp) osigp->clear(); if (docidp) *docidp = 0; // If we are doing an in place or full reset, no need to test. if (o_inPlaceReset || m_mode == DbTrunc) { // For in place reset, pretend the doc existed, to enable // subdoc purge. The value is only used as a boolean in this case. if (docidp && o_inPlaceReset) { *docidp = -1; } return true; } string uniterm = make_uniterm(udi); string ermsg; #ifdef IDX_THREADS // Need to protect against interaction with the doc update/insert // thread which also updates the existence map, and even multiple // accesses to the readonly Xapian::Database are not allowed // anyway std::unique_lock lock(m_ndb->m_mutex); #endif // Try to find the document indexed by the uniterm. Xapian::PostingIterator docid; XAPTRY(docid = m_ndb->xrdb.postlist_begin(uniterm), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::needUpdate: xapian::postlist_begin failed: " << m_reason << "\n"); return false; } if (docid == m_ndb->xrdb.postlist_end(uniterm)) { // No document exists with this path: we do need update LOGDEB("Db::needUpdate:yes (new): [" << uniterm << "]\n"); return true; } Xapian::Document xdoc; XAPTRY(xdoc = m_ndb->xrdb.get_document(*docid), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::needUpdate: get_document error: " << m_reason << "\n"); return true; } if (docidp) { *docidp = *docid; } // Retrieve old file/doc signature from value string osig; XAPTRY(osig = xdoc.get_value(VALUE_SIG), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::needUpdate: get_value error: " << m_reason << "\n"); return true; } LOGDEB2("Db::needUpdate: oldsig [" << osig << "] new [" << sig << "]\n"); if (osigp) { *osigp = osig; } // Compare new/old sig if (sig != osig) { LOGDEB("Db::needUpdate:yes: olsig [" << osig << "] new [" << sig << "] [" << uniterm << "]\n"); // Db is not up to date. Let's index the file return true; } // Up to date. Set the existance flags in the map for the doc and // its subdocs. LOGDEB("Db::needUpdate:no: [" << uniterm << "]\n"); i_setExistingFlags(udi, *docid); return false; } // Return existing stem db languages vector Db::getStemLangs() { LOGDEB("Db::getStemLang\n"); vector langs; if (m_ndb == 0 || m_ndb->m_isopen == false) return langs; StemDb db(m_ndb->xrdb); db.getMembers(langs); return langs; } /** * Delete stem db for given language */ bool Db::deleteStemDb(const string& lang) { LOGDEB("Db::deleteStemDb(" << lang << ")\n"); if (m_ndb == 0 || m_ndb->m_isopen == false || !m_ndb->m_iswritable) return false; XapWritableSynFamily db(m_ndb->xwdb, synFamStem); return db.deleteMember(lang); } /** * Create database of stem to parents associations for a given language. * We walk the list of all terms, stem them, and create another Xapian db * with documents indexed by a single term (the stem), and with the list of * parent terms in the document data. */ bool Db::createStemDbs(const vector& langs) { LOGDEB("Db::createStemDbs\n"); if (m_ndb == 0 || m_ndb->m_isopen == false || !m_ndb->m_iswritable) { LOGERR("createStemDb: db not open or not writable\n"); return false; } return createExpansionDbs(m_ndb->xwdb, langs); } /** * This is called at the end of an indexing session, to delete the * documents for files that are no longer there. This can ONLY be called * after a full file-system tree walk, else the file existence flags will * be wrong. */ bool Db::purge() { LOGDEB("Db::purge\n"); if (m_ndb == 0) return false; LOGDEB("Db::purge: m_isopen " << m_ndb->m_isopen << " m_iswritable " << m_ndb->m_iswritable << "\n"); if (m_ndb->m_isopen == false || m_ndb->m_iswritable == false) return false; #ifdef IDX_THREADS // If we manage our own write queue, make sure it's drained and closed if (m_ndb->m_havewriteq) m_ndb->m_wqueue.setTerminateAndWait(); // else we need to lock out other top level threads. This is just // a precaution as they should have been waited for by the top // level actor at this point std::unique_lock lock(m_ndb->m_mutex); #endif // IDX_THREADS // For xapian versions up to 1.0.1, deleting a non-existant // document would trigger an exception that would discard any // pending update. This could lose both previous added documents // or deletions. Adding the flush before the delete pass ensured // that any added document would go to the index. Kept here // because it doesn't really hurt. try { m_ndb->xwdb.commit(); } catch (...) { LOGERR("Db::purge: 1st flush failed\n"); } // Walk the document array and delete any xapian document whose // flag is not set (we did not see its source during indexing). int purgecount = 0; for (Xapian::docid docid = 1; docid < updated.size(); ++docid) { if (!updated[docid]) { if ((purgecount+1) % 100 == 0) { try { CancelCheck::instance().checkCancel(); } catch(CancelExcept) { LOGINFO("Db::purge: partially cancelled\n"); break; } } try { if (m_flushMb > 0) { // We use an average term length of 5 for // estimating the doc sizes which is probably not // accurate but gives rough consistency with what // we do for add/update. I should fetch the doc // size from the data record, but this would be // bad for performance. Xapian::termcount trms = m_ndb->xwdb.get_doclength(docid); maybeflush(trms * 5); } m_ndb->xwdb.delete_document(docid); LOGDEB("Db::purge: deleted document #" << docid << "\n"); } catch (const Xapian::DocNotFoundError &) { LOGDEB0("Db::purge: document #" << docid << " not found\n"); } catch (const Xapian::Error &e) { LOGERR("Db::purge: document #" << docid << ": " << e.get_msg() << "\n"); } catch (...) { LOGERR("Db::purge: document #" << docid << ": unknown error\n"); } purgecount++; } } try { m_ndb->xwdb.commit(); } catch (...) { LOGERR("Db::purge: 2nd flush failed\n"); } return true; } // Test for doc existence. bool Db::docExists(const string& uniterm) { #ifdef IDX_THREADS // Need to protect read db against multiaccess. std::unique_lock lock(m_ndb->m_mutex); #endif string ermsg; try { Xapian::PostingIterator docid = m_ndb->xrdb.postlist_begin(uniterm); if (docid == m_ndb->xrdb.postlist_end(uniterm)) { return false; } else { return true; } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::docExists(" << uniterm << ") " << ermsg << "\n"); } return false; } /* Delete document(s) for given unique identifier (doc and descendents) */ bool Db::purgeFile(const string &udi, bool *existed) { LOGDEB("Db:purgeFile: [" << udi << "]\n"); if (m_ndb == 0 || !m_ndb->m_iswritable) return false; string uniterm = make_uniterm(udi); bool exists = docExists(uniterm); if (existed) *existed = exists; if (!exists) return true; #ifdef IDX_THREADS if (m_ndb->m_havewriteq) { DbUpdTask *tp = new DbUpdTask(DbUpdTask::Delete, udi, uniterm, 0, (size_t)-1); if (!m_ndb->m_wqueue.put(tp)) { LOGERR("Db::purgeFile:Cant queue task\n"); return false; } else { return true; } } #endif /* We get there is IDX_THREADS is not defined or there is no queue */ return m_ndb->purgeFileWrite(false, udi, uniterm); } /* Delete subdocs with an out of date sig. We do this to purge obsolete subdocs during a partial update where no general purge will be done */ bool Db::purgeOrphans(const string &udi) { LOGDEB("Db:purgeOrphans: [" << udi << "]\n"); if (m_ndb == 0 || !m_ndb->m_iswritable) return false; string uniterm = make_uniterm(udi); #ifdef IDX_THREADS if (m_ndb->m_havewriteq) { DbUpdTask *tp = new DbUpdTask(DbUpdTask::PurgeOrphans, udi, uniterm, 0, (size_t)-1); if (!m_ndb->m_wqueue.put(tp)) { LOGERR("Db::purgeFile:Cant queue task\n"); return false; } else { return true; } } #endif /* We get there is IDX_THREADS is not defined or there is no queue */ return m_ndb->purgeFileWrite(true, udi, uniterm); } bool Db::dbStats(DbStats& res, bool listfailed) { if (!m_ndb || !m_ndb->m_isopen) return false; Xapian::Database xdb = m_ndb->xrdb; XAPTRY(res.dbdoccount = xdb.get_doccount(); res.dbavgdoclen = xdb.get_avlength(); res.mindoclen = xdb.get_doclength_lower_bound(); res.maxdoclen = xdb.get_doclength_upper_bound(); , xdb, m_reason); if (!m_reason.empty()) return false; if (!listfailed) { return true; } // listfailed is set : look for failed docs string ermsg; try { for (unsigned int docid = 1; docid < xdb.get_lastdocid(); docid++) { try { Xapian::Document doc = xdb.get_document(docid); string sig = doc.get_value(VALUE_SIG); if (sig.empty() || sig[sig.size()-1] != '+') { continue; } string data = doc.get_data(); ConfSimple parms(data); if (!parms.ok()) { } else { string url, ipath; parms.get(Doc::keyipt, ipath); parms.get(Doc::keyurl, url); // Turn to local url or not? It seems to make more // sense to keep the original urls as seen by the // indexer. // m_config->urlrewrite(dbdir, url); if (!ipath.empty()) { url += " | " + ipath; } res.failedurls.push_back(url); } } catch (Xapian::DocNotFoundError) { continue; } } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("Db::dbStats: " << ermsg << "\n"); return false; } return true; } // Retrieve document defined by Unique doc identifier. This is used // by the GUI history feature and by open parent/getenclosing // ! The return value is always true except for fatal errors. Document // existence should be tested by looking at doc.pc bool Db::getDoc(const string &udi, const Doc& idxdoc, Doc &doc) { LOGDEB("Db:getDoc: [" << udi << "]\n"); if (m_ndb == 0) return false; // Initialize what we can in any case. If this is history, caller // will make partial display in case of error doc.meta[Rcl::Doc::keyrr] = "100%"; doc.pc = 100; Xapian::Document xdoc; Xapian::docid docid; int idxi = idxdoc.idxi; if ((docid = m_ndb->getDoc(udi, idxi, xdoc))) { string data = xdoc.get_data(); doc.meta[Rcl::Doc::keyudi] = udi; return m_ndb->dbDataToRclDoc(docid, data, doc); } else { // Document found in history no longer in the // database. We return true (because their might be // other ok docs further) but indicate the error with // pc = -1 doc.pc = -1; LOGINFO("Db:getDoc: no such doc in index: [" << udi << "]\n"); return true; } } bool Db::hasSubDocs(const Doc &idoc) { if (m_ndb == 0) return false; string inudi; if (!idoc.getmeta(Doc::keyudi, &inudi) || inudi.empty()) { LOGERR("Db::hasSubDocs: no input udi or empty\n"); return false; } LOGDEB1("Db::hasSubDocs: idxi " << idoc.idxi << " inudi [" < docids; if (!m_ndb->subDocs(inudi, idoc.idxi, docids)) { LOGDEB("Db::hasSubDocs: lower level subdocs failed\n"); return false; } if (!docids.empty()) return true; // Check if doc has an "has_children" term if (m_ndb->hasTerm(inudi, idoc.idxi, has_children_term)) return true; return false; } // Retrieve all subdocuments of a given one, which may not be a file-level // one (in which case, we have to retrieve this first, then filter the ipaths) bool Db::getSubDocs(const Doc &idoc, vector& subdocs) { if (m_ndb == 0) return false; string inudi; if (!idoc.getmeta(Doc::keyudi, &inudi) || inudi.empty()) { LOGERR("Db::getSubDocs: no input udi or empty\n"); return false; } string rootudi; string ipath = idoc.ipath; LOGDEB0("Db::getSubDocs: idxi " << idoc.idxi << " inudi [" << inudi << "] ipath [" << ipath << "]\n"); if (ipath.empty()) { // File-level doc. Use it as root rootudi = inudi; } else { // See if we have a parent term Xapian::Document xdoc; if (!m_ndb->getDoc(inudi, idoc.idxi, xdoc)) { LOGERR("Db::getSubDocs: can't get Xapian document\n"); return false; } Xapian::TermIterator xit; XAPTRY(xit = xdoc.termlist_begin(); xit.skip_to(wrap_prefix(parent_prefix)), m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::getSubDocs: xapian error: " << m_reason << "\n"); return false; } if (xit == xdoc.termlist_end()) { LOGERR("Db::getSubDocs: parent term not found\n"); return false; } rootudi = strip_prefix(*xit); } LOGDEB("Db::getSubDocs: root: [" << rootudi << "]\n"); // Retrieve all subdoc xapian ids for the root vector docids; if (!m_ndb->subDocs(rootudi, idoc.idxi, docids)) { LOGDEB("Db::getSubDocs: lower level subdocs failed\n"); return false; } // Retrieve doc, filter, and build output list for (int tries = 0; tries < 2; tries++) { try { for (vector::const_iterator it = docids.begin(); it != docids.end(); it++) { Xapian::Document xdoc = m_ndb->xrdb.get_document(*it); string data = xdoc.get_data(); string docudi; m_ndb->xdocToUdi(xdoc, docudi); Doc doc; doc.meta[Doc::keyudi] = docudi; doc.meta[Doc::keyrr] = "100%"; doc.pc = 100; if (!m_ndb->dbDataToRclDoc(*it, data, doc)) { LOGERR("Db::getSubDocs: doc conversion error\n"); return false; } if (ipath.empty() || FileInterner::ipathContains(ipath, doc.ipath)) { subdocs.push_back(doc); } } return true; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); m_ndb->xrdb.reopen(); continue; } XCATCHERROR(m_reason); break; } LOGERR("Db::getSubDocs: Xapian error: " << m_reason << "\n"); return false; } } // End namespace Rcl recoll-1.23.7/rcldb/searchdata.cpp0000644000175000017500000002713613125637102013707 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Handle translation from rcl's SearchData structures to Xapian Queries #include "autoconfig.h" #include #include #include #include #include #include using namespace std; #include "xapian.h" #include "cstr.h" #include "rcldb.h" #include "rcldb_p.h" #include "searchdata.h" #include "log.h" #include "smallut.h" #include "textsplit.h" #include "unacpp.h" #include "utf8iter.h" #include "stoplist.h" #include "rclconfig.h" #include "termproc.h" #include "synfamily.h" #include "stemdb.h" #include "expansiondbs.h" #include "base64.h" #include "daterange.h" namespace Rcl { typedef vector::iterator qlist_it_t; typedef vector::const_iterator qlist_cit_t; void SearchData::commoninit() { m_haveDates = false; m_maxSize = size_t(-1); m_minSize = size_t(-1); m_haveWildCards = false; m_autodiacsens = false; m_autocasesens = true; m_maxexp = 10000; m_maxcl = 100000; m_softmaxexpand = -1; } SearchData::~SearchData() { LOGDEB0("SearchData::~SearchData\n" ); for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) delete *it; } // This is called by the GUI simple search if the option is set: add // (OR) phrase to a query (if it is simple enough) so that results // where the search terms are close and in order will come up on top. // We remove very common terms from the query to avoid performance issues. bool SearchData::maybeAddAutoPhrase(Rcl::Db& db, double freqThreshold) { LOGDEB0("SearchData::maybeAddAutoPhrase()\n" ); // cerr << "BEFORE SIMPLIFY\n"; dump(cerr); simplify(); // cerr << "AFTER SIMPLIFY\n"; dump(cerr); if (!m_query.size()) { LOGDEB2("SearchData::maybeAddAutoPhrase: empty query\n" ); return false; } string field; vector words; // Walk the clause list. If this is not an AND list, we find any // non simple clause or different field names, bail out. for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) { SClType tp = (*it)->m_tp; if (tp != SCLT_AND) { LOGDEB2("SearchData::maybeAddAutoPhrase: wrong tp " << (tp) << "\n" ); return false; } SearchDataClauseSimple *clp = dynamic_cast(*it); if (clp == 0) { LOGDEB2("SearchData::maybeAddAutoPhrase: dyncast failed\n" ); return false; } if (it == m_query.begin()) { field = clp->getfield(); } else { if (clp->getfield().compare(field)) { LOGDEB2("SearchData::maybeAddAutoPhrase: diff. fields\n" ); return false; } } // If there are wildcards or quotes in there, bail out if (clp->gettext().find_first_of("\"*[?") != string::npos) { LOGDEB2("SearchData::maybeAddAutoPhrase: wildcards\n" ); return false; } // Do a simple word-split here, not the full-blown // textsplit. Spans of stopwords should not be trimmed later // in this function, they will be properly split when the // phrase gets processed by toNativeQuery() later on. vector wl; stringToStrings(clp->gettext(), wl); words.insert(words.end(), wl.begin(), wl.end()); } // Trim the word list by eliminating very frequent terms // (increasing the slack as we do it): int slack = 0; int doccnt = db.docCnt(); if (!doccnt) doccnt = 1; string swords; for (vector::iterator it = words.begin(); it != words.end(); it++) { double freq = double(db.termDocCnt(*it)) / doccnt; if (freq < freqThreshold) { if (!swords.empty()) swords.append(1, ' '); swords += *it; } else { LOGDEB0("SearchData::Autophrase: [" << *it << "] too frequent (" << (100 * freq) << " %" << ")\n" ); slack++; } } // We can't make a phrase with a single word :) int nwords = TextSplit::countWords(swords); if (nwords <= 1) { LOGDEB2("SearchData::maybeAddAutoPhrase: ended with 1 word\n" ); return false; } // Increase the slack: we want to be a little more laxist than for // an actual user-entered phrase slack += 1 + nwords / 3; m_autophrase = std::shared_ptr( new SearchDataClauseDist(SCLT_PHRASE, swords, slack, field)); return true; } // Add clause to current list. OR lists cant have EXCL clauses. bool SearchData::addClause(SearchDataClause* cl) { if (m_tp == SCLT_OR && cl->getexclude()) { LOGERR("SearchData::addClause: cant add EXCL to OR list\n" ); m_reason = "No Negative (AND_NOT) clauses allowed in OR queries"; return false; } cl->setParent(this); m_haveWildCards = m_haveWildCards || cl->m_haveWildCards; m_query.push_back(cl); return true; } // Am I a file name only search ? This is to turn off term highlighting. // There can't be a subclause in a filename search: no possible need to recurse bool SearchData::fileNameOnly() { for (qlist_it_t it = m_query.begin(); it != m_query.end(); it++) if (!(*it)->isFileName()) return false; return true; } // The query language creates a lot of subqueries. See if we can merge them. void SearchData::simplify() { for (unsigned int i = 0; i < m_query.size(); i++) { if (m_query[i]->m_tp != SCLT_SUB) continue; //C[est ce dyncast qui crashe?? SearchDataClauseSub *clsubp = dynamic_cast(m_query[i]); if (clsubp == 0) { // ?? continue; } if (clsubp->getSub()->m_tp != m_tp) continue; clsubp->getSub()->simplify(); // If this subquery has special attributes, it's not a // candidate for collapsing, except if it has no clauses, because // then, we just pick the attributes. if (!clsubp->getSub()->m_filetypes.empty() || !clsubp->getSub()->m_nfiletypes.empty() || clsubp->getSub()->m_haveDates || clsubp->getSub()->m_maxSize != size_t(-1) || clsubp->getSub()->m_minSize != size_t(-1) || clsubp->getSub()->m_haveWildCards) { if (!clsubp->getSub()->m_query.empty()) continue; m_filetypes.insert(m_filetypes.end(), clsubp->getSub()->m_filetypes.begin(), clsubp->getSub()->m_filetypes.end()); m_nfiletypes.insert(m_nfiletypes.end(), clsubp->getSub()->m_nfiletypes.begin(), clsubp->getSub()->m_nfiletypes.end()); if (clsubp->getSub()->m_haveDates && !m_haveDates) { m_dates = clsubp->getSub()->m_dates; } if (m_maxSize == size_t(-1)) m_maxSize = clsubp->getSub()->m_maxSize; if (m_minSize == size_t(-1)) m_minSize = clsubp->getSub()->m_minSize; m_haveWildCards = m_haveWildCards || clsubp->getSub()->m_haveWildCards; // And then let the clauses processing go on, there are // none anyway, we will just delete the subquery. } bool allsametp = true; for (qlist_it_t it1 = clsubp->getSub()->m_query.begin(); it1 != clsubp->getSub()->m_query.end(); it1++) { // We want all AND or OR clause, and same as our conjunction if (((*it1)->getTp() != SCLT_AND && (*it1)->getTp() != SCLT_OR) || (*it1)->getTp() != m_tp) { allsametp = false; break; } } if (!allsametp) continue; // All ok: delete the clause_sub, and insert the queries from // its searchdata in its place m_query.erase(m_query.begin() + i); m_query.insert(m_query.begin() + i, clsubp->getSub()->m_query.begin(), clsubp->getSub()->m_query.end()); for (unsigned int j = i; j < i + clsubp->getSub()->m_query.size(); j++) { m_query[j]->setParent(this); } i += int(clsubp->getSub()->m_query.size()) - 1; // We don't want the clauses to be deleted when the parent is, as we // know own them. clsubp->getSub()->m_query.clear(); delete clsubp; } } // Extract terms and groups for highlighting void SearchData::getTerms(HighlightData &hld) const { for (qlist_cit_t it = m_query.begin(); it != m_query.end(); it++) { if (!((*it)->getmodifiers() & SearchDataClause::SDCM_NOTERMS) && !(*it)->getexclude()) { (*it)->getTerms(hld); } } return; } static const char * tpToString(SClType t) { switch (t) { case SCLT_AND: return "AND"; case SCLT_OR: return "OR"; case SCLT_FILENAME: return "FILENAME"; case SCLT_PHRASE: return "PHRASE"; case SCLT_NEAR: return "NEAR"; case SCLT_PATH: return "PATH"; case SCLT_SUB: return "SUB"; default: return "UNKNOWN"; } } static string dumptabs; void SearchData::dump(ostream& o) const { o << dumptabs << "SearchData: " << tpToString(m_tp) << " qs " << int(m_query.size()) << " ft " << m_filetypes.size() << " nft " << m_nfiletypes.size() << " hd " << m_haveDates << " maxs " << int(m_maxSize) << " mins " << int(m_minSize) << " wc " << m_haveWildCards << "\n"; for (std::vector::const_iterator it = m_query.begin(); it != m_query.end(); it++) { o << dumptabs; (*it)->dump(o); o << "\n"; } // o << dumptabs << "\n"; } void SearchDataClause::dump(ostream& o) const { o << "SearchDataClause??"; } void SearchDataClauseSimple::dump(ostream& o) const { o << "ClauseSimple: " << tpToString(m_tp) << " "; if (m_exclude) o << "- "; o << "[" ; if (!m_field.empty()) o << m_field << " : "; o << m_text << "]"; } void SearchDataClauseFilename::dump(ostream& o) const { o << "ClauseFN: "; if (m_exclude) o << " - "; o << "[" << m_text << "]"; } void SearchDataClausePath::dump(ostream& o) const { o << "ClausePath: "; if (m_exclude) o << " - "; o << "[" << m_text << "]"; } void SearchDataClauseDist::dump(ostream& o) const { if (m_tp == SCLT_NEAR) o << "ClauseDist: NEAR "; else o << "ClauseDist: PHRA "; if (m_exclude) o << " - "; o << "["; if (!m_field.empty()) o << m_field << " : "; o << m_text << "]"; } void SearchDataClauseSub::dump(ostream& o) const { o << "ClauseSub {\n"; dumptabs += '\t'; m_sub->dump(o); dumptabs.erase(dumptabs.size()- 1); o << dumptabs << "}"; } } // Namespace Rcl recoll-1.23.7/rcldb/daterange.cpp0000644000175000017500000000635713125637102013544 00000000000000/* The dates-to-query routine is is lifted quasi-verbatim but * modified from xapian-omega:date.cc. Copyright info: * * Copyright 1999,2000,2001 BrightStation PLC * Copyright 2001 James Aylett * Copyright 2001,2002 Ananova Ltd * Copyright 2002 Intercede 1749 Ltd * Copyright 2002,2003,2006 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #include "autoconfig.h" #include #include using namespace std; #include #include "log.h" #include "rclconfig.h" namespace Rcl { static inline void bufprefix(char *buf, char c) { if (o_index_stripchars) { buf[0] = c; } else { buf[0] = ':'; buf[1] = c; buf[2] = ':'; } } static inline int bpoffs() { return o_index_stripchars ? 1 : 3; } Xapian::Query date_range_filter(int y1, int m1, int d1, int y2, int m2, int d2) { // Xapian uses a smallbuf and snprintf. Can't be bothered, we're // doing at most 3 %d's ! char buf[200]; vector v; // Deal with days till the end of the first month if any bufprefix(buf, 'D'); sprintf(buf + bpoffs(), "%04d%02d", y1, m1); int d_last = monthdays(m1, y1); int d_end = d_last; if (y1 == y2 && m1 == m2 && d2 < d_last) { d_end = d2; } if (d1 > 1 || d_end < d_last) { for ( ; d1 <= d_end ; d1++) { sprintf(buf + 6 + bpoffs(), "%02d", d1); v.push_back(Xapian::Query(buf)); } } else { bufprefix(buf, 'M'); v.push_back(Xapian::Query(buf)); } if (y1 == y2 && m1 == m2) { return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end()); } // Months till the end of first year int m_last = (y1 < y2) ? 12 : m2 - 1; bufprefix(buf, 'M'); while (++m1 <= m_last) { sprintf(buf + 4 + bpoffs(), "%02d", m1); v.push_back(Xapian::Query(buf)); } // Years inbetween and first months of the last year if (y1 < y2) { bufprefix(buf, 'Y'); while (++y1 < y2) { sprintf(buf + bpoffs(), "%04d", y1); v.push_back(Xapian::Query(buf)); } bufprefix(buf, 'M'); sprintf(buf + bpoffs(), "%04d", y2); for (m1 = 1; m1 < m2; m1++) { sprintf(buf + 4 + bpoffs(), "%02d", m1); v.push_back(Xapian::Query(buf)); } } // Last month sprintf(buf + 4 + bpoffs(), "%02d", m2); // Deal with any final partial month if (d2 < monthdays(m2, y2)) { bufprefix(buf, 'D'); for (d1 = 1 ; d1 <= d2; d1++) { sprintf(buf + 6 + bpoffs(), "%02d", d1); v.push_back(Xapian::Query(buf)); } } else { bufprefix(buf, 'M'); v.push_back(Xapian::Query(buf)); } return Xapian::Query(Xapian::Query::OP_OR, v.begin(), v.end()); } } recoll-1.23.7/rcldb/rclterms.cpp0000644000175000017500000004530213224502562013437 00000000000000/* 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. */ //////////////////////////////////////////////////////////////////// /** Things dealing with walking the terms lists and expansion dbs */ #include "autoconfig.h" #include #include "log.h" #include "rcldb.h" #include "rcldb_p.h" #include "stemdb.h" #include "expansiondbs.h" #include "strmatcher.h" using namespace std; namespace Rcl { // File name wild card expansion. This is a specialisation ot termMatch bool Db::filenameWildExp(const string& fnexp, vector& names, int max) { string pattern = fnexp; names.clear(); // If pattern is not capitalized, not quoted (quoted pattern can't // get here currently anyway), and has no wildcards, we add * at // each end: match any substring if (pattern[0] == '"' && pattern[pattern.size()-1] == '"') { pattern = pattern.substr(1, pattern.size() -2); } else if (pattern.find_first_of(cstr_minwilds) == string::npos && !unaciscapital(pattern)) { pattern = "*" + pattern + "*"; } // else let it be LOGDEB("Rcl::Db::filenameWildExp: pattern: [" << (pattern) << "]\n" ); // We inconditionnally lowercase and strip the pattern, as is done // during indexing. This seems to be the only sane possible // approach with file names and wild cards. termMatch does // stripping conditionally on indexstripchars. string pat1; if (unacmaybefold(pattern, pat1, "UTF-8", UNACOP_UNACFOLD)) { pattern.swap(pat1); } TermMatchResult result; if (!idxTermMatch(ET_WILD, string(), pattern, result, max, unsplitFilenameFieldName)) return false; for (vector::const_iterator it = result.entries.begin(); it != result.entries.end(); it++) names.push_back(it->term); if (names.empty()) { // Build an impossible query: we know its impossible because we // control the prefixes! names.push_back(wrap_prefix("XNONE") + "NoMatchingTerms"); } return true; } // Walk the Y terms and return min/max bool Db::maxYearSpan(int *minyear, int *maxyear) { LOGDEB("Rcl::Db:maxYearSpan\n" ); *minyear = 1000000; *maxyear = -1000000; TermMatchResult result; if (!idxTermMatch(ET_WILD, string(), "*", result, -1, "xapyear")) { LOGINFO("Rcl::Db:maxYearSpan: termMatch failed\n" ); return false; } for (vector::const_iterator it = result.entries.begin(); it != result.entries.end(); it++) { if (!it->term.empty()) { int year = atoi(strip_prefix(it->term).c_str()); if (year < *minyear) *minyear = year; if (year > *maxyear) *maxyear = year; } } return true; } bool Db::getAllDbMimeTypes(std::vector& exp) { Rcl::TermMatchResult res; if (!idxTermMatch(Rcl::Db::ET_WILD, "", "*", res, -1, "mtype")) { return false; } for (vector::const_iterator rit = res.entries.begin(); rit != res.entries.end(); rit++) { exp.push_back(Rcl::strip_prefix(rit->term)); } return true; } class TermMatchCmpByWcf { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return r.wcf - l.wcf < 0; } }; class TermMatchCmpByTerm { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return l.term.compare(r.term) > 0; } }; class TermMatchTermEqual { public: int operator()(const TermMatchEntry& l, const TermMatchEntry& r) { return !l.term.compare(r.term); } }; static const char *tmtptostr(int typ) { switch (typ) { case Db::ET_WILD: return "wildcard"; case Db::ET_REGEXP: return "regexp"; case Db::ET_STEM: return "stem"; case Db::ET_NONE: default: return "none"; } } // Find all index terms that match an input along different expansion modes: // wildcard, regular expression, or stemming. Depending on flags we perform // case and/or diacritics expansion (this can be the only thing requested). // If the "field" parameter is set, we return a list of appropriately // prefixed terms (which are going to be used to build a Xapian // query). // This routine performs case/diacritics/stemming expansion against // the auxiliary tables, and possibly calls idxTermMatch() for work // using the main index terms (filtering, retrieving stats, expansion // in some cases). bool Db::termMatch(int typ_sens, const string &lang, const string &_term, TermMatchResult& res, int max, const string& field, vector* multiwords) { int matchtyp = matchTypeTp(typ_sens); if (!m_ndb || !m_ndb->m_isopen) return false; Xapian::Database xrdb = m_ndb->xrdb; bool diac_sensitive = (typ_sens & ET_DIACSENS) != 0; bool case_sensitive = (typ_sens & ET_CASESENS) != 0; // Path elements (used for dir: filtering) are special because // they are not unaccented or lowercased even if the index is // otherwise stripped. bool pathelt = (typ_sens & ET_PATHELT) != 0; LOGDEB0("Db::TermMatch: typ " << tmtptostr(matchtyp) << " diacsens " << diac_sensitive << " casesens " << case_sensitive << " pathelt " << pathelt << " lang [" << lang << "] term [" << _term << "] max " << max << " field [" << field << "] stripped " << o_index_stripchars << " init res.size " << res.entries.size() << "\n"); // If index is stripped, no case or diac expansion can be needed: // for the processing inside this routine, everything looks like // we're all-sensitive: no use of expansion db. // Also, convert input to lowercase and strip its accents. string term = _term; if (o_index_stripchars) { diac_sensitive = case_sensitive = true; if (!pathelt && !unacmaybefold(_term, term, "UTF-8", UNACOP_UNACFOLD)) { LOGERR("Db::termMatch: unac failed for [" << _term << "]\n"); return false; } } // The case/diac expansion db SynTermTransUnac unacfoldtrans(UNACOP_UNACFOLD); XapComputableSynFamMember synac(xrdb, synFamDiCa, "all", &unacfoldtrans); if (matchtyp == ET_WILD || matchtyp == ET_REGEXP) { std::shared_ptr matcher; if (matchtyp == ET_WILD) { matcher = std::shared_ptr(new StrWildMatcher(term)); } else { matcher = std::shared_ptr(new StrRegexpMatcher(term)); } if (!diac_sensitive || !case_sensitive) { // Perform case/diac expansion on the exp as appropriate and // expand the result. vector exp; if (diac_sensitive) { // Expand for diacritics and case, filtering for same diacritics SynTermTransUnac foldtrans(UNACOP_FOLD); synac.synKeyExpand(matcher.get(), exp, &foldtrans); } else if (case_sensitive) { // Expand for diacritics and case, filtering for same case SynTermTransUnac unactrans(UNACOP_UNAC); synac.synKeyExpand(matcher.get(), exp, &unactrans); } else { // Expand for diacritics and case, no filtering synac.synKeyExpand(matcher.get(), exp); } // Retrieve additional info and filter against the index itself for (vector::const_iterator it = exp.begin(); it != exp.end(); it++) { idxTermMatch(ET_NONE, "", *it, res, max, field); } // And also expand the original expression against the // main index: for the common case where the expression // had no case/diac expansion (no entry in the exp db if // the original term is lowercase and without accents). idxTermMatch(typ_sens, lang, term, res, max, field); } else { idxTermMatch(typ_sens, lang, term, res, max, field); } } else { // Expansion is STEM or NONE (which may still need synonyms // and case/diac exp) vector lexp; if (diac_sensitive && case_sensitive) { // No case/diac expansion lexp.push_back(term); } else if (diac_sensitive) { // Expand for accents and case, filtering for same accents, SynTermTransUnac foldtrans(UNACOP_FOLD); synac.synExpand(term, lexp, &foldtrans); } else if (case_sensitive) { // Expand for accents and case, filtering for same case SynTermTransUnac unactrans(UNACOP_UNAC); synac.synExpand(term, lexp, &unactrans); } else { // We are neither accent- nor case- sensitive and may need stem // expansion or not. Expand for accents and case synac.synExpand(term, lexp); } if (matchtyp == ET_STEM || (typ_sens & ET_SYNEXP)) { // Note: if any of the above conds is true, we are insensitive to // diacs and case (enforced in searchdatatox:termexpand // Need stem expansion. Lowercase the result of accent and case // expansion for input to stemdb. for (unsigned int i = 0; i < lexp.size(); i++) { string lower; unacmaybefold(lexp[i], lower, "UTF-8", UNACOP_FOLD); lexp[i] = lower; } sort(lexp.begin(), lexp.end()); lexp.erase(unique(lexp.begin(), lexp.end()), lexp.end()); if (matchtyp == ET_STEM) { StemDb sdb(xrdb); vector exp1; for (vector::const_iterator it = lexp.begin(); it != lexp.end(); it++) { sdb.stemExpand(lang, *it, exp1); } exp1.swap(lexp); sort(lexp.begin(), lexp.end()); lexp.erase(unique(lexp.begin(), lexp.end()), lexp.end()); LOGDEB("ExpTerm: stemexp: " << (stringsToString(lexp)) << "\n" ); } if (m_syngroups.ok() && (typ_sens & ET_SYNEXP)) { LOGDEB("ExpTerm: got syngroups\n" ); vector exp1(lexp); for (vector::const_iterator it = lexp.begin(); it != lexp.end(); it++) { vector sg = m_syngroups.getgroup(*it); if (!sg.empty()) { LOGDEB("ExpTerm: syns: " << *it << " -> " << (stringsToString(sg)) << "\n" ); for (vector::const_iterator it1 = sg.begin(); it1 != sg.end(); it1++) { if (it1->find_first_of(" ") != string::npos) { if (multiwords) { multiwords->push_back(*it1); } } else { exp1.push_back(*it1); } } } } lexp.swap(exp1); sort(lexp.begin(), lexp.end()); lexp.erase(unique(lexp.begin(), lexp.end()), lexp.end()); } // Expand the resulting list for case (all stemdb content // is lowercase) vector exp1; for (vector::const_iterator it = lexp.begin(); it != lexp.end(); it++) { synac.synExpand(*it, exp1); } exp1.swap(lexp); sort(lexp.begin(), lexp.end()); lexp.erase(unique(lexp.begin(), lexp.end()), lexp.end()); } // Filter the result and get the stats, possibly add prefixes. LOGDEB("ExpandTerm:TM: lexp: " << (stringsToString(lexp)) << "\n" ); for (vector::const_iterator it = lexp.begin(); it != lexp.end(); it++) { idxTermMatch(Rcl::Db::ET_WILD, "", *it, res, max, field); } } TermMatchCmpByTerm tcmp; sort(res.entries.begin(), res.entries.end(), tcmp); TermMatchTermEqual teq; vector::iterator uit = unique(res.entries.begin(), res.entries.end(), teq); res.entries.resize(uit - res.entries.begin()); TermMatchCmpByWcf wcmp; sort(res.entries.begin(), res.entries.end(), wcmp); if (max > 0) { // Would need a small max and big stem expansion... res.entries.resize(MIN(res.entries.size(), (unsigned int)max)); } return true; } // Second phase of wildcard/regexp term expansion after case/diac // expansion: expand against main index terms bool Db::idxTermMatch(int typ_sens, const string &lang, const string &root, TermMatchResult& res, int max, const string& field) { int typ = matchTypeTp(typ_sens); LOGDEB1("Db::idxTermMatch: typ " << (tmtptostr(typ)) << " lang [" << (lang) << "] term [" << (root) << "] max " << (max) << " field [" << (field) << "] init res.size " << (res.entries.size()) << "\n" ); if (typ == ET_STEM) { LOGFATAL("RCLDB: internal error: idxTermMatch called with ET_STEM\n" ); abort(); } Xapian::Database xdb = m_ndb->xrdb; string prefix; if (!field.empty()) { const FieldTraits *ftp = 0; if (!fieldToTraits(field, &ftp, true) || ftp->pfx.empty()) { LOGDEB("Db::termMatch: field is not indexed (no prefix): [" << (field) << "]\n" ); } else { prefix = wrap_prefix(ftp->pfx); } } res.prefix = prefix; std::shared_ptr matcher; if (typ == ET_REGEXP) { matcher = std::shared_ptr(new StrRegexpMatcher(root)); if (!matcher->ok()) { LOGERR("termMatch: regcomp failed: " << (matcher->getreason())); return false; } } else if (typ == ET_WILD) { matcher = std::shared_ptr(new StrWildMatcher(root)); } // Find the initial section before any special char string::size_type es = string::npos; if (matcher) { es = matcher->baseprefixlen(); } // Initial section: the part of the prefix+expr before the // first wildcard character. We only scan the part of the // index where this matches string is; if (es == string::npos) { is = prefix + root; } else if (es == 0) { is = prefix; } else { is = prefix + root.substr(0, es); } LOGDEB2("termMatch: initsec: [" << (is) << "]\n" ); for (int tries = 0; tries < 2; tries++) { try { Xapian::TermIterator it = xdb.allterms_begin(); if (!is.empty()) it.skip_to(is.c_str()); for (int rcnt = 0; it != xdb.allterms_end(); it++) { // If we're beyond the terms matching the initial // section, end if (!is.empty() && (*it).find(is) != 0) break; // Else try to match the term. The matcher content // is without prefix, so we remove this if any. We // just checked that the index term did begin with // the prefix. string term; if (!prefix.empty()) { term = (*it).substr(prefix.length()); } else { if (has_prefix(*it)) { continue; } term = *it; } if (matcher && !matcher->match(term)) continue; res.entries.push_back( TermMatchEntry(*it, xdb.get_collection_freq(*it), it.get_termfreq())); // The problem with truncating here is that this is done // alphabetically and we may not keep the most frequent // terms. OTOH, not doing it may stall the program if // we are walking the whole term list. We compromise // by cutting at 2*max if (max > 0 && ++rcnt >= 2*max) break; } m_reason.erase(); break; } catch (const Xapian::DatabaseModifiedError &e) { m_reason = e.get_msg(); xdb.reopen(); continue; } XCATCHERROR(m_reason); break; } if (!m_reason.empty()) { LOGERR("termMatch: " << (m_reason) << "\n" ); return false; } return true; } /** Term list walking. */ class TermIter { public: Xapian::TermIterator it; Xapian::Database db; }; TermIter *Db::termWalkOpen() { if (!m_ndb || !m_ndb->m_isopen) return 0; TermIter *tit = new TermIter; if (tit) { tit->db = m_ndb->xrdb; XAPTRY(tit->it = tit->db.allterms_begin(), tit->db, m_reason); if (!m_reason.empty()) { LOGERR("Db::termWalkOpen: xapian error: " << (m_reason) << "\n" ); return 0; } } return tit; } bool Db::termWalkNext(TermIter *tit, string &term) { XAPTRY( if (tit && tit->it != tit->db.allterms_end()) { term = *(tit->it)++; return true; } , tit->db, m_reason); if (!m_reason.empty()) { LOGERR("Db::termWalkOpen: xapian error: " << (m_reason) << "\n" ); } return false; } void Db::termWalkClose(TermIter *tit) { try { delete tit; } catch (...) {} } bool Db::termExists(const string& word) { if (!m_ndb || !m_ndb->m_isopen) return 0; XAPTRY(if (!m_ndb->xrdb.term_exists(word)) return false, m_ndb->xrdb, m_reason); if (!m_reason.empty()) { LOGERR("Db::termWalkOpen: xapian error: " << (m_reason) << "\n" ); return false; } return true; } bool Db::stemDiffers(const string& lang, const string& word, const string& base) { Xapian::Stem stemmer(lang); if (!stemmer(word).compare(stemmer(base))) { LOGDEB2("Rcl::Db::stemDiffers: same for " << (word) << " and " << (base) << "\n" ); return false; } return true; } } // End namespace Rcl recoll-1.23.7/rcldb/stoplist.h0000644000175000017500000000312713125527323013133 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STOPLIST_H_INCLUDED_ #define _STOPLIST_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::set; using std::string; namespace Rcl { #endif /** * A StopList is just a bunch of strings read from a file. * * Some of the string may contain whitespace (that's for experimentation with * stop n-grams), so we take care of dquotes while reading the file. We also * lowercase and remove accents. The source file should be utf-8. */ class StopList { public: StopList() {} StopList(const string &filename) {setFile(filename);} virtual ~StopList() {} bool setFile(const string &filename); bool isStop(const string &term) const; bool hasStops() const {return !m_stops.empty();} private: set m_stops; }; #ifndef NO_NAMESPACES } #endif #endif /* _STOPLIST_H_INCLUDED_ */ recoll-1.23.7/rcldb/xmacros.h0000644000175000017500000000401113125527323012717 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _xmacros_h_included_ #define _xmacros_h_included_ // Generic Xapian exception catching code. We do this quite often, // and I have no idea how to do this except for a macro #define XCATCHERROR(MSG) \ catch (const Xapian::Error &e) { \ MSG = e.get_msg(); \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (const std::string &s) { \ MSG = s; \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (const char *s) { \ MSG = s; \ if (MSG.empty()) MSG = "Empty error message"; \ } catch (...) { \ MSG = "Caught unknown xapian exception"; \ } #define XAPTRY(STMTTOTRY, XAPDB, ERSTR) \ for (int tries = 0; tries < 2; tries++) { \ try { \ STMTTOTRY; \ ERSTR.erase(); \ break; \ } catch (const Xapian::DatabaseModifiedError &e) { \ ERSTR = e.get_msg(); \ XAPDB.reopen(); \ continue; \ } XCATCHERROR(ERSTR); \ break; \ } #endif recoll-1.23.7/rcldb/stoplist.cpp0000644000175000017500000000536213125637102013466 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_STOPLIST #include "log.h" #include "readfile.h" #include "unacpp.h" #include "smallut.h" #include "stoplist.h" #ifndef NO_NAMESPACES namespace Rcl { #endif bool StopList::setFile(const string &filename) { m_stops.clear(); string stoptext, reason; if (!file_to_string(filename, stoptext, &reason)) { LOGDEB0("StopList::StopList: file_to_string(" << (filename) << ") failed: " << (reason) << "\n" ); return false; } set stops; stringToStrings(stoptext, stops); for (set::iterator it = stops.begin(); it != stops.end(); it++) { string dterm; unacmaybefold(*it, dterm, "UTF-8", UNACOP_UNACFOLD); m_stops.insert(dterm); } return true; } // Most sites will have an empty stop list. We try to optimize the // empty set case as much as possible. empty() is probably sligtly faster than // find() in this case. bool StopList::isStop(const string &term) const { return m_stops.empty() ? false : m_stops.find(term) != m_stops.end(); } #ifndef NO_NAMESPACES } #endif #else // TEST_STOPLIST #include #include #include #include #include #include #include #include "stoplist.h" using namespace std; using namespace Rcl; static char *thisprog; static char usage [] = "trstoplist stopstermsfile\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } const string tstwords[] = { "the", "is", "xweird", "autre", "autre double", "mot1", "mot double", }; const int tstsz = sizeof(tstwords) / sizeof(string); int main(int argc, char **argv) { int count = 10; thisprog = argv[0]; argc--; argv++; if (argc != 1) Usage(); string filename = argv[0]; argc--; StopList sl(filename); for (int i = 0; i < tstsz; i++) { const string &tst = tstwords[i]; cout << "[" << tst << "] " << (sl.isStop(tst) ? "in stop list" : "not in stop list") << endl; } exit(0); } #endif // TEST_STOPLIST recoll-1.23.7/rcldb/synfamily.cpp0000644000175000017500000002605013125637102013615 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_SYNFAMILY #include "autoconfig.h" #include #include #include #include "log.h" #include "cstr.h" #include "xmacros.h" #include "synfamily.h" #include "smallut.h" using namespace std; namespace Rcl { bool XapWritableSynFamily::createMember(const string& membername) { string ermsg; try { m_wdb.add_synonym(memberskey(), membername); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapSynFamily::createMember: error: " << (ermsg) << "\n" ); return false; } return true; } bool XapWritableSynFamily::deleteMember(const string& membername) { string key = entryprefix(membername); for (Xapian::TermIterator xit = m_wdb.synonym_keys_begin(key); xit != m_wdb.synonym_keys_end(key); xit++) { m_wdb.clear_synonyms(*xit); } m_wdb.remove_synonym(memberskey(), membername); return true; } bool XapSynFamily::getMembers(vector& members) { string key = memberskey(); string ermsg; try { for (Xapian::TermIterator xit = m_rdb.synonyms_begin(key); xit != m_rdb.synonyms_end(key); xit++) { members.push_back(*xit); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapSynFamily::getMembers: xapian error " << (ermsg) << "\n" ); return false; } return true; } bool XapSynFamily::listMap(const string& membername) { string key = entryprefix(membername); string ermsg; try { for (Xapian::TermIterator kit = m_rdb.synonym_keys_begin(key); kit != m_rdb.synonym_keys_end(key); kit++) { cout << "[" << *kit << "] -> "; for (Xapian::TermIterator xit = m_rdb.synonyms_begin(*kit); xit != m_rdb.synonyms_end(*kit); xit++) { cout << *xit << " "; } cout << endl; } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapSynFamily::listMap: xapian error " << (ermsg) << "\n" ); return false; } vectormembers; getMembers(members); cout << "All family members: "; for (vector::const_iterator it = members.begin(); it != members.end(); it++) { cout << *it << " "; } cout << endl; return true; } bool XapSynFamily::synExpand(const string& member, const string& term, vector& result) { LOGDEB("XapSynFamily::synExpand:(" << (m_prefix1) << ") " << (term) << " for " << (member) << "\n" ); string key = entryprefix(member) + term; string ermsg; try { for (Xapian::TermIterator xit = m_rdb.synonyms_begin(key); xit != m_rdb.synonyms_end(key); xit++) { LOGDEB2(" Pushing " << ((*xit)) << "\n" ); result.push_back(*xit); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("synFamily::synExpand: error for member [" << (member) << "] term [" << (term) << "]\n" ); result.push_back(term); return false; } // If the input term is not in the list, add it if (find(result.begin(), result.end(), term) == result.end()) { result.push_back(term); } return true; } bool XapComputableSynFamMember::synExpand(const string& term, vector& result, SynTermTrans *filtertrans) { string root = (*m_trans)(term); string filter_root; if (filtertrans) filter_root = (*filtertrans)(term); string key = m_prefix + root; LOGDEB("XapCompSynFamMbr::synExpand([" << (m_prefix) << "]): term [" << (term) << "] root [" << (root) << "] m_trans: " << (m_trans->name()) << " filter: " << (filtertrans ? filtertrans->name() : "none") << "\n" ); string ermsg; try { for (Xapian::TermIterator xit = m_family.getdb().synonyms_begin(key); xit != m_family.getdb().synonyms_end(key); xit++) { if (!filtertrans || (*filtertrans)(*xit) == filter_root) { LOGDEB2(" Pushing " << ((*xit)) << "\n" ); result.push_back(*xit); } } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapSynDb::synExpand: error for term [" << (term) << "] (key " << (key) << ")\n" ); result.push_back(term); return false; } // If the input term and root are not in the list, add them if (find(result.begin(), result.end(), term) == result.end()) { LOGDEB2(" Pushing " << (term) << "\n" ); result.push_back(term); } if (root != term && find(result.begin(), result.end(), root) == result.end()) { if (!filtertrans || (*filtertrans)(root) == filter_root) { LOGDEB2(" Pushing " << (root) << "\n" ); result.push_back(root); } } LOGDEB("XapCompSynFamMbr::synExpand([" << (m_prefix) << "]): term [" << (term) << "] -> [" << (stringsToString(result)) << "]\n" ); return true; } bool XapComputableSynFamMember::synKeyExpand(StrMatcher* inexp, vector& result, SynTermTrans *filtertrans) { LOGDEB("XapCompSynFam::synKeyExpand: [" << (inexp->exp()) << "]\n" ); // If set, compute filtering term (e.g.: only case-folded) std::shared_ptr filter_exp; if (filtertrans) { filter_exp = std::shared_ptr(inexp->clone()); filter_exp->setExp((*filtertrans)(inexp->exp())); } // Transform input into our key format (e.g.: case-folded + diac-stripped), // and prepend prefix inexp->setExp(m_prefix + (*m_trans)(inexp->exp())); // Find the initial section before any special chars for skipping the keys string::size_type es = inexp->baseprefixlen(); string is = inexp->exp().substr(0, es); string::size_type preflen = m_prefix.size(); LOGDEB2("XapCompSynFam::synKeyExpand: init section: [" << (is) << "]\n" ); string ermsg; try { for (Xapian::TermIterator xit = m_family.getdb().synonym_keys_begin(is); xit != m_family.getdb().synonym_keys_end(is); xit++) { LOGDEB2(" Checking1 [" << ((*xit)) << "] against [" << (inexp->exp()) << "]\n" ); if (!inexp->match(*xit)) continue; // Push all the synonyms if they match the secondary filter for (Xapian::TermIterator xit1 = m_family.getdb().synonyms_begin(*xit); xit1 != m_family.getdb().synonyms_end(*xit); xit1++) { string term = *xit1; if (filter_exp) { string term1 = (*filtertrans)(term); LOGDEB2(" Testing [" << (term1) << "] against [" << (filter_exp->exp()) << "]\n" ); if (!filter_exp->match(term1)) { continue; } } LOGDEB2("XapCompSynFam::keyWildExpand: [" << ((*xit1)) << "]\n" ); result.push_back(*xit1); } // Same with key itself string term = (*xit).substr(preflen); if (filter_exp) { string term1 = (*filtertrans)(term); LOGDEB2(" Testing [" << (term1) << "] against [" << (filter_exp->exp()) << "]\n" ); if (!filter_exp->match(term1)) { continue; } } LOGDEB2("XapCompSynFam::keyWildExpand: [" << (term) << "]\n" ); result.push_back(term); } } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapCompSynFam::synKeyExpand: xapian: [" << (ermsg) << "]\n" ); return false; } LOGDEB1("XapCompSynFam::synKeyExpand: final: [" << (stringsToString(result)) << "]\n" ); return true; } } // Namespace Rcl #else // TEST_SYNFAMILY #include "autoconfig.h" #include #include #include #include #include #include #include using namespace std; #include "xapian.h" #include "smallut.h" #include "pathut.h" #include "xmacros.h" #include "synfamily.h" static string thisprog; static int op_flags; #define OPT_D 0x1 #define OPT_L 0x2 #define OPT_a 0x4 #define OPT_u 0x8 #define OPT_d 0x10 #define OPT_l 0x20 #define OPT_s 0x40 #define OPT_e 0x80 static string usage = " -d {-s|-a|-u} database dir and synfamily: stem accents/case ustem\n" " -l : list members\n" " -L : list entries for given member\n" " -e : list expansion for given member and key\n" " -D : delete member\n" " \n\n" ; static void Usage(void) { cerr << thisprog << ": usage:\n" << usage; exit(1); } int main(int argc, char **argv) { string dbdir(path_tildexpand("~/.recoll/xapiandb")); string outencoding = "UTF-8"; string member; string key; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'D': op_flags |= OPT_D; break; case 'd': op_flags |= OPT_d; if (argc < 2) Usage(); dbdir = *(++argv); argc--; goto b1; case 'e': op_flags |= OPT_e; if (argc < 3) Usage(); member = *(++argv);argc--; key = *(++argv); argc--; goto b1; case 'l': op_flags |= OPT_l; break; case 'L': op_flags |= OPT_L; if (argc < 2) Usage(); member = *(++argv); argc--; goto b1; case 's': op_flags |= OPT_s; break; case 'u': op_flags |= OPT_u; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); string familyname; if (op_flags & OPT_a) { familyname = Rcl::synFamDiCa; } else if (op_flags & OPT_u) { familyname = Rcl::synFamStemUnac; } else { familyname = Rcl::synFamStem; } if ((op_flags & (OPT_l|OPT_L|OPT_D|OPT_e)) == 0) Usage(); string ermsg; try { if ((op_flags & (OPT_D)) == 0) { // Need write ? Xapian::Database db(dbdir); Rcl::XapSynFamily fam(db, familyname); if (op_flags & OPT_l) { vector members; if (!fam.getMembers(members)) { cerr << "getMembers error" << endl; return 1; } string out; stringsToString(members, out); cout << "Family: " << familyname << " Members: " << out << endl; } else if (op_flags & OPT_L) { fam.listMap(member); } else if (op_flags & OPT_e) { vector exp; if (!fam.synExpand(member, key, exp)) { cerr << "expand error" << endl; return 1; } string out; stringsToString(exp, out); cout << "Family: " << familyname << " Key: " << key << " Expansion: " << out << endl; } else { Usage(); } } else { Xapian::WritableDatabase db(dbdir, Xapian::DB_CREATE_OR_OPEN); Rcl::XapWritableSynFamily fam(db, familyname); if (op_flags & OPT_D) { } else { Usage(); } } } XCATCHERROR (ermsg); if (!ermsg.empty()) { cerr << "Xapian Exception: " << ermsg << endl; return 1; } return 0; } #endif // TEST_SYNFAMILY recoll-1.23.7/rcldb/stemdb.cpp0000644000175000017500000000546313125637102013065 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** * Management of the auxiliary databases listing stems and their expansion * terms */ #include "autoconfig.h" #include "safeunistd.h" #include #include #include #include using namespace std; #include #include "stemdb.h" #include "log.h" #include "smallut.h" #include "synfamily.h" #include "unacpp.h" #include "rclconfig.h" namespace Rcl { /** * Expand for one or several languages */ bool StemDb::stemExpand(const std::string& langs, const std::string& _term, vector& result) { vector llangs; stringToStrings(langs, llangs); // The stemdb keys may have kept their diacritics or not but they // are always lower-case. It would be more logical for the term // transformers to perform before doing the stemming, but this // would be inefficient when there are several stemming languages string term; unacmaybefold(_term, term, "UTF-8", UNACOP_FOLD); for (vector::const_iterator it = llangs.begin(); it != llangs.end(); it++) { SynTermTransStem stemmer(*it); XapComputableSynFamMember expander(getdb(), synFamStem, *it, &stemmer); (void)expander.synExpand(term, result); } if (!o_index_stripchars) { string unac; unacmaybefold(term, unac, "UTF-8", UNACOP_UNAC); // Expand the unaccented stem, using the unaccented stem // db. Because it's a different db, We need to do it even if // the input has no accent (unac == term) for (vector::const_iterator it = llangs.begin(); it != llangs.end(); it++) { SynTermTransStem stemmer(*it); XapComputableSynFamMember expander(getdb(), synFamStemUnac, *it, &stemmer); (void)expander.synExpand(unac, result); } } if (result.empty()) result.push_back(term); sort(result.begin(), result.end()); vector::iterator uit = unique(result.begin(), result.end()); result.resize(uit - result.begin()); LOGDEB1("stemExpand:" << (langs) << ": " << (term) << " -> " << (stringsToString(result)) << "\n" ); return true; } } recoll-1.23.7/rcldb/searchdatatox.cpp0000644000175000017500000010555013224503173014437 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Handle translation from rcl's SearchData structures to Xapian Queries #include "autoconfig.h" #include #include #include #include #include #include using namespace std; #include "xapian.h" #include "cstr.h" #include "rcldb.h" #include "rcldb_p.h" #include "searchdata.h" #include "log.h" #include "smallut.h" #include "textsplit.h" #include "unacpp.h" #include "utf8iter.h" #include "stoplist.h" #include "rclconfig.h" #include "termproc.h" #include "synfamily.h" #include "stemdb.h" #include "expansiondbs.h" #include "base64.h" #include "daterange.h" namespace Rcl { typedef vector::iterator qlist_it_t; static const int original_term_wqf_booster = 10; // Expand doc categories and mime type wild card expressions // // Categories are expanded against the configuration, mimetypes // against the index. bool SearchData::expandFileTypes(Db &db, vector& tps) { const RclConfig *cfg = db.getConf(); if (!cfg) { LOGFATAL("Db::expandFileTypes: null configuration!!\n" ); return false; } vector exptps; for (vector::iterator it = tps.begin(); it != tps.end(); it++) { if (cfg->isMimeCategory(*it)) { vectortps; cfg->getMimeCatTypes(*it, tps); exptps.insert(exptps.end(), tps.begin(), tps.end()); } else { TermMatchResult res; string mt = stringtolower((const string&)*it); // We set casesens|diacsens to get an equivalent of ixTermMatch() db.termMatch(Db::ET_WILD|Db::ET_CASESENS|Db::ET_DIACSENS, string(), mt, res, -1, "mtype"); if (res.entries.empty()) { exptps.push_back(it->c_str()); } else { for (vector::const_iterator rit = res.entries.begin(); rit != res.entries.end(); rit++) { exptps.push_back(strip_prefix(rit->term)); } } } } sort(exptps.begin(), exptps.end()); exptps.erase(unique(exptps.begin(), exptps.end()), exptps.end()); tps = exptps; return true; } static const char *maxXapClauseMsg = "Maximum Xapian query size exceeded. Increase maxXapianClauses " "in the configuration. "; static const char *maxXapClauseCaseDiacMsg = "Or try to use case (C) or diacritics (D) sensitivity qualifiers, or less " "wildcards ?" ; // Walk the clauses list, translate each and add to top Xapian Query bool SearchData::clausesToQuery(Rcl::Db &db, SClType tp, vector& query, string& reason, void *d) { Xapian::Query xq; for (qlist_it_t it = query.begin(); it != query.end(); it++) { Xapian::Query nq; if (!(*it)->toNativeQuery(db, &nq)) { LOGERR("SearchData::clausesToQuery: toNativeQuery failed: " << ((*it)->getReason()) << "\n" ); reason += (*it)->getReason() + " "; return false; } if (nq.empty()) { LOGDEB("SearchData::clausesToQuery: skipping empty clause\n" ); continue; } // If this structure is an AND list, must use AND_NOT for excl clauses. // Else this is an OR list, and there can't be excl clauses (checked by // addClause()) Xapian::Query::op op; if (tp == SCLT_AND) { if ((*it)->getexclude()) { op = Xapian::Query::OP_AND_NOT; } else { op = Xapian::Query::OP_AND; } } else { op = Xapian::Query::OP_OR; } if (xq.empty()) { if (op == Xapian::Query::OP_AND_NOT) xq = Xapian::Query(op, Xapian::Query::MatchAll, nq); else xq = nq; } else { xq = Xapian::Query(op, xq, nq); } if (int(xq.get_length()) >= getMaxCl()) { LOGERR("" << (maxXapClauseMsg) << "\n" ); m_reason += maxXapClauseMsg; if (!o_index_stripchars) m_reason += maxXapClauseCaseDiacMsg; return false; } } LOGDEB0("SearchData::clausesToQuery: got " << (xq.get_length()) << " clauses\n" ); if (xq.empty()) xq = Xapian::Query::MatchAll; *((Xapian::Query *)d) = xq; return true; } bool SearchData::toNativeQuery(Rcl::Db &db, void *d) { LOGDEB("SearchData::toNativeQuery: stemlang [" << (m_stemlang) << "]\n" ); m_reason.erase(); db.getConf()->getConfParam("maxTermExpand", &m_maxexp); db.getConf()->getConfParam("maxXapianClauses", &m_maxcl); db.getConf()->getConfParam("autocasesens", &m_autocasesens); db.getConf()->getConfParam("autodiacsens", &m_autodiacsens); // Walk the clause list translating each in turn and building the // Xapian query tree Xapian::Query xq; if (!clausesToQuery(db, m_tp, m_query, m_reason, &xq)) { LOGERR("SearchData::toNativeQuery: clausesToQuery failed. reason: " << (m_reason) << "\n" ); return false; } if (m_haveDates) { // If one of the extremities is unset, compute db extremas if (m_dates.y1 == 0 || m_dates.y2 == 0) { int minyear = 1970, maxyear = 2100; if (!db.maxYearSpan(&minyear, &maxyear)) { LOGERR("Can't retrieve index min/max dates\n" ); //whatever, go on. } if (m_dates.y1 == 0) { m_dates.y1 = minyear; m_dates.m1 = 1; m_dates.d1 = 1; } if (m_dates.y2 == 0) { m_dates.y2 = maxyear; m_dates.m2 = 12; m_dates.d2 = 31; } } LOGDEB("Db::toNativeQuery: date interval: " << (m_dates.y1) << "-" << (m_dates.m1) << "-" << (m_dates.d1) << "/" << (m_dates.y2) << "-" << (m_dates.m2) << "-" << (m_dates.d2) << "\n" ); Xapian::Query dq = date_range_filter(m_dates.y1, m_dates.m1, m_dates.d1, m_dates.y2, m_dates.m2, m_dates.d2); if (dq.empty()) { LOGINFO("Db::toNativeQuery: date filter is empty\n" ); } // If no probabilistic query is provided then promote the daterange // filter to be THE query instead of filtering an empty query. if (xq.empty()) { LOGINFO("Db::toNativeQuery: proba query is empty\n" ); xq = dq; } else { xq = Xapian::Query(Xapian::Query::OP_FILTER, xq, dq); } } if (m_minSize != size_t(-1) || m_maxSize != size_t(-1)) { Xapian::Query sq; string min = lltodecstr(m_minSize); string max = lltodecstr(m_maxSize); if (m_minSize == size_t(-1)) { string value(max); leftzeropad(value, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_LE, VALUE_SIZE, value); } else if (m_maxSize == size_t(-1)) { string value(min); leftzeropad(value, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_GE, VALUE_SIZE, value); } else { string minvalue(min); leftzeropad(minvalue, 12); string maxvalue(max); leftzeropad(maxvalue, 12); sq = Xapian::Query(Xapian::Query::OP_VALUE_RANGE, VALUE_SIZE, minvalue, maxvalue); } // If no probabilistic query is provided then promote the // filter to be THE query instead of filtering an empty query. if (xq.empty()) { LOGINFO("Db::toNativeQuery: proba query is empty\n" ); xq = sq; } else { xq = Xapian::Query(Xapian::Query::OP_FILTER, xq, sq); } } // Add the autophrase if any if (m_autophrase) { Xapian::Query apq; if (m_autophrase->toNativeQuery(db, &apq)) { xq = xq.empty() ? apq : Xapian::Query(Xapian::Query::OP_AND_MAYBE, xq, apq); } } // Add the file type filtering clause if any if (!m_filetypes.empty()) { expandFileTypes(db, m_filetypes); Xapian::Query tq; for (vector::iterator it = m_filetypes.begin(); it != m_filetypes.end(); it++) { string term = wrap_prefix(mimetype_prefix) + *it; LOGDEB0("Adding file type term: [" << (term) << "]\n" ); tq = tq.empty() ? Xapian::Query(term) : Xapian::Query(Xapian::Query::OP_OR, tq, Xapian::Query(term)); } xq = xq.empty() ? tq : Xapian::Query(Xapian::Query::OP_FILTER, xq, tq); } // Add the neg file type filtering clause if any if (!m_nfiletypes.empty()) { expandFileTypes(db, m_nfiletypes); Xapian::Query tq; for (vector::iterator it = m_nfiletypes.begin(); it != m_nfiletypes.end(); it++) { string term = wrap_prefix(mimetype_prefix) + *it; LOGDEB0("Adding negative file type term: [" << (term) << "]\n" ); tq = tq.empty() ? Xapian::Query(term) : Xapian::Query(Xapian::Query::OP_OR, tq, Xapian::Query(term)); } xq = xq.empty() ? tq : Xapian::Query(Xapian::Query::OP_AND_NOT, xq, tq); } *((Xapian::Query *)d) = xq; return true; } // Splitter for breaking a user string into simple terms and // phrases. This is for parts of the user entry which would appear as // a single word because there is no white space inside, but are // actually multiple terms to rcldb (ie term1,term2). Still, most of // the time, the result of our splitting will be a single term. class TextSplitQ : public TextSplitP { public: TextSplitQ(Flags flags, TermProc *prc) : TextSplitP(prc, flags), m_nostemexp(false) { } bool takeword(const std::string &term, int pos, int bs, int be) { // Check if the first letter is a majuscule in which // case we do not want to do stem expansion. Need to do this // before unac of course... m_nostemexp = unaciscapital(term); return TextSplitP::takeword(term, pos, bs, be); } bool nostemexp() const { return m_nostemexp; } private: bool m_nostemexp; }; class TermProcQ : public TermProc { public: TermProcQ() : TermProc(0), m_alltermcount(0), m_lastpos(0), m_ts(0) {} // We need a ref to the splitter (only it knows about orig term // capitalization for controlling stemming. The ref can't be set // in the constructor because the splitter is not built yet when // we are born (chicken and egg). void setTSQ(const TextSplitQ *ts) { m_ts = ts; } bool takeword(const std::string &term, int pos, int bs, int be) { m_alltermcount++; if (m_lastpos < pos) m_lastpos = pos; bool noexpand = be ? m_ts->nostemexp() : true; LOGDEB1("TermProcQ::takeword: pushing [" << (term) << "] pos " << (pos) << " noexp " << (noexpand) << "\n" ); if (m_terms[pos].size() < term.size()) { m_terms[pos] = term; m_nste[pos] = noexpand; } return true; } bool flush() { for (map::const_iterator it = m_terms.begin(); it != m_terms.end(); it++) { m_vterms.push_back(it->second); m_vnostemexps.push_back(m_nste[it->first]); } return true; } int alltermcount() const { return m_alltermcount; } int lastpos() const { return m_lastpos; } const vector& terms() { return m_vterms; } const vector& nostemexps() { return m_vnostemexps; } private: // Count of terms including stopwords: this is for adjusting // phrase/near slack int m_alltermcount; int m_lastpos; const TextSplitQ *m_ts; vector m_vterms; vector m_vnostemexps; map m_terms; map m_nste; }; static const vector expandModStrings{ {SearchDataClause::SDCM_NOSTEMMING, "nostemming"}, {SearchDataClause::SDCM_ANCHORSTART, "anchorstart"}, {SearchDataClause::SDCM_ANCHOREND, "anchorend"}, {SearchDataClause::SDCM_CASESENS, "casesens"}, {SearchDataClause::SDCM_DIACSENS, "diacsens"}, {SearchDataClause::SDCM_NOTERMS, "noterms"}, {SearchDataClause::SDCM_NOSYNS, "nosyns"}, {SearchDataClause::SDCM_PATHELT, "pathelt"}, }; /** Expand term into term list, using appropriate mode: stem, wildcards, * diacritics... * * @param mods stem expansion, case and diacritics sensitivity control. * @param term input single word * @param oexp output expansion list * @param sterm output original input term if there were no wildcards * @param prefix field prefix in index. We could recompute it, but the caller * has it already. Used in the simple case where there is nothing to expand, * and we just return the prefixed term (else Db::termMatch deals with it). * @param multiwords it may happen that synonym processing results in multi-word * expansions which should be processed as phrases. */ bool SearchDataClauseSimple::expandTerm(Rcl::Db &db, string& ermsg, int mods, const string& term, vector& oexp, string &sterm, const string& prefix, vector* multiwords ) { LOGDEB0("expandTerm: mods: [" << flagsToString(expandModStrings, mods) << "] fld [" << m_field << "] trm [" << term << "] lang [" << getStemLang() << "]\n"); sterm.clear(); oexp.clear(); if (term.empty()) return true; if (mods & SDCM_PATHELT) { // Path element are so special. Only wildcards, and they are // case-sensitive. mods |= SDCM_NOSTEMMING|SDCM_CASESENS|SDCM_DIACSENS|SDCM_NOSYNS; } bool maxexpissoft = false; int maxexpand = getSoftMaxExp(); if (maxexpand != -1) { maxexpissoft = true; } else { maxexpand = getMaxExp(); } bool haswild = term.find_first_of(cstr_minwilds) != string::npos; // If there are no wildcards, add term to the list of user-entered terms if (!haswild) { m_hldata.uterms.insert(term); sterm = term; } // No stem expansion if there are wildcards or if prevented by caller bool nostemexp = (mods & SDCM_NOSTEMMING) != 0; if (haswild || getStemLang().empty()) { LOGDEB2("expandTerm: found wildcards or stemlang empty: no exp\n"); nostemexp = true; } bool diac_sensitive = (mods & SDCM_DIACSENS) != 0; bool case_sensitive = (mods & SDCM_CASESENS) != 0; bool synonyms = (mods & SDCM_NOSYNS) == 0; bool pathelt = (mods & SDCM_PATHELT) != 0; // noexpansion can be modified further down by possible case/diac expansion bool noexpansion = nostemexp && !haswild && !synonyms; if (o_index_stripchars) { diac_sensitive = case_sensitive = false; } else { // If we are working with a raw index, apply the rules for case and // diacritics sensitivity. // If any character has a diacritic, we become // diacritic-sensitive. Note that the way that the test is // performed (conversion+comparison) will automatically ignore // accented characters which are actually a separate letter if (getAutoDiac() && unachasaccents(term)) { LOGDEB0("expandTerm: term has accents -> diac-sensitive\n"); diac_sensitive = true; } // If any character apart the first is uppercase, we become // case-sensitive. The first character is reserved for // turning off stemming. You need to use a query language // modifier to search for Floor in a case-sensitive way. Utf8Iter it(term); it++; if (getAutoCase() && unachasuppercase(term.substr(it.getBpos()))) { LOGDEB0("expandTerm: term has uppercase -> case-sensitive\n"); case_sensitive = true; } // If we are sensitive to case or diacritics turn stemming off if (diac_sensitive || case_sensitive) { LOGDEB0("expandTerm: diac or case sens set -> stemexpand and " "synonyms off\n"); nostemexp = true; synonyms = false; } if (!case_sensitive || !diac_sensitive) noexpansion = false; } if (noexpansion) { oexp.push_back(prefix + term); m_hldata.terms[term] = term; LOGDEB("ExpandTerm: noexpansion: final: "<= maxexpand && !maxexpissoft) { ermsg = "Maximum term expansion size exceeded." " Maybe use case/diacritics sensitivity or increase maxTermExpand."; return false; } for (const auto& entry : res.entries) { oexp.push_back(entry.term); } // If the term does not exist at all in the db, the return from // termMatch() is going to be empty, which is not what we want (we // would then compute an empty Xapian query) if (oexp.empty()) oexp.push_back(prefix + term); // Remember the uterm-to-expansion links for (const auto& entry : oexp) { m_hldata.terms[strip_prefix(entry)] = term; } LOGDEB("ExpandTerm: final: " << stringsToString(oexp) << "\n"); return true; } // Do distribution of string vectors: a,b c,d -> a,c a,d b,c b,d void multiply_groups(vector >::const_iterator vvit, vector >::const_iterator vvend, vector& comb, vector >&allcombs) { // Remember my string vector and compute next, for recursive calls. vector >::const_iterator myvit = vvit++; // Walk the string vector I'm called upon and, for each string, // add it to current result, an call myself recursively on the // next string vector. The last call (last element of the vector of // vectors), adds the elementary result to the output // Walk my string vector for (vector::const_iterator strit = (*myvit).begin(); strit != (*myvit).end(); strit++) { // Add my current value to the string vector we're building comb.push_back(*strit); if (vvit == vvend) { // Last call: store current result allcombs.push_back(comb); } else { // Call recursively on next string vector multiply_groups(vvit, vvend, comb, allcombs); } // Pop the value I just added (make room for the next element in my // vector) comb.pop_back(); } } static void prefix_vector(vector& v, const string& prefix) { for (vector::iterator it = v.begin(); it != v.end(); it++) { *it = prefix + *it; } } void SearchDataClauseSimple:: processSimpleSpan(Rcl::Db &db, string& ermsg, const string& span, int mods, void * pq) { vector& pqueries(*(vector*)pq); LOGDEB0("StringToXapianQ::processSimpleSpan: [" << (span) << "] mods 0x" << ((unsigned int)mods) << "\n" ); vector exp; string sterm; // dumb version of user term string prefix; const FieldTraits *ftp; if (!m_field.empty() && db.fieldToTraits(m_field, &ftp, true)) { if (ftp->noterms) addModifier(SDCM_NOTERMS); // Don't add terms to highlight data prefix = wrap_prefix(ftp->pfx); } vector multiwords; if (!expandTerm(db, ermsg, mods, span, exp, sterm, prefix, &multiwords)) return; // Set up the highlight data. No prefix should go in there for (vector::const_iterator it = exp.begin(); it != exp.end(); it++) { m_hldata.groups.push_back(vector(1, it->substr(prefix.size()))); m_hldata.slacks.push_back(0); m_hldata.grpsugidx.push_back(m_hldata.ugroups.size() - 1); } // Push either term or OR of stem-expanded set Xapian::Query xq(Xapian::Query::OP_OR, exp.begin(), exp.end()); m_curcl += exp.size(); // If sterm (simplified original user term) is not null, give it a // relevance boost. We do this even if no expansion occurred (else // the non-expanded terms in a term list would end-up with even // less wqf). This does not happen if there are wildcards anywhere // in the search. // We normally boost the original term in the stem expansion list. Don't // do it if there are wildcards anywhere, this would skew the results. bool doBoostUserTerm = (m_parentSearch && !m_parentSearch->haveWildCards()) || (m_parentSearch == 0 && !m_haveWildCards); if (doBoostUserTerm && !sterm.empty()) { xq = Xapian::Query(Xapian::Query::OP_OR, xq, Xapian::Query(prefix+sterm, original_term_wqf_booster)); } // Push phrases for the multi-word expansions for (vector::const_iterator mwp = multiwords.begin(); mwp != multiwords.end(); mwp++) { vector phr; // We just do a basic split to keep things a bit simpler here // (no textsplit). This means though that no punctuation is // allowed in multi-word synonyms. stringToTokens(*mwp, phr); if (!prefix.empty()) prefix_vector(phr, prefix); xq = Xapian::Query(Xapian::Query::OP_OR, xq, Xapian::Query(Xapian::Query::OP_PHRASE, phr.begin(), phr.end())); m_curcl++; } pqueries.push_back(xq); } // User entry element had several terms: transform into a PHRASE or // NEAR xapian query, the elements of which can themselves be OR // queries if the terms get expanded by stemming or wildcards (we // don't do stemming for PHRASE though) void SearchDataClauseSimple::processPhraseOrNear(Rcl::Db &db, string& ermsg, TermProcQ *splitData, int mods, void *pq, bool useNear, int slack) { vector &pqueries(*(vector*)pq); Xapian::Query::op op = useNear ? Xapian::Query::OP_NEAR : Xapian::Query::OP_PHRASE; vector orqueries; #ifdef XAPIAN_NEAR_EXPAND_SINGLE_BUF bool hadmultiple = false; #endif vector >groups; string prefix; const FieldTraits *ftp; if (!m_field.empty() && db.fieldToTraits(m_field, &ftp, true)) { prefix = wrap_prefix(ftp->pfx); } if (mods & Rcl::SearchDataClause::SDCM_ANCHORSTART) { orqueries.push_back(Xapian::Query(prefix + start_of_field_term)); slack++; } // Go through the list and perform stem/wildcard expansion for each element vector::const_iterator nxit = splitData->nostemexps().begin(); for (vector::const_iterator it = splitData->terms().begin(); it != splitData->terms().end(); it++, nxit++) { LOGDEB0("ProcessPhrase: processing [" << *it << "]\n" ); // Adjust when we do stem expansion. Not if disabled by // caller, not inside phrases, and some versions of xapian // will accept only one OR clause inside NEAR. bool nostemexp = *nxit || (op == Xapian::Query::OP_PHRASE) #ifdef XAPIAN_NEAR_EXPAND_SINGLE_BUF || hadmultiple #endif // single OR inside NEAR ; int lmods = mods; if (nostemexp) lmods |= SearchDataClause::SDCM_NOSTEMMING; string sterm; vector exp; if (!expandTerm(db, ermsg, lmods, *it, exp, sterm, prefix)) return; LOGDEB0("ProcessPhraseOrNear: exp size " << (exp.size()) << ", exp: " << (stringsToString(exp)) << "\n" ); // groups is used for highlighting, we don't want prefixes in there. vector noprefs; for (vector::const_iterator it = exp.begin(); it != exp.end(); it++) { noprefs.push_back(it->substr(prefix.size())); } groups.push_back(noprefs); orqueries.push_back(Xapian::Query(Xapian::Query::OP_OR, exp.begin(), exp.end())); m_curcl += exp.size(); if (m_curcl >= getMaxCl()) return; #ifdef XAPIAN_NEAR_EXPAND_SINGLE_BUF if (exp.size() > 1) hadmultiple = true; #endif } if (mods & Rcl::SearchDataClause::SDCM_ANCHOREND) { orqueries.push_back(Xapian::Query(prefix + end_of_field_term)); slack++; } // Generate an appropriate PHRASE/NEAR query with adjusted slack // For phrases, give a relevance boost like we do for original terms LOGDEB2("PHRASE/NEAR: alltermcount " << (splitData->alltermcount()) << " lastpos " << (splitData->lastpos()) << "\n" ); Xapian::Query xq(op, orqueries.begin(), orqueries.end(), splitData->lastpos() + 1 + slack); if (op == Xapian::Query::OP_PHRASE) xq = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, xq, original_term_wqf_booster); pqueries.push_back(xq); // Add all combinations of NEAR/PHRASE groups to the highlighting data. vector > allcombs; vector comb; multiply_groups(groups.begin(), groups.end(), comb, allcombs); // Insert the search groups and slacks in the highlight data, with // a reference to the user entry that generated them: m_hldata.groups.insert(m_hldata.groups.end(), allcombs.begin(), allcombs.end()); m_hldata.slacks.insert(m_hldata.slacks.end(), allcombs.size(), slack); m_hldata.grpsugidx.insert(m_hldata.grpsugidx.end(), allcombs.size(), m_hldata.ugroups.size() - 1); } // Trim string beginning with ^ or ending with $ and convert to flags static int stringToMods(string& s) { int mods = 0; // Check for an anchored search trimstring(s); if (s.length() > 0 && s[0] == '^') { mods |= Rcl::SearchDataClause::SDCM_ANCHORSTART; s.erase(0, 1); } if (s.length() > 0 && s[s.length()-1] == '$') { mods |= Rcl::SearchDataClause::SDCM_ANCHOREND; s.erase(s.length()-1); } return mods; } /** * Turn user entry string (NOT query language) into a list of xapian queries. * We just separate words and phrases, and do wildcard and stem expansion, * * This is used to process data entered into an OR/AND/NEAR/PHRASE field of * the GUI (in the case of NEAR/PHRASE, clausedist adds dquotes to the user * entry). * * This appears awful, and it would seem that the split into * terms/phrases should be performed in the upper layer so that we * only receive pure term or near/phrase pure elements here, but in * fact there are things that would appear like terms to naive code, * and which will actually may be turned into phrases (ie: tom:jerry), * in a manner which intimately depends on the index implementation, * so that it makes sense to process this here. * * The final list contains one query for each term or phrase * - Elements corresponding to a stem-expanded part are an OP_OR * composition of the stem-expanded terms (or a single term query). * - Elements corresponding to phrase/near are an OP_PHRASE/NEAR * composition of the phrase terms (no stem expansion in this case) * @return the subquery count (either or'd stem-expanded terms or phrase word * count) */ bool SearchDataClauseSimple::processUserString(Rcl::Db &db, const string &iq, string &ermsg, void *pq, int slack, bool useNear) { vector &pqueries(*(vector*)pq); int mods = m_modifiers; LOGDEB("StringToXapianQ:pUS:: qstr [" << (iq) << "] fld [" << (m_field) << "] mods 0x" << (mods) << " slack " << (slack) << " near " << (useNear) << "\n" ); ermsg.erase(); m_curcl = 0; const StopList stops = db.getStopList(); // Simple whitespace-split input into user-level words and // double-quoted phrases: word1 word2 "this is a phrase". // // The text splitter may further still decide that the resulting // "words" are really phrases, this depends on separators: // [paul@dom.net] would still be a word (span), but [about:me] // will probably be handled as a phrase. vector phrases; TextSplit::stringToStrings(iq, phrases); // Process each element: textsplit into terms, handle stem/wildcard // expansion and transform into an appropriate Xapian::Query try { for (vector::iterator it = phrases.begin(); it != phrases.end(); it++) { LOGDEB0("strToXapianQ: phrase/word: [" << *it << "]\n" ); // Anchoring modifiers int amods = stringToMods(*it); int terminc = amods != 0 ? 1 : 0; mods |= amods; // If there are multiple spans in this element, including // at least one composite, we have to increase the slack // else a phrase query including a span would fail. // Ex: "term0@term1 term2" is onlyspans-split as: // 0 term0@term1 0 12 // 2 term2 13 18 // The position of term2 is 2, not 1, so a phrase search // would fail. // We used to do word split, searching for // "term0 term1 term2" instead, which may have worse // performance, but will succeed. // We now adjust the phrase/near slack by comparing the term count // and the last position // The term processing pipeline: // split -> [unac/case ->] stops -> store terms TermProcQ tpq; TermProc *nxt = &tpq; TermProcStop tpstop(nxt, stops); nxt = &tpstop; //TermProcCommongrams tpcommon(nxt, stops); nxt = &tpcommon; //tpcommon.onlygrams(true); TermProcPrep tpprep(nxt); if (o_index_stripchars) nxt = &tpprep; TextSplitQ splitter(TextSplit::Flags(TextSplit::TXTS_ONLYSPANS | TextSplit::TXTS_KEEPWILD), nxt); tpq.setTSQ(&splitter); splitter.text_to_words(*it); slack += tpq.lastpos() - int(tpq.terms().size()) + 1; LOGDEB0("strToXapianQ: termcount: " << (tpq.terms().size()) << "\n" ); switch (tpq.terms().size() + terminc) { case 0: continue;// ?? case 1: { int lmods = mods; if (tpq.nostemexps().front()) lmods |= SearchDataClause::SDCM_NOSTEMMING; m_hldata.ugroups.push_back(tpq.terms()); processSimpleSpan(db, ermsg, tpq.terms().front(), lmods, &pqueries); } break; default: m_hldata.ugroups.push_back(tpq.terms()); processPhraseOrNear(db, ermsg, &tpq, mods, &pqueries, useNear, slack); } if (m_curcl >= getMaxCl()) { ermsg = maxXapClauseMsg; if (!o_index_stripchars) ermsg += maxXapClauseCaseDiacMsg; break; } } } catch (const Xapian::Error &e) { ermsg = e.get_msg(); } catch (const string &s) { ermsg = s; } catch (const char *s) { ermsg = s; } catch (...) { ermsg = "Caught unknown exception"; } if (!ermsg.empty()) { LOGERR("stringToXapianQueries: " << (ermsg) << "\n" ); return false; } return true; } // Translate a simple OR or AND search clause. bool SearchDataClauseSimple::toNativeQuery(Rcl::Db &db, void *p) { LOGDEB("SearchDataClauseSimple::toNativeQuery: fld [" << (m_field) << "] val [" << (m_text) << "] stemlang [" << (getStemLang()) << "]\n" ); Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); Xapian::Query::op op; switch (m_tp) { case SCLT_AND: op = Xapian::Query::OP_AND; break; case SCLT_OR: op = Xapian::Query::OP_OR; break; default: LOGERR("SearchDataClauseSimple: bad m_tp " << (m_tp) << "\n" ); m_reason = "Internal error"; return false; } vector pqueries; if (!processUserString(db, m_text, m_reason, &pqueries)) return false; if (pqueries.empty()) { LOGERR("SearchDataClauseSimple: resolved to null query\n" ); m_reason = string("Resolved to null query. Term too long ? : [" + m_text + string("]")); return false; } *qp = Xapian::Query(op, pqueries.begin(), pqueries.end()); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate a FILENAME search clause. This always comes // from a "filename" search from the gui or recollq. A query language // "filename:"-prefixed field will not go through here, but through // the generic field-processing code. // // We do not split the entry any more (used to do some crazy thing // about expanding multiple fragments in the past). We just take the // value blanks and all and expand this against the indexed unsplit // file names bool SearchDataClauseFilename::toNativeQuery(Rcl::Db &db, void *p) { Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); int maxexp = getSoftMaxExp(); if (maxexp == -1) maxexp = getMaxExp(); vector names; db.filenameWildExp(m_text, names, maxexp); *qp = Xapian::Query(Xapian::Query::OP_OR, names.begin(), names.end()); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate a dir: path filtering clause. See comments in .h bool SearchDataClausePath::toNativeQuery(Rcl::Db &db, void *p) { LOGDEB("SearchDataClausePath::toNativeQuery: [" << m_text << "]\n"); Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); string ltext; #ifdef _WIN32 // Windows file names are case-insensitive, so we lowercase (same // as when indexing) unacmaybefold(m_text, ltext, "UTF-8", UNACOP_FOLD); #else ltext = m_text; #endif if (ltext.empty()) { LOGERR("SearchDataClausePath: empty path??\n"); m_reason = "Empty path ?"; return false; } vector orqueries; if (path_isabsolute(ltext)) orqueries.push_back(Xapian::Query(wrap_prefix(pathelt_prefix))); else ltext = path_tildexpand(ltext); vector vpath; stringToTokens(ltext, vpath, "/"); for (vector::const_iterator pit = vpath.begin(); pit != vpath.end(); pit++){ string sterm; vector exp; if (!expandTerm(db, m_reason, SDCM_PATHELT, *pit, exp, sterm, wrap_prefix(pathelt_prefix))) { return false; } LOGDEB0("SDataPath::toNative: exp size " << exp.size() << ". Exp: " << stringsToString(exp) << "\n"); if (exp.size() == 1) orqueries.push_back(Xapian::Query(exp[0])); else orqueries.push_back(Xapian::Query(Xapian::Query::OP_OR, exp.begin(), exp.end())); m_curcl += exp.size(); if (m_curcl >= getMaxCl()) return false; } *qp = Xapian::Query(Xapian::Query::OP_PHRASE, orqueries.begin(), orqueries.end()); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } // Translate NEAR or PHRASE clause. bool SearchDataClauseDist::toNativeQuery(Rcl::Db &db, void *p) { LOGDEB("SearchDataClauseDist::toNativeQuery\n" ); Xapian::Query *qp = (Xapian::Query *)p; *qp = Xapian::Query(); vector pqueries; // We produce a single phrase out of the user entry then use // stringToXapianQueries() to lowercase and simplify the phrase // terms etc. This will result into a single (complex) // Xapian::Query. if (m_text.find('\"') != string::npos) { m_text = neutchars(m_text, "\""); } string s = cstr_dquote + m_text + cstr_dquote; bool useNear = (m_tp == SCLT_NEAR); if (!processUserString(db, s, m_reason, &pqueries, m_slack, useNear)) return false; if (pqueries.empty()) { LOGERR("SearchDataClauseDist: resolved to null query\n" ); m_reason = string("Resolved to null query. Term too long ? : [" + m_text + string("]")); return false; } *qp = *pqueries.begin(); if (m_weight != 1.0) { *qp = Xapian::Query(Xapian::Query::OP_SCALE_WEIGHT, *qp, m_weight); } return true; } } // Namespace Rcl recoll-1.23.7/rcldb/rclabstract.cpp0000644000175000017500000004702113224431525014110 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "log.h" #include "rcldb.h" #include "rcldb_p.h" #include "rclquery.h" #include "rclquery_p.h" #include "textsplit.h" #include "searchdata.h" #include "utf8iter.h" #include "hldata.h" #include "chrono.h" using namespace std; namespace Rcl { // This is used as a marker inside the abstract frag lists, but // normally doesn't remain in final output (which is built with a // custom sep. by our caller). static const string cstr_ellipsis("..."); // This is used to mark positions overlapped by a multi-word match term static const string occupiedmarker("?"); #undef DEBUGABSTRACT #ifdef DEBUGABSTRACT #define LOGABS LOGDEB static void listList(const string& what, const vector&l) { string a; for (vector::const_iterator it = l.begin(); it != l.end(); it++) { a = a + *it + " "; } LOGDEB("" << (what) << ": " << (a) << "\n" ); } #else #define LOGABS LOGDEB2 static void listList(const string&, const vector&) { } #endif // Unprefix terms. Actually it's not completely clear if we should // remove prefixes and keep all terms or prune the prefixed // ones. There is no good way to be sure what will provide the best // result in general. static const bool prune_prefixed_terms = true; static void noPrefixList(const vector& in, vector& out) { for (vector::const_iterator qit = in.begin(); qit != in.end(); qit++) { if (prune_prefixed_terms) { if (has_prefix(*qit)) continue; } out.push_back(strip_prefix(*qit)); } sort(out.begin(), out.end()); vector::iterator it = unique(out.begin(), out.end()); out.resize(it - out.begin()); } bool Query::Native::getMatchTerms(unsigned long xdocid, vector& terms) { if (!xenquire) { LOGERR("Query::getMatchTerms: no query opened\n" ); return false; } terms.clear(); Xapian::TermIterator it; Xapian::docid id = Xapian::docid(xdocid); vector iterms; XAPTRY(iterms.insert(iterms.begin(), xenquire->get_matching_terms_begin(id), xenquire->get_matching_terms_end(id)), m_q->m_db->m_ndb->xrdb, m_q->m_reason); if (!m_q->m_reason.empty()) { LOGERR("getMatchTerms: xapian error: " << (m_q->m_reason) << "\n" ); return false; } noPrefixList(iterms, terms); return true; } // Retrieve db-wide frequencies for the query terms and store them in // the query object. This is done at most once for a query, and the data is used // while computing abstracts for the different result documents. void Query::Native::setDbWideQTermsFreqs() { // Do it once only for a given query. if (!termfreqs.empty()) return; vector qterms; { vector iqterms; m_q->getQueryTerms(iqterms); noPrefixList(iqterms, qterms); } // listList("Query terms: ", qterms); Xapian::Database &xrdb = m_q->m_db->m_ndb->xrdb; double doccnt = xrdb.get_doccount(); if (doccnt == 0) doccnt = 1; for (vector::const_iterator qit = qterms.begin(); qit != qterms.end(); qit++) { termfreqs[*qit] = xrdb.get_termfreq(*qit) / doccnt; LOGABS("setDbWideQTermFreqs: [" << (qit) << "] db freq " << (termfreqs[*qit]) << "\n" ); } } // Compute matched terms quality coefficients for a matched document by // retrieving the Within Document Frequencies and multiplying by // overal term frequency, then using log-based thresholds. // 2012: it's not too clear to me why exactly we do the log thresholds thing. // Preferring terms wich are rare either or both in the db and the document // seems reasonable though // To avoid setting a high quality for a low frequency expansion of a // common stem, which seems wrong, we group the terms by // root, compute a frequency for the group from the sum of member // occurrences, and let the frequency for each group member be the // aggregated frequency. double Query::Native::qualityTerms(Xapian::docid docid, const vector& terms, multimap >& byQ) { LOGABS("qualityTerms\n" ); setDbWideQTermsFreqs(); map termQcoefs; double totalweight = 0; Xapian::Database &xrdb = m_q->m_db->m_ndb->xrdb; double doclen = xrdb.get_doclength(docid); if (doclen == 0) doclen = 1; HighlightData hld; if (m_q->m_sd) { m_q->m_sd->getTerms(hld); } #ifdef DEBUGABSTRACT { string deb; hld.toString(deb); LOGABS("qualityTerms: hld: " << (deb) << "\n" ); } #endif // Group the input terms by the user term they were possibly expanded from map > byRoot; for (vector::const_iterator qit = terms.begin(); qit != terms.end(); qit++) { map::const_iterator eit = hld.terms.find(*qit); if (eit != hld.terms.end()) { byRoot[eit->second].push_back(*qit); } else { LOGDEB0("qualityTerms: [" << ((*qit)) << "] not found in hld\n" ); byRoot[*qit].push_back(*qit); } } #ifdef DEBUGABSTRACT { string byRootstr; for (map >::const_iterator debit = byRoot.begin(); debit != byRoot.end(); debit++) { byRootstr.append("[").append(debit->first).append("]->"); for (vector::const_iterator it = debit->second.begin(); it != debit->second.end(); it++) { byRootstr.append("[").append(*it).append("] "); } byRootstr.append("\n"); } LOGABS("\nqualityTerms: uterms to terms: " << (byRootstr) << "\n" ); } #endif // Compute in-document and global frequencies for the groups. map grpwdfs; map grptfreqs; for (map >::const_iterator git = byRoot.begin(); git != byRoot.end(); git++) { for (vector::const_iterator qit = git->second.begin(); qit != git->second.end(); qit++) { Xapian::TermIterator term = xrdb.termlist_begin(docid); term.skip_to(*qit); if (term != xrdb.termlist_end(docid) && *term == *qit) { if (grpwdfs.find(git->first) != grpwdfs.end()) { grpwdfs[git->first] = term.get_wdf() / doclen; grptfreqs[git->first] = termfreqs[*qit]; } else { grpwdfs[git->first] += term.get_wdf() / doclen; grptfreqs[git->first] += termfreqs[*qit]; } } } } // Build a sorted by quality container for the groups for (map >::const_iterator git = byRoot.begin(); git != byRoot.end(); git++) { double q = (grpwdfs[git->first]) * grptfreqs[git->first]; q = -log10(q); if (q < 3) { q = 0.05; } else if (q < 4) { q = 0.3; } else if (q < 5) { q = 0.7; } else if (q < 6) { q = 0.8; } else { q = 1; } totalweight += q; byQ.insert(pair >(q, git->second)); } #ifdef DEBUGABSTRACT for (multimap >::reverse_iterator mit= byQ.rbegin(); mit != byQ.rend(); mit++) { LOGABS("qualityTerms: group\n" ); for (vector::const_iterator qit = mit->second.begin(); qit != mit->second.end(); qit++) { LOGABS("" << (mit->first) << "->[" << (qit) << "]\n" ); } } #endif return totalweight; } // Return page number for first match of "significant" term. int Query::Native::getFirstMatchPage(Xapian::docid docid, string& term) { LOGDEB("Query::Native::getFirstMatchPage\n"); if (!m_q|| !m_q->m_db || !m_q->m_db->m_ndb || !m_q->m_db->m_ndb->m_isopen) { LOGERR("Query::getFirstMatchPage: no db\n" ); return -1; } Rcl::Db::Native *ndb(m_q->m_db->m_ndb); Xapian::Database& xrdb(ndb->xrdb); vector terms; getMatchTerms(docid, terms); if (terms.empty()) { LOGDEB("getFirstMatchPage: empty match term list (field match?)\n" ); return -1; } vector pagepos; ndb->getPagePositions(docid, pagepos); if (pagepos.empty()) return -1; setDbWideQTermsFreqs(); // We try to use a page which matches the "best" term. Get a sorted list multimap > byQ; qualityTerms(docid, terms, byQ); for (multimap >::reverse_iterator mit = byQ.rbegin(); mit != byQ.rend(); mit++) { for (vector::const_iterator qit = mit->second.begin(); qit != mit->second.end(); qit++) { string qterm = *qit; Xapian::PositionIterator pos; string emptys; try { for (pos = xrdb.positionlist_begin(docid, qterm); pos != xrdb.positionlist_end(docid, qterm); pos++) { int pagenum = ndb->getPageNumberForPosition(pagepos, *pos); if (pagenum > 0) { term = qterm; return pagenum; } } } catch (...) { // Term does not occur. No problem. } } } return -1; } // Build a document abstract by extracting text chunks around the query terms // This uses the db termlists, not the original document. // // DatabaseModified and other general exceptions are catched and // possibly retried by our caller int Query::Native::makeAbstract(Xapian::docid docid, vector& vabs, int imaxoccs, int ictxwords) { Chrono chron; LOGABS("makeAbstract: docid " << (long(docid)) << " imaxoccs " << (imaxoccs) << " ictxwords " << (ictxwords) << "\n" ); // The (unprefixed) terms matched by this document vector matchedTerms; getMatchTerms(docid, matchedTerms); if (matchedTerms.empty()) { LOGDEB("makeAbstract::Empty term list\n" ); return ABSRES_ERROR; } listList("Match terms: ", matchedTerms); // Retrieve the term frequencies for the query terms. This is // actually computed only once for a query, and for all terms in // the query (not only the matches for this doc) setDbWideQTermsFreqs(); // Build a sorted by quality container for the match terms We are // going to try and show text around the less common search terms. // Terms issued from an original one by stem expansion are // aggregated by the qualityTerms() routine. multimap > byQ; double totalweight = qualityTerms(docid, matchedTerms, byQ); LOGABS("makeAbstract:" << (chron.ms()) << ": computed Qcoefs.\n" ); // This can't happen, but would crash us if (totalweight == 0.0) { LOGERR("makeAbstract: totalweight == 0.0 !\n" ); return ABSRES_ERROR; } Rcl::Db::Native *ndb(m_q->m_db->m_ndb); Xapian::Database& xrdb(ndb->xrdb); /////////////////// // For each of the query terms, ask xapian for its positions list // in the document. For each position entry, insert it and its // neighbours in the set of 'interesting' positions // The terms 'array' that we partially populate with the document // terms, at their positions around the search terms positions: map sparseDoc; // Also remember apart the search term positions so that we can list // them with their snippets. std::unordered_set searchTermPositions; // Remember max position. Used to stop walking positions lists while // populating the adjacent slots. unsigned int maxpos = 0; // Total number of occurences for all terms. We stop when we have too much unsigned int totaloccs = 0; // Total number of slots we populate. The 7 is taken as // average word size. It was a mistake to have the user max // abstract size parameter in characters, we basically only deal // with words. We used to limit the character size at the end, but // this damaged our careful selection of terms const unsigned int maxtotaloccs = imaxoccs > 0 ? imaxoccs : m_q->m_db->getAbsLen() /(7 * (m_q->m_db->getAbsCtxLen() + 1)); int ctxwords = ictxwords == -1 ? m_q->m_db->getAbsCtxLen() : ictxwords; LOGABS("makeAbstract:" << (chron.ms()) << ": mxttloccs " << (maxtotaloccs) << " ctxwords " << (ctxwords) << "\n" ); int ret = ABSRES_OK; // Let's go populate for (multimap >::reverse_iterator mit = byQ.rbegin(); mit != byQ.rend(); mit++) { unsigned int maxgrpoccs; double q; if (byQ.size() == 1) { maxgrpoccs = maxtotaloccs; q = 1.0; } else { // We give more slots to the better term groups q = mit->first / totalweight; maxgrpoccs = int(ceil(maxtotaloccs * q)); } unsigned int grpoccs = 0; for (vector::const_iterator qit = mit->second.begin(); qit != mit->second.end(); qit++) { // Group done ? if (grpoccs >= maxgrpoccs) break; string qterm = *qit; LOGABS("makeAbstract: [" << (qterm) << "] " << (maxgrpoccs) << " max grp occs (coef " << (q) << ")\n" ); // The match term may span several words int qtrmwrdcnt = TextSplit::countWords(qterm, TextSplit::TXTS_NOSPANS); Xapian::PositionIterator pos; // There may be query terms not in this doc. This raises an // exception when requesting the position list, we catch it ?? // Not clear how this can happen because we are walking the // match list returned by Xapian. Maybe something with the // fields? string emptys; try { for (pos = xrdb.positionlist_begin(docid, qterm); pos != xrdb.positionlist_end(docid, qterm); pos++) { int ipos = *pos; if (ipos < int(baseTextPosition)) // Not in text body continue; LOGABS("makeAbstract: [" << (qterm) << "] at pos " << (ipos) << " grpoccs " << (grpoccs) << " maxgrpoccs " << (maxgrpoccs) << "\n" ); totaloccs++; grpoccs++; // Add adjacent slots to the set to populate at next // step by inserting empty strings. Special provisions // for adding ellipsis and for positions overlapped by // the match term. unsigned int sta = MAX(int(baseTextPosition), ipos - ctxwords); unsigned int sto = ipos + qtrmwrdcnt-1 + m_q->m_db->getAbsCtxLen(); for (unsigned int ii = sta; ii <= sto; ii++) { if (ii == (unsigned int)ipos) { sparseDoc[ii] = qterm; searchTermPositions.insert(ii); if (ii > maxpos) maxpos = ii; } else if (ii > (unsigned int)ipos && ii < (unsigned int)ipos + qtrmwrdcnt) { sparseDoc[ii] = occupiedmarker; } else if (!sparseDoc[ii].compare(cstr_ellipsis)) { // For an empty slot, the test has a side // effect of inserting an empty string which // is what we want. sparseDoc[ii] = emptys; } } // Add ellipsis at the end. This may be replaced later by // an overlapping extract. Take care not to replace an // empty string here, we really want an empty slot, // use find() if (sparseDoc.find(sto+1) == sparseDoc.end()) { sparseDoc[sto+1] = cstr_ellipsis; } // Group done ? if (grpoccs >= maxgrpoccs) { ret |= ABSRES_TRUNC; LOGABS("Db::makeAbstract: max group occs cutoff\n" ); break; } // Global done ? if (totaloccs >= maxtotaloccs) { ret |= ABSRES_TRUNC; LOGABS("Db::makeAbstract: max occurrences cutoff\n" ); break; } } } catch (...) { // Term does not occur. No problem. } if (totaloccs >= maxtotaloccs) { ret |= ABSRES_TRUNC; LOGABS("Db::makeAbstract: max1 occurrences cutoff\n" ); break; } } } maxpos += ctxwords + 1; LOGABS("makeAbstract:" << (chron.millis()) << ":chosen number of positions " << (totaloccs) << "\n" ); // This can happen if there are term occurences in the keywords // etc. but not elsewhere ? if (totaloccs == 0) { LOGDEB("makeAbstract: no occurrences\n" ); return ABSRES_OK; } // Walk all document's terms position lists and populate slots // around the query terms. We arbitrarily truncate the list to // avoid taking forever. If we do cutoff, the abstract may be // inconsistant (missing words, potentially altering meaning), // which is bad. { Xapian::TermIterator term; int cutoff = m_q->m_snipMaxPosWalk; for (term = xrdb.termlist_begin(docid); term != xrdb.termlist_end(docid); term++) { // Ignore prefixed terms if (has_prefix(*term)) continue; if (m_q->m_snipMaxPosWalk > 0 && cutoff-- < 0) { ret |= ABSRES_TERMMISS; LOGDEB0("makeAbstract: max term count cutoff " << (m_q->m_snipMaxPosWalk) << "\n" ); break; } map::iterator vit; Xapian::PositionIterator pos; for (pos = xrdb.positionlist_begin(docid, *term); pos != xrdb.positionlist_end(docid, *term); pos++) { if (m_q->m_snipMaxPosWalk > 0 && cutoff-- < 0) { ret |= ABSRES_TERMMISS; LOGDEB0("makeAbstract: max term count cutoff " << (m_q->m_snipMaxPosWalk) << "\n" ); break; } // If we are beyond the max possible position, stop // for this term if (*pos > maxpos) { break; } if ((vit = sparseDoc.find(*pos)) != sparseDoc.end()) { // Don't replace a term: the terms list is in // alphabetic order, and we may have several terms // at the same position, we want to keep only the // first one (ie: dockes and dockes@wanadoo.fr) if (vit->second.empty()) { LOGDEB2("makeAbstract: populating: [" << ((*term)) << "] at " << (*pos) << "\n" ); sparseDoc[*pos] = *term; } } } } } #if 0 // Debug only: output the full term[position] vector bool epty = false; int ipos = 0; for (map::iterator it = sparseDoc.begin(); it != sparseDoc.end(); it++, ipos++) { if (it->empty()) { if (!epty) LOGDEB("makeAbstract:vec[" << (ipos) << "]: [" << (it) << "]\n" ); epty=true; } else { epty = false; LOGDEB("makeAbstract:vec[" << (ipos) << "]: [" << (it) << "]\n" ); } } #endif vector vpbreaks; ndb->getPagePositions(docid, vpbreaks); LOGABS("makeAbstract:" << (chron.millis()) << ": extracting. Got " << (vpbreaks.size()) << " pages\n" ); // Finally build the abstract by walking the map (in order of position) vabs.clear(); string chunk; bool incjk = false; int page = 0; string term; for (map::const_iterator it = sparseDoc.begin(); it != sparseDoc.end(); it++) { LOGDEB2("Abtract:output " << (it->first) << " -> [" << (it->second) << "]\n" ); if (!occupiedmarker.compare(it->second)) { LOGDEB("Abstract: qtrm position not filled ??\n" ); continue; } if (chunk.empty() && !vpbreaks.empty()) { page = ndb->getPageNumberForPosition(vpbreaks, it->first); if (page < 0) page = 0; term.clear(); } Utf8Iter uit(it->second); bool newcjk = false; if (TextSplit::isCJK(*uit)) newcjk = true; if (!incjk || (incjk && !newcjk)) chunk += " "; incjk = newcjk; if (searchTermPositions.find(it->first) != searchTermPositions.end()) term = it->second; if (it->second == cstr_ellipsis) { vabs.push_back(Snippet(page, chunk).setTerm(term)); chunk.clear(); } else { if (it->second.compare(end_of_field_term) && it->second.compare(start_of_field_term)) chunk += it->second; } } if (!chunk.empty()) vabs.push_back(Snippet(page, chunk).setTerm(term)); LOGDEB2("makeAbtract: done in " << (chron.millis()) << " mS\n" ); return ret; } } recoll-1.23.7/rcldb/synfamily.h0000644000175000017500000001573513125637102013272 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SYNFAMILY_H_INCLUDED_ #define _SYNFAMILY_H_INCLUDED_ /** * The Xapian synonyms mechanism can be used for many things beyond actual * synonyms, anything that would turn a string into a group of equivalents. * Unfortunately, it has only one keyspace. * This class partitions the Xapian synonyms keyspace by using prefixes and * can provide different applications each with a family of keyspaces. * Two characters are reserved by the class and should not be used inside * either family or member names: ':' and ';' * A synonym key for family "stemdb", member "french", key "somestem" * looks like: * :stemdb:french:somestem -> somestem expansions * A special entry is used to list all the members for a family, e.g.: * :stemdb;members -> french, english ... */ #include #include #include #include "log.h" #include "xmacros.h" #include "strmatcher.h" namespace Rcl { class XapSynFamily { public: /** * Construct from readable xapian database and family name (ie: Stm) */ XapSynFamily(Xapian::Database xdb, const std::string& familyname) : m_rdb(xdb) { m_prefix1 = std::string(":") + familyname; } /** Retrieve all members of this family (e.g: french english german...) */ virtual bool getMembers(std::vector&); /** debug: list map for one member to stdout */ virtual bool listMap(const std::string& fam); /** Expand term to list of synonyms for given member */ bool synExpand(const std::string& membername, const std::string& term, std::vector& result); // The prefix shared by all synonym entries inside a family member virtual std::string entryprefix(const std::string& member) { return m_prefix1 + ":" + member + ":"; } // The key for the "list of members" entry virtual std::string memberskey() { return m_prefix1 + ";" + "members"; } Xapian::Database& getdb() { return m_rdb; } protected: Xapian::Database m_rdb; std::string m_prefix1; }; /** Modify ops for a synonyms family * * A method to add a synonym entry inside a given member would make sense, * but would not be used presently as all these ops go through * ComputableSynFamMember objects */ class XapWritableSynFamily : public XapSynFamily { public: /** Construct with Xapian db open for r/w */ XapWritableSynFamily(Xapian::WritableDatabase db, const std::string& familyname) : XapSynFamily(db, familyname), m_wdb(db) { } /** Delete all entries for one member (e.g. french), and remove from list * of members */ virtual bool deleteMember(const std::string& membername); /** Add to list of members. Idempotent, does not affect actual expansions */ virtual bool createMember(const std::string& membername); Xapian::WritableDatabase getdb() {return m_wdb;} protected: Xapian::WritableDatabase m_wdb; }; /** A functor which transforms a string */ class SynTermTrans { public: virtual std::string operator()(const std::string&) = 0; virtual std::string name() { return "SynTermTrans: unknown";} }; /** A member (set of root-synonyms associations) of a SynFamily for * which the root is computable from the input term. * The objects use a functor member to compute the term root on input * (e.g. compute the term sterm or casefold it */ class XapComputableSynFamMember { public: XapComputableSynFamMember(Xapian::Database xdb, std::string familyname, std::string membername, SynTermTrans* trans) : m_family(xdb, familyname), m_membername(membername), m_trans(trans), m_prefix(m_family.entryprefix(m_membername)) { } /** Expand a term to its list of synonyms. If filtertrans is set we * keep only the results which transform to the same value as the input * This is used for example for filtering the result of case+diac * expansion when only either case or diac expansion is desired. */ bool synExpand(const std::string& term, std::vector& result, SynTermTrans *filtertrans = 0); /** Same with also wildcard/regexp expansion of entry against the keys. * The input matcher will be modified to fit our key format. */ bool synKeyExpand(StrMatcher* in, std::vector& result, SynTermTrans *filtertrans = 0); private: XapSynFamily m_family; std::string m_membername; SynTermTrans *m_trans; std::string m_prefix; }; /** Computable term root SynFamily member, modify ops */ class XapWritableComputableSynFamMember { public: XapWritableComputableSynFamMember( Xapian::WritableDatabase xdb, std::string familyname, std::string membername, SynTermTrans* trans) : m_family(xdb, familyname), m_membername(membername), m_trans(trans), m_prefix(m_family.entryprefix(m_membername)) { } virtual bool addSynonym(const std::string& term) { LOGDEB2("addSynonym:me " << (this) << " term [" << (term) << "] m_trans " << (m_trans) << "\n" ); std::string transformed = (*m_trans)(term); LOGDEB2("addSynonym: transformed [" << (transformed) << "]\n" ); if (transformed == term) return true; std::string ermsg; try { m_family.getdb().add_synonym(m_prefix + transformed, term); } XCATCHERROR(ermsg); if (!ermsg.empty()) { LOGERR("XapWritableComputableSynFamMember::addSynonym: xapian error " << (ermsg) << "\n" ); return false; } return true; } void clear() { m_family.deleteMember(m_membername); } void recreate() { clear(); m_family.createMember(m_membername); } private: XapWritableSynFamily m_family; std::string m_membername; SynTermTrans *m_trans; std::string m_prefix; }; // // Prefixes are centrally defined here to avoid collisions // // Lowercase accented stem to expansion. Family member name: language static const std::string synFamStem("Stm"); // Lowercase unaccented stem to expansion. Family member name: language static const std::string synFamStemUnac("StU"); // Lowercase unaccented term to case and accent variations. Only one // member, named "all". This set is used for separate case/diac // expansion by post-filtering the results of dual expansion. static const std::string synFamDiCa("DCa"); } // end namespace Rcl #endif /* _SYNFAMILY_H_INCLUDED_ */ recoll-1.23.7/rcldb/searchdataxml.cpp0000644000175000017500000001034713125637102014424 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Handle translation from rcl's SearchData structures to XML. Used for // complex search history storage in the GUI #include "autoconfig.h" #include #include #include #include #include "searchdata.h" #include "log.h" #include "base64.h" using namespace std; namespace Rcl { static string tpToString(SClType tp) { switch (tp) { case SCLT_AND: return "AND"; case SCLT_OR: return "OR"; case SCLT_FILENAME: return "FN"; case SCLT_PHRASE: return "PH"; case SCLT_NEAR: return "NE"; case SCLT_SUB: return "SU"; // Unsupported actually default: return "UN"; } } string SearchData::asXML() { LOGDEB("SearchData::asXML\n" ); ostringstream os; // Searchdata os << "" << endl; // Clause list os << "" << endl; // List conjunction: default is AND, else print it. if (m_tp != SCLT_AND) os << "" << tpToString(m_tp) << "" << endl; for (unsigned int i = 0; i < m_query.size(); i++) { SearchDataClause *c = m_query[i]; if (c->getTp() == SCLT_SUB) { LOGERR("SearchData::asXML: can't do subclauses !\n" ); continue; } if (c->getTp() == SCLT_PATH) { // Keep these apart, for compat with the older history format. NEG // is ignored here, we have 2 different tags instead. SearchDataClausePath *cl = dynamic_cast(c); if (cl->getexclude()) { os << "" << base64_encode(cl->gettext()) << "" << endl; } else { os << "" << base64_encode(cl->gettext()) << "" << endl; } continue; } else { os << "" << endl; if (c->getexclude()) os << "" << endl; if (c->getTp() != SCLT_AND) { os << "" << tpToString(c->getTp()) << "" << endl; } if (c->getTp() == SCLT_FILENAME) { SearchDataClauseFilename *cl = dynamic_cast(c); os << "" << base64_encode(cl->gettext()) << "" << endl; } else { SearchDataClauseSimple *cl = dynamic_cast(c); if (!cl->getfield().empty()) { os << "" << base64_encode(cl->getfield()) << "" << endl; } os << "" << base64_encode(cl->gettext()) << "" << endl; if (cl->getTp() == SCLT_NEAR || cl->getTp() == SCLT_PHRASE) { SearchDataClauseDist *cld = dynamic_cast(cl); os << "" << cld->getslack() << "" << endl; } } os << "" << endl; } } os << "" << endl; if (m_haveDates) { if (m_dates.y1 > 0) { os << "" << "" << m_dates.d1 << "" << "" << m_dates.m1 << "" << "" << m_dates.y1 << "" << "" << endl; } if (m_dates.y2 > 0) { os << "" << "" << m_dates.d2 << "" << "" << m_dates.m2 << "" << "" << m_dates.y2 << "" << "" << endl; } } if (m_minSize != size_t(-1)) { os << "" << m_minSize << "" << endl; } if (m_maxSize != size_t(-1)) { os << "" << m_maxSize << "" << endl; } if (!m_filetypes.empty()) { os << ""; for (vector::iterator it = m_filetypes.begin(); it != m_filetypes.end(); it++) { os << *it << " "; } os << "" << endl; } if (!m_nfiletypes.empty()) { os << ""; for (vector::iterator it = m_nfiletypes.begin(); it != m_nfiletypes.end(); it++) { os << *it << " "; } os << "" << endl; } os << ""; return os.str(); } } recoll-1.23.7/rcldb/rcldb_p.h0000644000175000017500000001455713224431525012666 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _rcldb_p_h_included_ #define _rcldb_p_h_included_ #include "autoconfig.h" #include #include #include #ifdef IDX_THREADS #include "workqueue.h" #endif // IDX_THREADS #include "xmacros.h" namespace Rcl { class Query; #ifdef IDX_THREADS // Task for the index update thread. This can be // - add/update for a new / update documment // - delete for a deleted document // - purgeOrphans when a multidoc file is updated during a partial pass (no // general purge). We want to remove subDocs that possibly don't // exist anymore. We find them by their different sig // txtlen and doc are only valid for add/update else, len is (size_t)-1 and doc // is empty class DbUpdTask { public: enum Op {AddOrUpdate, Delete, PurgeOrphans}; // Note that udi and uniterm are strictly equivalent and are // passed both just to avoid recomputing uniterm which is // available on the caller site. // Take some care to avoid sharing string data (if string impl is cow) DbUpdTask(Op _op, const string& ud, const string& un, Xapian::Document *d, size_t tl) : op(_op), udi(ud.begin(), ud.end()), uniterm(un.begin(), un.end()), doc(d), txtlen(tl) {} // Udi and uniterm equivalently designate the doc Op op; string udi; string uniterm; Xapian::Document *doc; // txtlen is used to update the flush interval. It's -1 for a // purge because we actually don't know it, and the code fakes a // text length based on the term count. size_t txtlen; }; #endif // IDX_THREADS class TextSplitDb; // A class for data and methods that would have to expose // Xapian-specific stuff if they were in Rcl::Db. There could actually be // 2 different ones for indexing or query as there is not much in // common. class Db::Native { public: Db *m_rcldb; // Parent bool m_isopen; bool m_iswritable; bool m_noversionwrite; //Set if open failed because of version mismatch! #ifdef IDX_THREADS WorkQueue m_wqueue; std::mutex m_mutex; long long m_totalworkns; bool m_havewriteq; void maybeStartThreads(); #endif // IDX_THREADS // Indexing Xapian::WritableDatabase xwdb; // Querying (active even if the wdb is too) Xapian::Database xrdb; Native(Db *db); ~Native(); #ifdef IDX_THREADS friend void *DbUpdWorker(void*); #endif // IDX_THREADS // Final steps of doc update, part which need to be single-threaded bool addOrUpdateWrite(const string& udi, const string& uniterm, Xapian::Document *doc, size_t txtlen); /** Delete all documents which are contained in the input document, * which must be a file-level one. * * @param onlyOrphans if true, only delete documents which have * not the same signature as the input. This is used to delete docs * which do not exist any more in the file after an update, for * example the tail messages after a folder truncation). If false, * delete all. * @param udi the parent document identifier. * @param uniterm equivalent to udi, passed just to avoid recomputing. */ bool purgeFileWrite(bool onlyOrphans, const string& udi, const string& uniterm); bool getPagePositions(Xapian::docid docid, vector& vpos); int getPageNumberForPosition(const vector& pbreaks, int pos); bool dbDataToRclDoc(Xapian::docid docid, std::string &data, Doc &doc); size_t whatDbIdx(Xapian::docid id); /** Retrieve Xapian::docid, given unique document identifier, * using the posting list for the derived term. * * @param udi the unique document identifier (opaque hashed path+ipath). * @param idxi the database index, at query time, when using external * databases. * @param[out] xdoc the xapian document. * @return 0 if not found */ Xapian::docid getDoc(const string& udi, int idxi, Xapian::Document& xdoc); /** Retrieve unique document identifier for given Xapian document, * using the document termlist */ bool xdocToUdi(Xapian::Document& xdoc, string &udi); /** Check if doc is indexed by term */ bool hasTerm(const string& udi, int idxi, const string& term); /** Update existing Xapian document for pure extended attrs change */ bool docToXdocXattrOnly(TextSplitDb *splitter, const string &udi, Doc &doc, Xapian::Document& xdoc); /** Remove all terms currently indexed for field defined by idx prefix */ bool clearField(Xapian::Document& xdoc, const string& pfx, Xapian::termcount wdfdec); /** Check if term wdf is 0 and remove term if so */ bool clearDocTermIfWdf0(Xapian::Document& xdoc, const string& term); /** Compute list of subdocuments for a given udi. We look for documents * indexed by a parent term matching the udi, the posting list for the * parentterm(udi) (As suggested by James Aylett) * * Note that this is not currently recursive: all subdocs are supposed * to be children of the file doc. * Ie: in a mail folder, all messages, attachments, attachments of * attached messages etc. must have the folder file document as * parent. * * Finer grain parent-child relationships are defined by the * indexer (rcldb user), using the ipath. * */ bool subDocs(const string &udi, int idxi, vector& docids); /** Check if a page position list is defined */ bool hasPages(Xapian::docid id); }; // This is the word position offset at which we index the body text // (abstract, keywords, etc.. are stored before this) static const unsigned int baseTextPosition = 100000; } #endif /* _rcldb_p_h_included_ */ recoll-1.23.7/rcldb/rcldoc.h0000644000175000017500000002357313125637102012524 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLDOC_H_INCLUDED_ #define _RCLDOC_H_INCLUDED_ #include #include #include #include "smallut.h" namespace Rcl { /** * Dumb holder for document attributes and data. * * This is used both for indexing, where fields are filled-up by the * indexer prior to adding to the index, and for querying, where * fields are filled from data stored in the index. Not all fields are * in use at both index and query times, and not all field data is * stored at index time (for example the "text" field is split and * indexed, but not stored as such) */ class Doc { public: //////////////////////////////////////////////////////////// // The following fields are stored into the document data record (so they // can be accessed after a query without fetching the actual document). // We indicate the routine that sets them up during indexing // Binary or url-encoded url. No transcoding: this is used to access files // Index: computed by Db::add caller. // Query: from doc data. std::string url; // When we do path translation for documents from external indexes, we // save the original path: std::string idxurl; // And the originating db. 0 is base, 1 first external etc. int idxi; // Internal path for multi-doc files. Ascii // Set by FsIndexer::processone std::string ipath; // Mime type. Set by FileInterner::internfile std::string mimetype; // File modification time as decimal ascii unix time // Set by FsIndexer::processone std::string fmtime; // Data reference date (same format). Ie: mail date // Possibly set by mimetype-specific handler // Filter::metaData["modificationdate"] std::string dmtime; // Charset we transcoded the 'text' field from (in case we want back) // Possibly set by handler std::string origcharset; // A map for textual metadata like, author, keywords, abstract, // title. The entries are possibly set by the mimetype-specific // handler. If a fieldname-to-prefix translation exists, the // terms in the value will be indexed with a prefix. // Only some predefined fields are stored in the data record: // "title", "keywords", "abstract", "author", but if a field name is // in the "stored" configuration list, it will be stored too. std::map meta; // Attribute for the "abstract" entry. true if it is just the top // of doc, not a native document attribute. Not stored directly, but // as an indicative prefix at the beginning of the abstract (ugly hack) bool syntabs; // File size. This is the size of the compressed file or of the // external containing archive. // Index: Set by caller prior to Db::Add. // Query: Set from data record std::string pcbytes; // Document size, ie, size of the .odt or .xls. // Index: Set in internfile from the filter stack // Query: set from data record std::string fbytes; // Doc text size. // Index: from text.length(). // Query: set by rcldb from index data record std::string dbytes; // Doc signature. Used for up to date checks. // Index: set by Db::Add caller. Query: set from doc data. // This is opaque to rcldb, and could just as well be ctime, size, // ctime+size, md5, whatever. std::string sig; ///////////////////////////////////////////////// // The following fields don't go to the db record, so they can't // be retrieved at query time // Main document text. This is plaintext utf-8 text to be split // and indexed std::string text; ///////////////////////////////////////////////// // Misc stuff int pc; // relevancy percentage, used by sortseq, convenience unsigned long xdocid; // Opaque: rcldb doc identifier. // Page breaks were stored during indexing. bool haspages; // Has children, either as content of file-level container or // ipath descendants. bool haschildren; // During indexing: only fields from extended attributes were set, no // doc content. Allows for faster reindexing of existing doc bool onlyxattr; /////////////////////////////////////////////////////////////////// void erase() { url.erase(); idxurl.erase(); idxi = 0; ipath.erase(); mimetype.erase(); fmtime.erase(); dmtime.erase(); origcharset.erase(); meta.clear(); syntabs = false; pcbytes.erase(); fbytes.erase(); dbytes.erase(); sig.erase(); text.erase(); pc = 0; xdocid = 0; idxi = 0; haspages = false; haschildren = false; onlyxattr = false; } // Copy ensuring no shared string data, for threading issues. void copyto(Doc *d) const; Doc() : idxi(0), syntabs(false), pc(0), xdocid(0), haspages(false), haschildren(false), onlyxattr(false) { } /** Get value for named field. If value pointer is 0, just test existence */ bool getmeta(const std::string& nm, std::string *value = 0) const { const auto it = meta.find(nm); if (it != meta.end()) { if (value) *value = it->second; return true; } else { return false; } } /** Nocopy getvalue. sets pointer to entry value if exists */ bool peekmeta(const std::string& nm, const std::string **value = 0) const { const auto it = meta.find(nm); if (it != meta.end()) { if (value) *value = &(it->second); return true; } else { return false; } } // Create entry or append text to existing entry. bool addmeta(const std::string& nm, const std::string& value) { auto mit = meta.find(nm); if (mit == meta.end()) { meta[nm] = value; } else if (mit->second.empty()) { mit->second = value; } else { // It may happen that the same attr exists several times // in the internfile stack. Avoid duplicating values. if (mit->second != value) mit->second += std::string(" - ") + value; } return true; } /* Is this document stored as a regular filesystem file ? * (as opposed to e.g. a webcache file), not a subdoc, */ bool isFsFile() { std::string backend; getmeta(keybcknd, &backend); if (!backend.empty() && backend.compare("FS")) return false; return true; } void dump(bool dotext=false) const; // The official names for recoll native fields when used in a text // context (ie: the python interface duplicates some of the fixed // fields in the meta array, these are the names used). Defined in // rcldoc.cpp. Fields stored in the meta[] array (ie, title, // author), _must_ use these canonical values, not aliases. This is // enforced in internfile.cpp and misc other bits of metadata-gathering // code static const std::string keyurl; // url // childurl. This is set when working with the parent of the result, to hold // the child of interest url, typically to highlight a directory entry static const std::string keychildurl; // file name. This is set for filesystem-level containers or // documents, and not inherited by subdocuments (which can get a // keyfn anyway from, e.g, an attachment filename value). Subdocs // used to inherit the file name, but this was undesirable (you // usually don't want to see all subdocs when searching for the // file name). Instead the container file name is now set in the // document record but not indexed (see next entry). static const std::string keyfn; // Container file name. This is set for all subdocuments of a // given top level container. It is not indexed by default but // stored in the document record keyfn field if this is still // empty when we create it, for display purposes. static const std::string keytcfn; static const std::string keyipt; // ipath static const std::string keytp; // mime type static const std::string keyfmt; // file mtime static const std::string keydmt; // document mtime static const std::string keymt; // mtime dmtime if set else fmtime static const std::string keyoc; // original charset static const std::string keypcs; // document outer container size static const std::string keyfs; // document size static const std::string keyds; // document text size static const std::string keysz; // dbytes if set else fbytes else pcbytes static const std::string keysig; // sig static const std::string keyrr; // relevancy rating static const std::string keycc; // Collapse count static const std::string keyabs; // abstract static const std::string keyau; // author static const std::string keytt; // title static const std::string keykw; // keywords static const std::string keymd5; // file md5 checksum static const std::string keybcknd; // backend type for data not from the filesys // udi back from index. Only set by Rcl::Query::getdoc(). static const std::string keyudi; static const std::string keyapptg; // apptag. Set from localfields (fsindexer) static const std::string keybght; // beagle hit type ("beagleHitType") }; extern bool docsToPaths(std::vector &docs,std::vector &paths); } #endif /* _RCLDOC_H_INCLUDED_ */ recoll-1.23.7/missing0000755000175000017500000001533013224670150011406 00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2013-10-28.13; # UTC # Copyright (C) 1996-2014 Free Software Foundation, Inc. # Originally written by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try '$0 --help' for more information" exit 1 fi case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and 'g' are ignored when checking the name. Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: unknown '$1' option" echo 1>&2 "Try '$0 --help' for more information" exit 1 ;; esac # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'autom4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.23.7/compile0000755000175000017500000001624513224670150011373 00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2014 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi exec "$@" $linker_opts exit 1 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . EOF exit $? ;; -v | --v*) echo "compile $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: recoll-1.23.7/configure0000755000175000017500000246154513224670150011735 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for Recoll 1.23.7. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Recoll' PACKAGE_TARNAME='recoll' PACKAGE_VERSION='1.23.7' PACKAGE_STRING='Recoll 1.23.7' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_unique_file="index/recollindex.cpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS RCLLIBVERSION RCLVERSION LIBQZEITGEIST QMAKE_DISABLE_ZEITGEIST QMAKE_ENABLE_ZEITGEIST QMAKE_DISABLE_WEBKIT QMAKE_ENABLE_WEBKIT XAPIANCXXFLAGS QTGUI QMAKE LIBFAM LIBXAPIANSTATICEXTRA LIBXAPIANDIR LIBXAPIAN INCICONV X_LIBX11 RECOLL_DATADIR X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS XMKMF QMAKEPATH MAKECMDLINE_FALSE MAKECMDLINE_TRUE MAKEQT_FALSE MAKEQT_TRUE MAKEUSERDOC_FALSE MAKEUSERDOC_TRUE MAKEXADUMP_FALSE MAKEXADUMP_TRUE XAPIAN_CONFIG2 XAPIAN_CONFIG1 XAPIAN_CONFIG0 MAKEPYTHON_FALSE MAKEPYTHON_TRUE NOTHREADS_FALSE NOTHREADS_TRUE aspellProg fileProg YFLAGS YACC CXXCPP am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX LTLIBICONV LIBICONV CPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB ac_ct_AR AR DLLTOOL OBJDUMP LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build LIBTOOL AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_silent_rules enable_static enable_shared with_pic enable_fast_install with_aix_soname enable_dependency_tracking with_gnu_ld with_sysroot enable_libtool_lock enable_rpath with_libiconv_prefix enable_largefile enable_posix_spawn with_file_command with_aspell with_inotify with_fam enable_idxthreads enable_camelcase enable_python_module enable_xadump enable_userdoc enable_qtgui enable_recollq enable_webkit with_qzeitgeist enable_x11mon with_x ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS LT_SYS_LIBRARY_PATH CPP CXX CXXFLAGS CCC CXXCPP YACC YFLAGS XMKMF' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures Recoll 1.23.7 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/recoll] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Recoll 1.23.7:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-libtool-lock avoid locking (might break parallel builds) --disable-rpath do not hardcode runtime library paths --disable-largefile omit support for large files --enable-posix_spawn Enable the use of posix_spawn(). --disable-idxthreads Disable multithread indexing. --enable-camelcase Enable splitting camelCase words. This is not enabled by default as this makes phrase matches more difficult: you need to use matching case in the phrase query to get a match. Ie querying for "MySQL manual" and "my sql manual" are the same, but not the same as "mysql manual" (in phrases only and you could raise the phrase slack to get a match). --disable-python-module Do not build the Python module. --enable-xadump Enable building the xadump low level Xapian access program. --disable-userdoc Disable building the user manual. (Avoids the need for docbook xml/xsl files and TeX tools. --disable-qtgui Disable the QT-based graphical user interface. --enable-recollq Enable building the recollq command line query tool (recoll -t without need for Qt). This is done by default if --disable-qtgui is set but this option enables forcing it. --disable-webkit Disable use of qt-webkit (only meaningful if qtgui is enabled). --disable-x11mon Disable recollindex support for X11 session monitoring. Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib --without-libiconv-prefix don't search for libiconv in includedir and libdir --with-file-command Specify version of 'file' command (ie: --with-file-command=/usr/local/bin/file) --without-aspell Disable use of aspell spelling package to provide term expansion to other spellings --with-inotify Use inotify for almost real time indexing of modified files (the default is yes on Linux). --with-fam Use File Alteration Monitor for almost real time indexing of modified files. Give the fam/gamin library as argument (ie: /usr/lib/libfam.so) if configure does not find the right one. --with-qzeitgeist Enable the use of the qzeitgeist library to send zeitgeist events. --with-x use the X Window System Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory LT_SYS_LIBRARY_PATH User-defined run-time library search path. CPP C preprocessor CXX C++ compiler command CXXFLAGS C++ compiler flags CXXCPP C++ preprocessor YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. YFLAGS The list of arguments that will be passed by default to $YACC. This script will default YFLAGS to the empty string to avoid a default value of `-d' given by some make applications. XMKMF Path to xmkmf, Makefile generator for X Window System Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Recoll configure 1.23.7 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES # --------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_cxx_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_mongrel 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.23.7, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers common/autoconfig.h" am__api_version='1.15' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". as_fn_error $? "ls -t appears to fail. Make sure there is not a broken alias in your environment" "$LINENO" 5 fi if test "$2" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$2" = conftest.file ) then # Ok. : else as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if ${ac_cv_path_mkdir+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi test -d ./--version && rmdir ./--version if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AWK+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null # Check whether --enable-silent-rules was given. if test "${enable_silent_rules+set}" = set; then : enableval=$enable_silent_rules; fi case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=1;; esac am_make=${MAKE-make} { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 $as_echo_n "checking whether $am_make supports nested variables... " >&6; } if ${am_cv_make_support_nested_variables+:} false; then : $as_echo_n "(cached) " >&6 else if $as_echo 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 $as_echo "$am_cv_make_support_nested_variables" >&6; } if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AM_BACKSLASH='\' if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='recoll' VERSION='1.23.7' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 fi fi # Check whether --enable-static was given. if test "${enable_static+set}" = set; then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else enable_static=no fi case `pwd` in *\ * | *\ *) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 $as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.4.6' macro_revision='2.4.6' ltmain=$ac_aux_dir/ltmain.sh # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 $as_echo_n "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5 $as_echo "printf" >&6; } ;; print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 $as_echo "print -r" >&6; } ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5 $as_echo "cat" >&6; } ;; esac DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 $as_echo_n "checking whether $CC understands -c and -o together... " >&6; } if ${am_cv_prog_cc_c_o+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 $as_echo "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CC_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 $as_echo_n "checking for a sed that does not truncate output... " >&6; } if ${ac_cv_path_SED+:} false; then : $as_echo_n "(cached) " >&6 else ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 $as_echo "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 $as_echo_n "checking for fgrep... " >&6; } if ${ac_cv_path_FGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in fgrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 $as_echo "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 $as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if ${lt_cv_path_NM+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 $as_echo "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 $as_echo "$DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 $as_echo "$ac_ct_DUMPBIN" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 $as_echo_n "checking the name lister ($NM) interface... " >&6; } if ${lt_cv_nm_interface+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 $as_echo "$lt_cv_nm_interface" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } if ${lt_cv_sys_max_cmd_len+:} false; then : $as_echo_n "(cached) " >&6 else i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu*) # Under GNU Hurd, this test is not required because there is # no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 $as_echo "$lt_cv_sys_max_cmd_len" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5 $as_echo "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 $as_echo_n "checking how to convert $build file names to $host format... " >&6; } if ${lt_cv_to_host_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 $as_echo "$lt_cv_to_host_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 $as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } if ${lt_cv_to_tool_file_cmd+:} false; then : $as_echo_n "(cached) " >&6 else #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* ) case $build in *-*-mingw* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 $as_echo "$lt_cv_to_tool_file_cmd" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 $as_echo_n "checking for $LD option to reload object files... " >&6; } if ${lt_cv_ld_reload_flag+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_reload_flag='-r' fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 $as_echo "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 $as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 $as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 $as_echo_n "checking how to recognize dependent libraries... " >&6; } if ${lt_cv_deplibs_check_method+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'test_compile' -- check by making test program. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='/usr/bin/file -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=/usr/bin/file lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd* | bitrig*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 $as_echo "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 $as_echo "$DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 $as_echo "$ac_ct_DLLTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 $as_echo_n "checking how to associate runtime and link libraries... " >&6; } if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 $as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AR=$ac_cv_prog_AR if test -n "$AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 $as_echo "$AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_AR+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 $as_echo "$ac_ct_AR" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${AR_FLAGS=cru} { $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 $as_echo_n "checking for archiver @FILE support... " >&6; } if ${lt_cv_ar_at_file+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 $as_echo "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_STRIP+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 $as_echo "$RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_RANLIB+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 $as_echo "$ac_ct_RANLIB" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then case $host_os in bitrig* | openbsd*) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" ;; *) old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" ;; esac old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 $as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } if ${lt_cv_sys_global_symbol_pipe+:} false; then : $as_echo_n "(cached) " >&6 else # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="sed -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5 (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5 $as_echo "failed" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 $as_echo "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 $as_echo_n "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test "${with_sysroot+set}" = set; then : withval=$with_sysroot; else with_sysroot=no fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then lt_sysroot=`$CC --print-sysroot 2>/dev/null` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 $as_echo "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 $as_echo "${lt_sysroot:-no}" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 $as_echo_n "checking for a working dd... " >&6; } if ${ac_cv_path_lt_DD+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in dd; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 $as_echo "$ac_cv_path_lt_DD" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 $as_echo_n "checking how to truncate binary pipes... " >&6; } if ${lt_cv_truncate_bin+:} false; then : $as_echo_n "(cached) " >&6 else printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 $as_echo "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test "${enable_libtool_lock+set}" = set; then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `/usr/bin/file conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `/usr/bin/file conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `/usr/bin/file conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `/usr/bin/file conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*) case `/usr/bin/file conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 $as_echo_n "checking whether the C compiler needs -belf... " >&6; } if ${lt_cv_cc_needs_belf+:} false; then : $as_echo_n "(cached) " >&6 else ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_cc_needs_belf=yes else lt_cv_cc_needs_belf=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 $as_echo "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 $as_echo "$MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 $as_echo "$ac_ct_MANIFEST_TOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 $as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if ${lt_cv_path_mainfest_tool+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_path_mainfest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_mainfest_tool=yes fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5 $as_echo "$lt_cv_path_mainfest_tool" >&6; } if test yes != "$lt_cv_path_mainfest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 $as_echo "$DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 $as_echo "$ac_ct_DSYMUTIL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 $as_echo "$NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 $as_echo "$ac_ct_NMEDIT" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 $as_echo "$LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_LIPO+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 $as_echo "$ac_ct_LIPO" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 $as_echo "$OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 $as_echo "$ac_ct_OTOOL" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 $as_echo "$OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 $as_echo "$ac_ct_OTOOL64" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 $as_echo_n "checking for -single_module linker flag... " >&6; } if ${lt_cv_apple_cc_single_mod+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if ${lt_cv_ld_exported_symbols_list+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_ld_exported_symbols_list=yes else lt_cv_ld_exported_symbols_list=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 $as_echo_n "checking for -force_load linker flag... " >&6; } if ${lt_cv_ld_force_load+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR cru libconftest.a conftest.o" >&5 $AR cru libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main() { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 $as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) # darwin 5.x on # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*86*-darwin8*|10.0,*-darwin[91]*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; 10.[012][,.]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; 10.*) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in dlfcn.h do : ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_DLFCN_H 1 _ACEOF fi done # Set options enable_dlopen=no enable_win32_dll=no # Check whether --enable-shared was given. if test "${enable_shared+set}" = set; then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else enable_shared=yes fi # Check whether --with-pic was given. if test "${with_pic+set}" = set; then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else pic_mode=default fi # Check whether --enable-fast-install was given. if test "${enable_fast_install+set}" = set; then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else enable_fast_install=yes fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 $as_echo_n "checking which variant of shared library versioning to provide... " >&6; } # Check whether --with-aix-soname was given. if test "${with_aix_soname+set}" = set; then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else if ${lt_cv_with_aix_soname+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_with_aix_soname=aix fi with_aix_soname=$lt_cv_with_aix_soname fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 $as_echo "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 $as_echo_n "checking for objdir... " >&6; } if ${lt_cv_objdir+:} false; then : $as_echo_n "(cached) " >&6 else rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 $as_echo "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir cat >>confdefs.h <<_ACEOF #define LT_OBJDIR "$lt_cv_objdir/" _ACEOF case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 $as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5 $as_echo_n "checking for file... " >&6; } if ${lt_cv_path_MAGIC_CMD+:} false; then : $as_echo_n "(cached) " >&6 else case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 $as_echo "$MAGIC_CMD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 $as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic=$lt_prog_compiler_pic fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 $as_echo "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if ${lt_cv_prog_compiler_pic_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 $as_echo "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 $as_echo "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd* | bitrig*) with_gnu_ld=no ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs=no ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=yes ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath_+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl*) # Native MSVC hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 $as_echo_n "checking if $CC understands -b... " >&6; } if ${lt_cv_prog_compiler__b+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 $as_echo "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 $as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if ${lt_cv_irix_exported_symbol+:} false; then : $as_echo_n "(cached) " >&6 else save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : lt_cv_irix_exported_symbol=yes else lt_cv_irix_exported_symbol=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 $as_echo "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi link_all_deplibs=no else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 $as_echo "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes; then : lt_cv_dlopen=shl_load else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 $as_echo_n "checking for shl_load in -ldld... " >&6; } if ${ac_cv_lib_dld_shl_load+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shl_load (); int main () { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_shl_load=yes else ac_cv_lib_dld_shl_load=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 $as_echo "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes; then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes; then : lt_cv_dlopen=dlopen else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 $as_echo_n "checking for dlopen in -lsvld... " >&6; } if ${ac_cv_lib_svld_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_svld_dlopen=yes else ac_cv_lib_svld_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 $as_echo "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes; then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 $as_echo_n "checking for dld_link in -ldld... " >&6; } if ${ac_cv_lib_dld_dld_link+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dld_link (); int main () { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dld_dld_link=yes else ac_cv_lib_dld_dld_link=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 $as_echo "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes; then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi fi fi fi fi fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 $as_echo_n "checking whether a program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 $as_echo "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 $as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } if ${lt_cv_dlopen_self_static+:} false; then : $as_echo_n "(cached) " >&6 else if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord () __attribute__((visibility("default"))); #endif int fnord () { return 42; } int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 $as_echo "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 $as_echo_n "checking whether stripping libraries is possible... " >&6; } if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in darwin*) if test -n "$STRIP"; then striplib="$STRIP -x" old_striplib="$STRIP -S" { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } ;; esac fi # Report what library types will actually be built { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC ac_config_commands="$ac_config_commands libtool" # Only expand once: # iconv.m4 serial 11 (gettext-0.18.1) if test "X$prefix" = "XNONE"; then acl_final_prefix="$ac_default_prefix" else acl_final_prefix="$prefix" fi if test "X$exec_prefix" = "XNONE"; then acl_final_exec_prefix='${prefix}' else acl_final_exec_prefix="$exec_prefix" fi acl_save_prefix="$prefix" prefix="$acl_final_prefix" eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" prefix="$acl_save_prefix" # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes else with_gnu_ld=no fi # Prepare PATH_SEPARATOR. # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then # Determine PATH_SEPARATOR by trying to find /bin/sh in a PATH which # contains only /bin. Note that ksh looks also at the FPATH variable, # so we have to set that as well for the test. PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 \ || PATH_SEPARATOR=';' } fi ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`echo "$ac_prog"| sed 's%\\\\%/%g'` while echo "$ac_prog" | grep "$re_direlt" > /dev/null 2>&1; do ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test "$with_gnu_ld" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${acl_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then acl_save_ifs="$IFS"; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS="$acl_save_ifs" test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then acl_cv_path_LD="$ac_dir/$ac_prog" # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$acl_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${acl_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$acl_cv_prog_gnu_ld" >&6; } with_gnu_ld=$acl_cv_prog_gnu_ld { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5 $as_echo_n "checking for shared library run path origin... " >&6; } if ${acl_cv_rpath+:} false; then : $as_echo_n "(cached) " >&6 else CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh . ./conftest.sh rm -f ./conftest.sh acl_cv_rpath=done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5 $as_echo "$acl_cv_rpath" >&6; } wl="$acl_cv_wl" acl_libext="$acl_cv_libext" acl_shlibext="$acl_cv_shlibext" acl_libname_spec="$acl_cv_libname_spec" acl_library_names_spec="$acl_cv_library_names_spec" acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" acl_hardcode_direct="$acl_cv_hardcode_direct" acl_hardcode_minus_L="$acl_cv_hardcode_minus_L" # Check whether --enable-rpath was given. if test "${enable_rpath+set}" = set; then : enableval=$enable_rpath; : else enable_rpath=yes fi acl_libdirstem=lib acl_libdirstem2= case "$host_os" in solaris*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking for 64-bit host" >&5 $as_echo_n "checking for 64-bit host... " >&6; } if ${gl_cv_solaris_64bit+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef _LP64 sixtyfour bits #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "sixtyfour bits" >/dev/null 2>&1; then : gl_cv_solaris_64bit=yes else gl_cv_solaris_64bit=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gl_cv_solaris_64bit" >&5 $as_echo "$gl_cv_solaris_64bit" >&6; } if test $gl_cv_solaris_64bit = yes; then acl_libdirstem=lib/64 case "$host_cpu" in sparc*) acl_libdirstem2=lib/sparcv9 ;; i*86 | x86_64) acl_libdirstem2=lib/amd64 ;; esac fi ;; *) searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'` if test -n "$searchpath"; then acl_save_IFS="${IFS= }"; IFS=":" for searchdir in $searchpath; do if test -d "$searchdir"; then case "$searchdir" in */lib64/ | */lib64 ) acl_libdirstem=lib64 ;; */../ | */.. ) # Better ignore directories of this form. They are misleading. ;; *) searchdir=`cd "$searchdir" && pwd` case "$searchdir" in */lib64 ) acl_libdirstem=lib64 ;; esac ;; esac fi done IFS="$acl_save_IFS" fi ;; esac test -n "$acl_libdirstem2" || acl_libdirstem2="$acl_libdirstem" use_additional=yes acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" # Check whether --with-libiconv-prefix was given. if test "${with_libiconv_prefix+set}" = set; then : withval=$with_libiconv_prefix; if test "X$withval" = "Xno"; then use_additional=no else if test "X$withval" = "X"; then acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval additional_includedir=\"$includedir\" eval additional_libdir=\"$libdir\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" else additional_includedir="$withval/include" additional_libdir="$withval/$acl_libdirstem" if test "$acl_libdirstem2" != "$acl_libdirstem" \ && ! test -d "$withval/$acl_libdirstem"; then additional_libdir="$withval/$acl_libdirstem2" fi fi fi fi LIBICONV= LTLIBICONV= INCICONV= LIBICONV_PREFIX= HAVE_LIBICONV= rpathdirs= ltrpathdirs= names_already_handled= names_next_round='iconv ' while test -n "$names_next_round"; do names_this_round="$names_next_round" names_next_round= for name in $names_this_round; do already_handled= for n in $names_already_handled; do if test "$n" = "$name"; then already_handled=yes break fi done if test -z "$already_handled"; then names_already_handled="$names_already_handled $name" uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./+-|ABCDEFGHIJKLMNOPQRSTUVWXYZ____|'` eval value=\"\$HAVE_LIB$uppername\" if test -n "$value"; then if test "$value" = yes; then eval value=\"\$LIB$uppername\" test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" eval value=\"\$LTLIB$uppername\" test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" else : fi else found_dir= found_la= found_so= found_a= eval libname=\"$acl_libname_spec\" # typically: libname=lib$name if test -n "$acl_shlibext"; then shrext=".$acl_shlibext" # typically: shrext=.so else shrext= fi if test $use_additional = yes; then dir="$additional_libdir" if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi fi if test "X$found_dir" = "X"; then for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" case "$x" in -L*) dir=`echo "X$x" | sed -e 's/^X-L//'` if test -n "$acl_shlibext"; then if test -f "$dir/$libname$shrext"; then found_dir="$dir" found_so="$dir/$libname$shrext" else if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then ver=`(cd "$dir" && \ for f in "$libname$shrext".*; do echo "$f"; done \ | sed -e "s,^$libname$shrext\\\\.,," \ | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \ | sed 1q ) 2>/dev/null` if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then found_dir="$dir" found_so="$dir/$libname$shrext.$ver" fi else eval library_names=\"$acl_library_names_spec\" for f in $library_names; do if test -f "$dir/$f"; then found_dir="$dir" found_so="$dir/$f" break fi done fi fi fi if test "X$found_dir" = "X"; then if test -f "$dir/$libname.$acl_libext"; then found_dir="$dir" found_a="$dir/$libname.$acl_libext" fi fi if test "X$found_dir" != "X"; then if test -f "$dir/$libname.la"; then found_la="$dir/$libname.la" fi fi ;; esac if test "X$found_dir" != "X"; then break fi done fi if test "X$found_dir" != "X"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" if test "X$found_so" != "X"; then if test "$enable_rpath" = no \ || test "X$found_dir" = "X/usr/$acl_libdirstem" \ || test "X$found_dir" = "X/usr/$acl_libdirstem2"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else haveit= for x in $ltrpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $found_dir" fi if test "$acl_hardcode_direct" = yes; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" haveit= for x in $rpathdirs; do if test "X$x" = "X$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $found_dir" fi else haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$found_dir"; then haveit=yes break fi done if test -z "$haveit"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" fi if test "$acl_hardcode_minus_L" != no; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" fi fi fi fi else if test "X$found_a" != "X"; then LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" else LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" fi fi additional_includedir= case "$found_dir" in */$acl_libdirstem | */$acl_libdirstem/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; */$acl_libdirstem2 | */$acl_libdirstem2/) basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem2/"'*$,,'` if test "$name" = 'iconv'; then LIBICONV_PREFIX="$basedir" fi additional_includedir="$basedir/include" ;; esac if test "X$additional_includedir" != "X"; then if test "X$additional_includedir" != "X/usr/include"; then haveit= if test "X$additional_includedir" = "X/usr/local/include"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then for x in $CPPFLAGS $INCICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-I$additional_includedir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_includedir"; then INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" fi fi fi fi fi if test -n "$found_la"; then save_libdir="$libdir" case "$found_la" in */* | *\\*) . "$found_la" ;; *) . "./$found_la" ;; esac libdir="$save_libdir" for dep in $dependency_libs; do case "$dep" in -L*) additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` if test "X$additional_libdir" != "X/usr/$acl_libdirstem" \ && test "X$additional_libdir" != "X/usr/$acl_libdirstem2"; then haveit= if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem" \ || test "X$additional_libdir" = "X/usr/local/$acl_libdirstem2"; then if test -n "$GCC"; then case $host_os in linux* | gnu* | k*bsd*-gnu) haveit=yes;; esac fi fi if test -z "$haveit"; then haveit= for x in $LDFLAGS $LIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" fi fi haveit= for x in $LDFLAGS $LTLIBICONV; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X-L$additional_libdir"; then haveit=yes break fi done if test -z "$haveit"; then if test -d "$additional_libdir"; then LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" fi fi fi fi ;; -R*) dir=`echo "X$dep" | sed -e 's/^X-R//'` if test "$enable_rpath" != no; then haveit= for x in $rpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then rpathdirs="$rpathdirs $dir" fi haveit= for x in $ltrpathdirs; do if test "X$x" = "X$dir"; then haveit=yes break fi done if test -z "$haveit"; then ltrpathdirs="$ltrpathdirs $dir" fi fi ;; -l*) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` ;; *.la) names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` ;; *) LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" ;; esac done fi else LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" fi fi fi done done if test "X$rpathdirs" != "X"; then if test -n "$acl_hardcode_libdir_separator"; then alldirs= for found_dir in $rpathdirs; do alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir" done acl_save_libdir="$libdir" libdir="$alldirs" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" else for found_dir in $rpathdirs; do acl_save_libdir="$libdir" libdir="$found_dir" eval flag=\"$acl_hardcode_libdir_flag_spec\" libdir="$acl_save_libdir" LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" done fi fi if test "X$ltrpathdirs" != "X"; then for found_dir in $ltrpathdirs; do LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" done fi am_save_CPPFLAGS="$CPPFLAGS" for element in $INCICONV; do haveit= for x in $CPPFLAGS; do acl_save_prefix="$prefix" prefix="$acl_final_prefix" acl_save_exec_prefix="$exec_prefix" exec_prefix="$acl_final_exec_prefix" eval x=\"$x\" exec_prefix="$acl_save_exec_prefix" prefix="$acl_save_prefix" if test "X$x" = "X$element"; then haveit=yes break fi done if test -z "$haveit"; then CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5 $as_echo_n "checking for iconv... " >&6; } if ${am_cv_func_iconv+:} false; then : $as_echo_n "(cached) " >&6 else am_cv_func_iconv="no, consider installing GNU libiconv" am_cv_lib_iconv=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$am_cv_func_iconv" != yes; then am_save_LIBS="$LIBS" LIBS="$LIBS $LIBICONV" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { iconv_t cd = iconv_open("",""); iconv(cd,NULL,NULL,NULL,NULL); iconv_close(cd); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : am_cv_lib_iconv=yes am_cv_func_iconv=yes fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$am_save_LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5 $as_echo "$am_cv_func_iconv" >&6; } if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5 $as_echo_n "checking for working iconv... " >&6; } if ${am_cv_func_iconv_works+:} false; then : $as_echo_n "(cached) " >&6 else am_save_LIBS="$LIBS" if test $am_cv_lib_iconv = yes; then LIBS="$LIBS $LIBICONV" fi if test "$cross_compiling" = yes; then : case "$host_os" in aix* | hpux*) am_cv_func_iconv_works="guessing no" ;; *) am_cv_func_iconv_works="guessing yes" ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { /* Test against AIX 5.1 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); if (cd_utf8_to_88591 != (iconv_t)(-1)) { static const char input[] = "\342\202\254"; /* EURO SIGN */ char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_utf8_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } /* Test against Solaris 10 bug: Failures are not distinguishable from successful returns. */ { iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646"); if (cd_ascii_to_88591 != (iconv_t)(-1)) { static const char input[] = "\263"; char buf[10]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_ascii_to_88591, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if (res == 0) return 1; } } #if 0 /* This bug could be worked around by the caller. */ /* Test against HP-UX 11.11 bug: Positive return value instead of 0. */ { iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591"); if (cd_88591_to_utf8 != (iconv_t)(-1)) { static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337"; char buf[50]; const char *inptr = input; size_t inbytesleft = strlen (input); char *outptr = buf; size_t outbytesleft = sizeof (buf); size_t res = iconv (cd_88591_to_utf8, (char **) &inptr, &inbytesleft, &outptr, &outbytesleft); if ((int)res > 0) return 1; } } #endif /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is provided. */ if (/* Try standardized names. */ iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */ && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try AIX names. */ && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try HP-UX names. */ && iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) return 1; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : am_cv_func_iconv_works=yes else am_cv_func_iconv_works=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi LIBS="$am_save_LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5 $as_echo "$am_cv_func_iconv_works" >&6; } case "$am_cv_func_iconv_works" in *no) am_func_iconv=no am_cv_lib_iconv=no ;; *) am_func_iconv=yes ;; esac else am_func_iconv=no am_cv_lib_iconv=no fi if test "$am_func_iconv" = yes; then $as_echo "#define HAVE_ICONV 1" >>confdefs.h fi if test "$am_cv_lib_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5 $as_echo_n "checking how to link with libiconv... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5 $as_echo "$LIBICONV" >&6; } else CPPFLAGS="$am_save_CPPFLAGS" LIBICONV= LTLIBICONV= fi if test "$am_cv_func_iconv" = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv declaration" >&5 $as_echo_n "checking for iconv declaration... " >&6; } if ${am_cv_proto_iconv+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include extern #ifdef __cplusplus "C" #endif #if defined(__STDC__) || defined(__cplusplus) size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); #else size_t iconv(); #endif int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : am_cv_proto_iconv_arg1="" else am_cv_proto_iconv_arg1="const" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);" fi am_cv_proto_iconv=`echo "$am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_proto_iconv" >&5 $as_echo " $am_cv_proto_iconv" >&6; } cat >>confdefs.h <<_ACEOF #define ICONV_CONST $am_cv_proto_iconv_arg1 _ACEOF fi INCICONV=$CPPFLAGS LIBICONV=$LTLIBICONV ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if ${am_cv_CXX_dependencies_compiler_type+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 $as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 $as_echo_n "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if ${ac_cv_prog_CXXCPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CXXCPP needs to be expanded for CXXCPP in "$CXX -E" "/lib/cpp" do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CXXCPP=$CXXCPP fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 $as_echo "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test "${with_gnu_ld+set}" = set; then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else with_gnu_ld=no fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 $as_echo_n "checking for ld used by $CC... " >&6; } case $host in *-*-mingw*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 $as_echo_n "checking for GNU ld... " >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 $as_echo_n "checking for non-GNU ld... " >&6; } fi if ${lt_cv_path_LD+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 $as_echo "$LD" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 $as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } if ${lt_cv_prog_gnu_ld+:} false; then : $as_echo_n "(cached) " >&6 else # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 $as_echo "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if eval "`$CC -print-prog-name=ld` --help 2>&1" | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if ${lt_cv_aix_libpath__CXX+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl*) # Native MSVC # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=yes ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd* | bitrig*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R}" and the path. # Remove the space. if test x-L = "$p" || test x-R = "$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 $as_echo_n "checking for $compiler option to produce PIC... " >&6; } if ${lt_cv_prog_compiler_pic_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 $as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if ${lt_cv_prog_compiler_static_works_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 $as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if ${lt_cv_prog_compiler_c_o_CXX+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 $as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 $as_echo "$hard_links" >&6; } if test no = "$hard_links"; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 $as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | cegcc*) case $cc_basename in cl*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; linux* | k*bsd*-gnu | gnu*) link_all_deplibs_CXX=no ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 $as_echo "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then : $as_echo_n "(cached) " >&6 else $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 $as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl*) # Native MSVC libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac shlibpath_var=LD_LIBRARY_PATH case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # Don't embed -rpath directories since the linker doesn't support them. hardcode_libdir_flag_spec_CXX='-L$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if ${lt_cv_shlibpath_overrides_runpath+:} false; then : $as_echo_n "(cached) " >&6 else lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directores which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd* | bitrig*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; *) dynamic_linker=no ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 $as_echo "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 $as_echo "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # AC_PROG_CXX used to set CXX to C when no compiler was found, but now it's # g++. So actually try to build a program to verify the compiler. if test C$CXX = C ; then as_fn_error $? "C++ compiler needed. Please install one (ie: gnu g++)" "$LINENO" 5 fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO"; then : rcl_link_ok=yes else rcl_link_ok=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext if test "$rcl_link_ok" = "no" ; then as_fn_error $? "No working C++ compiler was found" "$LINENO" 5 fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in 'bison -y' byacc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_YACC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$YACC"; then ac_cv_prog_YACC="$YACC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_YACC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi YACC=$ac_cv_prog_YACC if test -n "$YACC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $YACC" >&5 $as_echo "$YACC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$YACC" && break done test -n "$YACC" || YACC="yacc" { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5 $as_echo_n "checking whether byte ordering is bigendian... " >&6; } if ${ac_cv_c_bigendian+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_c_bigendian=unknown # See if we're dealing with a universal compiler. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifndef __APPLE_CC__ not a universal capable compiler #endif typedef int dummy; _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # Check for potential -arch flags. It is not universal unless # there are at least two -arch flags with different values. ac_arch= ac_prev= for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do if test -n "$ac_prev"; then case $ac_word in i?86 | x86_64 | ppc | ppc64) if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then ac_arch=$ac_word else ac_cv_c_bigendian=universal break fi ;; esac ac_prev= elif test "x$ac_word" = "x-arch"; then ac_prev=arch fi done fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_c_bigendian = unknown; then # See if sys/param.h defines the BYTE_ORDER macro. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ && LITTLE_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { #if BYTE_ORDER != BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) bogus endian macros #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : # It does; now see whether it defined to _BIG_ENDIAN or not. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { #ifndef _BIG_ENDIAN not big endian #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_bigendian=yes else ac_cv_c_bigendian=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi if test $ac_cv_c_bigendian = unknown; then # Compile a test program. if test "$cross_compiling" = yes; then : # Try to guess by grepping values from an object file. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ short int ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; short int ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; int use_ascii (int i) { return ascii_mm[i] + ascii_ii[i]; } short int ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; short int ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; int use_ebcdic (int i) { return ebcdic_mm[i] + ebcdic_ii[i]; } extern int foo; int main () { return use_ascii (foo) == use_ebcdic (foo); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then ac_cv_c_bigendian=yes fi if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then if test "$ac_cv_c_bigendian" = unknown; then ac_cv_c_bigendian=no else # finding both strings is unlikely to happen, but who knows? ac_cv_c_bigendian=unknown fi fi fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int main () { /* Are we little or big endian? From Harbison&Steele. */ union { long int l; char c[sizeof (long int)]; } u; u.l = 1; return u.c[sizeof (long int) - 1] == 1; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_bigendian=no else ac_cv_c_bigendian=yes fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5 $as_echo "$ac_cv_c_bigendian" >&6; } case $ac_cv_c_bigendian in #( yes) $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h ;; #( no) ;; #( universal) $as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h ;; #( *) as_fn_error $? "unknown endianness presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;; esac # Check whether --enable-largefile was given. if test "${enable_largefile+set}" = set; then : enableval=$enable_largefile; fi if test "$enable_largefile" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5 $as_echo_n "checking for special C compiler options needed for large files... " >&6; } if ${ac_cv_sys_largefile_CC+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_sys_largefile_CC=no if test "$GCC" != yes; then ac_save_CC=$CC while :; do # IRIX 6.2 and later do not support large files by default, # so use the C compiler's -n32 option if that helps. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : break fi rm -f core conftest.err conftest.$ac_objext CC="$CC -n32" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_largefile_CC=' -n32'; break fi rm -f core conftest.err conftest.$ac_objext break done CC=$ac_save_CC rm -f conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5 $as_echo "$ac_cv_sys_largefile_CC" >&6; } if test "$ac_cv_sys_largefile_CC" != no; then CC=$CC$ac_cv_sys_largefile_CC fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5 $as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } if ${ac_cv_sys_file_offset_bits+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _FILE_OFFSET_BITS 64 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_file_offset_bits=64; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_file_offset_bits=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5 $as_echo "$ac_cv_sys_file_offset_bits" >&6; } case $ac_cv_sys_file_offset_bits in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits _ACEOF ;; esac rm -rf conftest* if test $ac_cv_sys_file_offset_bits = unknown; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5 $as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } if ${ac_cv_sys_large_files+:} false; then : $as_echo_n "(cached) " >&6 else while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=no; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define _LARGE_FILES 1 #include /* Check that off_t can represent 2**63 - 1 correctly. We can't simply define LARGE_OFF_T to be 9223372036854775807, since some C++ compilers masquerading as C compilers incorrectly reject 9223372036854775807. */ #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31)) int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 && LARGE_OFF_T % 2147483647 == 1) ? 1 : -1]; int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_sys_large_files=1; break fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_sys_large_files=unknown break done fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5 $as_echo "$ac_cv_sys_large_files" >&6; } case $ac_cv_sys_large_files in #( no | unknown) ;; *) cat >>confdefs.h <<_ACEOF #define _LARGE_FILES $ac_cv_sys_large_files _ACEOF ;; esac rm -rf conftest* fi fi # OpenBSD needs sys/param.h for mount.h to compile for ac_header in sys/param.h, spawn.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_func in posix_spawn setrlimit kqueue do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "x$ac_cv_func_posix_spawn" = xyes; then : # Check whether --enable-posix_spawn was given. if test "${enable_posix_spawn+set}" = set; then : enableval=$enable_posix_spawn; posixSpawnEnabled=$enableval else posixSpawnEnabled=no fi fi if test X$posixSpawnEnabled = Xyes ; then $as_echo "#define USE_POSIX_SPAWN 1" >>confdefs.h fi # Check for where to find unordered_map etc. ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ac_fn_cxx_check_header_mongrel "$LINENO" "tr1/unordered_map" "ac_cv_header_tr1_unordered_map" "$ac_includes_default" if test "x$ac_cv_header_tr1_unordered_map" = xyes; then : $as_echo "#define HAVE_TR1_UNORDERED /**/" >>confdefs.h fi ac_fn_cxx_check_header_mongrel "$LINENO" "unordered_map" "ac_cv_header_unordered_map" "$ac_includes_default" if test "x$ac_cv_header_unordered_map" = xyes; then : $as_echo "#define HAVE_CXX0X_UNORDERED /**/" >>confdefs.h fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { std::shared_ptr ptr; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : rcl_shared_ptr_std="1" else rcl_shared_ptr_std="0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { std::tr1::shared_ptr ptr; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : rcl_shared_ptr_tr1="1" else rcl_shared_ptr_tr1="0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test X$rcl_shared_ptr_std = X1; then $as_echo "#define HAVE_SHARED_PTR_STD /**/" >>confdefs.h elif test X$rcl_shared_ptr_tr1 = X1; then $as_echo "#define HAVE_SHARED_PTR_TR1 /**/" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_header in sys/mount.h sys/statfs.h sys/statvfs.h sys/vfs.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "#ifdef HAVE_SYS_PARAM_H # include #endif " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Use specific 'file' command ? (Useful on solaris to specify # /usr/local/bin/file instead of the system's which doesn't understand '-i' # Check whether --with-file-command was given. if test "${with_file_command+set}" = set; then : withval=$with_file_command; withFileCommand=$withval else withFileCommand=file fi case $withFileCommand in file) # Extract the first word of "file", so it can be a program name with args. set dummy file; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_fileProg+:} false; then : $as_echo_n "(cached) " >&6 else case $fileProg in [\\/]* | ?:[\\/]*) ac_cv_path_fileProg="$fileProg" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_fileProg="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi fileProg=$ac_cv_path_fileProg if test -n "$fileProg"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $fileProg" >&5 $as_echo "$fileProg" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) fileProg=$withFileCommand;; esac if test ! -x "$fileProg"; then as_fn_error $? "$fileProg does not exist or is not executable" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF #define FILE_PROG "$fileProg" _ACEOF # Can't use Solaris standard 'file' command, it doesn't support -i if test X$sys != XSunOS -o X$fileProg != X/usr/bin/file; then $as_echo "#define USE_SYSTEM_FILE_COMMAND 1" >>confdefs.h fi # Use aspell to provide spelling expansions ? # The default is yes. If we do find an aspell installation, we use it. Else # we do compile the aspell module using an internal copy of aspell.h # Only --with-aspell=no will completely disable aspell support # Check whether --with-aspell was given. if test "${with_aspell+set}" = set; then : withval=$with_aspell; withAspell=$withval else withAspell=yes fi case $withAspell in no);; yes) # Extract the first word of "aspell", so it can be a program name with args. set dummy aspell; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_aspellProg+:} false; then : $as_echo_n "(cached) " >&6 else case $aspellProg in [\\/]* | ?:[\\/]*) ac_cv_path_aspellProg="$aspellProg" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_aspellProg="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi aspellProg=$ac_cv_path_aspellProg if test -n "$aspellProg"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $aspellProg" >&5 $as_echo "$aspellProg" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; *) # The argument should be the path to the aspell program aspellProg=$withAspell ;; esac if test X$withAspell != Xno ; then $as_echo "#define RCL_USE_ASPELL 1" >>confdefs.h if test X$aspellProg != X ; then aspellBase=`dirname $aspellProg` aspellBase=`dirname $aspellBase` cat >>confdefs.h <<_ACEOF #define ASPELL_PROG "$aspellProg" _ACEOF if test -f $aspellBase/include/aspell.h ; then cat >>confdefs.h <<_ACEOF #define ASPELL_INCLUDE "$aspellBase/include/aspell.h" _ACEOF else { $as_echo "$as_me:${as_lineno-$LINENO}: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&5 $as_echo "$as_me: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&6;} $as_echo "#define ASPELL_INCLUDE \"aspell-local.h\"" >>confdefs.h fi else # aspell support enabled but no aspell install yet { $as_echo "$as_me:${as_lineno-$LINENO}: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&5 $as_echo "$as_me: aspell support enabled but aspell package not found. Compiling with internal aspell interface file" >&6;} $as_echo "#define ASPELL_INCLUDE \"aspell-local.h\"" >>confdefs.h fi fi if test -f /usr/include/sys/inotify.h -o -f /usr/include/linux/inotify.h; then inot_default=yes else inot_default=no fi # Real time monitoring with inotify # Check whether --with-inotify was given. if test "${with_inotify+set}" = set; then : withval=$with_inotify; withInotify=$withval else withInotify=$inot_default fi if test X$withInotify != Xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: enabled support for inotify monitoring" >&5 $as_echo "$as_me: enabled support for inotify monitoring" >&6;} $as_echo "#define RCL_MONITOR 1" >>confdefs.h $as_echo "#define RCL_USE_INOTIFY 1" >>confdefs.h else { $as_echo "$as_me:${as_lineno-$LINENO}: inotify not found, inotify monitoring disabled" >&5 $as_echo "$as_me: inotify not found, inotify monitoring disabled" >&6;} fi # Real time monitoring with FAM # Check whether --with-fam was given. if test "${with_fam+set}" = set; then : withval=$with_fam; withFam=$withval else withFam=yes fi if test X$withFam != Xno -a X$withInotify != Xno ; then { $as_echo "$as_me:${as_lineno-$LINENO}: FAM support enabled but inotify support also enabled. Disabling FAM support and using inotify" >&5 $as_echo "$as_me: FAM support enabled but inotify support also enabled. Disabling FAM support and using inotify" >&6;} withFam=no fi famLib="" case $withFam in no);; yes) for dir in /usr/local/lib ${libdir};do if test -f $dir/libfam.so ; then famLib=$dir/libfam.so;break;fi done if test X$famLib = X ; then { $as_echo "$as_me:${as_lineno-$LINENO}: FAM library not found, disabling FAM and real time indexing support" >&5 $as_echo "$as_me: FAM library not found, disabling FAM and real time indexing support" >&6;} withFam=no fi ;; *) # The argument should be the path to the fam library famLib=$withFam ;; esac if test X$withFam != Xno ; then $as_echo "#define RCL_MONITOR 1" >>confdefs.h $as_echo "#define RCL_USE_FAM 1" >>confdefs.h if test X$famLib != X ; then famLibDir=`dirname $famLib` famBase=`dirname $famLibDir` famBLib=`basename $famLib .so | sed -e s/lib//` if test ! -f $famBase/include/fam.h ; then as_fn_error $? "fam.h not found in $famBase/include. Specify --with-fam=no to disable fam support" "$LINENO" 5 fi LIBFAM="-L$famLibDir -l$famBLib" { $as_echo "$as_me:${as_lineno-$LINENO}: fam library directive: $LIBFAM" >&5 $as_echo "$as_me: fam library directive: $LIBFAM" >&6;} cat >>confdefs.h <<_ACEOF #define FAM_INCLUDE "$famBase/include/fam.h" _ACEOF else as_fn_error $? "fam library not found" "$LINENO" 5 fi fi # Enable use of threads in the indexing pipeline. # This is disabled by default as we usually care little about indexing # absolute performance (more about impact on usability and total # resources used). # Check whether --enable-idxthreads was given. if test "${enable_idxthreads+set}" = set; then : enableval=$enable_idxthreads; idxthreadsEnabled=$enableval else idxthreadsEnabled=yes fi if test X$idxthreadsEnabled = Xno; then NOTHREADS_TRUE= NOTHREADS_FALSE='#' else NOTHREADS_TRUE='#' NOTHREADS_FALSE= fi if test X$idxthreadsEnabled = Xyes ; then $as_echo "#define IDX_THREADS 1" >>confdefs.h fi # Enable CamelCase word splitting. This is optional because it causes # problems with phrases: with camelcase enabled, "MySQL manual" # will be matched by "MySQL manual" and "my sql manual" but not # "mysql manual" (which would need increased slack as manual is now at pos # 2 instead of 1 # Check whether --enable-camelcase was given. if test "${enable_camelcase+set}" = set; then : enableval=$enable_camelcase; camelcaseEnabled=$enableval else camelcaseEnabled=no fi if test X$camelcaseEnabled = Xyes ; then $as_echo "#define RCL_SPLIT_CAMELCASE 1" >>confdefs.h fi # Disable building the python module. if test X$sys != XDarwin ; then # Check whether --enable-python-module was given. if test "${enable_python_module+set}" = set; then : enableval=$enable_python_module; pythonEnabled=$enableval else pythonEnabled=yes fi else pythonEnabled=no fi if test X$pythonEnabled = Xyes; then MAKEPYTHON_TRUE= MAKEPYTHON_FALSE='#' else MAKEPYTHON_TRUE='#' MAKEPYTHON_FALSE= fi for ac_func in mkdtemp do : ac_fn_c_check_func "$LINENO" "mkdtemp" "ac_cv_func_mkdtemp" if test "x$ac_cv_func_mkdtemp" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_MKDTEMP 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5 $as_echo_n "checking for pthread_create in -lpthread... " >&6; } if ${ac_cv_lib_pthread_pthread_create+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpthread $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pthread_create (); int main () { return pthread_create (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pthread_pthread_create=yes else ac_cv_lib_pthread_pthread_create=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pthread_pthread_create" >&5 $as_echo "$ac_cv_lib_pthread_pthread_create" >&6; } if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPTHREAD 1 _ACEOF LIBS="-lpthread $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 $as_echo_n "checking for dlopen in -ldl... " >&6; } if ${ac_cv_lib_dl_dlopen+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dlopen (); int main () { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dl_dlopen=yes else ac_cv_lib_dl_dlopen=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 $as_echo "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBDL 1 _ACEOF LIBS="-ldl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for zlibVersion in -lz" >&5 $as_echo_n "checking for zlibVersion in -lz... " >&6; } if ${ac_cv_lib_z_zlibVersion+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char zlibVersion (); int main () { return zlibVersion (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_zlibVersion=yes else ac_cv_lib_z_zlibVersion=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_zlibVersion" >&5 $as_echo "$ac_cv_lib_z_zlibVersion" >&6; } if test "x$ac_cv_lib_z_zlibVersion" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" fi ############# Putenv { $as_echo "$as_me:${as_lineno-$LINENO}: checking for type of string parameter to putenv" >&5 $as_echo_n "checking for type of string parameter to putenv... " >&6; } ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { putenv((const char *)0); ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : rcl_putenv_string_const="1" else rcl_putenv_string_const="0" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test X$rcl_putenv_string_const = X1 ; then $as_echo "#define PUTENV_ARG_CONST 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu #### Look for Xapian. Done in a strange way to work around autoconf # cache XAPIAN_CONFIG=${XAPIAN_CONFIG:-no} if test "$XAPIAN_CONFIG" = "no"; then # Extract the first word of "xapian-config", so it can be a program name with args. set dummy xapian-config; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XAPIAN_CONFIG0+:} false; then : $as_echo_n "(cached) " >&6 else case $XAPIAN_CONFIG0 in [\\/]* | ?:[\\/]*) ac_cv_path_XAPIAN_CONFIG0="$XAPIAN_CONFIG0" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XAPIAN_CONFIG0="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XAPIAN_CONFIG0" && ac_cv_path_XAPIAN_CONFIG0="no" ;; esac fi XAPIAN_CONFIG0=$ac_cv_path_XAPIAN_CONFIG0 if test -n "$XAPIAN_CONFIG0"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XAPIAN_CONFIG0" >&5 $as_echo "$XAPIAN_CONFIG0" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi XAPIAN_CONFIG=$XAPIAN_CONFIG0 fi if test "$XAPIAN_CONFIG" = "no"; then # Extract the first word of "xapian-config-1.3", so it can be a program name with args. set dummy xapian-config-1.3; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XAPIAN_CONFIG1+:} false; then : $as_echo_n "(cached) " >&6 else case $XAPIAN_CONFIG1 in [\\/]* | ?:[\\/]*) ac_cv_path_XAPIAN_CONFIG1="$XAPIAN_CONFIG1" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XAPIAN_CONFIG1="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XAPIAN_CONFIG1" && ac_cv_path_XAPIAN_CONFIG1="no" ;; esac fi XAPIAN_CONFIG1=$ac_cv_path_XAPIAN_CONFIG1 if test -n "$XAPIAN_CONFIG1"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XAPIAN_CONFIG1" >&5 $as_echo "$XAPIAN_CONFIG1" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi XAPIAN_CONFIG=$XAPIAN_CONFIG1 fi if test "$XAPIAN_CONFIG" = "no"; then # Extract the first word of "xapian-config-1.1", so it can be a program name with args. set dummy xapian-config-1.1; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_XAPIAN_CONFIG2+:} false; then : $as_echo_n "(cached) " >&6 else case $XAPIAN_CONFIG2 in [\\/]* | ?:[\\/]*) ac_cv_path_XAPIAN_CONFIG2="$XAPIAN_CONFIG2" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_XAPIAN_CONFIG2="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_XAPIAN_CONFIG2" && ac_cv_path_XAPIAN_CONFIG2="no" ;; esac fi XAPIAN_CONFIG2=$ac_cv_path_XAPIAN_CONFIG2 if test -n "$XAPIAN_CONFIG2"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XAPIAN_CONFIG2" >&5 $as_echo "$XAPIAN_CONFIG2" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi XAPIAN_CONFIG=$XAPIAN_CONFIG2 fi if test "$XAPIAN_CONFIG" = "no" ; then as_fn_error $? "Cannot find xapian-config command in $PATH. Is xapian-core installed ?" "$LINENO" 5 exit 1 fi LIBXAPIAN=`$XAPIAN_CONFIG --libs` # The --static thing fails with older Xapians. Happily enough they don't # need it either (because there are no needed libraries (no uuid and we # deal explicitely with libz) LIBXAPIANSTATICEXTRA=`$XAPIAN_CONFIG --static --libs 2> /dev/null` # Workaround for problem in xapian-config in some versions: wrongly lists # libstdc++.la in the lib list for i in $LIBXAPIAN ; do case $i in *stdc++*|-lm|-lgcc_s|-lc);; *) tmpxaplib="$tmpxaplib $i";; esac done LIBXAPIAN=$tmpxaplib 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 # Check whether --enable-xadump was given. if test "${enable_xadump+set}" = set; then : enableval=$enable_xadump; enableXADUMP=$enableval else enableXADUMP="no" fi if test X$enableXADUMP = Xyes; then MAKEXADUMP_TRUE= MAKEXADUMP_FALSE='#' else MAKEXADUMP_TRUE='#' MAKEXADUMP_FALSE= fi # Check whether --enable-userdoc was given. if test "${enable_userdoc+set}" = set; then : enableval=$enable_userdoc; enableUserdoc=$enableval else enableUserdoc="yes" fi if test X$enableUserdoc = Xyes; then MAKEUSERDOC_TRUE= MAKEUSERDOC_FALSE='#' else MAKEUSERDOC_TRUE='#' MAKEUSERDOC_FALSE= fi #### QT # The way qt and its tools (qmake especially) are installed is very # different between systems (and maybe qt versions) # # In general we need QTDIR to be set, because it is used inside the # qmake-generated makefiles. But there are exceptions: ie on debian3.1 (at # least on the sourceforge compile farm), QTDIR is not needed because qmake # generates hard paths (and is installed in /usr/bin). We don't want to # force the user to set QTDIR if it is not needed. # # The logic is then to first look for qmake, possibly using QTDIR if it is # set. # # If QTDIR is not set, we then generate a bogus qt project and check if # QTDIR is needed in the Makefile, in which case we complain. # # QMAKESPEC: on most Linux system, there is a 'default' link inside the # mkspecs directory, so that QMAKESPEC is not needed. # If QMAKESPEC is not set and needed, the qmake test at the previous test # will have failed, and we tell the user to check his environment. # # Check whether --enable-qtgui was given. if test "${enable_qtgui+set}" = set; then : enableval=$enable_qtgui; enableQT=$enableval else enableQT="yes" fi if test X$enableQT = Xyes; then MAKEQT_TRUE= MAKEQT_FALSE='#' else MAKEQT_TRUE='#' MAKEQT_FALSE= fi # Check whether --enable-recollq was given. if test "${enable_recollq+set}" = set; then : enableval=$enable_recollq; enableRECOLLQ=$enableval else enableRECOLLQ="no" fi if test X"$enableRECOLLQ" != X ; then if test X$enableRECOLLQ = Xyes; then MAKECMDLINE_TRUE= MAKECMDLINE_FALSE='#' else MAKECMDLINE_TRUE='#' MAKECMDLINE_FALSE= fi else if test X$enableQT = Xno; then MAKECMDLINE_TRUE= MAKECMDLINE_FALSE='#' else MAKECMDLINE_TRUE='#' MAKECMDLINE_FALSE= fi fi if test X$enableQT = Xyes ; then if test X$QTDIR != X ; then PATH=$PATH:$QTDIR/bin export PATH fi if test X$QMAKE = X ; then QMAKE=qmake fi case $QMAKE in */*) QMAKEPATH=$QMAKE;; *) # Extract the first word of "$QMAKE", so it can be a program name with args. set dummy $QMAKE; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_path_QMAKEPATH+:} false; then : $as_echo_n "(cached) " >&6 else case $QMAKEPATH in [\\/]* | ?:[\\/]*) ac_cv_path_QMAKEPATH="$QMAKEPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_path_QMAKEPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_QMAKEPATH" && ac_cv_path_QMAKEPATH="NOTFOUND" ;; esac fi QMAKEPATH=$ac_cv_path_QMAKEPATH if test -n "$QMAKEPATH"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $QMAKEPATH" >&5 $as_echo "$QMAKEPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ;; esac if test X$QMAKEPATH = XNOTFOUND ; then as_fn_error $? "Cannot find the qmake program. Maybe you need to install qt development files and tools and/or set the QTDIR environment variable?" "$LINENO" 5 fi QMAKE=$QMAKEPATH # MAC OS X: we don't support this (the native search tool is more than # good enough), but we make things work just enough so that the program can # be compiled and roughly installed (not as a .app, but to /usr/local), # basically to enable using a Macbook for development if test X$sys = XDarwin ; then # The default is xcode QMAKE="${QMAKE} -spec macx-g++" fi # Check Qt version qmakevers="`${QMAKE} --version 2>&1`" #echo "qmake version: $qmakevers" v4=`expr "$qmakevers" : '.*Qt *version *4.*'` v5=`expr "$qmakevers" : '.*Qt *version *5.*'` if test X$v4 = X0 -a X$v5 = X0; then as_fn_error $? "Bad qt/qmake version string (not 4 or 5?): $qmakevers" "$LINENO" 5 else if test X$v4 != X0 ; then { $as_echo "$as_me:${as_lineno-$LINENO}: using qt version 4 user interface" >&5 $as_echo "$as_me: using qt version 4 user interface" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: using qt version 5 user interface" >&5 $as_echo "$as_me: using qt version 5 user interface" >&6;} fi QTGUI=qtgui fi ##### Using Qt webkit for reslist display? Else Qt textbrowser # Check whether --enable-webkit was given. if test "${enable_webkit+set}" = set; then : enableval=$enable_webkit; enableWebkit=$enableval else enableWebkit="yes" fi if test "$enableWebkit" = "yes" ; then QMAKE_ENABLE_WEBKIT="" QMAKE_DISABLE_WEBKIT="#" else QMAKE_ENABLE_WEBKIT="#" QMAKE_DISABLE_WEBKIT="" fi ##### Using QZeitGeist lib ? Default no for now # Check whether --with-qzeitgeist was given. if test "${with_qzeitgeist+set}" = set; then : withval=$with_qzeitgeist; withQZeitgeist=$withval else withQZeitgeist="no" fi case "$withQZeitgeist" in no) LIBQZEITGEIST=;; yes) LIBQZEITGEIST=-lqzeitgeist;; *) LIBQZEITGEIST=$withQZeitgeist;; esac if test "$withQZeitgeist" != "no" ; then QMAKE_ENABLE_ZEITGEIST="" QMAKE_DISABLE_ZEITGEIST="#" else QMAKE_ENABLE_ZEITGEIST="#" QMAKE_DISABLE_ZEITGEIST="" fi ac_config_files="$ac_config_files $QTGUI/recoll.pro" ##################### End QT stuff fi ### X11: this is needed for the session monitoring code (in recollindex -m) # Check whether --enable-x11mon was given. if test "${enable_x11mon+set}" = set; then : enableval=$enable_x11mon; enableX11mon=$enableval else enableX11mon="yes" fi if test X$withInotify = Xno -a X$withFam = Xno ; then enableX11mon=no fi if test "$enableX11mon" = "yes" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi X_LIBX11=-lX11 else $as_echo "#define DISABLE_X11MON 1" >>confdefs.h X_LIBX11="" fi #echo X_CFLAGS "'$X_CFLAGS'" X_PRE_LIBS "'$X_PRE_LIBS'" X_LIBS \ # "'$X_LIBS'" X_LIBX11 "'$X_LIBX11'" X_EXTRA_LIBS "'$X_EXTRA_LIBS'" # For communicating the value of RECOLL_DATADIR to non-make-based # subpackages like python-recoll, we have to expand prefix in here, because # things like "datadir = ${prefix}/share" (which is what we'd get by # expanding @datadir@) don't mean a thing in Python... I guess we could # have a piece of shell-script text to be substituted into and executed by # setup.py for getting the value of pkgdatadir, but really... m_prefix=$prefix test "X$m_prefix" = "XNONE" && m_prefix=/usr/local m_datadir=${m_prefix}/share RECOLL_DATADIR=${m_datadir}/recoll RCLVERSION=$PACKAGE_VERSION RCLLIBVERSION=$RCLVERSION # All object files depend on localdefs which has the cc flags. Avoid # changing it unless necessary ac_config_files="$ac_config_files Makefile" ac_config_files="$ac_config_files common/rclversion.h" ac_config_files="$ac_config_files python/recoll/setup.py" ac_config_files="$ac_config_files python/recoll/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs { $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 $as_echo_n "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 $as_echo "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${NOTHREADS_TRUE}" && test -z "${NOTHREADS_FALSE}"; then as_fn_error $? "conditional \"NOTHREADS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKEPYTHON_TRUE}" && test -z "${MAKEPYTHON_FALSE}"; then as_fn_error $? "conditional \"MAKEPYTHON\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKEXADUMP_TRUE}" && test -z "${MAKEXADUMP_FALSE}"; then as_fn_error $? "conditional \"MAKEXADUMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKEUSERDOC_TRUE}" && test -z "${MAKEUSERDOC_FALSE}"; then as_fn_error $? "conditional \"MAKEUSERDOC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKEQT_TRUE}" && test -z "${MAKEQT_FALSE}"; then as_fn_error $? "conditional \"MAKEQT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKECMDLINE_TRUE}" && test -z "${MAKECMDLINE_FALSE}"; then as_fn_error $? "conditional \"MAKECMDLINE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${MAKECMDLINE_TRUE}" && test -z "${MAKECMDLINE_FALSE}"; then as_fn_error $? "conditional \"MAKECMDLINE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Recoll $as_me 1.23.7, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration commands: $config_commands Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ Recoll config.status 1.23.7 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ OBJDUMP \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ DLLTOOL \ sharedlib_from_linklib_cmd \ AR \ AR_FLAGS \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ reload_flag_CXX \ compiler_CXX \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_static_CXX \ lt_cv_prog_compiler_c_o_CXX \ export_dynamic_flag_spec_CXX \ whole_archive_flag_spec_CXX \ compiler_needs_object_CXX \ with_gnu_ld_CXX \ allow_undefined_flag_CXX \ no_undefined_flag_CXX \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_separator_CXX \ exclude_expsyms_CXX \ include_expsyms_CXX \ file_list_spec_CXX \ compiler_lib_search_dirs_CXX \ predep_objects_CXX \ postdep_objects_CXX \ predeps_CXX \ postdeps_CXX \ compiler_lib_search_path_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ old_archive_cmds_CXX \ old_archive_from_new_cmds_CXX \ old_archive_from_expsyms_cmds_CXX \ archive_cmds_CXX \ archive_expsym_cmds_CXX \ module_cmds_CXX \ module_expsym_cmds_CXX \ export_symbols_cmds_CXX \ prelink_cmds_CXX \ postlink_cmds_CXX; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "common/autoconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS common/autoconfig.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "$QTGUI/recoll.pro") CONFIG_FILES="$CONFIG_FILES $QTGUI/recoll.pro" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "common/rclversion.h") CONFIG_FILES="$CONFIG_FILES common/rclversion.h" ;; "python/recoll/setup.py") CONFIG_FILES="$CONFIG_FILES python/recoll/setup.py" ;; "python/recoll/Makefile") CONFIG_FILES="$CONFIG_FILES python/recoll/Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2014 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool 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 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Whether or not to build static libraries. build_old_libs=$enable_static # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # What type of objects to build. pic_mode=$pic_mode # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # An object symbol dumper. OBJDUMP=$lt_OBJDUMP # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # DLL creation program. DLLTOOL=$lt_DLLTOOL # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive. AR_FLAGS=$lt_AR_FLAGS # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? sed '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi recoll-1.23.7/VERSION0000644000175000017500000000000713224667572011070 000000000000001.23.7 recoll-1.23.7/internfile/0000755000175000017500000000000013224670234012227 500000000000000recoll-1.23.7/internfile/extrameta.cpp0000644000175000017500000001115213224431020014631 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "rclconfig.h" #include "pxattr.h" #include "log.h" #include "cstr.h" #include "rcldoc.h" #include "execmd.h" using std::string; using std::map; static void docfieldfrommeta(RclConfig* cfg, const string& name, const string &value, Rcl::Doc& doc) { string fieldname = cfg->fieldCanon(name); LOGDEB0("Internfile:: setting [" << fieldname << "] from cmd/xattr value [" << value << "]\n"); if (fieldname == cstr_dj_keymd) { doc.dmtime = value; } else { doc.meta[fieldname] = value; } } void reapXAttrs(const RclConfig* cfg, const string& path, map& xfields) { LOGDEB2("reapXAttrs: [" << path << "]\n"); #ifndef _WIN32 // Retrieve xattrs names from files and mapping table from config vector xnames; if (!pxattr::list(path, &xnames)) { if (errno == ENOTSUP) { LOGDEB("FileInterner::reapXattrs: pxattr::list: errno " << errno << "\n"); } else { LOGERR("FileInterner::reapXattrs: pxattr::list: errno " << errno << "\n"); } return; } const map& xtof = cfg->getXattrToField(); // Record the xattrs: names found in the config are either skipped // or mapped depending if the translation is empty. Other names // are recorded as-is for (vector::const_iterator it = xnames.begin(); it != xnames.end(); it++) { string key = *it; map::const_iterator mit = xtof.find(*it); if (mit != xtof.end()) { if (mit->second.empty()) { continue; } else { key = mit->second; } } string value; if (!pxattr::get(path, *it, &value, pxattr::PXATTR_NOFOLLOW)) { LOGERR("FileInterner::reapXattrs: pxattr::get failed for " << *it << ", errno " << errno << "\n"); continue; } // Encode should we ? xfields[key] = value; LOGDEB2("reapXAttrs: [" << key << "] -> [" << value << "]\n"); } #endif } void docFieldsFromXattrs(RclConfig *cfg, const map& xfields, Rcl::Doc& doc) { for (map::const_iterator it = xfields.begin(); it != xfields.end(); it++) { docfieldfrommeta(cfg, it->first, it->second, doc); } } void reapMetaCmds(RclConfig* cfg, const string& path, map& cfields) { const vector& reapers = cfg->getMDReapers(); if (reapers.empty()) return; map smap = {{'f', path}}; for (vector::const_iterator rp = reapers.begin(); rp != reapers.end(); rp++) { vector cmd; for (vector::const_iterator it = rp->cmdv.begin(); it != rp->cmdv.end(); it++) { string s; pcSubst(*it, s, smap); cmd.push_back(s); } string output; if (ExecCmd::backtick(cmd, output)) { cfields[rp->fieldname] = output; } } } // Set fields from external commands // These override those from xattrs and can be later augmented by // values from inside the file. // // This is a bit atrocious because some entry names are special: // "modificationdate" will set mtime instead of an ordinary field, // and the output from anything beginning with "rclmulti" will be // interpreted as multiple fields in configuration file format... void docFieldsFromMetaCmds(RclConfig *cfg, const map& cfields, Rcl::Doc& doc) { for (map::const_iterator it = cfields.begin(); it != cfields.end(); it++) { if (!it->first.compare(0, 8, "rclmulti")) { ConfSimple simple(it->second); if (simple.ok()) { vector names = simple.getNames(""); for (vector::const_iterator nm = names.begin(); nm != names.end(); nm++) { string value; if (simple.get(*nm, value)) { docfieldfrommeta(cfg, *nm, value, doc); } } } } else { docfieldfrommeta(cfg, it->first, it->second, doc); } } } recoll-1.23.7/internfile/mh_text.h0000644000175000017500000000423513125637102013771 00000000000000/* 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 _MH_TEXT_H_INCLUDED_ #define _MH_TEXT_H_INCLUDED_ #include #include #include #include "mimehandler.h" /** * Handler for text/plain files. * * Maybe try to guess charset, or use default, then transcode to utf8 */ class MimeHandlerText : public RecollFilter { public: MimeHandlerText(RclConfig *cnf, const std::string& id) : RecollFilter(cnf, id), m_paging(false), m_offs(0), m_pagesz(0) { } virtual ~MimeHandlerText() {} virtual bool is_data_input_ok(DataInput input) const { if (input == DOCUMENT_FILE_NAME || input == DOCUMENT_STRING) return true; return false; } virtual bool next_document(); virtual bool skip_to_document(const std::string& s); virtual void clear() { m_paging = false; m_text.erase(); m_fn.erase(); m_offs = 0; RecollFilter::clear(); } protected: virtual bool set_document_file_impl(const std::string& mt, const std::string &file_path); virtual bool set_document_string_impl(const std::string&, const std::string&); private: bool m_paging; std::string m_text; std::string m_fn; int64_t m_offs; // Offset of next read in file if we're paging size_t m_pagesz; std::string m_charsetfromxattr; bool readnext(); }; #endif /* _MH_TEXT_H_INCLUDED_ */ recoll-1.23.7/internfile/uncomp.cpp0000644000175000017500000001000413125637102014144 00000000000000/* Copyright (C) 2013 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include "uncomp.h" #include "log.h" #include "smallut.h" #include "execmd.h" #include "pathut.h" using std::map; using std::string; using std::vector; Uncomp::UncompCache Uncomp::o_cache; bool Uncomp::uncompressfile(const string& ifn, const vector& cmdv, string& tfile) { if (m_docache) { std::unique_lock lock(o_cache.m_lock); if (!o_cache.m_srcpath.compare(ifn)) { m_dir = o_cache.m_dir; m_tfile = tfile = o_cache.m_tfile; m_srcpath = ifn; o_cache.m_dir = 0; o_cache.m_srcpath.clear(); return true; } } m_srcpath.clear(); m_tfile.clear(); if (m_dir == 0) { m_dir = new TempDir; } // Make sure tmp dir is empty. we guarantee this to filters if (!m_dir || !m_dir->ok() || !m_dir->wipe()) { LOGERR("uncompressfile: can't clear temp dir " << (m_dir->dirname()) << "\n" ); return false; } // Check that we have enough available space to have some hope of // decompressing the file. int pc; long long availmbs; if (!fsocc(m_dir->dirname(), &pc, &availmbs)) { LOGERR("uncompressfile: can't retrieve avail space for " << (m_dir->dirname()) << "\n" ); // Hope for the best } else { long long fsize = path_filesize(ifn); if (fsize < 0) { LOGERR("uncompressfile: stat input file " << (ifn) << " errno " << (errno) << "\n" ); return false; } // We need at least twice the file size for the uncompressed // and compressed versions. Most compressors don't store the // uncompressed size, so we have no way to be sure that we // have enough space before trying. We take a little margin // use same Mb def as fsocc() long long filembs = fsize / (1024 * 1024); if (availmbs < 2 * filembs + 1) { LOGERR("uncompressfile. " << (lltodecstr(availmbs)) << " MBs available in " << (m_dir->dirname()) << " not enough to uncompress " << (ifn) << " of size " << (lltodecstr(filembs)) << " mbs\n" ); return false; } } string cmd = cmdv.front(); // Substitute file name and temp dir in command elements vector::const_iterator it = cmdv.begin(); ++it; vector args; map subs; subs['f'] = ifn; subs['t'] = m_dir->dirname(); for (; it != cmdv.end(); it++) { string ns; pcSubst(*it, ns, subs); args.push_back(ns); } // Execute command and retrieve output file name, check that it exists ExecCmd ex; int status = ex.doexec(cmd, args, 0, &tfile); if (status || tfile.empty()) { LOGERR("uncompressfile: doexec: failed for [" << (ifn) << "] status 0x" << (status) << "\n" ); if (!m_dir->wipe()) { LOGERR("uncompressfile: wipedir failed\n" ); } return false; } if (tfile[tfile.length() - 1] == '\n') tfile.erase(tfile.length() - 1, 1); m_tfile = tfile; m_srcpath = ifn; return true; } Uncomp::~Uncomp() { if (m_docache) { std::unique_lock lock(o_cache.m_lock); delete o_cache.m_dir; o_cache.m_dir = m_dir; o_cache.m_tfile = m_tfile; o_cache.m_srcpath = m_srcpath; } else { delete m_dir; } } recoll-1.23.7/internfile/internfile.h0000644000175000017500000002772613224431020014461 00000000000000/* 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 _INTERNFILE_H_INCLUDED_ #define _INTERNFILE_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include using std::string; using std::vector; using std::map; using std::set; #include "mimehandler.h" #include "uncomp.h" #include "pathut.h" class RclConfig; namespace Rcl { class Doc; } struct stat; /** Storage for missing helper program info. We want to keep this out of the * FileInterner class, because the data will typically be accumulated by several * FileInterner objects. Can't use static member either (because there * may be several separate usages of the class which shouldn't mix * their data). */ class FIMissingStore { public: FIMissingStore() {} FIMissingStore(const string& in); virtual ~FIMissingStore() {} virtual void addMissing(const string& prog, const string& mt) { m_typesForMissing[prog].insert(mt); } // Get simple progs list string virtual void getMissingExternal(string& out); // Get progs + assoc mtypes description string virtual void getMissingDescription(string& out); // Missing external programs map > m_typesForMissing; }; /** * Convert data from file-serialized form (either an actual File * System file or a memory image) into one or several documents in * internal representation (Rcl::Doc). This can be used for indexing, * or viewing at query time (GUI preview), or extracting an internal * document out of a compound file into a simple one. * * Things work a little differently when indexing or previewing: * - When indexing, all data has to come from the datastore, and it is * normally desired that all found subdocuments be returned (ie: * all messages and attachments out of a single file mail folder) * - When previewing, some data is taken from the index (ie: the mime type * is already known, and a single document usually needs to be processed, * so that the full doc identifier is passed in: high level url * (ie: file path) and internal identifier: ipath, ie: message and * attachment number. * * Internfile is the part of the code which knows about ipath structure. * * The class has a number of static helper method which could just as well not * be members and are in there just for namespace reasons. * */ class FileInterner { public: /** Operation modifier flags */ enum Flags {FIF_none, FIF_forPreview, FIF_doUseInputMimetype}; /** Return values for internfile() */ enum Status {FIError, FIDone, FIAgain}; /** Constructors take the initial step to preprocess the data object and * create the top filter */ /** * Identify and possibly decompress file, and create the top filter. * - The mtype parameter is not always set (it is when the object is * created for previewing a file). * - Filter output may be different for previewing and indexing. * * This constructor is now only used for indexing, the form with * an Rcl::Doc parameter to identify the data is always used * at query time. * * @param fn file name. * @param stp pointer to updated stat struct. * @param cnf Recoll configuration. * @param td temporary directory to use as working space if * decompression needed. Must be private and will be wiped clean. * @param mtype mime type if known. For a compressed file this is the * mime type for the uncompressed version. */ FileInterner(const string &fn, const struct stat *stp, RclConfig *cnf, int flags, const string *mtype = 0); /** * Alternate constructor for the case where the data is in memory. * This is mainly for data extracted from the web cache. * The MIME type must be set, and the data must be uncompressed. */ FileInterner(const string &data, RclConfig *cnf, int flags, const string& mtype); /** * Alternate constructor used at query time. We don't know where * the data was stored, and use the fetcher interface to reach it. * * @param idoc Rcl::Doc object built from index data. The back-end * storage identifier (rclbes field) is used by the fetcher factory * to build the appropriate object to return a file name or data which * is then used with the appropriate init method. */ FileInterner(const Rcl::Doc& idoc, RclConfig *cnf, int flags); ~FileInterner(); void setMissingStore(FIMissingStore *st) { m_missingdatap = st; } /** * Turn file or file part into Recoll document. * * For multidocument files (ie: mail folder), this must be called * multiple times to retrieve the subdocuments. * * @param doc output document * @param ipath internal path. If set by caller, the specified subdoc will * be returned. Else the next document according to current state will * be returned, and doc.ipath will be set on output. * @return FIError and FIDone are self-explanatory. If FIAgain is returned, * this is a multi-document file, with more subdocs, and internfile() * should be called again to get the following one(s). */ Status internfile(Rcl::Doc& doc, const string &ipath = ""); /** Extract subdoc defined by ipath in idoc to file. See params for idocToFile() */ bool interntofile(TempFile& otemp, const string& tofile, const string& ipath, const string& mimetype); /** Return the file's (top level object) mimetype (useful for * creating the pseudo-doc for container files) */ const string& getMimetype() {return m_mimetype;} /** We normally always return text/plain data. A caller can request * that we stop conversion at the native document type (ie: extracting * an email attachment in its native form for an external viewer) */ void setTargetMType(const string& tp) {m_targetMType = tp;} /** In case we see an html version while converting, it is set aside * and can be recovered */ const string& get_html() {return m_html;} /** If we happen to be processing an image file and need a temp file, we keep it around to save work for our caller, which can get it here */ TempFile get_imgtmp() {return m_imgtmp;} const string& getReason() const { return m_reason; } bool ok() const { return m_ok; } /** * Get UDI for immediate parent for document. * * This is not in general the same as the "parent" document used * with Rcl::Db::addOrUpdate(). The latter is the enclosing file, * this would be for exemple the email containing the attachment. * This is in internfile because of the ipath computation. */ static bool getEnclosingUDI(const Rcl::Doc &doc, string& udi); /** Return last element in ipath, like basename */ static std::string getLastIpathElt(const std::string& ipath); /** Check that 2nd param is child of first */ static bool ipathContains(const std::string& parent, const std::string& child); /** * Build sig for doc coming from rcldb. This is here because we know how * to query the right backend. Used to check up-to-dateness at query time */ static bool makesig(RclConfig *cnf, const Rcl::Doc& idoc, string& sig); /** Extract internal document into temporary file, without converting the * data. * * This is used mainly for starting an external viewer for a * subdocument (ie: mail attachment), but, for consistency, it also * works with a top level (null ipath) document. * This would not actually need to be a member method, it creates a * FileInterner object to do the actual work. * * @return true for success. * @param temp output reference-counted temp file object (goes * away magically). Only used if tofile.empty() * @param tofile output file if not empty. * @param cnf The recoll config * @param doc Doc data taken from the index. We use it to construct a * FileInterner object. * @param uncompress if true, uncompress compressed original doc. Only does * anything for a top level document. */ static bool idocToFile(TempFile& temp, const string& tofile, RclConfig *cnf, const Rcl::Doc& doc, bool uncompress = true); /** Does file appear to be the compressed version of a document? */ static bool isCompressed(const string& fn, RclConfig *cnf); /** * Check input compressed, allocate temp file and uncompress if it is. * @return true if ok, false for error. Actual decompression is indicated * by the TempFile status (!isNull()) */ static bool maybeUncompressToTemp(TempFile& temp, const string& fn, RclConfig *cnf, const Rcl::Doc& doc); private: static const unsigned int MAXHANDLERS = 20; RclConfig *m_cfg; string m_fn; string m_mimetype; // Mime type for [uncompressed] file bool m_forPreview; string m_html; // Possibly set-aside html text for preview TempFile m_imgtmp; // Possible reference to an image temp file string m_targetMType; string m_reachedMType; // target or text/plain string m_tfile; bool m_ok{false}; // Set after construction if ok // Fields found in file extended attributes. This is kept here, // not in the file-level handler because we are only interested in // the top-level file, not any temp file necessitated by // processing the internal doc hierarchy. map m_XAttrsFields; // Fields gathered by executing configured external commands map m_cmdFields; // Filter stack, path to the current document from which we're // fetching subdocs vector m_handlers; // Temporary files used for decoding the current stack bool m_tmpflgs[MAXHANDLERS]; vector m_tempfiles; // Error data if any string m_reason; FIMissingStore *m_missingdatap{nullptr}; Uncomp m_uncomp; bool m_noxattrs; // disable xattrs usage bool m_direct; // External app did the extraction // Pseudo-constructors void init(const string &fn, const struct stat *stp, RclConfig *cnf, int flags, const string *mtype = 0); void init(const string &data, RclConfig *cnf, int flags, const string& mtype); void initcommon(RclConfig *cnf, int flags); bool dijontorcl(Rcl::Doc&); void collectIpathAndMT(Rcl::Doc&) const; TempFile dataToTempFile(const string& data, const string& mt); void popHandler(); int addHandler(); void checkExternalMissing(const string& msg, const string& mt); void processNextDocError(Rcl::Doc &doc); static bool tempFileForMT(TempFile& otemp, RclConfig *cnf, const std::string& mimetype); static bool topdocToFile(TempFile& otemp, const std::string& tofile, RclConfig *cnf, const Rcl::Doc& idoc, bool uncompress); }; #endif /* _INTERNFILE_H_INCLUDED_ */ recoll-1.23.7/internfile/mh_exec.cpp0000644000175000017500000001674213224431020014261 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "safesyswait.h" #include #include "cstr.h" #include "execmd.h" #include "mh_exec.h" #include "mh_html.h" #include "log.h" #include "cancelcheck.h" #include "smallut.h" #include "md5ut.h" #include "rclconfig.h" using namespace std; MEAdv::MEAdv(int maxsecs) : m_filtermaxseconds(maxsecs) { m_start = time(0L); } void MEAdv::reset() { m_start = time(0L); } void MEAdv::newData(int n) { LOGDEB2("MHExec:newData(" << n << ")\n"); if (m_filtermaxseconds > 0 && time(0L) - m_start > m_filtermaxseconds) { LOGERR("MimeHandlerExec: filter timeout (" << m_filtermaxseconds << " S)\n"); throw HandlerTimeout(); } // If a cancel request was set by the signal handler (or by us // just above), this will raise an exception. Another approach // would be to call ExeCmd::setCancel(). CancelCheck::instance().checkCancel(); } MimeHandlerExec::MimeHandlerExec(RclConfig *cnf, const std::string& id) : RecollFilter(cnf, id), missingHelper(false), m_filtermaxseconds(900), m_filtermaxmbytes(0), m_handlernomd5(false), m_hnomd5init(false), m_nomd5(false) { m_config->getConfParam("filtermaxseconds", &m_filtermaxseconds); m_config->getConfParam("filtermaxmbytes", &m_filtermaxmbytes); } bool MimeHandlerExec::set_document_file_impl(const std::string& mt, const std::string &file_path) { // Can't do this in constructor as script name not set yet. Do it // once on first call unordered_set nomd5tps; bool tpsread(false); if (false == m_hnomd5init) { m_hnomd5init = true; if (m_config->getConfParam("nomd5types", &nomd5tps)) { tpsread = true; if (!nomd5tps.empty()) { if (params.size() && nomd5tps.find(path_getsimple(params[0])) != nomd5tps.end()) { m_handlernomd5 = true; } // On windows the 1st param is often a script interp // name (e.g. "python", and the script name is 2nd if (params.size() > 1 && nomd5tps.find(path_getsimple(params[1])) != nomd5tps.end()) { m_handlernomd5 = true; } } } } m_nomd5 = m_handlernomd5; if (!m_nomd5) { // Check for MIME type based md5 suppression if (!tpsread) { m_config->getConfParam("nomd5types", &nomd5tps); } if (nomd5tps.find(mt) != nomd5tps.end()) { m_nomd5 = true; } } m_fn = file_path; m_havedoc = true; return true; } bool MimeHandlerExec::skip_to_document(const string& ipath) { LOGDEB("MimeHandlerExec:skip_to_document: [" << ipath << "]\n"); m_ipath = ipath; return true; } // Execute an external program to translate a file from its native // format to text or html. bool MimeHandlerExec::next_document() { if (m_havedoc == false) return false; m_havedoc = false; if (missingHelper) { LOGDEB("MimeHandlerExec::next_document(): helper known missing\n"); return false; } if (params.empty()) { // Hu ho LOGERR("MimeHandlerExec::next_document: empty params\n"); m_reason = "RECFILTERROR BADCONFIG"; return false; } // Command name string cmd = params.front(); // Build parameter vector: delete cmd name and add the file name vectormyparams(params.begin() + 1, params.end()); myparams.push_back(m_fn); if (!m_ipath.empty()) myparams.push_back(m_ipath); // Execute command, store the output string& output = m_metaData[cstr_dj_keycontent]; output.erase(); ExecCmd mexec; MEAdv adv(m_filtermaxseconds); mexec.setAdvise(&adv); mexec.putenv("RECOLL_CONFDIR", m_config->getConfDir()); mexec.putenv(m_forPreview ? "RECOLL_FILTER_FORPREVIEW=yes" : "RECOLL_FILTER_FORPREVIEW=no"); mexec.setrlimit_as(m_filtermaxmbytes); int status; try { status = mexec.doexec(cmd, myparams, 0, &output); } catch (HandlerTimeout) { LOGERR("MimeHandlerExec: handler timeout\n" ); status = 0x110f; } catch (CancelExcept) { LOGERR("MimeHandlerExec: cancelled\n" ); status = 0x110f; } if (status) { LOGERR("MimeHandlerExec: command status 0x" << status << " for " << cmd << "\n"); if (WIFEXITED(status) && WEXITSTATUS(status) == 127) { // That's how execmd signals a failed exec (most probably // a missing command). Let'hope no filter uses the same value as // an exit status... Disable myself permanently and signal the // missing cmd. missingHelper = true; m_reason = string("RECFILTERROR HELPERNOTFOUND ") + cmd; } else if (output.find("RECFILTERROR") == 0) { // If the output string begins with RECFILTERROR, then it's // interpretable error information out from a recoll script m_reason = output; list lerr; stringToStrings(output, lerr); if (lerr.size() > 2) { list::iterator it = lerr.begin(); it++; if (*it == "HELPERNOTFOUND") { // No use trying again and again to execute this filter, // it won't work. missingHelper = true; } } } return false; } finaldetails(); return true; } void MimeHandlerExec::handle_cs(const string& mt, const string& icharset) { string charset(icharset); // cfgFilterOutputCharset comes from the mimeconf filter // definition line and defaults to UTF-8 if empty. If the value is // "default", we use the default input charset value defined in // recoll.conf (which may vary depending on directory) if (charset.empty()) { charset = cfgFilterOutputCharset.empty() ? cstr_utf8 : cfgFilterOutputCharset; if (!stringlowercmp("default", charset)) { charset = m_dfltInputCharset; } } m_metaData[cstr_dj_keyorigcharset] = charset; // If this is text/plain transcode_to/check utf-8 if (!mt.compare(cstr_textplain)) { (void)txtdcode("mh_exec/m"); } else { m_metaData[cstr_dj_keycharset] = charset; } } void MimeHandlerExec::finaldetails() { // The default output mime type is html, but it may be defined // otherwise in the filter definition. m_metaData[cstr_dj_keymt] = cfgFilterOutputMtype.empty() ? cstr_texthtml : cfgFilterOutputMtype; if (!m_forPreview && !m_nomd5) { string md5, xmd5, reason; if (MD5File(m_fn, md5, &reason)) { m_metaData[cstr_dj_keymd5] = MD5HexPrint(md5, xmd5); } else { LOGERR("MimeHandlerExec: cant compute md5 for [" << m_fn << "]: " << reason << "\n"); } } handle_cs(m_metaData[cstr_dj_keymt]); } recoll-1.23.7/internfile/indextext.h0000644000175000017500000000230513125637102014331 00000000000000/* 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 _INDEXTEXT_H_INCLUDED_ #define _INDEXTEXT_H_INCLUDED_ /* Note: this only exists to help with using myhtmlparse.cc */ #include // lets hope that the charset includes ascii values... static inline void lowercase_term(std::string &term) { std::string::iterator i = term.begin(); while (i != term.end()) { if (*i >= 'A' && *i <= 'Z') *i = *i + 'a' - 'A'; i++; } } #endif /* _INDEXTEXT_H_INCLUDED_ */ recoll-1.23.7/internfile/mh_execm.cpp0000644000175000017500000002630413224431020014431 00000000000000 /* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include using namespace std; #include "cstr.h" #include "mh_execm.h" #include "mh_html.h" #include "log.h" #include "cancelcheck.h" #include "smallut.h" #include "md5ut.h" #include "rclconfig.h" #include "mimetype.h" #include "idfile.h" #include #include "safesyswait.h" bool MimeHandlerExecMultiple::startCmd() { LOGDEB("MimeHandlerExecMultiple::startCmd\n"); if (params.empty()) { // Hu ho LOGERR("MHExecMultiple::startCmd: empty params\n"); m_reason = "RECFILTERROR BADCONFIG"; return false; } // Command name string cmd = params.front(); m_maxmemberkb = 50000; m_config->getConfParam("membermaxkbs", &m_maxmemberkb); ostringstream oss; oss << "RECOLL_FILTER_MAXMEMBERKB=" << m_maxmemberkb; m_cmd.putenv(oss.str()); m_cmd.putenv("RECOLL_CONFDIR", m_config->getConfDir()); m_cmd.putenv(m_forPreview ? "RECOLL_FILTER_FORPREVIEW=yes" : "RECOLL_FILTER_FORPREVIEW=no"); m_cmd.setrlimit_as(m_filtermaxmbytes); m_adv.setmaxsecs(m_filtermaxseconds); m_cmd.setAdvise(&m_adv); // Build parameter list: delete cmd name vectormyparams(params.begin() + 1, params.end()); if (m_cmd.startExec(cmd, myparams, 1, 1) < 0) { m_reason = string("RECFILTERROR HELPERNOTFOUND ") + cmd; missingHelper = true; return false; } return true; } // Note: data is not used if this is the "document:" field: it goes // directly to m_metaData[cstr_dj_keycontent] to avoid an extra copy // // Messages are made of data elements. Each element is like: // name: len\ndata // An empty line signals the end of the message, so the whole thing // would look like: // Name1: Len1\nData1Name2: Len2\nData2\n bool MimeHandlerExecMultiple::readDataElement(string& name, string &data) { string ibuf; // Read name and length if (m_cmd.getline(ibuf) <= 0) { LOGERR("MHExecMultiple: getline error\n"); return false; } LOGDEB1("MHEM:rde: line [" << ibuf << "]\n"); // Empty line (end of message) ? if (!ibuf.compare("\n")) { LOGDEB("MHExecMultiple: Got empty line\n"); name.clear(); return true; } // Filters will sometimes abort before entering the real protocol, ie if // a module can't be loaded. Check the special filter error first word: if (ibuf.find("RECFILTERROR ") == 0) { m_reason = ibuf; if (ibuf.find("HELPERNOTFOUND") != string::npos) missingHelper = true; return false; } // We're expecting something like Name: len\n vector tokens; stringToTokens(ibuf, tokens); if (tokens.size() != 2) { LOGERR("MHExecMultiple: bad line in filter output: [" << ibuf << "]\n"); return false; } vector::iterator it = tokens.begin(); name = *it++; string& slen = *it; int len; if (sscanf(slen.c_str(), "%d", &len) != 1) { LOGERR("MHExecMultiple: bad line in filter output: [" << ibuf << "]\n"); return false; } if (len / 1024 > m_maxmemberkb) { LOGERR("MHExecMultiple: data len > maxmemberkb\n"); return false; } // Hack: check for 'Document:' and read directly the document data // to m_metaData[cstr_dj_keycontent] to avoid an extra copy of the bulky // piece string *datap = &data; if (!stringlowercmp("document:", name)) { datap = &m_metaData[cstr_dj_keycontent]; } else { datap = &data; } // Read element data datap->erase(); if (len > 0 && m_cmd.receive(*datap, len) != len) { LOGERR("MHExecMultiple: expected " << len << " bytes of data, got " << datap->length() << "\n"); return false; } LOGDEB1("MHExecMe:rdDtElt got: name [" << name << "] len " << len << "value [" << (datap->size() > 100 ? (datap->substr(0, 100) + " ...") : datap) << endl); return true; } bool MimeHandlerExecMultiple::next_document() { LOGDEB("MimeHandlerExecMultiple::next_document(): [" << m_fn << "]\n"); if (m_havedoc == false) return false; if (missingHelper) { LOGDEB("MHExecMultiple::next_document(): helper known missing\n"); return false; } if (m_cmd.getChildPid() <= 0 && !startCmd()) { return false; } m_metaData.clear(); // Send request to child process. This maybe the first/only // request for a given file, or a continuation request. We send an // empty file name in the latter case. // We also compute the file md5 before starting the extraction: // under Windows, we may not be able to do it while the file // is opened by the filter. ostringstream obuf; string file_md5; if (m_filefirst) { if (!m_forPreview && !m_nomd5) { string md5, xmd5, reason; if (MD5File(m_fn, md5, &reason)) { file_md5 = MD5HexPrint(md5, xmd5); } else { LOGERR("MimeHandlerExecM: cant compute md5 for [" << m_fn << "]: " << reason << "\n"); } } obuf << "FileName: " << m_fn.length() << "\n" << m_fn; // m_filefirst is set to true by set_document_file() m_filefirst = false; } else { obuf << "Filename: " << 0 << "\n"; } if (!m_ipath.empty()) { LOGDEB("next_doc: sending ipath " << m_ipath.length() << " val [" << m_ipath << "]\n"); obuf << "Ipath: " << m_ipath.length() << "\n" << m_ipath; } if (!m_dfltInputCharset.empty()) { obuf << "DflInCS: " << m_dfltInputCharset.length() << "\n" << m_dfltInputCharset; } obuf << "Mimetype: " << m_mimeType.length() << "\n" << m_mimeType; obuf << "\n"; if (m_cmd.send(obuf.str()) < 0) { m_cmd.zapChild(); LOGERR("MHExecMultiple: send error\n"); return false; } m_adv.reset(); // Read answer (multiple elements) LOGDEB1("MHExecMultiple: reading answer\n"); bool eofnext_received = false; bool eofnow_received = false; bool fileerror_received = false; bool subdocerror_received = false; string ipath; string mtype; string charset; for (int loop=0;;loop++) { string name, data; try { if (!readDataElement(name, data)) { m_cmd.zapChild(); return false; } } catch (HandlerTimeout) { LOGINFO("MHExecMultiple: timeout\n"); m_cmd.zapChild(); return false; } catch (CancelExcept) { LOGINFO("MHExecMultiple: interrupt\n"); m_cmd.zapChild(); return false; } if (name.empty()) break; if (!stringlowercmp("eofnext:", name)) { LOGDEB("MHExecMultiple: got EOFNEXT\n"); eofnext_received = true; } else if (!stringlowercmp("eofnow:", name)) { LOGDEB("MHExecMultiple: got EOFNOW\n"); eofnow_received = true; } else if (!stringlowercmp("fileerror:", name)) { LOGDEB("MHExecMultiple: got FILEERROR\n"); fileerror_received = true; } else if (!stringlowercmp("subdocerror:", name)) { LOGDEB("MHExecMultiple: got SUBDOCERROR\n"); subdocerror_received = true; } else if (!stringlowercmp("ipath:", name)) { ipath = data; LOGDEB("MHExecMultiple: got ipath [" << data << "]\n"); } else if (!stringlowercmp("charset:", name)) { charset = data; LOGDEB("MHExecMultiple: got charset [" << data << "]\n"); } else if (!stringlowercmp("mimetype:", name)) { mtype = data; LOGDEB("MHExecMultiple: got mimetype [" << data << "]\n"); } else { string nm = stringtolower((const string&)name); trimstring(nm, ":"); LOGDEB("MHExecMultiple: got [" << nm << "] -> [" << data << "]\n"); m_metaData[nm] += data; } if (loop == 200) { // ?? LOGERR("MHExecMultiple: handler sent more than 200 attributes\n"); return false; } } if (eofnow_received || fileerror_received) { // No more docs m_havedoc = false; return false; } if (subdocerror_received) { return false; } // It used to be that eof could be signalled just by an empty document, but // this was wrong. Empty documents can be found ie in zip files and should // not be interpreted as eof. if (m_metaData[cstr_dj_keycontent].empty()) { LOGDEB0("MHExecMultiple: got empty document inside [" << m_fn << "]: [" << ipath << "]\n"); } if (!ipath.empty()) { // If this has an ipath, it is an internal doc from a // multi-document file. In this case, either the filter // supplies the mimetype, or the ipath MUST be a filename-like // string which we can use to compute a mime type m_metaData[cstr_dj_keyipath] = ipath; if (mtype.empty()) { LOGDEB0("MHExecMultiple: no mime type from filter, using ipath " "for a guess\n"); mtype = mimetype(ipath, 0, m_config, false); if (mtype.empty()) { // mimetype() won't call idFile when there is no file. Do it mtype = idFileMem(m_metaData[cstr_dj_keycontent]); if (mtype.empty()) { // Note this happens for example for directory zip members // We could recognize them by the end /, but wouldn't know // what to do with them anyway. LOGINFO("MHExecMultiple: cant guess mime type\n"); mtype = "application/octet-stream"; } } } m_metaData[cstr_dj_keymt] = mtype; if (!m_forPreview) { string md5, xmd5; MD5String(m_metaData[cstr_dj_keycontent], md5); m_metaData[cstr_dj_keymd5] = MD5HexPrint(md5, xmd5); } } else { // "Self" document. m_metaData[cstr_dj_keymt] = mtype.empty() ? cstr_texthtml : mtype; m_metaData.erase(cstr_dj_keyipath); if (!m_forPreview) { m_metaData[cstr_dj_keymd5] = file_md5; } } handle_cs(m_metaData[cstr_dj_keymt], charset); if (eofnext_received) m_havedoc = false; LOGDEB0("MHExecMultiple: returning " << m_metaData[cstr_dj_keycontent].size() << " bytes of content, mtype [" << m_metaData[cstr_dj_keymt] << "] charset [" << m_metaData[cstr_dj_keycharset] << "]\n"); LOGDEB2("MHExecMultiple: metadata: \n" << metadataAsString()); return true; } recoll-1.23.7/internfile/myhtmlparse.cpp0000644000175000017500000004603213125637102015222 00000000000000/* This file was copied from omega-0.8.5->1.2.6 and modified */ /* myhtmlparse.cc: subclass of HtmlParser for extracting text * * ----START-LICENCE---- * Copyright 1999,2000,2001 BrightStation PLC * Copyright 2002,2003,2004 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA * -----END-LICENCE----- */ #include #ifdef _WIN32 // Local implementation in windows directory #include "strptime.h" #endif #include #include #include #include "cstr.h" #include "myhtmlparse.h" #include "indextext.h" // for lowercase_term() #include "mimeparse.h" #include "smallut.h" #include "cancelcheck.h" #include "log.h" #include "transcode.h" static const string cstr_html_charset("charset"); static const string cstr_html_content("content"); inline static bool p_notdigit(char c) { return !isdigit(static_cast(c)); } inline static bool p_notxdigit(char c) { return !isxdigit(static_cast(c)); } inline static bool p_notalnum(char c) { return !isalnum(static_cast(c)); } /* * The following array was taken from Estraier. Estraier was * written by Mikio Hirabayashi. * Copyright (C) 2003-2004 Mikio Hirabayashi * The version where this comes from * is covered by the GNU licence, as this file.*/ static const char *epairs[] = { /* basic symbols */ "amp", "&", "lt", "<", "gt", ">", "quot", "\"", "apos", "'", /* ISO-8859-1 */ "nbsp", "\xc2\xa0", "iexcl", "\xc2\xa1", "cent", "\xc2\xa2", "pound", "\xc2\xa3", "curren", "\xc2\xa4", "yen", "\xc2\xa5", "brvbar", "\xc2\xa6", "sect", "\xc2\xa7", "uml", "\xc2\xa8", "copy", "\xc2\xa9", "ordf", "\xc2\xaa", "laquo", "\xc2\xab", "not", "\xc2\xac", "shy", "\xc2\xad", "reg", "\xc2\xae", "macr", "\xc2\xaf", "deg", "\xc2\xb0", "plusmn", "\xc2\xb1", "sup2", "\xc2\xb2", "sup3", "\xc2\xb3", "acute", "\xc2\xb4", "micro", "\xc2\xb5", "para", "\xc2\xb6", "middot", "\xc2\xb7", "cedil", "\xc2\xb8", "sup1", "\xc2\xb9", "ordm", "\xc2\xba", "raquo", "\xc2\xbb", "frac14", "\xc2\xbc", "frac12", "\xc2\xbd", "frac34", "\xc2\xbe", "iquest", "\xc2\xbf", "Agrave", "\xc3\x80", "Aacute", "\xc3\x81", "Acirc", "\xc3\x82", "Atilde", "\xc3\x83", "Auml", "\xc3\x84", "Aring", "\xc3\x85", "AElig", "\xc3\x86", "Ccedil", "\xc3\x87", "Egrave", "\xc3\x88", "Eacute", "\xc3\x89", "Ecirc", "\xc3\x8a", "Euml", "\xc3\x8b", "Igrave", "\xc3\x8c", "Iacute", "\xc3\x8d", "Icirc", "\xc3\x8e", "Iuml", "\xc3\x8f", "ETH", "\xc3\x90", "Ntilde", "\xc3\x91", "Ograve", "\xc3\x92", "Oacute", "\xc3\x93", "Ocirc", "\xc3\x94", "Otilde", "\xc3\x95", "Ouml", "\xc3\x96", "times", "\xc3\x97", "Oslash", "\xc3\x98", "Ugrave", "\xc3\x99", "Uacute", "\xc3\x9a", "Ucirc", "\xc3\x9b", "Uuml", "\xc3\x9c", "Yacute", "\xc3\x9d", "THORN", "\xc3\x9e", "szlig", "\xc3\x9f", "agrave", "\xc3\xa0", "aacute", "\xc3\xa1", "acirc", "\xc3\xa2", "atilde", "\xc3\xa3", "auml", "\xc3\xa4", "aring", "\xc3\xa5", "aelig", "\xc3\xa6", "ccedil", "\xc3\xa7", "egrave", "\xc3\xa8", "eacute", "\xc3\xa9", "ecirc", "\xc3\xaa", "euml", "\xc3\xab", "igrave", "\xc3\xac", "iacute", "\xc3\xad", "icirc", "\xc3\xae", "iuml", "\xc3\xaf", "eth", "\xc3\xb0", "ntilde", "\xc3\xb1", "ograve", "\xc3\xb2", "oacute", "\xc3\xb3", "ocirc", "\xc3\xb4", "otilde", "\xc3\xb5", "ouml", "\xc3\xb6", "divide", "\xc3\xb7", "oslash", "\xc3\xb8", "ugrave", "\xc3\xb9", "uacute", "\xc3\xba", "ucirc", "\xc3\xbb", "uuml", "\xc3\xbc", "yacute", "\xc3\xbd", "thorn", "\xc3\xbe", "yuml", "\xc3\xbf", /* ISO-10646 */ "fnof", "\xc6\x92", "Alpha", "\xce\x91", "Beta", "\xce\x92", "Gamma", "\xce\x93", "Delta", "\xce\x94", "Epsilon", "\xce\x95", "Zeta", "\xce\x96", "Eta", "\xce\x97", "Theta", "\xce\x98", "Iota", "\xce\x99", "Kappa", "\xce\x9a", "Lambda", "\xce\x9b", "Mu", "\xce\x9c", "Nu", "\xce\x9d", "Xi", "\xce\x9e", "Omicron", "\xce\x9f", "Pi", "\xce\xa0", "Rho", "\xce\xa1", "Sigma", "\xce\xa3", "Tau", "\xce\xa4", "Upsilon", "\xce\xa5", "Phi", "\xce\xa6", "Chi", "\xce\xa7", "Psi", "\xce\xa8", "Omega", "\xce\xa9", "alpha", "\xce\xb1", "beta", "\xce\xb2", "gamma", "\xce\xb3", "delta", "\xce\xb4", "epsilon", "\xce\xb5", "zeta", "\xce\xb6", "eta", "\xce\xb7", "theta", "\xce\xb8", "iota", "\xce\xb9", "kappa", "\xce\xba", "lambda", "\xce\xbb", "mu", "\xce\xbc", "nu", "\xce\xbd", "xi", "\xce\xbe", "omicron", "\xce\xbf", "pi", "\xcf\x80", "rho", "\xcf\x81", "sigmaf", "\xcf\x82", "sigma", "\xcf\x83", "tau", "\xcf\x84", "upsilon", "\xcf\x85", "phi", "\xcf\x86", "chi", "\xcf\x87", "psi", "\xcf\x88", "omega", "\xcf\x89", "thetasym", "\xcf\x91", "upsih", "\xcf\x92", "piv", "\xcf\x96", "bull", "\xe2\x80\xa2", "hellip", "\xe2\x80\xa6", "prime", "\xe2\x80\xb2", "Prime", "\xe2\x80\xb3", "oline", "\xe2\x80\xbe", "frasl", "\xe2\x81\x84", "weierp", "\xe2\x84\x98", "image", "\xe2\x84\x91", "real", "\xe2\x84\x9c", "trade", "\xe2\x84\xa2", "alefsym", "\xe2\x84\xb5", "larr", "\xe2\x86\x90", "uarr", "\xe2\x86\x91", "rarr", "\xe2\x86\x92", "darr", "\xe2\x86\x93", "harr", "\xe2\x86\x94", "crarr", "\xe2\x86\xb5", "lArr", "\xe2\x87\x90", "uArr", "\xe2\x87\x91", "rArr", "\xe2\x87\x92", "dArr", "\xe2\x87\x93", "hArr", "\xe2\x87\x94", "forall", "\xe2\x88\x80", "part", "\xe2\x88\x82", "exist", "\xe2\x88\x83", "empty", "\xe2\x88\x85", "nabla", "\xe2\x88\x87", "isin", "\xe2\x88\x88", "notin", "\xe2\x88\x89", "ni", "\xe2\x88\x8b", "prod", "\xe2\x88\x8f", "sum", "\xe2\x88\x91", "minus", "\xe2\x88\x92", "lowast", "\xe2\x88\x97", "radic", "\xe2\x88\x9a", "prop", "\xe2\x88\x9d", "infin", "\xe2\x88\x9e", "ang", "\xe2\x88\xa0", "and", "\xe2\x88\xa7", "or", "\xe2\x88\xa8", "cap", "\xe2\x88\xa9", "cup", "\xe2\x88\xaa", "int", "\xe2\x88\xab", "there4", "\xe2\x88\xb4", "sim", "\xe2\x88\xbc", "cong", "\xe2\x89\x85", "asymp", "\xe2\x89\x88", "ne", "\xe2\x89\xa0", "equiv", "\xe2\x89\xa1", "le", "\xe2\x89\xa4", "ge", "\xe2\x89\xa5", "sub", "\xe2\x8a\x82", "sup", "\xe2\x8a\x83", "nsub", "\xe2\x8a\x84", "sube", "\xe2\x8a\x86", "supe", "\xe2\x8a\x87", "oplus", "\xe2\x8a\x95", "otimes", "\xe2\x8a\x97", "perp", "\xe2\x8a\xa5", "sdot", "\xe2\x8b\x85", "lceil", "\xe2\x8c\x88", "rceil", "\xe2\x8c\x89", "lfloor", "\xe2\x8c\x8a", "rfloor", "\xe2\x8c\x8b", "lang", "\xe2\x8c\xa9", "rang", "\xe2\x8c\xaa", "loz", "\xe2\x97\x8a", "spades", "\xe2\x99\xa0", "clubs", "\xe2\x99\xa3", "hearts", "\xe2\x99\xa5", "diams", "\xe2\x99\xa6", "OElig", "\xc5\x92", "oelig", "\xc5\x93", "Scaron", "\xc5\xa0", "scaron", "\xc5\xa1", "Yuml", "\xc5\xb8", "circ", "\xcb\x86", "tilde", "\xcb\x9c", "ensp", "\xe2\x80\x82", "emsp", "\xe2\x80\x83", "thinsp", "\xe2\x80\x89", "zwnj", "\xe2\x80\x8c", "zwj", "\xe2\x80\x8d", "lrm", "\xe2\x80\x8e", "rlm", "\xe2\x80\x8f", "ndash", "\xe2\x80\x93", "mdash", "\xe2\x80\x94", "lsquo", "\xe2\x80\x98", "rsquo", "\xe2\x80\x99", "sbquo", "\xe2\x80\x9a", "ldquo", "\xe2\x80\x9c", "rdquo", "\xe2\x80\x9d", "bdquo", "\xe2\x80\x9e", "dagger", "\xe2\x80\xa0", "Dagger", "\xe2\x80\xa1", "permil", "\xe2\x80\xb0", "lsaquo", "\xe2\x80\xb9", "rsaquo", "\xe2\x80\xba", "euro", "\xe2\x82\xac", NULL, NULL }; map my_named_ents; class NamedEntsInitializer { public: NamedEntsInitializer() { for (int i = 0;;) { const char *ent; const char *val; ent = epairs[i++]; if (ent == 0) break; val = epairs[i++]; if (val == 0) break; my_named_ents[string(ent)] = val; } } }; static NamedEntsInitializer namedEntsInitializerInstance; MyHtmlParser::MyHtmlParser() : in_script_tag(false), in_style_tag(false), in_pre_tag(false), in_title_tag(false), pending_space(false), indexing_allowed(true) { // The default html document charset is iso-8859-1. We'll update // this value from the encoding tag if found. Actually use cp1252 which // is a superset charset = "CP1252"; } void MyHtmlParser::decode_entities(string &s) { LOGDEB2("MyHtmlParser::decode_entities\n" ); // This has no meaning whatsoever if the character encoding is unknown, // so don't do it. If charset known, caller has converted text to utf-8, // and this is also how we translate entities // if (tocharset != "utf-8") // return; // We need a const_iterator version of s.end() - otherwise the // find() and find_if() templates don't work... string::const_iterator amp = s.begin(), s_end = s.end(); while ((amp = find(amp, s_end, '&')) != s_end) { unsigned int val = 0; string::const_iterator end, p = amp + 1; string subs; if (p != s_end && *p == '#') { p++; if (p != s_end && (*p == 'x' || *p == 'X')) { // hex p++; end = find_if(p, s_end, p_notxdigit); sscanf(s.substr(p - s.begin(), end - p).c_str(), "%x", &val); } else { // number end = find_if(p, s_end, p_notdigit); val = atoi(s.substr(p - s.begin(), end - p).c_str()); } } else { end = find_if(p, s_end, p_notalnum); string code = s.substr(p - s.begin(), end - p); map::const_iterator i; i = my_named_ents.find(code); if (i != my_named_ents.end()) subs = i->second; } if (end < s_end && *end == ';') end++; if (val) { // The code is the code position for a unicode char. We need // to translate it to an utf-8 string. string utf16be; utf16be += char(val / 256); utf16be += char(val % 256); transcode(utf16be, subs, "UTF-16BE", "UTF-8"); } if (subs.length() > 0) { string::size_type amp_pos = amp - s.begin(); s.replace(amp_pos, end - amp, subs); s_end = s.end(); // We've modified the string, so the iterators are no longer // valid... amp = s.begin() + amp_pos + subs.length(); } else { amp = end; } } } // Compress whitespace and suppress newlines // Note that we independantly add some newlines to the output text in the // tag processing code. Like this, the preview looks a bit more like what a // browser would display. // We keep whitespace inside
 tags
void
MyHtmlParser::process_text(const string &text)
{
    LOGDEB2("process_text: title "  << (in_title_tag) << " script "  << (in_script_tag) << " style "  << (in_style_tag) << " pre "  << (in_pre_tag) << " pending_space "  << (pending_space) << " txt ["  << (text) << "]\n" );
    CancelCheck::instance().checkCancel();

    if (!in_script_tag && !in_style_tag) {
	if (in_title_tag) {
	    titledump += text;
	} else if (!in_pre_tag) {
	    string::size_type b = 0;
	    bool only_space = true;
	    while ((b = text.find_first_not_of(WHITESPACE, b)) != string::npos) {
		only_space = false;
		// If space specifically needed or chunk begins with
		// whitespace, add exactly one space
		if (pending_space || b != 0) {
			dump += ' ';
		}
		pending_space = true;
		string::size_type e = text.find_first_of(WHITESPACE, b);
		if (e == string::npos) {
		    dump += text.substr(b);
		    pending_space = false;
		    break;
		}
		dump += text.substr(b, e - b);
		b = e + 1;
	    }
	    if (only_space)
		pending_space = true;
	} else {
	    if (pending_space)
		dump += ' ';
	    dump += text;
	}
    }
}

bool
MyHtmlParser::opening_tag(const string &tag)
{
    LOGDEB2("opening_tag: ["  << (tag) << "]\n" );
#if 0
    cout << "TAG: " << tag << ": " << endl;
    map::const_iterator x;
    for (x = p.begin(); x != p.end(); x++) {
	cout << "  " << x->first << " -> '" << x->second << "'" << endl;
    }
#endif
    if (tag.empty()) return true;
    switch (tag[0]) {
	case 'a':
	    if (tag == "address") pending_space = true;
	    break;
	case 'b':
	    // body: some bad docs have several opening body tags and
	    // even text before the body is displayed by Opera and
	    // Firefox.  We used to reset the dump each time we saw a
	    // body tag, but I can't see any reason to do so.

	    if (tag == "blockquote" || tag == "br") {
		dump += '\n';
		pending_space = true;
	    }
	    break;
	case 'c':
	    if (tag == "center") pending_space = true;
	    break;
	case 'd':
	    if (tag == "dd" || tag == "dir" || tag == "div" || tag == "dl" ||
		tag == "dt") pending_space = true;
	    if (tag == "dt")
		dump += '\n';
	    break;
	case 'e':
	    if (tag == "embed") pending_space = true;
	    break;
	case 'f':
	    if (tag == "fieldset" || tag == "form") pending_space = true;
	    break;
	case 'h':
	    // hr, and h1, ..., h6
	    if (tag.length() == 2 && strchr("r123456", tag[1])) {
		dump += '\n';
		pending_space = true;
	    }
	    break;
	case 'i':
	    if (tag == "iframe" || tag == "img" || tag == "isindex" ||
		tag == "input") pending_space = true;
	    break;
	case 'k':
	    if (tag == "keygen") pending_space = true;
	    break;
	case 'l':
	    if (tag == "legend" || tag == "li" || tag == "listing") {
		dump += '\n';
		pending_space = true;
	    }
	    break;
	case 'm':
	    if (tag == "meta") {
		string content;
		if (get_parameter(cstr_html_content, content)) {
		    string name;
		    if (get_parameter("name", name)) {
			lowercase_term(name);
			if (name == "date") {
			    // Specific to Recoll filters.
			    decode_entities(content);
			    struct tm tm;
                            memset(&tm, 0, sizeof(tm));
			    if (strptime(content.c_str(), 
					 " %Y-%m-%d %H:%M:%S ", &tm) ||
				strptime(content.c_str(), 
					 "%Y-%m-%dT%H:%M:%S", &tm)
				) {
				char ascuxtime[100];
				sprintf(ascuxtime, "%ld", (long)mktime(&tm));
				dmtime = ascuxtime;
			    }
			} else if (name == "robots") {
			} else {
			    string markup;
			    bool ishtml = false;
			    if (get_parameter("markup", markup)) {
				if (!stringlowercmp("html", markup)) {
				    ishtml = true;
				}
			    }
			    if (!meta[name].empty())
				meta[name] += ' ';
			    decode_entities(content);
			    meta[name] += content;
			    if (ishtml && 
				meta[name].compare(0, cstr_fldhtm.size(), 
						   cstr_fldhtm)) {
				meta[name].insert(0, cstr_fldhtm);
			    }
			}
		    } 
		    string hdr;
		    if (get_parameter("http-equiv", hdr)) {
			lowercase_term(hdr);
			if (hdr == "content-type") {
			    MimeHeaderValue p;
			    parseMimeHeaderValue(content, p);
			    map::const_iterator k;
			    if ((k = p.params.find(cstr_html_charset)) != 
				p.params.end()) {
				charset = k->second;
				if (!charset.empty() && 
				    !samecharset(charset, fromcharset)) {
				    LOGDEB1("Doc http-equiv charset '"  << (charset) << "' differs from dir deflt '"  << (fromcharset) << "'\n" );
				    throw false;
				}
			    }
			}
		    }
		}
		string newcharset;
		if (get_parameter(cstr_html_charset, newcharset)) {
		    // HTML5 added: 
		    lowercase_term(newcharset);
		    charset = newcharset;
		    if (!charset.empty() && 
			!samecharset(charset, fromcharset)) {
			LOGDEB1("Doc html5 charset '"  << (charset) << "' differs from dir deflt '"  << (fromcharset) << "'\n" );
			throw false;
		    }
		}
		break;
	    } else if (tag == "marquee" || tag == "menu" || tag == "multicol")
		pending_space = true;
	    break;
	case 'o':
	    if (tag == "ol" || tag == "option") pending_space = true;
	    break;
	case 'p':
	    if (tag == "p" || tag == "plaintext") {
		dump += '\n';
		pending_space = true;
	    } else if (tag == "pre") {
		in_pre_tag = true;
		dump += '\n';
		pending_space = true;
	    }
	    break;
	case 'q':
	    if (tag == "q") pending_space = true;
	    break;
	case 's':
	    if (tag == "style") {
		in_style_tag = true;
		break;
	    } else if (tag == "script") {
		in_script_tag = true;
		break;
	    } else if (tag == "select") 
		pending_space = true;
	    break;
	case 't':
	    if (tag == "table" || tag == "td" || tag == "textarea" ||
		tag == "th") {
		pending_space = true;
	    } else if (tag == "title") {
		in_title_tag = true;
	    }
	    break;
	case 'u':
	    if (tag == "ul") pending_space = true;
	    break;
	case 'x':
	    if (tag == "xmp") pending_space = true;
	    break;
    }
    return true;
}

bool
MyHtmlParser::closing_tag(const string &tag)
{
    LOGDEB2("closing_tag: ["  << (tag) << "]\n" );
    if (tag.empty()) return true;
    switch (tag[0]) {
	case 'a':
	    if (tag == "address") pending_space = true;
	    break;
	case 'b':
	    // body: We used to signal and end of doc here by returning
	    // false but the browsers just ignore body and html
	    // closing tags if there is further text, so it seems right
	    // to do the same

	    if (tag == "blockquote" || tag == "br") pending_space = true;
	    break;
	case 'c':
	    if (tag == "center") pending_space = true;
	    break;
	case 'd':
	    if (tag == "dd" || tag == "dir" || tag == "div" || tag == "dl" ||
		tag == "dt") pending_space = true;
	    break;
	case 'f':
	    if (tag == "fieldset" || tag == "form") pending_space = true;
	    break;
	case 'h':
	    // hr, and h1, ..., h6
	    if (tag.length() == 2 && strchr("r123456", tag[1]))
		pending_space = true;
	    break;
	case 'i':
	    if (tag == "iframe") pending_space = true;
	    break;
	case 'l':
	    if (tag == "legend" || tag == "li" || tag == "listing")
		pending_space = true;
	    break;
	case 'm':
	    if (tag == "marquee" || tag == "menu") pending_space = true;
	    break;
	case 'o':
	    if (tag == "ol" || tag == "option") pending_space = true;
	    break;
	case 'p':
	    if (tag == "p") {
		pending_space = true;
	    } else if  (tag == "pre") {
		pending_space = true;
		in_pre_tag = false;
	    }
	    break;
	case 'q':
	    if (tag == "q") pending_space = true;
	    break;
	case 's':
	    if (tag == "style") {
		in_style_tag = false;
		break;
	    }
	    if (tag == "script") {
		in_script_tag = false;
		break;
	    }
	    if (tag == "select") pending_space = true;
	    break;
	case 't':
	    if (tag == "title") {
		in_title_tag = false;
		if (meta.find("title") == meta.end()|| meta["title"].empty()) {
		    meta["title"] = titledump;
		    titledump.clear();
		}
		break;
	    }
	    if (tag == "table" || tag == "td" || tag == "textarea" ||
		tag == "th") pending_space = true;
	    break;
	case 'u':
	    if (tag == "ul") pending_space = true;
	    break;
	case 'x':
	    if (tag == "xmp") pending_space = true;
	    break;
    }
    return true;
}

// This gets called when hitting eof. 
// We used to do: 
//    > If the  is open, do
//    > something with the text (that is, don't throw up). Else, things are
//    > too weird, throw an error. We don't get called if the parser finds
//    > a closing body tag (exception gets thrown by closing_tag())
// But we don't throw any more. Whatever text we've extracted up to now is
// better than nothing.
void
MyHtmlParser::do_eof()
{
}

recoll-1.23.7/internfile/mh_unknown.h0000644000175000017500000000301713224431020014470 00000000000000/* 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 _MH_UNKNOWN_H_INCLUDED_
#define _MH_UNKNOWN_H_INCLUDED_

#include 

#include "cstr.h"
#include "mimehandler.h"

/**
 * Handler for files with no content handler: does nothing.
 *
 */
class MimeHandlerUnknown : public RecollFilter {
 public:
    MimeHandlerUnknown(RclConfig *cnf, const string& id) 
	: RecollFilter(cnf, id) {
    }
    virtual ~MimeHandlerUnknown() {}
    virtual bool is_data_input_ok(DataInput input) const {
        return true;
    }
    
    virtual bool next_document() {
	if (m_havedoc == false)
	    return false;
	m_havedoc = false; 
	m_metaData[cstr_dj_keycontent] = cstr_null;
	m_metaData[cstr_dj_keymt] = cstr_textplain;
	return true;
    }
    virtual bool is_unknown() {return true;}
};

#endif /* _MH_UNKNOWN_H_INCLUDED_ */
recoll-1.23.7/internfile/mh_execm.h0000644000175000017500000001235113125637102014104 00000000000000/* 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 _MH_EXECM_H_INCLUDED_
#define _MH_EXECM_H_INCLUDED_

#include "mh_exec.h"
#include "execmd.h"

/** 
 * Turn external document into internal one by executing an external filter.
 *
 * The command to execute, and its parameters, are stored in the "params" 
 * which is built in mimehandler.cpp out of data from the mimeconf file.
 *
 * This version uses persistent filters which can handle multiple requests 
 * without exiting (both multiple files and multiple documents per file), 
 * with a simple question/response protocol.
 *
 * The data is exchanged in TLV fashion, in a way that should be
 * usable in most script languages. The basic unit of data has one line 
 * with a data type and a count (both ASCII), followed by the data. A
 * 'message' is made of one or several units or tags and ends with one empty
 * line. 
 * 
 * Example from recollindex (the message begins before 'Filename' and has
 * 'Filename' and 'Ipath' tags):
 * 
Filename: 24
/my/home/mail/somefolderIpath: 2
22


#include 

#include "mimehandler.h"

/** 
 * Translate a mail folder file into internal documents (also works
 * for maildir files). This has to keep state while parsing a mail folder
 * file. 
 */
class MimeHandlerMbox : public RecollFilter {
public:
    MimeHandlerMbox(RclConfig *cnf, const std::string& id) 
	: RecollFilter(cnf, id), m_vfp(0), m_msgnum(0), 
	  m_lineno(0), m_fsize(0) {
    }
    virtual ~MimeHandlerMbox();
    virtual bool next_document();
    virtual bool skip_to_document(const std::string& ipath) {
	m_ipath = ipath;
	return true;
    }
    virtual void clear();
    typedef long long mbhoff_type;

protected:
    virtual bool set_document_file_impl(const std::string&,
                                        const std::string&);

private:
    std::string m_fn;     // File name
    void      *m_vfp;    // File pointer for folder
    int        m_msgnum; // Current message number in folder. Starts at 1
    std::string m_ipath;
    int        m_lineno; // debug 
    mbhoff_type m_fsize;
    std::vector m_offsets;
    enum Quirks {MBOXQUIRK_TBIRD=1};
    int        m_quirks;
};

#endif /* _MBOX_H_INCLUDED_ */
recoll-1.23.7/internfile/htmlparse.cpp0000644000175000017500000002465713125527323014670 00000000000000/* This file was copied/updated from xapian-omega-1.0.1 to 1.2.6 and modified */

/* htmlparse.cc: simple HTML parser for omega indexer
 *
 * Copyright 1999,2000,2001 BrightStation PLC
 * Copyright 2001 Ananova Ltd
 * Copyright 2002,2006,2007,2008,2009,2010,2011 Olly Betts
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301
 * USA
 */

#include 
using std::find;
using std::find_if;
#include "htmlparse.h"
#include 
#include 
#include 

inline void
lowercase_string(string &str)
{
    for (string::iterator i = str.begin(); i != str.end(); ++i) {
	*i = tolower(static_cast(*i));
    }
}

map HtmlParser::named_ents;

inline static bool
p_notdigit(char c)
{
    return !isdigit(static_cast(c));
}

inline static bool
p_notxdigit(char c)
{
    return !isxdigit(static_cast(c));
}

inline static bool
p_notalnum(char c)
{
    return !isalnum(static_cast(c));
}

inline static bool
p_notwhitespace(char c)
{
    return !isspace(static_cast(c));
}

inline static bool
p_nottag(char c)
{
    return !isalnum(static_cast(c)) &&
	c != '.' && c != '-' && c != ':'; // ':' for XML namespaces.
}

inline static bool
p_whitespacegt(char c)
{
    return isspace(static_cast(c)) || c == '>';
}

inline static bool
p_whitespaceeqgt(char c)
{
    return isspace(static_cast(c)) || c == '=' || c == '>';
}

bool
HtmlParser::get_parameter(const string & param, string & value) const
{
    map::const_iterator i = parameters.find(param);
    if (i == parameters.end()) return false;
    value = i->second;
    return true;
}

HtmlParser::HtmlParser()
{
    // RECOLL: no need to initialize these entities, we use those from
    // myhtmlparse
#if 0
    static const struct ent { const char *n; unsigned int v; } ents[] = {
#include "namedentities.h"
	{ NULL, 0 }
    };
    if (named_ents.empty()) {
	const struct ent *i = ents;
	while (i->n) {
	    named_ents[string(i->n)] = i->v;
	    ++i;
	}
    }
#endif
}

void
HtmlParser::decode_entities(string &s)
{
    // Not used for recoll. Kept here to minimize the amount of
    // diffs. Almost the same code in myhtmlparse except that the
    // entity table directly holds the utf-8 strings instead of the
    // unicode positions (one less conversion).
#if 0
    // We need a const_iterator version of s.end() - otherwise the
    // find() and find_if() templates don't work...
    string::const_iterator amp = s.begin(), s_end = s.end();
    while ((amp = find(amp, s_end, '&')) != s_end) {
	unsigned int val = 0;
	string::const_iterator end, p = amp + 1;
	if (p != s_end && *p == '#') {
	    p++;
	    if (p != s_end && (*p == 'x' || *p == 'X')) {
		// hex
		p++;
		end = find_if(p, s_end, p_notxdigit);
		sscanf(s.substr(p - s.begin(), end - p).c_str(), "%x", &val);
	    } else {
		// number
		end = find_if(p, s_end, p_notdigit);
		val = atoi(s.substr(p - s.begin(), end - p).c_str());
	    }
	} else {
	    end = find_if(p, s_end, p_notalnum);
	    string code = s.substr(p - s.begin(), end - p);
	    map::const_iterator i;
	    i = named_ents.find(code);
	    if (i != named_ents.end()) val = i->second;
	}
	if (end < s_end && *end == ';') end++;
	if (val) {
	    string::size_type amp_pos = amp - s.begin();
	    if (val < 0x80) {
		s.replace(amp_pos, end - amp, 1u, char(val));
	    } else {
		// Convert unicode value val to UTF-8.
		char seq[4];
		unsigned len = Xapian::Unicode::nonascii_to_utf8(val, seq);
		s.replace(amp_pos, end - amp, seq, len);
	    }
	    s_end = s.end();
	    // We've modified the string, so the iterators are no longer
	    // valid...
	    amp = s.begin() + amp_pos + 1;
	} else {
	    amp = end;
	}
    }
#endif
}

void
HtmlParser::parse_html(const string &body)
{
    in_script = false;

    parameters.clear();
    string::const_iterator start = body.begin();

    while (true) {
	// Skip through until we find an HTML tag, a comment, or the end of
	// document.  Ignore isolated occurrences of `<' which don't start
	// a tag or comment.	
	string::const_iterator p = start;
	while (true) {
	    p = find(p, body.end(), '<');
	    if (p == body.end()) break;
	    unsigned char ch = *(p + 1);

	    // Tag, closing tag, or comment (or SGML declaration).
	    if ((!in_script && isalpha(ch)) || ch == '/' || ch == '!') break;

	    if (ch == '?') {
		// PHP code or XML declaration.
		// XML declaration is only valid at the start of the first line.
		// FIXME: need to deal with BOMs...
		if (p != body.begin() || body.size() < 20) break;

		// XML declaration looks something like this:
		// 
		if (p[2] != 'x' || p[3] != 'm' || p[4] != 'l') break;
		if (strchr(" \t\r\n", p[5]) == NULL) break;

		string::const_iterator decl_end = find(p + 6, body.end(), '?');
		if (decl_end == body.end()) break;

		// Default charset for XML is UTF-8.
		charset = "utf-8";

		string decl(p + 6, decl_end);
		size_t enc = decl.find("encoding");
		if (enc == string::npos) break;

		enc = decl.find_first_not_of(" \t\r\n", enc + 8);
		if (enc == string::npos || enc == decl.size()) break;

		if (decl[enc] != '=') break;
		
		enc = decl.find_first_not_of(" \t\r\n", enc + 1);
		if (enc == string::npos || enc == decl.size()) break;

		if (decl[enc] != '"' && decl[enc] != '\'') break;

		char quote = decl[enc++];
		size_t enc_end = decl.find(quote, enc);

		if (enc != string::npos)
		    charset = decl.substr(enc, enc_end - enc);

		break;
	    }
	    p++;
	}

	// Process text up to start of tag.
	if (p > start || p == body.end()) {
	    string text = body.substr(start - body.begin(), p - start);
	    decode_entities(text);
	    process_text(text);
	}

	if (p == body.end()) {
	    do_eof();
	    break;
	}

	start = p + 1;
   
	if (start == body.end()) break;

	if (*start == '!') {
	    if (++start == body.end()) break;
	    if (++start == body.end()) break;
	    // comment or SGML declaration
	    if (*(start - 1) == '-' && *start == '-') {
		++start;
		string::const_iterator close = find(start, body.end(), '>');
		// An unterminated comment swallows rest of document
		// (like Netscape, but unlike MSIE IIRC)
		if (close == body.end()) break;

		p = close;
		// look for -->
		while (p != body.end() && (*(p - 1) != '-' || *(p - 2) != '-'))
		    p = find(p + 1, body.end(), '>');

		if (p != body.end()) {
		    // Check for htdig's "ignore this bit" comments.
		    if (p - start == 15 && string(start, p - 2) == "htdig_noindex") {
			string::size_type i;
			i = body.find("", p + 1 - body.begin());
			if (i == string::npos) break;
			start = body.begin() + i + 21;
			continue;
		    }
		    // If we found --> skip to there.
		    start = p;
		} else {
		    // Otherwise skip to the first > we found (as Netscape does).
		    start = close;
		}
	    } else {
		// just an SGML declaration, perhaps giving the DTD - ignore it
		start = find(start - 1, body.end(), '>');
		if (start == body.end()) break;
	    }
	    ++start;
	} else if (*start == '?') {
	    if (++start == body.end()) break;
	    // PHP - swallow until ?> or EOF
	    start = find(start + 1, body.end(), '>');

	    // look for ?>
	    while (start != body.end() && *(start - 1) != '?')
		start = find(start + 1, body.end(), '>');

	    // unterminated PHP swallows rest of document (rather arbitrarily
	    // but it avoids polluting the database when things go wrong)
	    if (start != body.end()) ++start;
	} else {
	    // opening or closing tag
	    int closing = 0;

	    if (*start == '/') {
		closing = 1;
		start = find_if(start + 1, body.end(), p_notwhitespace);
	    }
	      
	    p = start;
	    start = find_if(start, body.end(), p_nottag);
	    string tag = body.substr(p - body.begin(), start - p);
	    // convert tagname to lowercase
	    lowercase_string(tag);

	    if (closing) {
		if (!closing_tag(tag))
		    return;
		if (in_script && tag == "script") in_script = false;

		/* ignore any bogus parameters on closing tags */
		p = find(start, body.end(), '>');
		if (p == body.end()) break;
		start = p + 1;
	    } else {
		bool empty_element = false;
		// FIXME: parse parameters lazily.
		while (start < body.end() && *start != '>') {
		    string name, value;

		    p = find_if(start, body.end(), p_whitespaceeqgt);

		    size_t name_len = p - start;
		    if (name_len == 1) {
			if (*start == '/' && p < body.end() && *p == '>') {
			    // E.g. 
			    start = p;
			    empty_element = true;
			    break;
			}
		    }

		    name.assign(body, start - body.begin(), name_len);

		    p = find_if(p, body.end(), p_notwhitespace);

		    start = p;
		    if (start != body.end() && *start == '=') {
			start = find_if(start + 1, body.end(), p_notwhitespace);

			p = body.end();

			int quote = *start;
			if (quote == '"' || quote == '\'') {
			    start++;
			    p = find(start, body.end(), quote);
			}

			if (p == body.end()) {
			    // unquoted or no closing quote
			    p = find_if(start, body.end(), p_whitespacegt);
			}
			value.assign(body, start - body.begin(), p - start);
			start = find_if(p, body.end(), p_notwhitespace);

			if (!name.empty()) {
			    // convert parameter name to lowercase
			    lowercase_string(name);
			    // in case of multiple entries, use the first
			    // (as Netscape does)
			    parameters.insert(make_pair(name, value));
			}
		    }
		}
#if 0
		cout << "<" << tag;
		map::const_iterator x;
		for (x = parameters.begin(); x != parameters.end(); x++) {
		    cout << " " << x->first << "=\"" << x->second << "\"";
		}
		cout << ">\n";
#endif
		if (!opening_tag(tag))
		    return;
		parameters.clear();

		if (empty_element) {
		    if (!closing_tag(tag))
			return;
		}

		// In 

  

  

    

A Recoll-searchable HTML page

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

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

recoll-1.23.7/kde/kioslave/kio_recoll-kde4/data/help.html0000644000175000017500000000751613125527323020077 00000000000000 Recoll Kio Slave Recoll search

Recoll kio slave

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

The module can work in two modes:

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

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

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

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

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

HTML interface

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

Most pages in the interface should quite self-explanatory.

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

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

File manager interface

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

There are several ways to enter this interface:

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

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

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

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

Recoll Search

recoll-1.23.7/kde/kioslave/kio_recoll-kde4/recoll.protocol0000644000175000017500000000025613125527323020405 00000000000000[Protocol] exec=kio_recoll protocol=recoll input=none output=filesystem listing=Name,Type, URL reading=true defaultMimeType=text/html Icon=recoll Class=:local URIMode=rawuri recoll-1.23.7/kde/kioslave/kio_recoll-kde4/kio_recoll.cpp0000644000175000017500000002477113125637102020175 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include using namespace std; #include #include #include #include #include #include #include #include "rclconfig.h" #include "rcldb.h" #include "rclinit.h" #include "pathut.h" #include "searchdata.h" #include "rclquery.h" #include "wasatorcl.h" #include "kio_recoll.h" #include "docseqdb.h" #include "readfile.h" #include "smallut.h" #include "textsplit.h" #include "guiutils.h" using namespace KIO; RclConfig *RecollProtocol::o_rclconfig; RecollProtocol::RecollProtocol(const QByteArray &pool, const QByteArray &app) : SlaveBase("recoll", pool, app), m_initok(false), m_rcldb(0), m_alwaysdir(false) { kDebug() << endl; if (o_rclconfig == 0) { o_rclconfig = recollinit(0, 0, m_reason); if (!o_rclconfig || !o_rclconfig->ok()) { m_reason = string("Configuration problem: ") + m_reason; return; } } if (o_rclconfig->getDbDir().empty()) { // Note: this will have to be replaced by a call to a // configuration building dialog for initial configuration? Or // do we assume that the QT GUO is always used for this ? m_reason = "No db directory in configuration ??"; return; } rwSettings(false); m_rcldb = new Rcl::Db(o_rclconfig); if (!m_rcldb) { m_reason = "Could not build database object. (out of memory ?)"; return; } // Decide if we allow switching between html and file manager // presentation by using an end slash or not. Can also be done dynamically // by switching proto names. const char *cp = getenv("RECOLL_KIO_ALWAYS_DIR"); if (cp) { m_alwaysdir = stringToBool(cp); } else { o_rclconfig->getConfParam("kio_always_dir", &m_alwaysdir); } cp = getenv("RECOLL_KIO_STEMLANG"); if (cp) { m_stemlang = cp; } else { m_stemlang = "english"; } m_pager.setParent(this); m_initok = true; return; } // There should be an object counter somewhere to delete the config when done. // Doesn't seem needed in the kio context. RecollProtocol::~RecollProtocol() { kDebug(); delete m_rcldb; } bool RecollProtocol::maybeOpenDb(string &reason) { if (!m_rcldb) { reason = "Internal error: initialization error"; return false; } if (!m_rcldb->isopen() && !m_rcldb->open(Rcl::Db::DbRO)) { reason = "Could not open database in " + o_rclconfig->getDbDir(); return false; } return true; } // This is never called afaik void RecollProtocol::mimetype(const KUrl &url) { kDebug() << url << endl; mimeType("text/html"); finished(); } UrlIngester::UrlIngester(RecollProtocol *p, const KUrl& url) : m_parent(p), m_slashend(false), m_alwaysdir(false), m_retType(UIRET_NONE), m_resnum(0), m_type(UIMT_NONE) { kDebug() << "Url" << url; m_alwaysdir = !url.protocol().compare("recollf"); QString path = url.path(); if (url.host().isEmpty()) { if (path.isEmpty() || !path.compare("/")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_ROOT; return; } else if (!path.compare("/help.html")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_HELP; return; } else if (!path.compare("/search.html")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_SEARCH; // Retrieve the query value for preloading the form m_query.query = url.queryItem("q"); return; } else if (m_parent->isRecollResult(url, &m_resnum, &m_query.query)) { m_type = UIMT_QUERYRESULT; m_query.opt = "l"; m_query.page = 0; } else { // Have to think this is some search string m_type = UIMT_QUERY; m_query.query = url.path(); m_query.opt = "l"; m_query.page = 0; } } else { // Non empty host, url must be something like : // //search/query?q=query¶m=value... kDebug() << "host" << url.host() << "path" << url.path(); if (url.host().compare("search") || url.path().compare("/query")) { return; } m_type = UIMT_QUERY; // Decode the forms' arguments m_query.query = url.queryItem("q"); m_query.opt = url.queryItem("qtp"); if (m_query.opt.isEmpty()) { m_query.opt = "l"; } QString p = url.queryItem("p"); if (p.isEmpty()) { m_query.page = 0; } else { sscanf(p.toAscii(), "%d", &m_query.page); } p = url.queryItem("det"); m_query.isDetReq = !p.isEmpty(); p = url.queryItem("cmd"); if (!p.isEmpty() && !p.compare("pv")) { p = url.queryItem("dn"); if (!p.isEmpty()) { // Preview and no docnum ?? m_resnum = atoi((const char *)p.toUtf8()); // Result in page is 1+ m_resnum--; m_type = UIMT_PREVIEW; } } } if (m_query.query.startsWith("/")) m_query.query.remove(0,1); if (m_query.query.endsWith("/")) { kDebug() << "Ends with /"; m_slashend = true; m_query.query.chop(1); } else { m_slashend = false; } return; } bool RecollProtocol::syncSearch(const QueryDesc &qd) { kDebug(); if (!m_initok || !maybeOpenDb(m_reason)) { string reason = "RecollProtocol::listDir: Init error:" + m_reason; error(KIO::ERR_SLAVE_DEFINED, reason.c_str()); return false; } if (qd.sameQuery(m_query)) { return true; } // doSearch() calls error() if appropriate. return doSearch(qd); } // This is used by the html interface, but also by the directory one // when doing file copies for exemple. This is the central dispatcher // for requests, it has to know a little about both models. void RecollProtocol::get(const KUrl& url) { kDebug() << url << endl; if (!m_initok || !maybeOpenDb(m_reason)) { string reason = "Recoll: init error: " + m_reason; error(KIO::ERR_SLAVE_DEFINED, reason.c_str()); return; } UrlIngester ingest(this, url); UrlIngester::RootEntryType rettp; QueryDesc qd; int resnum; if (ingest.isRootEntry(&rettp)) { switch(rettp) { case UrlIngester::UIRET_HELP: { QString location = KStandardDirs::locate("data", "kio_recoll/help.html"); redirection(location); } goto out; default: searchPage(); goto out; } } else if (ingest.isResult(&qd, &resnum)) { // Url matched one generated by konqueror/Dolphin out of a // search directory listing: ie: // recoll:/some search string/recollResultxx // // This happens when the user drags/drop the result to another // app, or with the "open-with" right-click. Does not happen // if the entry itself is clicked (the UDS_URL is apparently // used in this case // // Redirect to the result document URL if (!syncSearch(qd)) { return; } Rcl::Doc doc; if (resnum >= 0 && m_source && m_source->getDoc(resnum, doc)) { mimeType(doc.mimetype.c_str()); redirection(KUrl::fromLocalFile((const char *)(doc.url.c_str()+7))); goto out; } } else if (ingest.isPreview(&qd, &resnum)) { if (!syncSearch(qd)) { return; } Rcl::Doc doc; if (resnum >= 0 && m_source && m_source->getDoc(resnum, doc)) { showPreview(doc); goto out; } } else if (ingest.isQuery(&qd)) { #if 0 // Do we need this ? if (host.isEmpty()) { char cpage[20];sprintf(cpage, "%d", page); QString nurl = QString::fromAscii("recoll://search/query?q=") + query + "&qtp=" + opt + "&p=" + cpage; redirection(KUrl(nurl)); goto out; } #endif // htmlDoSearch does the search syncing (needs to know about changes). htmlDoSearch(qd); goto out; } error(KIO::ERR_SLAVE_DEFINED, "Unrecognized URL or internal error"); out: finished(); } // Execute Recoll search, and set the docsource bool RecollProtocol::doSearch(const QueryDesc& qd) { kDebug() << "query" << qd.query << "opt" << qd.opt; m_query = qd; char opt = qd.opt.isEmpty() ? 'l' : qd.opt.toUtf8().at(0); string qs = (const char *)qd.query.toUtf8(); Rcl::SearchData *sd = 0; if (opt != 'l') { Rcl::SearchDataClause *clp = 0; if (opt == 'f') { clp = new Rcl::SearchDataClauseFilename(qs); } else { clp = new Rcl::SearchDataClauseSimple(opt == 'o' ? Rcl::SCLT_OR : Rcl::SCLT_AND, qs); } sd = new Rcl::SearchData(Rcl::SCLT_OR, m_stemlang); if (sd && clp) sd->addClause(clp); } else { sd = wasaStringToRcl(o_rclconfig, m_stemlang, qs, m_reason); } if (!sd) { m_reason = "Internal Error: cant build search"; error(KIO::ERR_SLAVE_DEFINED, m_reason.c_str()); return false; } std::shared_ptr sdata(sd); std::shared_ptrquery(new Rcl::Query(m_rcldb)); query->setCollapseDuplicates(prefs.collapseDuplicates); if (!query->setQuery(sdata)) { m_reason = "Query execute failed. Invalid query or syntax error?"; error(KIO::ERR_SLAVE_DEFINED, m_reason.c_str()); return false; } DocSequenceDb *src = new DocSequenceDb(std::shared_ptr(query), "Query results", sdata); if (src == 0) { error(KIO::ERR_SLAVE_DEFINED, "Can't build result sequence"); return false; } m_source = std::shared_ptr(src); // Reset pager in all cases. Costs nothing, stays at page -1 initially // htmldosearch will fetch the first page if needed. m_pager.setDocSource(m_source); return true; } // Note: KDE_EXPORT is actually needed on Unix when building with // cmake. Says something like __attribute__(visibility(defautl)) // (cmake apparently sets all symbols to not exported) extern "C" {KDE_EXPORT int kdemain(int argc, char **argv);} int kdemain(int argc, char **argv) { #ifdef KDE_VERSION_3 KInstance instance("kio_recoll"); #else KComponentData instance("kio_recoll"); #endif kDebug() << "*** starting kio_recoll " << endl; if (argc != 4) { kDebug() << "Usage: kio_recoll proto dom-socket1 dom-socket2\n" << endl; exit(-1); } RecollProtocol slave(argv[2], argv[3]); slave.dispatchLoop(); kDebug() << "kio_recoll Done" << endl; return 0; } recoll-1.23.7/kde/kioslave/kio_recoll-kde4/00README.txt0000644000175000017500000000656413125527323017210 00000000000000Recoll KIO slave ================ An experiment with a recoll KIO slave. Caveat: I am only currently testing this with a production, but very recent, version of KDE 4.1, and I don't intend to really support older versions. The most usable aspects work under KDE 4.0 though. As a reference, my test system is an up to date (2009-01) Kubuntu 8.10. Usage ===== Depending on the protocol name used, the search results will be returned either as HTML pages (looking quite like a normal Recoll result list), or as directory entries. The HTML mode only works with Konqueror, not Dolphin. The directory mode is available with both browsers, and also application open dialog (ie Kate). The HTML mode is much more usable than the directory mode at this point More detailed help/explanations can be found a document accessible from the slave: To try things out, after building and installing, enter "recoll:/" in a Konqueror URL entry. Depending on the KDE version, this will bring you either to an HTML search form, or to a directory listing, where you should READ THE HELP FILE. Building and installing: ======================= Only tested with KDE 4.1 and later. The main Recoll installation shares its prefix with the KIO slave, which needs to use the KDE one. This means that, if KDE lives in /usr, Recoll must be configured with --prefix=/usr, not /usr/local. Else you'll have run-time problems, the slave will not be able to find the Recoll configuration. !!*Notice: You cannot share a build directory between recoll and kio_recoll because they use different configure options for the main lib, but build it in the same place. The main lib "configure" is run at "cmake" time for kio_recoll, the build is done at "make" time. Recipe: - Make sure the KDE4 core devel packages and cmake are installed. - Extract the Recoll source. - IF Recoll is not installed yet: configure recoll with --prefix=/usr (or wherever KDE lives), build and install Recoll. - In the Recoll source, go to kde/kioslave/recoll, then build and install the kio slave: mkdir builddir cd builddir cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DQT_QMAKE_EXECUTABLE=/usr/bin/qmake-qt4 make sudo make install - You should have a look at where "make install" copies things, because misconfigured distribution, generating wrong targets, are frequent. Especially, you should check that kio_recoll.so is copied to the right place, meaning among the output of "kde4-config --path module". As an additional check, there should be many other kio_[xxx].so in there. Same for the protocol file, check that it's not alone in its directory (really, this sounds strange, but, to this point, I've seen more systems with broken cmake/KDE configs than correct ones). You need to build/update the index with recollindex, the KIO slave doesn't deal with indexing for now. Misc build problems: =================== KUBUNTU 8.10 (updated to 2008-27-11) ------------------------------------ cmake generates a bad dependancy on /build/buildd/kde4libs-4.1.2/obj-i486-linux-gnu/lib/libkdecore.so inside CMakeFiles/kio_recoll.dir/build.make Found no way to fix this. You need to edit the line and replace the /build/[...]/lib with /usr/lib. This manifests itself with the following error message: make[2]: *** No rule to make target `/build/buildd/kde4libs-4.1.2/obj-i486-linux-gnu/lib/libkdecore.so', needed by `lib/kio_recoll.so'. Stop. recoll-1.23.7/kde/kioslave/kio_recoll-kde4/kio_recoll.h0000644000175000017500000001423213125637102017631 00000000000000#ifndef _RECOLL_H #define _RECOLL_H /* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include using std::string; #include #include #include #include #include #include #include "rclconfig.h" #include "rcldb.h" #include "reslistpager.h" #include "docseq.h" #include class RecollProtocol; /** Specialize the recoll html pager for the kind of links we use etc. */ class RecollKioPager : public ResListPager { public: RecollKioPager() : m_parent(0) {} void setParent(RecollProtocol *proto) {m_parent = proto;} virtual bool append(const string& data); virtual bool append(const string& data, int, const Rcl::Doc&) {return append(data);} virtual string detailsLink(); virtual const string &parFormat(); virtual string nextUrl(); virtual string prevUrl(); virtual string pageTop(); private: RecollProtocol *m_parent; }; class QueryDesc { public: QueryDesc() : opt("l"), page(0), isDetReq(false) {} QString query; QString opt; int page; bool isDetReq; bool sameQuery(const QueryDesc& o) const { return !opt.compare(o.opt) && !query.compare(o.query); } }; // Our virtual tree is a bit complicated. We need a class to analyse an URL // and tell what we should do with it class UrlIngester { public: UrlIngester(RecollProtocol *p, const KUrl& url); enum RootEntryType {UIRET_NONE, UIRET_ROOT, UIRET_HELP, UIRET_SEARCH}; bool isRootEntry(RootEntryType *tp) { if (m_type != UIMT_ROOTENTRY) return false; *tp = m_retType; return true; } bool isQuery(QueryDesc *q) { if (m_type != UIMT_QUERY) return false; *q = m_query; return true; } bool isResult(QueryDesc *q, int *num) { if (m_type != UIMT_QUERYRESULT) return false; *q = m_query; *num = m_resnum; return true; } bool isPreview(QueryDesc *q, int *num) { if (m_type != UIMT_PREVIEW) return false; *q = m_query; *num = m_resnum; return true; } bool endSlashQuery() {return m_slashend;} bool alwaysDir() {return m_alwaysdir;} private: RecollProtocol *m_parent; QueryDesc m_query; bool m_slashend; bool m_alwaysdir; RootEntryType m_retType; int m_resnum; enum MyType {UIMT_NONE, UIMT_ROOTENTRY, UIMT_QUERY, UIMT_QUERYRESULT, UIMT_PREVIEW}; MyType m_type; }; /** * A KIO slave to execute and display Recoll searches. * * Things are made a little complicated because KIO slaves can't hope * that their internal state will remain consistent with their user * application state: slaves die, are restarted, reused, at random * between requests. * In our case, this means that any request has to be processed * without reference to the last operation performed. Ie, if the * search parameters are not those from the last request, the search * must be restarted anew. This happens for example with different * searches in 2 konqueror screens: typically only one kio_slave will * be used. * The fact that we check if the search is the same as the last one, * to avoid restarting is an optimization, not the base mechanism * (contrary to what was initially assumed, and may have left a few * crumbs around). * * We have two modes of operation, one based on html forms and result * pages, which can potentially be developped to the full Recoll * functionality, and one based on a directory listing model, which * will always be more limited, but may be useful in some cases to * allow easy copying of files etc. Which one is in use is decided by * the form of the URL. */ class RecollProtocol : public KIO::SlaveBase { public: RecollProtocol(const QByteArray &pool, const QByteArray &app ); virtual ~RecollProtocol(); virtual void mimetype(const KUrl& url); virtual void get(const KUrl& url); // The directory mode is not available with KDE 4.0, I could find // no way to avoid crashing kdirmodel #if KDE_IS_VERSION(4,1,0) virtual void stat(const KUrl & url); virtual void listDir(const KUrl& url); #endif static RclConfig *o_rclconfig; friend class RecollKioPager; friend class UrlIngester; private: bool maybeOpenDb(string& reason); bool URLToQuery(const KUrl &url, QString& q, QString& opt, int *page=0); bool doSearch(const QueryDesc& qd); void searchPage(); void queryDetails(); string makeQueryUrl(int page, bool isdet = false); bool syncSearch(const QueryDesc& qd); void htmlDoSearch(const QueryDesc& qd); void showPreview(const Rcl::Doc& doc); bool isRecollResult(const KUrl &url, int *num, QString* q); bool m_initok; Rcl::Db *m_rcldb; string m_reason; bool m_alwaysdir; string m_stemlang; // english by default else env[RECOLL_KIO_STEMLANG] // Search state: because of how the KIO slaves are used / reused, // we can't be sure that the next request will be for the same // search, and we need to check and restart one if the data // changes. This is very wasteful but hopefully won't happen too // much in actual use. One possible workaround for some scenarios // (one slave several konqueror windows) would be to have a small // cache of recent searches kept open. RecollKioPager m_pager; std::shared_ptr m_source; // Note: page here is not used, current page always comes from m_pager. QueryDesc m_query; }; extern "C" {int kdemain(int, char**);} #endif // _RECOLL_H recoll-1.23.7/kde/kioslave/kio_recoll/0000755000175000017500000000000013224670235014573 500000000000000recoll-1.23.7/kde/kioslave/kio_recoll/CMakeLists.txt0000644000175000017500000000526513224431020017246 00000000000000project(kio_recoll) cmake_minimum_required(VERSION 2.8.12) include(FeatureSummary) set(QT_MIN_VERSION 5.2.0) set(KF5_MIN_VERSION 5.0.0) find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Network Widgets) find_package(ECM REQUIRED NO_MODULE) set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(KDEInstallDirs) include(KDECMakeSettings) include(KDECompilerSettings NO_POLICY_SCOPE) # CoreAddons? find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS KIO) add_definitions(-DQT_NO_URL_CAST_FROM_STRING) include_directories( ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ) ## Recoll stuff add_definitions( -DRECOLL_DATADIR="${CMAKE_INSTALL_PREFIX}/share/recoll" -DLIBDIR="${CMAKE_INSTALL_PREFIX}/lib" -DHAVE_CONFIG_H ) set(rcltop ${CMAKE_CURRENT_SOURCE_DIR}/../../../) # Execute recoll configuration to create autoconfig.h and version.h and # generate a PIC lib execute_process(COMMAND ${rcltop}/configure --disable-static --disable-qtgui --disable-x11mon --prefix=${CMAKE_INSTALL_PREFIX} --mandir=${CMAKE_INSTALL_PREFIX}/share/man WORKING_DIRECTORY ${rcltop} ) link_directories(${rcltop}/.libs ${CMAKE_INSTALL_PREFIX}/lib) include_directories (${CMAKE_SOURCE_DIR} ${rcltop}/aspell ${rcltop}/bincimapmime ${rcltop}/common ${rcltop}/index ${rcltop}/internfile ${rcltop}/query ${rcltop}/rcldb ${rcltop}/unac ${rcltop}/utils ${rcltop}/qtgui ) set(kio_recoll_SRCS kio_recoll.cpp htmlif.cpp dirif.cpp ${rcltop}/qtgui/guiutils.cpp) # Had the idea to add e.g. /usr/lib/recoll to the rpath so that the dyn lib # will be found at run time. But this does not seem to work with debian # which strips RPATH by default (I think there is a way for libs in app-specific # paths but I did not find it). Link with the .a instead. #SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib/recoll") add_library(kio_recoll MODULE ${kio_recoll_SRCS}) add_custom_target(rcllib COMMAND make -j 3 PicStatic WORKING_DIRECTORY ${rcltop} ) add_dependencies(kio_recoll rcllib) target_link_libraries(kio_recoll recoll xapian KF5::KIOCore dl z pthread ) install(FILES recoll.protocol recollf.protocol DESTINATION ${SERVICES_INSTALL_DIR}) install(FILES data/welcome.html data/help.html DESTINATION ${DATA_INSTALL_DIR}/kio_recoll) # Tried but could not use PLUGIN_INSTALL_DIR (/usr/lib64/plugins), or # /usr/lib64/qt5/plugins/kf5/kio/recoll.so: the module is not found by # dolphin). Actually that's because of the protocol file. recoll has # exec=kio_recoll, file has exec=kf5/kio/file set_target_properties(kio_recoll PROPERTIES OUTPUT_NAME "kio_recoll") install(TARGETS kio_recoll DESTINATION ${LIB_INSTALL_DIR}/qt5/plugins) recoll-1.23.7/kde/kioslave/kio_recoll/dirif.cpp0000644000175000017500000003074413125637102016320 00000000000000/* Copyright (C) 2008 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * A lot of code in this file was copied from kio_beagle 0.4.0, * which is a GPL program. The authors listed are: * Debajyoti Bera * * KDE4 port: * Stephan Binner */ #include "autoconfig.h" // Couldn't get listDir() to work with kde 4.0, konqueror keeps // crashing because of kdirmodel, couldn't find a workaround (not // saying it's impossible)... #include #include #include #include #include "kio_recoll.h" #include "pathut.h" using namespace KIO; static const QString resultBaseName("recollResult"); // Check if the input URL is of the form that konqueror builds by // appending one of our result file names to the directory name (which // is the search string). If it is, extract and return the result // document number. Possibly restart the search if the search string // does not match the current one bool RecollProtocol::isRecollResult(const QUrl& url, int *num, QString *q) { *num = -1; qDebug() << "RecollProtocol::isRecollResult: url: " << url; // Basic checks if (!url.host().isEmpty() || url.path().isEmpty() || (url.scheme().compare("recoll") && url.scheme().compare("recollf"))) { qDebug() << "RecollProtocol::isRecollResult: no: url.host " << url.host() << " path " << url.path() << " scheme " << url.scheme(); return false; } QString path = url.path(); qDebug() << "RecollProtocol::isRecollResult: path: " << path; if (!path.startsWith("/")) { return false; } // Look for the last '/' and check if it is followed by // resultBaseName (riiiight...) int slashpos = path.lastIndexOf("/"); if (slashpos == -1 || slashpos == 0 || slashpos == path.length() - 1) { return false; } slashpos++; //qDebug() << "Comparing " << path.mid(slashpos, resultBaseName.length()) << // "and " << resultBaseName; if (path.mid(slashpos, resultBaseName.length()).compare(resultBaseName)) { return false; } // Extract the result number QString snum = path.mid(slashpos + resultBaseName.length()); sscanf(snum.toUtf8(), "%d", num); if (*num == -1) { return false; } //qDebug() << "URL analysis ok, num:" << *num; // We do have something that ressembles a recoll result locator. Check if // this matches the current search, else have to run the requested one *q = path.mid(1, slashpos - 2); return true; } // Translate rcldoc result into directory entry static const UDSEntry resultToUDSEntry(const Rcl::Doc& doc, int num) { UDSEntry entry; QUrl url(doc.url.c_str()); //qDebug() << doc.url.c_str(); /// Filename - as displayed in directory listings etc. /// "." has the usual special meaning of "current directory" /// UDS_NAME must always be set and never be empty, neither contain '/'. /// /// Note that KIO will append the UDS_NAME to the url of their /// parent directory, so all kioslaves must use that naming scheme /// ("url_of_parent/filename" will be the full url of that file). /// To customize the appearance of files without changing the url /// of the items, use UDS_DISPLAY_NAME. // // Use the result number to designate the file in case we are // asked to access it char cnum[30]; sprintf(cnum, "%04d", num); entry.insert(KIO::UDSEntry::UDS_NAME, resultBaseName + cnum); // Display the real file name entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, url.fileName()); /// A local file path if the ioslave display files sitting on the /// local filesystem (but in another hierarchy, e.g. settings:/ or /// remote:/) entry.insert(KIO::UDSEntry::UDS_LOCAL_PATH, url.path()); /// This file is a shortcut or mount, pointing to an /// URL in a different hierarchy /// @since 4.1 // We should probably set this only if the scheme is not 'file' (e.g. // from the web cache). entry.insert(KIO::UDSEntry::UDS_TARGET_URL, doc.url.c_str()); if (!doc.mimetype.compare("application/x-fsdirectory") || !doc.mimetype.compare("inode/directory")) { entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); } else { entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, doc.mimetype.c_str()); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); } // For local files, supply the usual file stat information struct stat info; if (lstat(url.path().toUtf8(), &info) >= 0) { entry.insert(KIO::UDSEntry::UDS_SIZE, info.st_size); entry.insert(KIO::UDSEntry::UDS_ACCESS, info.st_mode); entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, info.st_mtime); entry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, info.st_atime); entry.insert(KIO::UDSEntry::UDS_CREATION_TIME, info.st_ctime); } return entry; } // From kio_beagle static void createRootEntry(KIO::UDSEntry& entry) { entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, "."); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); } // Points to html query screen static void createGoHomeEntry(KIO::UDSEntry& entry) { entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, "search.html"); entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Recoll search (click me)"); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); entry.insert(KIO::UDSEntry::UDS_TARGET_URL, "recoll:///search.html"); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html"); entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "recoll"); } // Points to help file static void createGoHelpEntry(KIO::UDSEntry& entry) { QString location = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kio_recoll/help.html"); entry.clear(); entry.insert(KIO::UDSEntry::UDS_NAME, "help"); entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, "Recoll help (click me first)"); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG); entry.insert(KIO::UDSEntry::UDS_TARGET_URL, QString("file://") + location); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0500); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "text/html"); entry.insert(KIO::UDSEntry::UDS_ICON_NAME, "help"); } // As far as I can see we only ever get this on '/' so why all the code? void RecollProtocol::stat(const QUrl& url) { qDebug() << "RecollProtocol::stat:" << url; UrlIngester ingest(this, url); KIO::UDSEntry entry; // entry.insert(KIO::UDSEntry::UDS_TARGET_URL, url.url()); // entry.insert(KIO::UDSEntry::UDS_URL, url.url()); UrlIngester::RootEntryType rettp; QueryDesc qd; int num; if (ingest.isRootEntry(&rettp)) { qDebug() << "RecollProtocol::stat: root entry"; switch (rettp) { case UrlIngester::UIRET_ROOT: qDebug() << "RecollProtocol::stat: root"; createRootEntry(entry); break; case UrlIngester::UIRET_HELP: qDebug() << "RecollProtocol::stat: root help"; createGoHelpEntry(entry); break; case UrlIngester::UIRET_SEARCH: qDebug() << "RecollProtocol::stat: root search"; createGoHomeEntry(entry); break; default: qDebug() << "RecollProtocol::stat: ??"; error(ERR_DOES_NOT_EXIST, QString()); break; } } else if (ingest.isResult(&qd, &num)) { qDebug() << "RecollProtocol::stat: isresult"; if (syncSearch(qd)) { Rcl::Doc doc; if (num >= 0 && m_source && m_source->getDoc(num, doc)) { entry = resultToUDSEntry(doc, num); } else { error(ERR_DOES_NOT_EXIST, QString()); } } else { // hopefully syncSearch() set the error? } } else if (ingest.isQuery(&qd)) { qDebug() << "RecollProtocol::stat: isquery"; // ie "recoll:/some string" or "recoll:/some string/" // // We have a problem here. We'd like to let the user enter // either form and get an html or a dir contents result, // depending on the ending /. Otoh this makes the name space // inconsistent, because /toto can't be a file (the html // result page) while /toto/ would be a directory ? or can it // // Another approach would be to use different protocol names // to avoid any possibility of mixups if (m_alwaysdir || ingest.alwaysDir() || ingest.endSlashQuery()) { qDebug() << "RecollProtocol::stat: Directory type:"; // Need to check no / in there entry.insert(KIO::UDSEntry::UDS_NAME, qd.query); entry.insert(KIO::UDSEntry::UDS_ACCESS, 0700); entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, time(0)); entry.insert(KIO::UDSEntry::UDS_CREATION_TIME, time(0)); entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR); entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, "inode/directory"); } } else { qDebug() << "RecollProtocol::stat: none of the above ??"; } statEntry(entry); finished(); } void RecollProtocol::listDir(const QUrl& url) { qDebug() << "RecollProtocol::listDir: url: " << url; UrlIngester ingest(this, url); UrlIngester::RootEntryType rettp; QueryDesc qd; if (ingest.isRootEntry(&rettp)) { switch (rettp) { case UrlIngester::UIRET_ROOT: { qDebug() << "RecollProtocol::listDir:list /"; UDSEntryList entries; KIO::UDSEntry entry; createRootEntry(entry); entries.append(entry); createGoHomeEntry(entry); entries.append(entry); createGoHelpEntry(entry); entries.append(entry); listEntries(entries); finished(); } return; default: error(ERR_CANNOT_ENTER_DIRECTORY, QString()); return; } } else if (ingest.isQuery(&qd)) { // At this point, it seems that when the request is from // konqueror autocompletion it comes with a / at the end, // which offers an opportunity to not perform it. if (ingest.endSlashQuery()) { qDebug() << "RecollProtocol::listDir: Ends With /"; error(ERR_SLAVE_DEFINED, QString::fromUtf8("Autocompletion search aborted")); return; } if (!syncSearch(qd)) { // syncSearch did the error thing return; } // Fallthrough to actually listing the directory } else { qDebug() << "RecollProtocol::listDir: Cant grok input url"; error(ERR_CANNOT_ENTER_DIRECTORY, QString()); return; } static int maxentries = -1; if (maxentries == -1) { if (o_rclconfig) { o_rclconfig->getConfParam("kio_max_direntries", &maxentries); } if (maxentries == -1) { maxentries = 10000; } } static const int pagesize = 200; int pagebase = 0; while (pagebase < maxentries) { vector page; int pagelen = m_source->getSeqSlice(pagebase, pagesize, page); UDSEntry entry; if (pagelen < 0) { error(ERR_SLAVE_DEFINED, QString::fromUtf8("Internal error")); break; } UDSEntryList entries; for (int i = 0; i < pagelen; i++) { entries.push_back(resultToUDSEntry(page[i].doc, i)); } listEntries(entries); if (pagelen != pagesize) { break; } pagebase += pagelen; } finished(); } recoll-1.23.7/kde/kioslave/kio_recoll/recollnolist.protocol0000644000175000017500000000030013125527323020777 00000000000000[Protocol] exec=kio_recoll protocol=recoll input=none output=filesystem # Version for kde4.0: no "listing" entry reading=true defaultMimeType=text/html Icon=recoll Class=:local URIMode=rawuri recoll-1.23.7/kde/kioslave/kio_recoll/htmlif.cpp0000644000175000017500000002122413125637102016477 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include "rclconfig.h" #include "rcldb.h" #include "rclinit.h" #include "pathut.h" #include "searchdata.h" #include "rclquery.h" #include "wasatorcl.h" #include "kio_recoll.h" #include "docseqdb.h" #include "readfile.h" #include "smallut.h" #include "plaintorich.h" #include "internfile.h" #include "wipedir.h" #include "hldata.h" using namespace std; using namespace KIO; bool RecollKioPager::append(const string& data) { if (!m_parent) { return false; } m_parent->data(QByteArray(data.c_str())); return true; } #include string RecollProtocol::makeQueryUrl(int page, bool isdet) { ostringstream str; str << "recoll://search/query?q=" << url_encode((const char*)m_query.query.toUtf8()) << "&qtp=" << (const char*)m_query.opt.toUtf8(); if (page >= 0) { str << "&p=" << page; } if (isdet) { str << "&det=1"; } return str.str(); } string RecollKioPager::detailsLink() { string chunk = string("makeQueryUrl(m_parent->m_pager.pageNumber(), true) + "\">" + "(show query)" + ""; return chunk; } static string parformat; const string& RecollKioPager::parFormat() { // Need to escape the % inside the query url string qurl = m_parent->makeQueryUrl(-1, false), escurl; for (string::size_type pos = 0; pos < qurl.length(); pos++) { switch (qurl.at(pos)) { case '%': escurl += "%%"; break; default: escurl += qurl.at(pos); } } ostringstream str; str << "" "%R %S " "Preview  " << "Open " << "%T
" "%M %D   %U  %i
" "%A %K"; return parformat = str.str(); } string RecollKioPager::pageTop() { string pt = "

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

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

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

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

Query details:

" << endl; os << "

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

" << endl; os << "

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

");
        }
    }

    virtual string startMatch(unsigned int) {
        return string("");
    }

    virtual string endMatch() {
        return string("");
    }

    const string& m_name;
};

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

    mimeType("text/html");

    string fname =  path_getsimple(fdoc.url).c_str();
    PlainToRichKio ptr(fname);
    ptr.set_inputhtml(!fdoc.mimetype.compare("text/html"));
    list otextlist;
    HighlightData hdata;
    if (m_source) {
        m_source->getTerms(hdata);
    }
    ptr.plaintorich(fdoc.text, otextlist, hdata);

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

void RecollProtocol::htmlDoSearch(const QueryDesc& qd)
{
    qDebug() << "q" << qd.query << "option" << qd.opt << "page" << qd.page <<
             "isdet" << qd.isDetReq << endl;

    mimeType("text/html");

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

    // Check / adjust page number
    if (qd.page > m_pager.pageNumber()) {
        int npages = qd.page - m_pager.pageNumber();
        for (int i = 0; i < npages; i++) {
            m_pager.resultPageNext();
        }
    } else if (qd.page < m_pager.pageNumber()) {
        int npages = m_pager.pageNumber() - qd.page;
        for (int i = 0; i < npages; i++) {
            m_pager.resultPageBack();
        }
    }
    // Display
    m_pager.displayPage(o_rclconfig);
}
recoll-1.23.7/kde/kioslave/kio_recoll/recollf.protocol0000644000175000017500000000025713125527323017727 00000000000000[Protocol]
exec=kio_recoll
protocol=recollf
input=none
output=filesystem
listing=Name,Type, URL
reading=true
defaultMimeType=text/html
Icon=recoll
Class=:local
URIMode=rawuri
recoll-1.23.7/kde/kioslave/kio_recoll/data/0000755000175000017500000000000013224670235015504 500000000000000recoll-1.23.7/kde/kioslave/kio_recoll/data/welcome.html0000644000175000017500000000145213125527323017746 00000000000000

  
  Recoll Search



  

Recoll search

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

recoll-1.23.7/kde/kioslave/kio_recoll/data/searchable.html0000644000175000017500000000145013125527323020402 00000000000000 Recoll searchable HTML

A Recoll-searchable HTML page

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

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

recoll-1.23.7/kde/kioslave/kio_recoll/data/help.html0000644000175000017500000000755513125527323017255 00000000000000 Recoll Kio Slave Recoll search

Recoll kio slave

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

The module can work in two modes:

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

With recent KDE versions (now: 2016), the file manager interface works in Dolphin, and both the file manager and the HTML interface work in Konqueror.

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

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

HTML interface

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

Most pages in the interface should quite self-explanatory.

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

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

File manager interface

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

There are several ways to enter this interface:

  • Dolphin will only present the file manager interface. Enter recoll:/some query or recoll: some query in the address bar. Note: single-slash, not double, you will get something like "Protocol unknown" if you enter 2 slashes.
  • Konqueror: this supports both the file manager and HTML interfaces. You can force using the file manager interface in the following ways:
    • Using "recollf" as protocol name instead of "recoll". This is probably the easiest option inside open dialogs.
    • Using an URL ending with a '/', ie:
      recoll:/red apples ext:html/
    • If you would like to use the file manager view most of the time, you can set the RECOLL_KIO_ALWAYS_DIR environment variable or the kio_always_dir recoll.conf variable to 1. The HTML interface will then only be accessible through the search link in the top "recoll:" view.

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

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

Recoll Search

recoll-1.23.7/kde/kioslave/kio_recoll/recoll.protocol0000644000175000017500000000025613125527323017560 00000000000000[Protocol] exec=kio_recoll protocol=recoll Icon=recoll input=none output=filesystem listing=Name,Type, URL reading=true Class=:local URIMode=rawuri defaultMimeType=text/html recoll-1.23.7/kde/kioslave/kio_recoll/kio_recoll.cpp0000644000175000017500000002740613125637102017346 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include "rclconfig.h" #include "rcldb.h" #include "rclinit.h" #include "pathut.h" #include "searchdata.h" #include "rclquery.h" #include "wasatorcl.h" #include "kio_recoll.h" #include "docseqdb.h" #include "readfile.h" #include "smallut.h" #include "textsplit.h" #include "guiutils.h" using namespace KIO; using namespace std; RclConfig *RecollProtocol::o_rclconfig; RecollProtocol::RecollProtocol(const QByteArray& pool, const QByteArray& app) : SlaveBase("recoll", pool, app), m_initok(false), m_rcldb(0), m_alwaysdir(false) { qDebug() << "RecollProtocol::RecollProtocol()"; if (o_rclconfig == 0) { o_rclconfig = recollinit(0, 0, m_reason); if (!o_rclconfig || !o_rclconfig->ok()) { m_reason = string("Configuration problem: ") + m_reason; return; } } if (o_rclconfig->getDbDir().empty()) { // Note: this will have to be replaced by a call to a // configuration building dialog for initial configuration? Or // do we assume that the QT GUO is always used for this ? m_reason = "No db directory in configuration ??"; return; } rwSettings(false); m_rcldb = new Rcl::Db(o_rclconfig); if (!m_rcldb) { m_reason = "Could not build database object. (out of memory ?)"; return; } // Decide if we allow switching between html and file manager // presentation by using an end slash or not. Can also be done dynamically // by switching proto names. const char *cp = getenv("RECOLL_KIO_ALWAYS_DIR"); if (cp) { m_alwaysdir = stringToBool(cp); } else { o_rclconfig->getConfParam("kio_always_dir", &m_alwaysdir); } cp = getenv("RECOLL_KIO_STEMLANG"); if (cp) { m_stemlang = cp; } else { m_stemlang = "english"; } m_pager.setParent(this); m_initok = true; return; } // There should be an object counter somewhere to delete the config when done. // Doesn't seem needed in the kio context. RecollProtocol::~RecollProtocol() { qDebug() << "RecollProtocol::~RecollProtocol()"; delete m_rcldb; } bool RecollProtocol::maybeOpenDb(string& reason) { if (!m_rcldb) { reason = "Internal error: initialization error"; return false; } if (!m_rcldb->isopen() && !m_rcldb->open(Rcl::Db::DbRO)) { reason = "Could not open database in " + o_rclconfig->getDbDir(); return false; } return true; } // This is never called afaik void RecollProtocol::mimetype(const QUrl& url) { qDebug() << "RecollProtocol::mimetype: url: " << url; mimeType("text/html"); finished(); } UrlIngester::UrlIngester(RecollProtocol *p, const QUrl& url) : m_parent(p), m_slashend(false), m_alwaysdir(false), m_retType(UIRET_NONE), m_resnum(0), m_type(UIMT_NONE) { qDebug() << "UrlIngester::UrlIngester: Url: " << url; m_alwaysdir = !url.scheme().compare("recollf"); QString path = url.path(); if (url.host().isEmpty()) { if (path.isEmpty() || !path.compare("/")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_ROOT; return; } else if (!path.compare("/help.html")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_HELP; return; } else if (!path.compare("/search.html")) { m_type = UIMT_ROOTENTRY; m_retType = UIRET_SEARCH; QUrlQuery q(url); // Retrieve the query value for preloading the form m_query.query = q.queryItemValue("q"); return; } else if (m_parent->isRecollResult(url, &m_resnum, &m_query.query)) { m_type = UIMT_QUERYRESULT; m_query.opt = "l"; m_query.page = 0; } else { // Have to think this is some search string m_type = UIMT_QUERY; m_query.query = url.path(); m_query.opt = "l"; m_query.page = 0; } } else { // Non empty host, url must be something like : // //search/query?q=query¶m=value... qDebug() << "UrlIngester::UrlIngester: host " << url.host() << " path " << url.path(); if (url.host().compare("search") || url.path().compare("/query")) { return; } m_type = UIMT_QUERY; // Decode the forms' arguments // Retrieve the query value for preloading the form QUrlQuery q(url); m_query.query = q.queryItemValue("q"); m_query.opt = q.queryItemValue("qtp"); if (m_query.opt.isEmpty()) { m_query.opt = "l"; } QString p = q.queryItemValue("p"); if (p.isEmpty()) { m_query.page = 0; } else { sscanf(p.toUtf8(), "%d", &m_query.page); } p = q.queryItemValue("det"); m_query.isDetReq = !p.isEmpty(); p = q.queryItemValue("cmd"); if (!p.isEmpty() && !p.compare("pv")) { p = q.queryItemValue("dn"); if (!p.isEmpty()) { // Preview and no docnum ?? m_resnum = atoi((const char *)p.toUtf8()); // Result in page is 1+ m_resnum--; m_type = UIMT_PREVIEW; } } } if (m_query.query.startsWith("/")) { m_query.query.remove(0, 1); } if (m_query.query.endsWith("/")) { qDebug() << "UrlIngester::UrlIngester: query Ends with /"; m_slashend = true; m_query.query.chop(1); } else { m_slashend = false; } return; } bool RecollProtocol::syncSearch(const QueryDesc& qd) { qDebug() << "RecollProtocol::syncSearch"; if (!m_initok || !maybeOpenDb(m_reason)) { string reason = "RecollProtocol::listDir: Init error:" + m_reason; error(KIO::ERR_SLAVE_DEFINED, u8s2qs(reason)); return false; } if (qd.sameQuery(m_query)) { return true; } // doSearch() calls error() if appropriate. return doSearch(qd); } // This is used by the html interface, but also by the directory one // when doing file copies for exemple. This is the central dispatcher // for requests, it has to know a little about both models. void RecollProtocol::get(const QUrl& url) { qDebug() << "RecollProtocol::get: " << url; if (!m_initok || !maybeOpenDb(m_reason)) { string reason = "Recoll: init error: " + m_reason; error(KIO::ERR_SLAVE_DEFINED, u8s2qs(reason)); return; } UrlIngester ingest(this, url); UrlIngester::RootEntryType rettp; QueryDesc qd; int resnum; if (ingest.isRootEntry(&rettp)) { switch (rettp) { case UrlIngester::UIRET_HELP: { QString location = QStandardPaths::locate(QStandardPaths::GenericDataLocation, "kio_recoll/help.html"); redirection(QUrl::fromLocalFile(location)); } goto out; default: searchPage(); goto out; } } else if (ingest.isResult(&qd, &resnum)) { // Url matched one generated by konqueror/Dolphin out of a // search directory listing: ie: // recoll:/some search string/recollResultxx // // This happens when the user drags/drop the result to another // app, or with the "open-with" right-click. Does not happen // if the entry itself is clicked (the UDS_URL is apparently // used in this case // // Redirect to the result document URL if (!syncSearch(qd)) { return; } Rcl::Doc doc; if (resnum >= 0 && m_source && m_source->getDoc(resnum, doc)) { mimeType(doc.mimetype.c_str()); redirection(QUrl::fromLocalFile((const char *)(doc.url.c_str() + 7))); goto out; } } else if (ingest.isPreview(&qd, &resnum)) { if (!syncSearch(qd)) { return; } Rcl::Doc doc; if (resnum >= 0 && m_source && m_source->getDoc(resnum, doc)) { showPreview(doc); goto out; } } else if (ingest.isQuery(&qd)) { #if 0 // Do we need this ? if (host.isEmpty()) { char cpage[20]; sprintf(cpage, "%d", page); QString nurl = QString::fromAscii("recoll://search/query?q=") + query + "&qtp=" + opt + "&p=" + cpage; redirection(QUrl(nurl)); goto out; } #endif // htmlDoSearch does the search syncing (needs to know about changes). htmlDoSearch(qd); goto out; } error(KIO::ERR_SLAVE_DEFINED, u8s2qs("Unrecognized URL or internal error")); out: finished(); } // Execute Recoll search, and set the docsource bool RecollProtocol::doSearch(const QueryDesc& qd) { qDebug() << "RecollProtocol::doSearch:query" << qd.query << "opt" << qd.opt; m_query = qd; char opt = qd.opt.isEmpty() ? 'l' : qd.opt.toUtf8().at(0); string qs = (const char *)qd.query.toUtf8(); Rcl::SearchData *sd = 0; if (opt != 'l') { Rcl::SearchDataClause *clp = 0; if (opt == 'f') { clp = new Rcl::SearchDataClauseFilename(qs); } else { clp = new Rcl::SearchDataClauseSimple(opt == 'o' ? Rcl::SCLT_OR : Rcl::SCLT_AND, qs); } sd = new Rcl::SearchData(Rcl::SCLT_OR, m_stemlang); if (sd && clp) { sd->addClause(clp); } } else { sd = wasaStringToRcl(o_rclconfig, m_stemlang, qs, m_reason); } if (!sd) { m_reason = "Internal Error: cant build search"; error(KIO::ERR_SLAVE_DEFINED, u8s2qs(m_reason)); return false; } std::shared_ptr sdata(sd); std::shared_ptrquery(new Rcl::Query(m_rcldb)); query->setCollapseDuplicates(prefs.collapseDuplicates); if (!query->setQuery(sdata)) { m_reason = "Query execute failed. Invalid query or syntax error?"; error(KIO::ERR_SLAVE_DEFINED, u8s2qs(m_reason)); return false; } DocSequenceDb *src = new DocSequenceDb(std::shared_ptr(query), "Query results", sdata); if (src == 0) { error(KIO::ERR_SLAVE_DEFINED, u8s2qs("Can't build result sequence")); return false; } m_source = std::shared_ptr(src); // Reset pager in all cases. Costs nothing, stays at page -1 initially // htmldosearch will fetch the first page if needed. m_pager.setDocSource(m_source); return true; } int kdemain(int argc, char **argv) { QCoreApplication::setApplicationName("kio_recoll"); qDebug() << "*** starting kio_recoll "; if (argc != 4) { qDebug() << "Usage: kio_recoll proto dom-socket1 dom-socket2\n"; exit(-1); } RecollProtocol slave(argv[2], argv[3]); slave.dispatchLoop(); qDebug() << "kio_recoll Done"; return 0; } recoll-1.23.7/kde/kioslave/kio_recoll/00README.txt0000644000175000017500000000542213125527323016353 00000000000000Recoll KIO slave ================ An experiment with a recoll KIO slave. Caveat: I am only currently testing this with a production, but very recent, version of KDE 4.1, and I don't intend to really support older versions. The most usable aspects work under KDE 4.0 though. As a reference, my test system is an up to date (2009-01) Kubuntu 8.10. Usage ===== Depending on the protocol name used, the search results will be returned either as HTML pages (looking quite like a normal Recoll result list), or as directory entries. The HTML mode only works with Konqueror, not Dolphin. The directory mode is available with both browsers, and also application open dialog (ie Kate). The HTML mode is much more usable than the directory mode at this point More detailed help/explanations can be found a document accessible from the slave: To try things out, after building and installing, enter "recoll:/" in a Konqueror URL entry. Depending on the KDE version, this will bring you either to an HTML search form, or to a directory listing, where you should READ THE HELP FILE. Building and installing: ======================= Only tested with KDE 4.1 and later. The main Recoll installation shares its prefix with the KIO slave, which needs to use the KDE one. This means that, if KDE lives in /usr, Recoll must be configured with --prefix=/usr, not /usr/local. Else you'll have run-time problems, the slave will not be able to find the Recoll configuration. !!*Notice: You cannot share a build directory between recoll and kio_recoll because they use different configure options for the main lib, but build it in the same place. The main lib "configure" is run at "cmake" time for kio_recoll, the build is done at "make" time. Recipe: - Make sure the KDE4 core devel packages and cmake are installed. - Extract the Recoll source. - IF Recoll is not installed yet: configure recoll with --prefix=/usr (or wherever KDE lives), build and install Recoll. - In the Recoll source, go to kde/kioslave/kio_recoll, then build and install the kio slave: mkdir builddir cd builddir cmake .. -DCMAKE_INSTALL_PREFIX=/usr make sudo make install - You should have a look at where "make install" copies things, because misconfigured distribution, generating wrong targets, are frequent. Especially, you should check that kio_recoll.so is copied to the right place, meaning among the output of "kde4-config --path module". As an additional check, there should be many other kio_[xxx].so in there. Same for the protocol file, check that it's not alone in its directory (really, this sounds strange, but, to this point, I've seen more systems with broken cmake/KDE configs than correct ones). You need to build/update the index with recollindex, the KIO slave doesn't deal with indexing for now. recoll-1.23.7/kde/kioslave/kio_recoll/kio_recoll.h0000644000175000017500000001465313125637102017013 00000000000000#ifndef _RECOLL_H #define _RECOLL_H /* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include "rclconfig.h" #include "rcldb.h" #include "docseq.h" #include "reslistpager.h" #include class RecollProtocol; /** Specialize the recoll html pager for the kind of links we use etc. */ class RecollKioPager : public ResListPager { public: RecollKioPager() : m_parent(0) {} void setParent(RecollProtocol *proto) { m_parent = proto; } virtual bool append(const std::string& data); virtual bool append(const std::string& data, int, const Rcl::Doc&) { return append(data); } virtual std::string detailsLink(); virtual const std::string& parFormat(); virtual std::string nextUrl(); virtual std::string prevUrl(); virtual std::string pageTop(); private: RecollProtocol *m_parent; }; class QueryDesc { public: QueryDesc() : opt("l"), page(0), isDetReq(false) {} QString query; QString opt; int page; bool isDetReq; bool sameQuery(const QueryDesc& o) const { return !opt.compare(o.opt) && !query.compare(o.query); } }; // Our virtual tree is a bit complicated. We need a class to analyse an URL // and tell what we should do with it class UrlIngester { public: UrlIngester(RecollProtocol *p, const QUrl& url); enum RootEntryType {UIRET_NONE, UIRET_ROOT, UIRET_HELP, UIRET_SEARCH}; bool isRootEntry(RootEntryType *tp) { if (m_type != UIMT_ROOTENTRY) { return false; } *tp = m_retType; return true; } bool isQuery(QueryDesc *q) { if (m_type != UIMT_QUERY) { return false; } *q = m_query; return true; } bool isResult(QueryDesc *q, int *num) { if (m_type != UIMT_QUERYRESULT) { return false; } *q = m_query; *num = m_resnum; return true; } bool isPreview(QueryDesc *q, int *num) { if (m_type != UIMT_PREVIEW) { return false; } *q = m_query; *num = m_resnum; return true; } bool endSlashQuery() { return m_slashend; } bool alwaysDir() { return m_alwaysdir; } private: RecollProtocol *m_parent; QueryDesc m_query; bool m_slashend; bool m_alwaysdir; RootEntryType m_retType; int m_resnum; enum MyType {UIMT_NONE, UIMT_ROOTENTRY, UIMT_QUERY, UIMT_QUERYRESULT, UIMT_PREVIEW }; MyType m_type; }; /** * A KIO slave to execute and display Recoll searches. * * Things are made a little complicated because KIO slaves can't hope * that their internal state will remain consistent with their user * application state: slaves die, are restarted, reused, at random * between requests. * In our case, this means that any request has to be processed * without reference to the last operation performed. Ie, if the * search parameters are not those from the last request, the search * must be restarted anew. This happens for example with different * searches in 2 konqueror screens: typically only one kio_slave will * be used. * The fact that we check if the search is the same as the last one, * to avoid restarting is an optimization, not the base mechanism * (contrary to what was initially assumed, and may have left a few * crumbs around). * * We have two modes of operation, one based on html forms and result * pages, which can potentially be developped to the full Recoll * functionality, and one based on a directory listing model, which * will always be more limited, but may be useful in some cases to * allow easy copying of files etc. Which one is in use is decided by * the form of the URL. */ class RecollProtocol : public KIO::SlaveBase { public: RecollProtocol(const QByteArray& pool, const QByteArray& app); virtual ~RecollProtocol(); virtual void mimetype(const QUrl& url); virtual void get(const QUrl& url); // The directory mode is not available with KDE 4.0, I could find // no way to avoid crashing kdirmodel virtual void stat(const QUrl& url); virtual void listDir(const QUrl& url); static RclConfig *o_rclconfig; friend class RecollKioPager; friend class UrlIngester; private: bool maybeOpenDb(std::string& reason); bool URLToQuery(const QUrl& url, QString& q, QString& opt, int *page = 0); bool doSearch(const QueryDesc& qd); void searchPage(); void queryDetails(); std::string makeQueryUrl(int page, bool isdet = false); bool syncSearch(const QueryDesc& qd); void htmlDoSearch(const QueryDesc& qd); void showPreview(const Rcl::Doc& doc); bool isRecollResult(const QUrl& url, int *num, QString* q); bool m_initok; Rcl::Db *m_rcldb; std::string m_reason; bool m_alwaysdir; // english by default else env[RECOLL_KIO_STEMLANG] std::string m_stemlang; // Search state: because of how the KIO slaves are used / reused, // we can't be sure that the next request will be for the same // search, and we need to check and restart one if the data // changes. This is very wasteful but hopefully won't happen too // much in actual use. One possible workaround for some scenarios // (one slave several konqueror windows) would be to have a small // cache of recent searches kept open. RecollKioPager m_pager; std::shared_ptr m_source; // Note: page here is not used, current page always comes from m_pager. QueryDesc m_query; }; extern "C" { __attribute__((visibility("default"))) int kdemain(int argc, char **argv); } #endif // _RECOLL_H recoll-1.23.7/aspell/0000755000175000017500000000000013224670234011350 500000000000000recoll-1.23.7/aspell/rclaspell.h0000644000175000017500000000504013125637102013416 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLASPELL_H_INCLUDED_ #define _RCLASPELL_H_INCLUDED_ /* autoconfig.h must be included before this file */ #ifdef RCL_USE_ASPELL /** * Aspell speller interface class. * * Aspell is used to let the user find about spelling variations that may * exist in the document set for a given word. * A specific aspell dictionary is created out of all the terms in the * xapian index, and we then use it to expand a term to spelling neighbours. * We use the aspell C api for term expansion, but have * to execute the program to create dictionaries. */ #include #include #include "rclconfig.h" #include "rcldb.h" class AspellData; class Aspell { public: Aspell(const RclConfig *cnf); ~Aspell(); /** Check health */ bool ok() const; /** Find the aspell command and shared library, init function pointers */ bool init(std::string &reason); /** Build dictionary out of index term list. This is done at the end * of an indexing pass. */ bool buildDict(Rcl::Db &db, std::string &reason); /** Check that word is in dictionary. Note that this would mean * that the EXACT word is: aspell just does a lookup, no * grammatical, case or diacritics magic of any kind * * @return true if word in dic, false if not. reason.size() -> error */ bool check(const std::string& term, std::string& reason); /** Return a list of possible expansions for a given word */ bool suggest(Rcl::Db &db, const std::string& term, std::list &suggestions, std::string &reason); private: std::string dicPath(); const RclConfig *m_config; std::string m_lang; AspellData *m_data; bool make_speller(std::string& reason); }; #endif /* RCL_USE_ASPELL */ #endif /* _RCLASPELL_H_INCLUDED_ */ recoll-1.23.7/aspell/rclaspell.cpp0000644000175000017500000004261613125637102013763 00000000000000#ifndef TEST_RCLASPELL /* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H #include "autoconfig.h" #endif #ifdef RCL_USE_ASPELL #include #include #include #include #include ASPELL_INCLUDE #include "pathut.h" #include "execmd.h" #include "rclaspell.h" #include "log.h" #include "unacpp.h" using namespace std; // Just a place where we keep the Aspell library entry points together class AspellApi { public: struct AspellConfig *(*new_aspell_config)(); int (*aspell_config_replace)(struct AspellConfig *, const char * key, const char * value); struct AspellCanHaveError *(*new_aspell_speller)(struct AspellConfig *); void (*delete_aspell_config)(struct AspellConfig *); void (*delete_aspell_can_have_error)(struct AspellCanHaveError *); struct AspellSpeller * (*to_aspell_speller)(struct AspellCanHaveError *); struct AspellConfig * (*aspell_speller_config)(struct AspellSpeller *); const struct AspellWordList * (*aspell_speller_suggest) (struct AspellSpeller *, const char *, int); int (*aspell_speller_check)(struct AspellSpeller *, const char *, int); struct AspellStringEnumeration * (*aspell_word_list_elements) (const struct AspellWordList * ths); const char * (*aspell_string_enumeration_next) (struct AspellStringEnumeration * ths); void (*delete_aspell_string_enumeration)(struct AspellStringEnumeration *); const struct AspellError *(*aspell_error) (const struct AspellCanHaveError *); const char *(*aspell_error_message)(const struct AspellCanHaveError *); const char *(*aspell_speller_error_message)(const struct AspellSpeller *); void (*delete_aspell_speller)(struct AspellSpeller *); }; static AspellApi aapi; static std::mutex o_aapi_mutex; #define NMTOPTR(NM, TP) \ if ((aapi.NM = TP dlsym(m_data->m_handle, #NM)) == 0) { \ badnames += #NM + string(" "); \ } static const char *aspell_lib_suffixes[] = { ".so", ".so.15", ".so.16" }; static const unsigned int nlibsuffs = sizeof(aspell_lib_suffixes) / sizeof(char *); // Stuff that we don't wish to see in the .h (possible sysdeps, etc.) class AspellData { public: AspellData() : m_handle(0), m_speller(0) {} ~AspellData() { LOGDEB2("~AspellData\n" ); if (m_handle) { dlclose(m_handle); m_handle = 0; } if (m_speller) { // Dumps core if I do this?? //aapi.delete_aspell_speller(m_speller); m_speller = 0; LOGDEB2("~AspellData: speller done\n" ); } } void *m_handle; string m_exec; AspellSpeller *m_speller; }; Aspell::Aspell(const RclConfig *cnf) : m_config(cnf), m_data(0) { } Aspell::~Aspell() { deleteZ(m_data); } bool Aspell::init(string &reason) { std::unique_lock locker(o_aapi_mutex); deleteZ(m_data); // Language: we get this from the configuration, else from the NLS // environment. The aspell language names used for selecting language // definition files (used to create dictionaries) are like en, fr if (!m_config->getConfParam("aspellLanguage", m_lang) || m_lang.empty()) { string lang = "en"; const char *cp; if ((cp = getenv("LC_ALL"))) lang = cp; else if ((cp = getenv("LANG"))) lang = cp; if (!lang.compare("C")) lang = "en"; m_lang = lang.substr(0, lang.find_first_of("_")); if (!m_lang.compare("ja")) { // Aspell has no support for Japanese. We substitute // english, as Japanese users often have texts with // interspersed english words or english texts. Japanese // parts of the text won't be sent to aspell (check // Rcl::Db::isSpellingCandidate()) m_lang = "en"; } } m_data = new AspellData; const char *aspell_prog_from_env = getenv("ASPELL_PROG"); if (aspell_prog_from_env && access(aspell_prog_from_env, X_OK) == 0) { m_data->m_exec = aspell_prog_from_env; #ifdef ASPELL_PROG } else if (access(ASPELL_PROG, X_OK) == 0) { m_data->m_exec = ASPELL_PROG; #endif // ASPELL_PROG } else { ExecCmd::which("aspell", m_data->m_exec); } if (m_data->m_exec.empty()) { reason = "aspell program not found or not executable"; deleteZ(m_data); return false; } reason = "Could not open shared library "; string libbase("libaspell"); string lib; for (unsigned int i = 0; i < nlibsuffs; i++) { lib = libbase + aspell_lib_suffixes[i]; reason += string("[") + lib + "] "; if ((m_data->m_handle = dlopen(lib.c_str(), RTLD_LAZY)) != 0) { reason.erase(); goto found; } } found: if (m_data->m_handle == 0) { reason += string(" : ") + dlerror(); deleteZ(m_data); return false; } string badnames; NMTOPTR(new_aspell_config, (struct AspellConfig *(*)())); NMTOPTR(aspell_config_replace, (int (*)(struct AspellConfig *, const char *, const char *))); NMTOPTR(new_aspell_speller, (struct AspellCanHaveError *(*)(struct AspellConfig *))); NMTOPTR(delete_aspell_config, (void (*)(struct AspellConfig *))); NMTOPTR(delete_aspell_can_have_error, (void (*)(struct AspellCanHaveError *))); NMTOPTR(to_aspell_speller, (struct AspellSpeller *(*)(struct AspellCanHaveError *))); NMTOPTR(aspell_speller_config, (struct AspellConfig *(*)(struct AspellSpeller *))); NMTOPTR(aspell_speller_suggest, (const struct AspellWordList *(*)(struct AspellSpeller *, const char *, int))); NMTOPTR(aspell_speller_check, (int (*)(struct AspellSpeller *, const char *, int))); NMTOPTR(aspell_word_list_elements, (struct AspellStringEnumeration *(*) (const struct AspellWordList *))); NMTOPTR(aspell_string_enumeration_next, (const char * (*)(struct AspellStringEnumeration *))); NMTOPTR(delete_aspell_string_enumeration, (void (*)(struct AspellStringEnumeration *))); NMTOPTR(aspell_error, (const struct AspellError*(*)(const struct AspellCanHaveError *))); NMTOPTR(aspell_error_message, (const char *(*)(const struct AspellCanHaveError *))); NMTOPTR(aspell_speller_error_message, (const char *(*)(const struct AspellSpeller *))); NMTOPTR(delete_aspell_speller, (void (*)(struct AspellSpeller *))); if (!badnames.empty()) { reason = string("Aspell::init: symbols not found:") + badnames; deleteZ(m_data); return false; } return true; } bool Aspell::ok() const { return m_data != 0 && m_data->m_handle != 0; } string Aspell::dicPath() { string ccdir = m_config->getAspellcacheDir(); return path_cat(ccdir, string("aspdict.") + m_lang + string(".rws")); } // The data source for the create dictionary aspell command. We walk // the term list, filtering out things that are probably not words. // Note that the manual for the current version (0.60) of aspell // states that utf-8 is not well supported, so that we should maybe // also filter all 8bit chars. Info is contradictory, so we only // filter out CJK which is definitely not supported (katakana would // make sense though, but currently no support). class AspExecPv : public ExecCmdProvide { public: string *m_input; // pointer to string used as input buffer to command Rcl::TermIter *m_tit; Rcl::Db &m_db; AspExecPv(string *i, Rcl::TermIter *tit, Rcl::Db &db) : m_input(i), m_tit(tit), m_db(db) {} void newData() { while (m_db.termWalkNext(m_tit, *m_input)) { LOGDEB2("Aspell::buildDict: term: [" << (m_input) << "]\n" ); if (!Rcl::Db::isSpellingCandidate(*m_input)) { LOGDEB2("Aspell::buildDict: SKIP\n" ); continue; } if (!o_index_stripchars) { string lower; if (!unacmaybefold(*m_input, lower, "UTF-8", UNACOP_FOLD)) continue; m_input->swap(lower); } // Got a non-empty sort-of appropriate term, let's send it to // aspell LOGDEB2("Apell::buildDict: SEND\n" ); m_input->append("\n"); return; } // End of data. Tell so. Exec will close cmd. m_input->erase(); } }; bool Aspell::buildDict(Rcl::Db &db, string &reason) { if (!ok()) return false; string addCreateParam; m_config->getConfParam("aspellAddCreateParam", addCreateParam); // We create the dictionary by executing the aspell command: // aspell --lang=[lang] create master [dictApath] string cmdstring(m_data->m_exec); ExecCmd aspell; vector args; args.push_back(string("--lang=")+ m_lang); cmdstring += string(" ") + string("--lang=") + m_lang; args.push_back("--encoding=utf-8"); cmdstring += string(" ") + "--encoding=utf-8"; if (!addCreateParam.empty()) { args.push_back(addCreateParam); cmdstring += string(" ") + addCreateParam; } args.push_back("create"); cmdstring += string(" ") + "create"; args.push_back("master"); cmdstring += string(" ") + "master"; args.push_back(dicPath()); cmdstring += string(" ") + dicPath(); // Have to disable stderr, as numerous messages about bad strings are // printed. We'd like to keep errors about missing databases though, so // make it configurable for diags bool keepStderr = false; m_config->getConfParam("aspellKeepStderr", &keepStderr); if (!keepStderr) aspell.setStderr("/dev/null"); Rcl::TermIter *tit = db.termWalkOpen(); if (tit == 0) { reason = "termWalkOpen failed\n"; return false; } string termbuf; AspExecPv pv(&termbuf, tit, db); aspell.setProvide(&pv); if (aspell.doexec(m_data->m_exec, args, &termbuf)) { ExecCmd cmd; args.clear(); args.push_back("dicts"); string dicts; bool hasdict = false; if (cmd.doexec(m_data->m_exec, args, 0, &dicts)) { vector vdicts; stringToTokens(dicts, vdicts, "\n\r\t "); if (find(vdicts.begin(), vdicts.end(), m_lang) != vdicts.end()) { hasdict = true; } } if (hasdict) reason = string( "\naspell dictionary creation command [") + cmdstring + string("] failed. Reason unknown.\n" "Try to set aspellKeepStderr = 1 in recoll.conf, and execute \n" "the indexing command in a terminal to see the aspell " "diagnostic output.\n"); else reason = string("aspell dictionary creation command failed:\n") + cmdstring + "\n" "One possible reason might be missing language " "data files for lang = " + m_lang + ". Maybe try to execute the command by hand for a better diag."; return false; } db.termWalkClose(tit); return true; } bool Aspell::make_speller(string& reason) { if (!ok()) return false; if (m_data->m_speller != 0) return true; AspellCanHaveError *ret; AspellConfig *config = aapi.new_aspell_config(); aapi.aspell_config_replace(config, "lang", m_lang.c_str()); aapi.aspell_config_replace(config, "encoding", "utf-8"); aapi.aspell_config_replace(config, "master", dicPath().c_str()); aapi.aspell_config_replace(config, "sug-mode", "fast"); // aapi.aspell_config_replace(config, "sug-edit-dist", "2"); ret = aapi.new_aspell_speller(config); aapi.delete_aspell_config(config); if (aapi.aspell_error(ret) != 0) { reason = aapi.aspell_error_message(ret); aapi.delete_aspell_can_have_error(ret); return false; } m_data->m_speller = aapi.to_aspell_speller(ret); return true; } bool Aspell::check(const string &iterm, string& reason) { LOGDEB("Aspell::check [" << iterm << "]\n"); string mterm(iterm); if (!Rcl::Db::isSpellingCandidate(mterm)) { LOGDEB0("Aspell::check: [" << mterm << " not spelling candidate, return true\n"); return true; } if (!ok() || !make_speller(reason)) return false; if (iterm.empty()) return true; //?? if (!o_index_stripchars) { string lower; if (!unacmaybefold(mterm, lower, "UTF-8", UNACOP_FOLD)) { LOGERR("Aspell::check: cant lowercase input\n"); return false; } mterm.swap(lower); } int ret = aapi.aspell_speller_check(m_data->m_speller, mterm.c_str(), mterm.length()); reason.clear(); switch (ret) { case 0: return false; case 1: return true; default: case -1: reason.append("Aspell error: "); reason.append(aapi.aspell_speller_error_message(m_data->m_speller)); return false; } } bool Aspell::suggest(Rcl::Db &db, const string &_term, list& suggestions, string& reason) { LOGDEB("Aspell::suggest: term [" << _term << "]\n"); if (!ok() || !make_speller(reason)) return false; string mterm(_term); if (mterm.empty()) return true; //?? if (!Rcl::Db::isSpellingCandidate(mterm)) { LOGDEB0("Aspell::suggest: [" << mterm << " not spelling candidate, return empty/true\n"); return true; } if (!o_index_stripchars) { string lower; if (!unacmaybefold(mterm, lower, "UTF-8", UNACOP_FOLD)) { LOGERR("Aspell::check : cant lowercase input\n"); return false; } mterm.swap(lower); } AspellCanHaveError *ret; const AspellWordList *wl = aapi.aspell_speller_suggest(m_data->m_speller, mterm.c_str(), mterm.length()); if (wl == 0) { reason = aapi.aspell_speller_error_message(m_data->m_speller); return false; } AspellStringEnumeration *els = aapi.aspell_word_list_elements(wl); const char *word; while ((word = aapi.aspell_string_enumeration_next(els)) != 0) { LOGDEB0("Aspell::suggest: got [" << word << "]\n"); // Check that the word exists in the index (we don't want // aspell computed stuff, only exact terms from the // dictionary). We used to also check that it stems // differently from the base word but this is complicated // (stemming on/off + language), so we now leave this to the // caller. if (db.termExists(word)) suggestions.push_back(word); } aapi.delete_aspell_string_enumeration(els); return true; } #endif // RCL_USE_ASPELL #else // TEST_RCLASPELL test driver -> #ifdef HAVE_CONFIG_H #include "autoconfig.h" #endif #ifdef RCL_USE_ASPELL #include #include #include #include #include #include using namespace std; #include "rclinit.h" #include "rclconfig.h" #include "rcldb.h" #include "rclaspell.h" static char *thisprog; RclConfig *rclconfig; static char usage [] = " -b : build dictionary\n" " -s : suggestions for term\n" " -c : check term\n" "\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_s 0x2 #define OPT_b 0x4 #define OPT_c 0x8 int main(int argc, char **argv) { string word; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'b': op_flags |= OPT_b; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); word = *(++argv); argc--; goto b1; case 's': op_flags |= OPT_s; if (argc < 2) Usage(); word = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0 || op_flags == 0) Usage(); string reason; rclconfig = recollinit(0, 0, reason); if (!rclconfig || !rclconfig->ok()) { fprintf(stderr, "Configuration problem: %s\n", reason.c_str()); exit(1); } string dbdir = rclconfig->getDbDir(); if (dbdir.empty()) { fprintf(stderr, "No db directory in configuration"); exit(1); } Rcl::Db rcldb(rclconfig); if (!rcldb.open(Rcl::Db::DbRO, 0)) { fprintf(stderr, "Could not open database in %s\n", dbdir.c_str()); exit(1); } Aspell aspell(rclconfig); if (!aspell.init(reason)) { cerr << "Init failed: " << reason << endl; exit(1); } if (op_flags & OPT_b) { if (!aspell.buildDict(rcldb, reason)) { cerr << "buildDict failed: " << reason << endl; exit(1); } } else if (op_flags & OPT_c) { bool ret = aspell.check(word, reason); if (!ret && reason.size()) { cerr << "Aspell error: " << reason << endl; return 1; } cout << word; if (ret) { cout << " is in dictionary" << endl; } else { cout << " not in dictionary" << endl; } } else { list suggs; if (!aspell.suggest(rcldb, word, suggs, reason)) { cerr << "suggest failed: " << reason << endl; exit(1); } cout << "Suggestions for " << word << ":" << endl; for (list::iterator it = suggs.begin(); it != suggs.end(); it++) { cout << *it << endl; } } exit(0); } #else int main(int argc, char **argv) {return 1;} #endif // RCL_USE_ASPELL #endif // TEST_RCLASPELL test driver recoll-1.23.7/aspell/aspell-local.h0000644000175000017500000006320013125527323014012 00000000000000/* Automatically generated file. Do not edit directly. */ /* This file is part of The New Aspell * Copyright (C) 2001-2002 by Kevin Atkinson under the GNU LGPL * license version 2.0 or 2.1. You should have received a copy of the * LGPL license along with this library if you did not you can find it * at http://www.gnu.org/. */ #ifndef ASPELL_ASPELL__H #define ASPELL_ASPELL__H #ifdef __cplusplus extern "C" { #endif /******************************* type id *******************************/ union AspellTypeId { unsigned int num; char str[4]; }; typedef union AspellTypeId AspellTypeId; /************************** mutable container **************************/ typedef struct AspellMutableContainer AspellMutableContainer; int aspell_mutable_container_add(struct AspellMutableContainer * ths, const char * to_add); int aspell_mutable_container_remove(struct AspellMutableContainer * ths, const char * to_rem); void aspell_mutable_container_clear(struct AspellMutableContainer * ths); struct AspellMutableContainer * aspell_mutable_container_to_mutable_container(struct AspellMutableContainer * ths); /******************************* key info *******************************/ enum AspellKeyInfoType {AspellKeyInfoString, AspellKeyInfoInt, AspellKeyInfoBool, AspellKeyInfoList}; typedef enum AspellKeyInfoType AspellKeyInfoType; struct AspellKeyInfo { /* The name of the key. */ const char * name; /* The key type. */ enum AspellKeyInfoType type; /* The default value of the key. */ const char * def; /* A brief description of the key or NULL if internal value. */ const char * desc; int flags; int other_data; }; typedef struct AspellKeyInfo AspellKeyInfo; /******************************** config ********************************/ typedef struct AspellKeyInfoEnumeration AspellKeyInfoEnumeration; int aspell_key_info_enumeration_at_end(const struct AspellKeyInfoEnumeration * ths); const struct AspellKeyInfo * aspell_key_info_enumeration_next(struct AspellKeyInfoEnumeration * ths); void delete_aspell_key_info_enumeration(struct AspellKeyInfoEnumeration * ths); struct AspellKeyInfoEnumeration * aspell_key_info_enumeration_clone(const struct AspellKeyInfoEnumeration * ths); void aspell_key_info_enumeration_assign(struct AspellKeyInfoEnumeration * ths, const struct AspellKeyInfoEnumeration * other); typedef struct AspellConfig AspellConfig; struct AspellConfig * new_aspell_config(); void delete_aspell_config(struct AspellConfig * ths); struct AspellConfig * aspell_config_clone(const struct AspellConfig * ths); void aspell_config_assign(struct AspellConfig * ths, const struct AspellConfig * other); unsigned int aspell_config_error_number(const struct AspellConfig * ths); const char * aspell_config_error_message(const struct AspellConfig * ths); const struct AspellError * aspell_config_error(const struct AspellConfig * ths); /* Sets extra keys which this config class should * accept. begin and end are expected to point to * the beginning and ending of an array of Aspell * Key Info. */ void aspell_config_set_extra(struct AspellConfig * ths, const struct AspellKeyInfo * begin, const struct AspellKeyInfo * end); /* Returns the KeyInfo object for the * corresponding key or returns NULL and sets * error_num to PERROR_UNKNOWN_KEY if the key is * not valid. The pointer returned is valid for * the lifetime of the object. */ const struct AspellKeyInfo * aspell_config_keyinfo(struct AspellConfig * ths, const char * key); /* Returns a newly allocated enumeration of all * the possible objects this config class uses. */ struct AspellKeyInfoEnumeration * aspell_config_possible_elements(struct AspellConfig * ths, int include_extra); /* Returns the default value for given key which * may involve substituting variables, thus it is * not the same as keyinfo(key)->def returns NULL * and sets error_num to PERROR_UNKNOWN_KEY if * the key is not valid. Uses the temporary * string. */ const char * aspell_config_get_default(struct AspellConfig * ths, const char * key); /* Returns a newly allocated enumeration of all * the key/value pairs. This DOES not include ones * which are set to their default values. */ struct AspellStringPairEnumeration * aspell_config_elements(struct AspellConfig * ths); /* Inserts an item, if the item already exists it * will be replaced. Returns TRUE if it succeeded * or FALSE on error. If the key in not valid it * sets error_num to PERROR_UNKNOWN_KEY, if the * value is not valid it will set error_num to * PERROR_BAD_VALUE, if the value can not be * changed it sets error_num to * PERROR_CANT_CHANGE_VALUE, and if the value is * a list and you are trying to set its directory, * it sets error_num to PERROR_LIST_SET */ int aspell_config_replace(struct AspellConfig * ths, const char * key, const char * value); /* Remove a key and returns TRUE if it exists * otherwise return FALSE. This effectively sets * the key to its default value. Calling replace * with a value of "" will also call * remove. If the key does not exist then it sets * error_num to 0 or PERROR_NOT, if the key is * not valid then it sets error_num to * PERROR_UNKNOWN_KEY, if the value can not be * changed then it sets error_num to * PERROR_CANT_CHANGE_VALUE */ int aspell_config_remove(struct AspellConfig * ths, const char * key); int aspell_config_have(const struct AspellConfig * ths, const char * key); /* Returns NULL on error. */ const char * aspell_config_retrieve(struct AspellConfig * ths, const char * key); int aspell_config_retrieve_list(struct AspellConfig * ths, const char * key, struct AspellMutableContainer * lst); /* Return -1 on error, 0 if false, 1 if true. */ int aspell_config_retrieve_bool(struct AspellConfig * ths, const char * key); /* Return -1 on error. */ int aspell_config_retrieve_int(struct AspellConfig * ths, const char * key); /******************************** error ********************************/ struct AspellError { const char * mesg; const struct AspellErrorInfo * err; }; typedef struct AspellError AspellError; int aspell_error_is_a(const struct AspellError * ths, const struct AspellErrorInfo * e); struct AspellErrorInfo { const struct AspellErrorInfo * isa; const char * mesg; unsigned int num_parms; const char * parms[3]; }; typedef struct AspellErrorInfo AspellErrorInfo; /**************************** can have error ****************************/ typedef struct AspellCanHaveError AspellCanHaveError; unsigned int aspell_error_number(const struct AspellCanHaveError * ths); const char * aspell_error_message(const struct AspellCanHaveError * ths); const struct AspellError * aspell_error(const struct AspellCanHaveError * ths); void delete_aspell_can_have_error(struct AspellCanHaveError * ths); /******************************** errors ********************************/ extern const struct AspellErrorInfo * const aerror_other; extern const struct AspellErrorInfo * const aerror_operation_not_supported; extern const struct AspellErrorInfo * const aerror_cant_copy; extern const struct AspellErrorInfo * const aerror_unimplemented_method; extern const struct AspellErrorInfo * const aerror_file; extern const struct AspellErrorInfo * const aerror_cant_open_file; extern const struct AspellErrorInfo * const aerror_cant_read_file; extern const struct AspellErrorInfo * const aerror_cant_write_file; extern const struct AspellErrorInfo * const aerror_invalid_name; extern const struct AspellErrorInfo * const aerror_bad_file_format; extern const struct AspellErrorInfo * const aerror_dir; extern const struct AspellErrorInfo * const aerror_cant_read_dir; extern const struct AspellErrorInfo * const aerror_config; extern const struct AspellErrorInfo * const aerror_unknown_key; extern const struct AspellErrorInfo * const aerror_cant_change_value; extern const struct AspellErrorInfo * const aerror_bad_key; extern const struct AspellErrorInfo * const aerror_bad_value; extern const struct AspellErrorInfo * const aerror_duplicate; extern const struct AspellErrorInfo * const aerror_key_not_string; extern const struct AspellErrorInfo * const aerror_key_not_int; extern const struct AspellErrorInfo * const aerror_key_not_bool; extern const struct AspellErrorInfo * const aerror_key_not_list; extern const struct AspellErrorInfo * const aerror_no_value_reset; extern const struct AspellErrorInfo * const aerror_no_value_enable; extern const struct AspellErrorInfo * const aerror_no_value_disable; extern const struct AspellErrorInfo * const aerror_no_value_clear; extern const struct AspellErrorInfo * const aerror_language_related; extern const struct AspellErrorInfo * const aerror_unknown_language; extern const struct AspellErrorInfo * const aerror_unknown_soundslike; extern const struct AspellErrorInfo * const aerror_language_not_supported; extern const struct AspellErrorInfo * const aerror_no_wordlist_for_lang; extern const struct AspellErrorInfo * const aerror_mismatched_language; extern const struct AspellErrorInfo * const aerror_affix; extern const struct AspellErrorInfo * const aerror_corrupt_affix; extern const struct AspellErrorInfo * const aerror_invalid_cond; extern const struct AspellErrorInfo * const aerror_invalid_cond_strip; extern const struct AspellErrorInfo * const aerror_incorrect_encoding; extern const struct AspellErrorInfo * const aerror_encoding; extern const struct AspellErrorInfo * const aerror_unknown_encoding; extern const struct AspellErrorInfo * const aerror_encoding_not_supported; extern const struct AspellErrorInfo * const aerror_conversion_not_supported; extern const struct AspellErrorInfo * const aerror_pipe; extern const struct AspellErrorInfo * const aerror_cant_create_pipe; extern const struct AspellErrorInfo * const aerror_process_died; extern const struct AspellErrorInfo * const aerror_bad_input; extern const struct AspellErrorInfo * const aerror_invalid_string; extern const struct AspellErrorInfo * const aerror_invalid_word; extern const struct AspellErrorInfo * const aerror_invalid_affix; extern const struct AspellErrorInfo * const aerror_inapplicable_affix; extern const struct AspellErrorInfo * const aerror_unknown_unichar; extern const struct AspellErrorInfo * const aerror_word_list_flags; extern const struct AspellErrorInfo * const aerror_invalid_flag; extern const struct AspellErrorInfo * const aerror_conflicting_flags; extern const struct AspellErrorInfo * const aerror_version_control; extern const struct AspellErrorInfo * const aerror_bad_version_string; extern const struct AspellErrorInfo * const aerror_filter; extern const struct AspellErrorInfo * const aerror_cant_dlopen_file; extern const struct AspellErrorInfo * const aerror_empty_filter; extern const struct AspellErrorInfo * const aerror_no_such_filter; extern const struct AspellErrorInfo * const aerror_confusing_version; extern const struct AspellErrorInfo * const aerror_bad_version; extern const struct AspellErrorInfo * const aerror_identical_option; extern const struct AspellErrorInfo * const aerror_options_only; extern const struct AspellErrorInfo * const aerror_invalid_option_modifier; extern const struct AspellErrorInfo * const aerror_cant_describe_filter; extern const struct AspellErrorInfo * const aerror_filter_mode_file; extern const struct AspellErrorInfo * const aerror_mode_option_name; extern const struct AspellErrorInfo * const aerror_no_filter_to_option; extern const struct AspellErrorInfo * const aerror_bad_mode_key; extern const struct AspellErrorInfo * const aerror_expect_mode_key; extern const struct AspellErrorInfo * const aerror_mode_version_requirement; extern const struct AspellErrorInfo * const aerror_confusing_mode_version; extern const struct AspellErrorInfo * const aerror_bad_mode_version; extern const struct AspellErrorInfo * const aerror_missing_magic_expression; extern const struct AspellErrorInfo * const aerror_empty_file_ext; extern const struct AspellErrorInfo * const aerror_filter_mode_expand; extern const struct AspellErrorInfo * const aerror_unknown_mode; extern const struct AspellErrorInfo * const aerror_mode_extend_expand; extern const struct AspellErrorInfo * const aerror_filter_mode_magic; extern const struct AspellErrorInfo * const aerror_file_magic_pos; extern const struct AspellErrorInfo * const aerror_file_magic_range; extern const struct AspellErrorInfo * const aerror_missing_magic; extern const struct AspellErrorInfo * const aerror_bad_magic; extern const struct AspellErrorInfo * const aerror_expression; extern const struct AspellErrorInfo * const aerror_invalid_expression; /******************************* speller *******************************/ typedef struct AspellSpeller AspellSpeller; struct AspellCanHaveError * new_aspell_speller(struct AspellConfig * config); struct AspellSpeller * to_aspell_speller(struct AspellCanHaveError * obj); void delete_aspell_speller(struct AspellSpeller * ths); unsigned int aspell_speller_error_number(const struct AspellSpeller * ths); const char * aspell_speller_error_message(const struct AspellSpeller * ths); const struct AspellError * aspell_speller_error(const struct AspellSpeller * ths); struct AspellConfig * aspell_speller_config(struct AspellSpeller * ths); /* Returns 0 if it is not in the dictionary, * 1 if it is, or -1 on error. */ int aspell_speller_check(struct AspellSpeller * ths, const char * word, int word_size); /* Add this word to your own personal word list. */ int aspell_speller_add_to_personal(struct AspellSpeller * ths, const char * word, int word_size); /* Add this word to the current spelling session. */ int aspell_speller_add_to_session(struct AspellSpeller * ths, const char * word, int word_size); /* This is your own personal word list file plus * any extra words added during this session to * your own personal word list. */ const struct AspellWordList * aspell_speller_personal_word_list(struct AspellSpeller * ths); /* This is a list of words added to this session * that are not in the main word list or in your * own personal list but are considered valid for * this spelling session. */ const struct AspellWordList * aspell_speller_session_word_list(struct AspellSpeller * ths); /* This is the main list of words used during this * spelling session. */ const struct AspellWordList * aspell_speller_main_word_list(struct AspellSpeller * ths); int aspell_speller_save_all_word_lists(struct AspellSpeller * ths); int aspell_speller_clear_session(struct AspellSpeller * ths); /* Return NULL on error. * The word list returned by suggest is only * valid until the next call to suggest. */ const struct AspellWordList * aspell_speller_suggest(struct AspellSpeller * ths, const char * word, int word_size); int aspell_speller_store_replacement(struct AspellSpeller * ths, const char * mis, int mis_size, const char * cor, int cor_size); /******************************** filter ********************************/ typedef struct AspellFilter AspellFilter; void delete_aspell_filter(struct AspellFilter * ths); unsigned int aspell_filter_error_number(const struct AspellFilter * ths); const char * aspell_filter_error_message(const struct AspellFilter * ths); const struct AspellError * aspell_filter_error(const struct AspellFilter * ths); struct AspellFilter * to_aspell_filter(struct AspellCanHaveError * obj); /*************************** document checker ***************************/ struct AspellToken { unsigned int offset; unsigned int len; }; typedef struct AspellToken AspellToken; typedef struct AspellDocumentChecker AspellDocumentChecker; void delete_aspell_document_checker(struct AspellDocumentChecker * ths); unsigned int aspell_document_checker_error_number(const struct AspellDocumentChecker * ths); const char * aspell_document_checker_error_message(const struct AspellDocumentChecker * ths); const struct AspellError * aspell_document_checker_error(const struct AspellDocumentChecker * ths); /* Creates a new document checker. * The speller class is expected to last until * this class is destroyed. * If config is given it will be used to override * any relevent options set by this speller class. * The config class is not once this function is done. * If filter is given then it will take ownership of * the filter class and use it to do the filtering. * You are expected to free the checker when done. */ struct AspellCanHaveError * new_aspell_document_checker(struct AspellSpeller * speller); struct AspellDocumentChecker * to_aspell_document_checker(struct AspellCanHaveError * obj); /* Reset the internal state of the filter. * Should be called whenever a new document is * being filtered. */ void aspell_document_checker_reset(struct AspellDocumentChecker * ths); /* Process a string. * The string passed in should only be split on * white space characters. Furthermore, between * calls to reset, each string should be passed * in exactly once and in the order they appeared * in the document. Passing in strings out of * order, skipping strings or passing them in * more than once may lead to undefined results. */ void aspell_document_checker_process(struct AspellDocumentChecker * ths, const char * str, int size); /* Returns the next misspelled word in the * processed string. If there are no more * misspelled words, then token.word will be * NULL and token.size will be 0 */ struct AspellToken aspell_document_checker_next_misspelling(struct AspellDocumentChecker * ths); /* Returns the underlying filter class. */ struct AspellFilter * aspell_document_checker_filter(struct AspellDocumentChecker * ths); /****************************** word list ******************************/ typedef struct AspellWordList AspellWordList; int aspell_word_list_empty(const struct AspellWordList * ths); unsigned int aspell_word_list_size(const struct AspellWordList * ths); struct AspellStringEnumeration * aspell_word_list_elements(const struct AspellWordList * ths); /************************** string enumeration **************************/ typedef struct AspellStringEnumeration AspellStringEnumeration; void delete_aspell_string_enumeration(struct AspellStringEnumeration * ths); struct AspellStringEnumeration * aspell_string_enumeration_clone(const struct AspellStringEnumeration * ths); void aspell_string_enumeration_assign(struct AspellStringEnumeration * ths, const struct AspellStringEnumeration * other); int aspell_string_enumeration_at_end(const struct AspellStringEnumeration * ths); const char * aspell_string_enumeration_next(struct AspellStringEnumeration * ths); /********************************* info *********************************/ struct AspellModuleInfo { const char * name; double order_num; const char * lib_dir; struct AspellStringList * dict_dirs; struct AspellStringList * dict_exts; }; typedef struct AspellModuleInfo AspellModuleInfo; struct AspellDictInfo { /* The Name to identify this dictionary by. */ const char * name; /* The language code to identify this dictionary. * A two letter UPPER-CASE ISO 639 language code * and an optional two letter ISO 3166 country * code after a dash or underscore. */ const char * code; /* Any extra information to distinguish this * variety of dictionary from other dictionaries * which may have the same language and size. */ const char * jargon; int size; /* A two char digit code describing the size of * the dictionary: 10=tiny, 20=really small, * 30=small, 40=med-small, 50=med, 60=med-large, * 70=large, 80=huge, 90=insane. Please check * the README in aspell-lang-200?????.tar.bz2 or * see SCOWL (http://wordlist.sourceforge.net) * for an example of how these sizes are used. */ const char * size_str; struct AspellModuleInfo * module; }; typedef struct AspellDictInfo AspellDictInfo; typedef struct AspellModuleInfoList AspellModuleInfoList; struct AspellModuleInfoList * get_aspell_module_info_list(struct AspellConfig * config); int aspell_module_info_list_empty(const struct AspellModuleInfoList * ths); unsigned int aspell_module_info_list_size(const struct AspellModuleInfoList * ths); struct AspellModuleInfoEnumeration * aspell_module_info_list_elements(const struct AspellModuleInfoList * ths); typedef struct AspellDictInfoList AspellDictInfoList; struct AspellDictInfoList * get_aspell_dict_info_list(struct AspellConfig * config); int aspell_dict_info_list_empty(const struct AspellDictInfoList * ths); unsigned int aspell_dict_info_list_size(const struct AspellDictInfoList * ths); struct AspellDictInfoEnumeration * aspell_dict_info_list_elements(const struct AspellDictInfoList * ths); typedef struct AspellModuleInfoEnumeration AspellModuleInfoEnumeration; int aspell_module_info_enumeration_at_end(const struct AspellModuleInfoEnumeration * ths); const struct AspellModuleInfo * aspell_module_info_enumeration_next(struct AspellModuleInfoEnumeration * ths); void delete_aspell_module_info_enumeration(struct AspellModuleInfoEnumeration * ths); struct AspellModuleInfoEnumeration * aspell_module_info_enumeration_clone(const struct AspellModuleInfoEnumeration * ths); void aspell_module_info_enumeration_assign(struct AspellModuleInfoEnumeration * ths, const struct AspellModuleInfoEnumeration * other); typedef struct AspellDictInfoEnumeration AspellDictInfoEnumeration; int aspell_dict_info_enumeration_at_end(const struct AspellDictInfoEnumeration * ths); const struct AspellDictInfo * aspell_dict_info_enumeration_next(struct AspellDictInfoEnumeration * ths); void delete_aspell_dict_info_enumeration(struct AspellDictInfoEnumeration * ths); struct AspellDictInfoEnumeration * aspell_dict_info_enumeration_clone(const struct AspellDictInfoEnumeration * ths); void aspell_dict_info_enumeration_assign(struct AspellDictInfoEnumeration * ths, const struct AspellDictInfoEnumeration * other); /***************************** string list *****************************/ typedef struct AspellStringList AspellStringList; struct AspellStringList * new_aspell_string_list(); int aspell_string_list_empty(const struct AspellStringList * ths); unsigned int aspell_string_list_size(const struct AspellStringList * ths); struct AspellStringEnumeration * aspell_string_list_elements(const struct AspellStringList * ths); int aspell_string_list_add(struct AspellStringList * ths, const char * to_add); int aspell_string_list_remove(struct AspellStringList * ths, const char * to_rem); void aspell_string_list_clear(struct AspellStringList * ths); struct AspellMutableContainer * aspell_string_list_to_mutable_container(struct AspellStringList * ths); void delete_aspell_string_list(struct AspellStringList * ths); struct AspellStringList * aspell_string_list_clone(const struct AspellStringList * ths); void aspell_string_list_assign(struct AspellStringList * ths, const struct AspellStringList * other); /****************************** string map ******************************/ typedef struct AspellStringMap AspellStringMap; struct AspellStringMap * new_aspell_string_map(); int aspell_string_map_add(struct AspellStringMap * ths, const char * to_add); int aspell_string_map_remove(struct AspellStringMap * ths, const char * to_rem); void aspell_string_map_clear(struct AspellStringMap * ths); struct AspellMutableContainer * aspell_string_map_to_mutable_container(struct AspellStringMap * ths); void delete_aspell_string_map(struct AspellStringMap * ths); struct AspellStringMap * aspell_string_map_clone(const struct AspellStringMap * ths); void aspell_string_map_assign(struct AspellStringMap * ths, const struct AspellStringMap * other); int aspell_string_map_empty(const struct AspellStringMap * ths); unsigned int aspell_string_map_size(const struct AspellStringMap * ths); struct AspellStringPairEnumeration * aspell_string_map_elements(const struct AspellStringMap * ths); /* Insert a new element. * Will NOT overwrite an existing entry. * Returns FALSE if the element already exists. */ int aspell_string_map_insert(struct AspellStringMap * ths, const char * key, const char * value); /* Insert a new element. * Will overwrite an existing entry. * Always returns TRUE. */ int aspell_string_map_replace(struct AspellStringMap * ths, const char * key, const char * value); /* Looks up an element and returns the value. * Returns NULL if the element does not exist. * Returns an empty string if the element exists * but has a NULL value. */ const char * aspell_string_map_lookup(const struct AspellStringMap * ths, const char * key); /***************************** string pair *****************************/ struct AspellStringPair { const char * first; const char * second; }; typedef struct AspellStringPair AspellStringPair; /*********************** string pair enumeration ***********************/ typedef struct AspellStringPairEnumeration AspellStringPairEnumeration; int aspell_string_pair_enumeration_at_end(const struct AspellStringPairEnumeration * ths); struct AspellStringPair aspell_string_pair_enumeration_next(struct AspellStringPairEnumeration * ths); void delete_aspell_string_pair_enumeration(struct AspellStringPairEnumeration * ths); struct AspellStringPairEnumeration * aspell_string_pair_enumeration_clone(const struct AspellStringPairEnumeration * ths); void aspell_string_pair_enumeration_assign(struct AspellStringPairEnumeration * ths, const struct AspellStringPairEnumeration * other); /******************************** cache ********************************/ /* Reset the global cache(s) so that cache queries will * create a new object. If existing objects are still in * use they are not deleted. If which is NULL then all * caches will be reset. Current caches are "encode", * "decode", "dictionary", "language", and "keyboard". */ int aspell_reset_cache(const char * which); #ifdef __cplusplus } #endif #endif /* ASPELL_ASPELL__H */ recoll-1.23.7/bincimapmime/0000755000175000017500000000000013224670235012523 500000000000000recoll-1.23.7/bincimapmime/mime-parseonlyheader.cc0000644000175000017500000001013113125527323017057 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * mime-parseonlyheader.cc * * Description: * Implementation of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #include "mime.h" #include "mime-utils.h" #include "mime-inputsource.h" #include "convert.h" #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace ::std; #endif /* NO_NAMESPACES */ //------------------------------------------------------------------------ void Binc::MimeDocument::parseOnlyHeader(int fd) { if (allIsParsed || headerIsParsed) return; headerIsParsed = true; delete doc_mimeSource; doc_mimeSource = new MimeInputSource(fd); headerstartoffsetcrlf = 0; headerlength = 0; bodystartoffsetcrlf = 0; bodylength = 0; messagerfc822 = false; multipart = false; nlines = 0; nbodylines = 0; doParseOnlyHeader(doc_mimeSource, ""); } void Binc::MimeDocument::parseOnlyHeader(istream& s) { if (allIsParsed || headerIsParsed) return; headerIsParsed = true; delete doc_mimeSource; doc_mimeSource = new MimeInputSourceStream(s); headerstartoffsetcrlf = 0; headerlength = 0; bodystartoffsetcrlf = 0; bodylength = 0; messagerfc822 = false; multipart = false; nlines = 0; nbodylines = 0; doParseOnlyHeader(doc_mimeSource, ""); } //------------------------------------------------------------------------ int Binc::MimePart::doParseOnlyHeader(MimeInputSource *ms, const string &toboundary) { mimeSource = ms; string name; string content; char cqueue[4]; memset(cqueue, 0, sizeof(cqueue)); headerstartoffsetcrlf = mimeSource->getOffset(); bool quit = false; char c = '\0'; while (!quit) { // read name while (1) { if (!mimeSource->getChar(&c)) { quit = true; break; } if (c == '\n') ++nlines; if (c == ':') break; if (c == '\n') { for (int i = int(name.length()) - 1; i >= 0; --i) mimeSource->ungetChar(); quit = true; name.clear(); break; } name += c; if (name.length() == 2 && name.substr(0, 2) == "\r\n") { name.clear(); quit = true; break; } } if (name.length() == 1 && name[0] == '\r') { name.clear(); break; } if (quit) break; while (!quit) { if (!mimeSource->getChar(&c)) { quit = true; break; } if (c == '\n') ++nlines; for (int i = 0; i < 3; ++i) cqueue[i] = cqueue[i + 1]; cqueue[3] = c; if (strncmp(cqueue, "\r\n\r\n", 4) == 0) { quit = true; break; } if (cqueue[2] == '\n') { // guess the mime rfc says what can not appear on the beginning // of a line. if (!isspace(cqueue[3])) { if (content.length() > 2) content.resize(content.length() - 2); trim(content); h.add(name, content); name = c; content.clear(); break; } } content += c; } } if (name != "") { if (content.length() > 2) content.resize(content.length() - 2); h.add(name, content); } headerlength = mimeSource->getOffset() - headerstartoffsetcrlf; return 1; } recoll-1.23.7/bincimapmime/mime-inputsource.h0000644000175000017500000001272713125527323016131 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * src/mime-inputsource.h * * Description: * The base class of the MIME input source * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #ifndef mime_inputsource_h_included #define mime_inputsource_h_included #include "autoconfig.h" // Data source for MIME parser // Note about large files: we might want to change the unsigned int // used for offsets into an off_t for intellectual satisfaction, but // in the context of recoll, we could only get into trouble if a // *single message* exceeded 2GB, which seems rather unlikely. When // parsing a mailbox files, we read each message in memory and use the // stream input source (from a memory buffer, no file offsets). When // parsing a raw message file, it's only one message. #include #include "safeunistd.h" #include namespace Binc { class MimeInputSource { public: // Note that we do NOT take ownership of fd, won't close it on delete inline MimeInputSource(int fd, unsigned int start = 0); virtual inline ~MimeInputSource(void); virtual inline ssize_t fillRaw(char *raw, size_t nbytes); virtual inline void reset(void); virtual inline bool fillInputBuffer(void); inline void seek(unsigned int offset); inline bool getChar(char *c); inline void ungetChar(void); inline int getFileDescriptor(void) const; inline unsigned int getOffset(void) const; private: int fd; char data[16384]; unsigned int offset; unsigned int tail; unsigned int head; unsigned int start; char lastChar; }; inline MimeInputSource::MimeInputSource(int fd, unsigned int start) { this->fd = fd; this->start = start; offset = 0; tail = 0; head = 0; lastChar = '\0'; memset(data, '\0', sizeof(data)); seek(start); } inline MimeInputSource::~MimeInputSource(void) { } inline ssize_t MimeInputSource::fillRaw(char *raw, size_t nbytes) { return read(fd, raw, nbytes); } inline bool MimeInputSource::fillInputBuffer(void) { char raw[4096]; ssize_t nbytes = fillRaw(raw, 4096); if (nbytes <= 0) { // FIXME: If ferror(crlffile) we should log this. return false; } for (ssize_t i = 0; i < nbytes; ++i) { const char c = raw[i]; if (c == '\r') { if (lastChar == '\r') { data[tail++ & (0x4000-1)] = '\r'; data[tail++ & (0x4000-1)] = '\n'; } } else if (c == '\n') { data[tail++ & (0x4000-1)] = '\r'; data[tail++ & (0x4000-1)] = '\n'; } else { if (lastChar == '\r') { data[tail++ & (0x4000-1)] = '\r'; data[tail++ & (0x4000-1)] = '\n'; } data[tail++ & (0x4000-1)] = c; } lastChar = c; } return true; } inline void MimeInputSource::reset(void) { offset = head = tail = 0; lastChar = '\0'; if (fd != -1) lseek(fd, 0, SEEK_SET); } inline void MimeInputSource::seek(unsigned int seekToOffset) { if (offset > seekToOffset) reset(); char c; int n = 0; while (seekToOffset > offset) { if (!getChar(&c)) break; ++n; } } inline bool MimeInputSource::getChar(char *c) { if (head == tail && !fillInputBuffer()) return false; *c = data[head++ & (0x4000-1)]; ++offset; return true; } inline void MimeInputSource::ungetChar() { --head; --offset; } inline int MimeInputSource::getFileDescriptor(void) const { return fd; } inline unsigned int MimeInputSource::getOffset(void) const { return offset; } /////////////////////////////////// class MimeInputSourceStream : public MimeInputSource { public: inline MimeInputSourceStream(istream& s, unsigned int start = 0); virtual inline ssize_t fillRaw(char *raw, size_t nb); virtual inline void reset(void); private: istream& s; }; inline MimeInputSourceStream::MimeInputSourceStream(istream& si, unsigned int start) : MimeInputSource(-1, start), s(si) { } inline ssize_t MimeInputSourceStream::fillRaw(char *raw, size_t nb) { // Why can't streams tell how many characters were actually read // when hitting eof ? std::streampos st = s.tellg(); s.seekg(0, ios::end); std::streampos lst = s.tellg(); s.seekg(st); size_t nbytes = size_t(lst - st); if (nbytes > nb) { nbytes = nb; } if (nbytes <= 0) { return (ssize_t)-1; } s.read(raw, nbytes); return static_cast(nbytes); } inline void MimeInputSourceStream::reset(void) { MimeInputSource::reset(); s.seekg(0); } } #endif recoll-1.23.7/bincimapmime/mime-parsefull.cc0000644000175000017500000004123013125527323015673 00000000000000 /* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * mime-parsefull.cc * * Description: * Implementation of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace ::std; #endif /* NO_NAMESPACES */ #include "mime.h" #include "mime-utils.h" #include "mime-inputsource.h" #include "convert.h" // #define MPF #ifdef MPF #define MPFDEB(X) fprintf X #else #define MPFDEB(X) #endif //------------------------------------------------------------------------ void Binc::MimeDocument::parseFull(int fd) { if (allIsParsed) return; allIsParsed = true; delete doc_mimeSource; doc_mimeSource = new MimeInputSource(fd); headerstartoffsetcrlf = 0; headerlength = 0; bodystartoffsetcrlf = 0; bodylength = 0; size = 0; messagerfc822 = false; multipart = false; int bsize = 0; string bound; doParseFull(doc_mimeSource, bound, bsize); // eat any trailing junk to get the correct size char c; while (doc_mimeSource->getChar(&c)); size = doc_mimeSource->getOffset(); } void Binc::MimeDocument::parseFull(istream& s) { if (allIsParsed) return; allIsParsed = true; delete doc_mimeSource; doc_mimeSource = new MimeInputSourceStream(s); headerstartoffsetcrlf = 0; headerlength = 0; bodystartoffsetcrlf = 0; bodylength = 0; size = 0; messagerfc822 = false; multipart = false; int bsize = 0; string bound; doParseFull(doc_mimeSource, bound, bsize); // eat any trailing junk to get the correct size char c; while (doc_mimeSource->getChar(&c)); size = doc_mimeSource->getOffset(); } //------------------------------------------------------------------------ bool Binc::MimePart::parseOneHeaderLine(Binc::Header *header, unsigned int *nlines) { using namespace ::Binc; char c; bool eof = false; char cqueue[4]; string name; string content; while (mimeSource->getChar(&c)) { // If we encounter a \r before we got to the first ':', then // rewind back to the start of the line and assume we're at the // start of the body. if (c == '\r') { for (int i = 0; i < (int) name.length() + 1; ++i) mimeSource->ungetChar(); return false; } // A colon marks the end of the header name if (c == ':') break; // Otherwise add to the header name name += c; } cqueue[0] = '\0'; cqueue[1] = '\0'; cqueue[2] = '\0'; cqueue[3] = '\0'; // Read until the end of the header. bool endOfHeaders = false; while (!endOfHeaders) { if (!mimeSource->getChar(&c)) { eof = true; break; } if (c == '\n') ++*nlines; for (int i = 0; i < 3; ++i) cqueue[i] = cqueue[i + 1]; cqueue[3] = c; if (strncmp(cqueue, "\r\n\r\n", 4) == 0) { endOfHeaders = true; break; } // If the last character was a newline, and the first now is not // whitespace, then rewind one character and store the current // key,value pair. if (cqueue[2] == '\n' && c != ' ' && c != '\t') { if (content.length() > 2) content.resize(content.length() - 2); trim(content); header->add(name, content); if (c != '\r') { mimeSource->ungetChar(); if (c == '\n') --*nlines; return true; } mimeSource->getChar(&c); return false; } content += c; } if (name != "") { if (content.length() > 2) content.resize(content.length() - 2); header->add(name, content); } return !(eof || endOfHeaders); } //------------------------------------------------------------------------ void Binc::MimePart::parseHeader(Binc::Header *header, unsigned int *nlines) { while (parseOneHeaderLine(header, nlines)) { } } //------------------------------------------------------------------------ void Binc::MimePart::analyzeHeader(Binc::Header *header, bool *multipart, bool *messagerfc822, string *subtype, string *boundary) { using namespace ::Binc; // Do simple parsing of headers to determine the // type of message (multipart,messagerfc822 etc) HeaderItem ctype; if (header->getFirstHeader("content-type", ctype)) { vector types; split(ctype.getValue(), ";", types); if (types.size() > 0) { // first element should describe content type string tmp = types[0]; trim(tmp); vector v; split(tmp, "/", v); string key, value; key = (v.size() > 0) ? v[0] : "text"; value = (v.size() > 1) ? v[1] : "plain"; lowercase(key); if (key == "multipart") { *multipart = true; lowercase(value); *subtype = value; } else if (key == "message") { lowercase(value); if (value == "rfc822") *messagerfc822 = true; } } for (vector::const_iterator i = types.begin(); i != types.end(); ++i) { string element = *i; trim(element); if (element.find("=") != string::npos) { string::size_type pos = element.find('='); string key = element.substr(0, pos); string value = element.substr(pos + 1); lowercase(key); trim(key); if (key == "boundary") { trim(value, " \""); *boundary = value; } } } } } void Binc::MimePart::parseMessageRFC822(vector *members, bool *foundendofpart, unsigned int *bodylength, unsigned int *nbodylines, const string &toboundary) { using namespace ::Binc; // message rfc822 means a completely enclosed mime document. we // call the parser recursively, and pass on the boundary string // that we got. when parse() finds this boundary, it returns 0. if // it finds the end boundary (boundary + "--"), it returns != 0. MimePart m; unsigned int bodystartoffsetcrlf = mimeSource->getOffset(); // parsefull returns the number of bytes that need to be removed // from the body because of the terminating boundary string. int bsize = 0; if (m.doParseFull(mimeSource, toboundary, bsize)) *foundendofpart = true; // make sure bodylength doesn't overflow *bodylength = mimeSource->getOffset(); if (*bodylength >= bodystartoffsetcrlf) { *bodylength -= bodystartoffsetcrlf; if (*bodylength >= (unsigned int) bsize) { *bodylength -= (unsigned int) bsize; } else { *bodylength = 0; } } else { *bodylength = 0; } *nbodylines += m.getNofLines(); members->push_back(m); } bool Binc::MimePart::skipUntilBoundary(const string &delimiter, unsigned int *nlines, bool *eof) { string::size_type endpos = delimiter.length(); char *delimiterqueue = 0; string::size_type delimiterpos = 0; const char *delimiterStr = delimiter.c_str(); if (delimiter != "") { delimiterqueue = new char[endpos]; memset(delimiterqueue, 0, endpos); } // first, skip to the first delimiter string. Anything between the // header and the first delimiter string is simply ignored (it's // usually a text message intended for non-mime clients) char c; bool foundBoundary = false; for (;;) { if (!mimeSource->getChar(&c)) { *eof = true; break; } if (c == '\n') ++*nlines; // if there is no delimiter, we just read until the end of the // file. if (!delimiterqueue) continue; delimiterqueue[delimiterpos++] = c; if (delimiterpos == endpos) delimiterpos = 0; if (compareStringToQueue(delimiterStr, delimiterqueue, delimiterpos, int(endpos))) { foundBoundary = true; break; } } delete [] delimiterqueue; delimiterqueue = 0; return foundBoundary; } // JFD: Things we do after finding a boundary (something like CRLF--somestring) // Need to see if this is a final one (with an additional -- at the end), // and need to check if it is immediately followed by another boundary // (in this case, we give up our final CRLF in its favour) inline void Binc::MimePart::postBoundaryProcessing(bool *eof, unsigned int *nlines, int *boundarysize, bool *foundendofpart) { // Read two more characters. This may be CRLF, it may be "--" and // it may be any other two characters. char a = '\0'; if (!mimeSource->getChar(&a)) *eof = true; if (a == '\n') ++*nlines; char b = '\0'; if (!mimeSource->getChar(&b)) *eof = true; if (b == '\n') ++*nlines; // If eof, we're done here if (*eof) return; // If we find two dashes after the boundary, then this is the end // of boundary marker, and we need to get 2 more chars if (a == '-' && b == '-') { *foundendofpart = true; *boundarysize += 2; if (!mimeSource->getChar(&a)) *eof = true; if (a == '\n') ++*nlines; if (!mimeSource->getChar(&b)) *eof = true; if (b == '\n') ++*nlines; } // If the boundary is followed by CRLF, we need to handle the // special case where another boundary line follows // immediately. In this case we consider the CRLF to be part of // the NEXT boundary. if (a == '\r' && b == '\n') { // Get 2 more if (!mimeSource->getChar(&a) || !mimeSource->getChar(&b)) { *eof = true; } else if (a == '-' && b == '-') { MPFDEB((stderr, "BINC: consecutive delimiters, giving up CRLF\n")); mimeSource->ungetChar(); mimeSource->ungetChar(); mimeSource->ungetChar(); mimeSource->ungetChar(); } else { // We unget the 2 chars, and keep our crlf (increasing our own size) MPFDEB((stderr, "BINC: keeping my CRLF\n")); mimeSource->ungetChar(); mimeSource->ungetChar(); *boundarysize += 2; } } else { // Boundary string not followed by CRLF, don't read more and let // others skip the rest. Note that this is allowed but quite uncommon mimeSource->ungetChar(); mimeSource->ungetChar(); } } void Binc::MimePart::parseMultipart(const string &boundary, const string &toboundary, bool *eof, unsigned int *nlines, int *boundarysize, bool *foundendofpart, unsigned int *bodylength, vector *members) { MPFDEB((stderr, "BINC: ParseMultipart: boundary [%s], toboundary[%s]\n", boundary.c_str(), toboundary.c_str())); using namespace ::Binc; unsigned int bodystartoffsetcrlf = mimeSource->getOffset(); // multipart parsing starts with skipping to the first // boundary. then we call parse() for all parts. the last parse() // command will return a code indicating that it found the last // boundary of this multipart. Note that the first boundary does // not have to start with CRLF. string delimiter = "--" + boundary; skipUntilBoundary(delimiter, nlines, eof); if (!eof) *boundarysize = int(delimiter.size()); postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart); // read all mime parts. if (!*foundendofpart && !*eof) { bool quit = false; do { MimePart m; // If parseFull returns != 0, then it encountered the multipart's // final boundary. int bsize = 0; if (m.doParseFull(mimeSource, boundary, bsize)) { quit = true; *boundarysize = bsize; } members->push_back(m); } while (!quit); } if (!*foundendofpart && !*eof) { // multipart parsing starts with skipping to the first // boundary. then we call parse() for all parts. the last parse() // command will return a code indicating that it found the last // boundary of this multipart. Note that the first boundary does // not have to start with CRLF. string delimiter = "\r\n--" + toboundary; skipUntilBoundary(delimiter, nlines, eof); if (!*eof) *boundarysize = int(delimiter.size()); postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart); } // make sure bodylength doesn't overflow *bodylength = mimeSource->getOffset(); if (*bodylength >= bodystartoffsetcrlf) { *bodylength -= bodystartoffsetcrlf; if (*bodylength >= (unsigned int) *boundarysize) { *bodylength -= (unsigned int) *boundarysize; } else { *bodylength = 0; } } else { *bodylength = 0; } MPFDEB((stderr, "BINC: ParseMultipart return\n")); } void Binc::MimePart::parseSinglePart(const string &toboundary, int *boundarysize, unsigned int *nbodylines, unsigned int *nlines, bool *eof, bool *foundendofpart, unsigned int *bodylength) { MPFDEB((stderr, "BINC: parseSinglePart, boundary [%s]\n", toboundary.c_str())); using namespace ::Binc; unsigned int bodystartoffsetcrlf = mimeSource->getOffset(); // If toboundary is empty, then we read until the end of the // file. Otherwise we will read until we encounter toboundary. string _toboundary; if (toboundary != "") { _toboundary = "\r\n--"; _toboundary += toboundary; } // if (skipUntilBoundary(_toboundary, nlines, eof)) // *boundarysize = _toboundary.length(); char *boundaryqueue = 0; size_t endpos = _toboundary.length(); if (toboundary != "") { boundaryqueue = new char[endpos]; memset(boundaryqueue, 0, endpos); } *boundarysize = 0; const char *_toboundaryStr = _toboundary.c_str(); string line; bool toboundaryIsEmpty = (toboundary == ""); char c; string::size_type boundarypos = 0; while (mimeSource->getChar(&c)) { if (c == '\n') { ++*nbodylines; ++*nlines; } if (toboundaryIsEmpty) continue; // find boundary boundaryqueue[boundarypos++] = c; if (boundarypos == endpos) boundarypos = 0; if (compareStringToQueue(_toboundaryStr, boundaryqueue, boundarypos, int(endpos))) { *boundarysize = static_cast(_toboundary.length()); break; } } delete [] boundaryqueue; if (toboundary != "") { postBoundaryProcessing(eof, nlines, boundarysize, foundendofpart); } else { // Recoll: in the case of a multipart body with a null // boundary (probably illegal but wtf), eof was not set and // multipart went into a loop until bad alloc. *eof = true; } // make sure bodylength doesn't overflow *bodylength = mimeSource->getOffset(); if (*bodylength >= bodystartoffsetcrlf) { *bodylength -= bodystartoffsetcrlf; if (*bodylength >= (unsigned int) *boundarysize) { *bodylength -= (unsigned int) *boundarysize; } else { *bodylength = 0; } } else { *bodylength = 0; } MPFDEB((stderr, "BINC: parseSimple ret: bodylength %d, boundarysize %d\n", *bodylength, *boundarysize)); } //------------------------------------------------------------------------ int Binc::MimePart::doParseFull(MimeInputSource *ms, const string &toboundary, int &boundarysize) { MPFDEB((stderr, "BINC: doParsefull, toboundary[%s]\n", toboundary.c_str())); mimeSource = ms; headerstartoffsetcrlf = mimeSource->getOffset(); // Parse the header of this mime part. parseHeader(&h, &nlines); // Headerlength includes the seperating CRLF. Body starts after the // CRLF. headerlength = mimeSource->getOffset() - headerstartoffsetcrlf; bodystartoffsetcrlf = mimeSource->getOffset(); MPFDEB((stderr, "BINC: doParsefull, bodystartoffsetcrlf %d\n", bodystartoffsetcrlf)); bodylength = 0; // Determine the type of mime part by looking at fields in the // header. analyzeHeader(&h, &multipart, &messagerfc822, &subtype, &boundary); bool eof = false; bool foundendofpart = false; if (messagerfc822) { parseMessageRFC822(&members, &foundendofpart, &bodylength, &nbodylines, toboundary); } else if (multipart) { parseMultipart(boundary, toboundary, &eof, &nlines, &boundarysize, &foundendofpart, &bodylength, &members); } else { parseSinglePart(toboundary, &boundarysize, &nbodylines, &nlines, &eof, &foundendofpart, &bodylength); } MPFDEB((stderr, "BINC: doParsefull ret, toboundary[%s]\n", toboundary.c_str())); return (eof || foundendofpart) ? 1 : 0; } recoll-1.23.7/bincimapmime/mime.cc0000644000175000017500000001021113125527323013673 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * mime.cc * * Description: * Implementation of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include #ifndef NO_NAMESPACES using namespace ::std; #endif /* NO_NAMESPACES */ #include "mime.h" #include "convert.h" #include "mime-inputsource.h" //------------------------------------------------------------------------ Binc::MimeDocument::MimeDocument(void) { allIsParsed = false; headerIsParsed = false; doc_mimeSource = 0; } //------------------------------------------------------------------------ Binc::MimeDocument::~MimeDocument(void) { delete doc_mimeSource; doc_mimeSource = 0; } //------------------------------------------------------------------------ void Binc::MimeDocument::clear(void) { members.clear(); h.clear(); headerIsParsed = false; allIsParsed = false; delete doc_mimeSource; doc_mimeSource = 0; } //------------------------------------------------------------------------ void Binc::MimePart::clear(void) { members.clear(); h.clear(); mimeSource = 0; } //------------------------------------------------------------------------ Binc::MimePart::MimePart(void) { size = 0; messagerfc822 = false; multipart = false; nlines = 0; nbodylines = 0; mimeSource = 0; } //------------------------------------------------------------------------ Binc::MimePart::~MimePart(void) { } //------------------------------------------------------------------------ Binc::HeaderItem::HeaderItem(void) { } //------------------------------------------------------------------------ Binc::HeaderItem::HeaderItem(const string &key, const string &value) { this->key = key; this->value = value; } //------------------------------------------------------------------------ Binc::Header::Header(void) { } //------------------------------------------------------------------------ Binc::Header::~Header(void) { } //------------------------------------------------------------------------ bool Binc::Header::getFirstHeader(const string &key, HeaderItem &dest) const { string k = key; lowercase(k); for (vector::const_iterator i = content.begin(); i != content.end(); ++i) { string tmp = (*i).getKey(); lowercase(tmp); if (tmp == k) { dest = *i; return true; } } return false; } //------------------------------------------------------------------------ bool Binc::Header::getAllHeaders(const string &key, vector &dest) const { string k = key; lowercase(k); for (vector::const_iterator i = content.begin(); i != content.end(); ++i) { string tmp = (*i).getKey(); lowercase(tmp); if (tmp == k) dest.push_back(*i); } return (dest.size() != 0); } //------------------------------------------------------------------------ void Binc::Header::clear(void) { content.clear(); } //------------------------------------------------------------------------ void Binc::Header::add(const string &key, const string &value) { content.push_back(HeaderItem(key, value)); } recoll-1.23.7/bincimapmime/convert.h0000644000175000017500000002147613125527323014305 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * src/util/convert.h * * Description: * Declaration of miscellaneous convertion functions. * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #ifndef convert_h_included #define convert_h_included #include #include #include #include #include #include #include #include namespace Binc { //---------------------------------------------------------------------- inline std::string toString(int i_in) { char intbuf[16]; snprintf(intbuf, sizeof(intbuf), "%d", i_in); return std::string(intbuf); } //---------------------------------------------------------------------- inline std::string toString(unsigned int i_in) { char intbuf[16]; snprintf(intbuf, sizeof(intbuf), "%u", i_in); return std::string(intbuf); } //---------------------------------------------------------------------- inline std::string toString(unsigned long i_in) { char longbuf[40]; snprintf(longbuf, sizeof(longbuf), "%lu", i_in); return std::string(longbuf); } //---------------------------------------------------------------------- inline std::string toString(const char *i_in) { return std::string(i_in); } //---------------------------------------------------------------------- inline int atoi(const std::string &s_in) { return ::atoi(s_in.c_str()); } //---------------------------------------------------------------------- inline std::string toHex(const std::string &s) { const char hexchars[] = "0123456789abcdef"; std::string tmp; for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) { unsigned char c = (unsigned char)*i; tmp += hexchars[((c & 0xf0) >> 4)]; tmp += hexchars[c & 0x0f]; } return tmp; } //---------------------------------------------------------------------- inline std::string fromHex(const std::string &s) { const char hexchars[] = "0123456789abcdef"; std::string tmp; for (std::string::const_iterator i = s.begin(); i != s.end() && i + 1 != s.end(); i += 2) { ptrdiff_t n; unsigned char c = *i; unsigned char d = *(i + 1); const char *t; if ((t = strchr(hexchars, c)) == 0) return "out of range"; n = (t - hexchars) << 4; if ((t = strchr(hexchars, d)) == 0) return "out of range"; n += (t - hexchars); if (n >= 0 && n <= 255) tmp += (char) n; else return "out of range"; } return tmp; } //---------------------------------------------------------------------- inline std::string toImapString(const std::string &s_in) { for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { unsigned char c = (unsigned char)*i; if (c <= 31 || c >= 127 || c == '\"' || c == '\\') return "{" + toString((unsigned long)s_in.length()) + "}\r\n" + s_in; } return "\"" + s_in + "\""; } //---------------------------------------------------------------------- inline void uppercase(std::string &input) { for (std::string::iterator i = input.begin(); i != input.end(); ++i) *i = toupper(*i); } //---------------------------------------------------------------------- inline void lowercase(std::string &input) { for (std::string::iterator i = input.begin(); i != input.end(); ++i) *i = tolower(*i); } //---------------------------------------------------------------------- inline void chomp(std::string &s_in, const std::string &chars = " \t\r\n") { std::string::size_type n = s_in.length(); while (n > 1 && chars.find(s_in[n - 1]) != std::string::npos) s_in.resize(n-- - 1); } //---------------------------------------------------------------------- inline void trim(std::string &s_in, const std::string &chars = " \t\r\n") { while (s_in != "" && chars.find(s_in[0]) != std::string::npos) s_in = s_in.substr(1); chomp(s_in, chars); } //---------------------------------------------------------------------- inline const std::string unfold(const std::string &a, bool removecomment = true) { std::string tmp; bool incomment = false; bool inquotes = false; for (std::string::const_iterator i = a.begin(); i != a.end(); ++i) { unsigned char c = (unsigned char)*i; if (!inquotes && removecomment) { if (c == '(') { incomment = true; tmp += " "; } else if (c == ')') { incomment = false; } else if (c != 0x0a && c != 0x0d) { tmp += *i; } } else if (c != 0x0a && c != 0x0d) { tmp += *i; } if (!incomment) { if (*i == '\"') inquotes = !inquotes; } } trim(tmp); return tmp; } //---------------------------------------------------------------------- inline void split(const std::string &s_in, const std::string &delim, std::vector &dest, bool skipempty = true) { std::string token; for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { if (delim.find(*i) != std::string::npos) { if (!skipempty || token != "") dest.push_back(token); token.clear(); } else token += *i; } if (token != "") dest.push_back(token); } //---------------------------------------------------------------------- inline void splitAddr(const std::string &s_in, std::vector &dest, bool skipempty = true) { static const std::string delim = ","; std::string token; bool inquote = false; for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { if (inquote && *i == '\"') inquote = false; else if (!inquote && *i == '\"') inquote = true; if (!inquote && delim.find(*i) != std::string::npos) { if (!skipempty || token != "") dest.push_back(token); token.clear(); } else token += *i; } if (token != "") dest.push_back(token); } //---------------------------------------------------------------------- inline std::string toCanonMailbox(const std::string &s_in) { if (s_in.find("..") != std::string::npos) return std::string(); if (s_in.length() >= 5) { std::string a = s_in.substr(0, 5); uppercase(a); return a == "INBOX" ? a + (s_in.length() > 5 ? s_in.substr(5) : std::string()) : s_in; } return s_in; } //------------------------------------------------------------------------ inline std::string toRegex(const std::string &s_in, char delimiter) { std::string regex = "^"; for (std::string::const_iterator i = s_in.begin(); i != s_in.end(); ++i) { if (*i == '.' || *i == '[' || *i == ']' || *i == '{' || *i == '}' || *i == '(' || *i == ')' || *i == '^' || *i == '$' || *i == '?' || *i == '+' || *i == '\\') { regex += "\\"; regex += *i; } else if (*i == '*') regex += ".*?"; else if (*i == '%') { regex += "(\\"; regex += delimiter; regex += "){0,1}"; regex += "[^\\"; regex += delimiter; regex += "]*?"; } else regex += *i; } if (regex[regex.length() - 1] == '?') regex[regex.length() - 1] = '$'; else regex += "$"; return regex; } //------------------------------------------------------------------------ class BincStream { private: std::string nstr; public: //-- BincStream &operator << (std::ostream&(*)(std::ostream&)); BincStream &operator << (const std::string &t); BincStream &operator << (unsigned int t); BincStream &operator << (int t); BincStream &operator << (char t); //-- std::string popString(std::string::size_type size); //-- char popChar(void); void unpopChar(char c); void unpopStr(const std::string &s); //-- const std::string &str(void) const; //-- unsigned int getSize(void) const; //-- void clear(void); //-- BincStream(void); ~BincStream(void); }; } #endif recoll-1.23.7/bincimapmime/COPYING0000644000175000017500000004460113125527323013502 00000000000000This software is released under the GPL. Find a full copy of the GNU General Public License below. In addition, as a special exception, Andreas Aardal Hanssen, author of Binc IMAP, gives permission to link the code of this program with the OpenSSL library (or with modified versions of OpenSSL that use the same license as OpenSSL, listed in the included COPYING.OpenSSL file), and distribute linked combinations including the two. You must obey the GNU General Public License in all respects for all of the code used other than OpenSSL. If you modify this file, you may extend this exception to your version of the file, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. --------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. recoll-1.23.7/bincimapmime/mime.h0000644000175000017500000001330413125527323013543 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * src/parsers/mime/mime.h * * Description: * Declaration of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #ifndef mime_h_included #define mime_h_included #include #include #include #include namespace Binc { class MimeInputSource; //---------------------------------------------------------------------- class HeaderItem { private: mutable std::string key; mutable std::string value; public: inline const std::string &getKey(void) const { return key; } inline const std::string &getValue(void) const { return value; } //-- HeaderItem(void); HeaderItem(const std::string &key, const std::string &value); }; //---------------------------------------------------------------------- class Header { private: mutable std::vector content; public: bool getFirstHeader(const std::string &key, HeaderItem &dest) const; bool getAllHeaders(const std::string &key, std::vector &dest) const; void add(const std::string &name, const std::string &content); void clear(void); //-- Header(void); ~Header(void); }; //---------------------------------------------------------------------- class IODevice; class MimeDocument; class MimePart { protected: public: mutable bool multipart; mutable bool messagerfc822; mutable std::string subtype; mutable std::string boundary; mutable unsigned int headerstartoffsetcrlf; mutable unsigned int headerlength; mutable unsigned int bodystartoffsetcrlf; mutable unsigned int bodylength; mutable unsigned int nlines; mutable unsigned int nbodylines; mutable unsigned int size; public: enum FetchType { FetchBody, FetchHeader, FetchMime }; mutable Header h; mutable std::vector members; inline const std::string &getSubType(void) const { return subtype; } inline bool isMultipart(void) const { return multipart; } inline bool isMessageRFC822(void) const { return messagerfc822; } inline unsigned int getSize(void) const { return bodylength; } inline unsigned int getNofLines(void) const { return nlines; } inline unsigned int getNofBodyLines(void) const { return nbodylines; } inline unsigned int getBodyLength(void) const { return bodylength; } inline unsigned int getBodyStartOffset(void) const { return bodystartoffsetcrlf; } void printBody(Binc::IODevice &output, unsigned int startoffset, unsigned int length) const; void getBody(std::string& s, unsigned int startoffset, unsigned int length) const; virtual void clear(void); virtual int doParseOnlyHeader(MimeInputSource *ms, const std::string &toboundary); virtual int doParseFull(MimeInputSource *ms, const std::string &toboundary, int &boundarysize); MimePart(void); virtual ~MimePart(void); private: MimeInputSource *mimeSource; bool parseOneHeaderLine(Binc::Header *header, unsigned int *nlines); bool skipUntilBoundary(const std::string &delimiter, unsigned int *nlines, bool *eof); inline void postBoundaryProcessing(bool *eof, unsigned int *nlines, int *boundarysize, bool *foundendofpart); void parseMultipart(const std::string &boundary, const std::string &toboundary, bool *eof, unsigned int *nlines, int *boundarysize, bool *foundendofpart, unsigned int *bodylength, std::vector *members); void parseSinglePart(const std::string &toboundary, int *boundarysize, unsigned int *nbodylines, unsigned int *nlines, bool *eof, bool *foundendofpart, unsigned int *bodylength); void parseHeader(Binc::Header *header, unsigned int *nlines); void analyzeHeader(Binc::Header *header, bool *multipart, bool *messagerfc822, std::string *subtype, std::string *boundary); void parseMessageRFC822(std::vector *members, bool *foundendofpart, unsigned int *bodylength, unsigned int *nbodylines, const std::string &toboundary); }; //---------------------------------------------------------------------- class MimeDocument : public MimePart { public: MimeDocument(void); ~MimeDocument(void); void parseOnlyHeader(int fd); void parseFull(int fd); void parseOnlyHeader(std::istream& s); void parseFull(std::istream& s); void clear(void); bool isHeaderParsed(void) const { return headerIsParsed; } bool isAllParsed(void) const { return allIsParsed; } private: bool headerIsParsed; bool allIsParsed; MimeInputSource *doc_mimeSource; }; }; #endif recoll-1.23.7/bincimapmime/AUTHORS0000644000175000017500000000444713125527323013523 00000000000000The following parties have participated in writing code or otherwise contributed to the Binc IMAP project: Author: Andreas Aardal Hanssen Several users have been very helpful with bug reports and suggestions, and the author is very grateful for their contributions. Some users have also gone to the extra effort of debugging the cause of a bug, or have found a way of implementing a feature, and have either provided a very good description of what is needed, or they have actually provided a patch that has been added to Binc IMAP. While adding extra value to the discussion around the discovery of a bug or the evaluation of a new feature, these contributors also take some load of the author's back, so they deserve extra thanks. In this list are also included people who have contributed with mirrors and translations of the web pages. Henry Baragar Jürgen Botz Charlie Brady Caskey Dickson Ketil Froyn Gary Gordon Marek Gutkowski Daniel James Zak Johnson Sergei Kolobov Rafal Kupka Eivind Kvedalen HIROSHIMA Naoki Greger Stolt Nilsen John Starks Peter Stuge Gerrit Pape Jeremy Rossi Dale Woolridge If you have contributed to the Binc IMAP project but are not listed here (this happens quite often), please send a mail to andreas-binc@bincimap.org and I'll add you to the list. recoll-1.23.7/bincimapmime/mime-printbody.cc0000644000175000017500000000322713125527323015714 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * mime-printbody.cc * * Description: * Implementation of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #include "mime.h" #include "mime-utils.h" #include "mime-inputsource.h" #include using namespace ::std; void Binc::MimePart::getBody(string &s, unsigned int startoffset, unsigned int length) const { mimeSource->reset(); mimeSource->seek(bodystartoffsetcrlf + startoffset); s.reserve(length); if (startoffset + length > bodylength) length = bodylength - startoffset; char c = '\0'; for (unsigned int i = 0; i < length; ++i) { if (!mimeSource->getChar(&c)) break; s += (char)c; } } recoll-1.23.7/bincimapmime/convert.cc0000644000175000017500000000671213125527323014437 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * convert.cc * * Description: * Implementation of miscellaneous convertion functions. * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #include "convert.h" #include #ifndef NO_NAMESPACES using namespace ::std; using namespace Binc; #endif /* NO_NAMESPACES */ //------------------------------------------------------------------------ BincStream::BincStream(void) { } //------------------------------------------------------------------------ BincStream::~BincStream(void) { clear(); } //------------------------------------------------------------------------ string BincStream::popString(std::string::size_type size) { if (size > nstr.length()) size = nstr.length(); string tmp = nstr.substr(0, size); nstr = nstr.substr(size); return tmp; } //------------------------------------------------------------------------ char BincStream::popChar(void) { if (nstr.length() == 0) return '\0'; char c = nstr[0]; nstr = nstr.substr(1); return c; } //------------------------------------------------------------------------ void BincStream::unpopChar(char c) { nstr = c + nstr; } //------------------------------------------------------------------------ void BincStream::unpopStr(const string &s) { nstr = s + nstr; } //------------------------------------------------------------------------ const string &BincStream::str(void) const { return nstr; } //------------------------------------------------------------------------ void BincStream::clear(void) { nstr.clear(); } //------------------------------------------------------------------------ unsigned int BincStream::getSize(void) const { return (unsigned int) nstr.length(); } //------------------------------------------------------------------------ BincStream &BincStream::operator << (std::ostream&(*)(std::ostream&)) { nstr += "\r\n"; return *this; } //------------------------------------------------------------------------ BincStream &BincStream::operator << (const string &t) { nstr += t; return *this; } //------------------------------------------------------------------------ BincStream &BincStream::operator << (int t) { nstr += toString(t); return *this; } //------------------------------------------------------------------------ BincStream &BincStream::operator << (unsigned int t) { nstr += toString(t); return *this; } //------------------------------------------------------------------------ BincStream &BincStream::operator << (char t) { nstr += t; return *this; } recoll-1.23.7/bincimapmime/mime-utils.h0000644000175000017500000000307013125527323014700 00000000000000/* -*- mode:c++;c-basic-offset:2 -*- */ /* -------------------------------------------------------------------- * Filename: * mime.cc * * Description: * Implementation of main mime parser components * -------------------------------------------------------------------- * Copyright 2002-2005 Andreas Aardal Hanssen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. * -------------------------------------------------------------------- */ #ifndef mime_utils_h_included #define mime_utils_h_included #include #include #include #include #ifndef NO_NAMESPACES using namespace ::std; #endif /* NO_NAMESPACES */ inline bool compareStringToQueue(const char *s_in, char *bqueue, int pos, int size) { for (int i = 0; i < size; ++i) { if (s_in[i] != bqueue[pos]) return false; if (++pos == size) pos = 0; } return true; } #endif recoll-1.23.7/bincimapmime/00README.recoll0000644000175000017500000000016313125527323014741 00000000000000Most of the code in this directory was taken from the Binc IMAP project (http://www.bincimap.org/), version 1.3.3 recoll-1.23.7/config.rpath0000755000175000017500000004421613224431017012321 00000000000000#! /bin/sh # Output a system dependent set of variables, describing how to set the # run time search path of shared libraries in an executable. # # Copyright 1996-2014 Free Software Foundation, Inc. # Taken from GNU libtool, 2001 # Originally by Gordon Matzigkeit , 1996 # # This file is free software; the Free Software Foundation gives # unlimited permission to copy and/or distribute it, with or without # modifications, as long as this notice is preserved. # # The first argument passed to this file is the canonical host specification, # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld # should be set by the caller. # # The set of defined variables is at the end of this script. # Known limitations: # - On IRIX 6.5 with CC="cc", the run time search patch must not be longer # than 256 bytes, otherwise the compiler driver will dump core. The only # known workaround is to choose shorter directory names for the build # directory and/or the installation directory. # All known linkers require a '.a' archive for static linking (except MSVC, # which needs '.lib'). libext=a shrext=.so host="$1" host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` # Code taken from libtool.m4's _LT_CC_BASENAME. for cc_temp in $CC""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done cc_basename=`echo "$cc_temp" | sed -e 's%^.*/%%'` # Code taken from libtool.m4's _LT_COMPILER_PIC. wl= if test "$GCC" = yes; then wl='-Wl,' else case "$host_os" in aix*) wl='-Wl,' ;; mingw* | cygwin* | pw32* | os2* | cegcc*) ;; hpux9* | hpux10* | hpux11*) wl='-Wl,' ;; irix5* | irix6* | nonstopux*) wl='-Wl,' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) case $cc_basename in ecc*) wl='-Wl,' ;; icc* | ifort*) wl='-Wl,' ;; lf95*) wl='-Wl,' ;; nagfor*) wl='-Wl,-Wl,,' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) wl='-Wl,' ;; ccc*) wl='-Wl,' ;; xl* | bgxl* | bgf* | mpixl*) wl='-Wl,' ;; como) wl='-lopt=' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ F* | *Sun*Fortran*) wl= ;; *Sun\ C*) wl='-Wl,' ;; esac ;; esac ;; newsos6) ;; *nto* | *qnx*) ;; osf3* | osf4* | osf5*) wl='-Wl,' ;; rdos*) ;; solaris*) case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) wl='-Qoption ld ' ;; *) wl='-Wl,' ;; esac ;; sunos4*) wl='-Qoption ld ' ;; sysv4 | sysv4.2uw2* | sysv4.3*) wl='-Wl,' ;; sysv4*MP*) ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) wl='-Wl,' ;; unicos*) wl='-Wl,' ;; uts4*) ;; esac fi # Code taken from libtool.m4's _LT_LINKER_SHLIBS. hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_direct=no hardcode_minus_L=no case "$host_os" in cygwin* | mingw* | pw32* | cegcc*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. if test "$GCC" != yes; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++) with_gnu_ld=yes ;; openbsd*) with_gnu_ld=no ;; esac ld_shlibs=yes if test "$with_gnu_ld" = yes; then # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. # Unlike libtool, we use -rpath here, not --rpath, since the documented # option of GNU ld is called -rpath, not --rpath. hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' case "$host_os" in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; cygwin* | mingw* | pw32* | cegcc*) # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then : else ld_shlibs=no fi ;; haiku*) ;; interix[3-9]*) hardcode_direct=no hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; netbsd*) ;; solaris*) if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' else ld_shlibs=no fi ;; esac ;; sunos4*) hardcode_direct=yes ;; *) if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then : else ld_shlibs=no fi ;; esac if test "$ld_shlibs" = no; then hardcode_libdir_flag_spec= fi else case "$host_os" in aix3*) # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test "$GCC" = yes; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test "$host_cpu" = ia64; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then aix_use_runtimelinking=yes break fi done ;; esac fi hardcode_direct=yes hardcode_libdir_separator=':' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) collect2name=`${CC} -print-prog-name=collect2` if test -f "$collect2name" && \ strings "$collect2name" | grep resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac fi # Begin _LT_AC_SYS_LIBPATH_AIX. echo 'int main () { return 0; }' > conftest.c ${CC} ${LDFLAGS} conftest.c -o conftest aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } }'` fi if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib" fi rm -f conftest.c conftest # End _LT_AC_SYS_LIBPATH_AIX. if test "$aix_use_runtimelinking" = yes; then hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' else hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" fi fi ;; amigaos*) case "$host_cpu" in powerpc) ;; m68k) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) ;; cygwin* | mingw* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec=' ' libext=lib ;; darwin* | rhapsody*) hardcode_direct=no if { case $cc_basename in ifort*) true;; *) test "$GCC" = yes;; esac; }; then : else ld_shlibs=no fi ;; dgux*) hardcode_libdir_flag_spec='-L$libdir' ;; freebsd2.[01]*) hardcode_direct=yes hardcode_minus_L=yes ;; freebsd* | dragonfly*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; hpux9*) hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; hpux10*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no ;; *) hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; netbsd*) hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes ;; newsos6) hardcode_direct=yes hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then hardcode_libdir_flag_spec='${wl}-rpath,$libdir' else case "$host_os" in openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) hardcode_libdir_flag_spec='-R$libdir' ;; *) hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; osf3*) hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) if test "$GCC" = yes; then hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else # Both cc and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi hardcode_libdir_separator=: ;; solaris*) hardcode_libdir_flag_spec='-R$libdir' ;; sunos4*) hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes ;; sysv4) case $host_vendor in sni) hardcode_direct=yes # is this really true??? ;; siemens) hardcode_direct=no ;; motorola) hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac ;; sysv4.3*) ;; sysv4*MP*) if test -d /usr/nec; then ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) ;; sysv5* | sco3.2v5* | sco5v6*) hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' ;; uts4*) hardcode_libdir_flag_spec='-L$libdir' ;; *) ld_shlibs=no ;; esac fi # Check dynamic linker characteristics # Code taken from libtool.m4's _LT_SYS_DYNAMIC_LINKER. # Unlike libtool.m4, here we don't care about _all_ names of the library, but # only about the one the linker finds when passed -lNAME. This is the last # element of library_names_spec in libtool.m4, or possibly two of them if the # linker has special search rules. library_names_spec= # the last element of library_names_spec in libtool.m4 libname_spec='lib$name' case "$host_os" in aix3*) library_names_spec='$libname.a' ;; aix[4-9]*) library_names_spec='$libname$shrext' ;; amigaos*) case "$host_cpu" in powerpc*) library_names_spec='$libname$shrext' ;; m68k) library_names_spec='$libname.a' ;; esac ;; beos*) library_names_spec='$libname$shrext' ;; bsdi[45]*) library_names_spec='$libname$shrext' ;; cygwin* | mingw* | pw32* | cegcc*) shrext=.dll library_names_spec='$libname.dll.a $libname.lib' ;; darwin* | rhapsody*) shrext=.dylib library_names_spec='$libname$shrext' ;; dgux*) library_names_spec='$libname$shrext' ;; freebsd[23].*) library_names_spec='$libname$shrext$versuffix' ;; freebsd* | dragonfly*) library_names_spec='$libname$shrext' ;; gnu*) library_names_spec='$libname$shrext' ;; haiku*) library_names_spec='$libname$shrext' ;; hpux9* | hpux10* | hpux11*) case $host_cpu in ia64*) shrext=.so ;; hppa*64*) shrext=.sl ;; *) shrext=.sl ;; esac library_names_spec='$libname$shrext' ;; interix[3-9]*) library_names_spec='$libname$shrext' ;; irix5* | irix6* | nonstopux*) library_names_spec='$libname$shrext' case "$host_os" in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; *) libsuff= shlibsuff= ;; esac ;; esac ;; linux*oldld* | linux*aout* | linux*coff*) ;; linux* | k*bsd*-gnu | kopensolaris*-gnu) library_names_spec='$libname$shrext' ;; knetbsd*-gnu) library_names_spec='$libname$shrext' ;; netbsd*) library_names_spec='$libname$shrext' ;; newsos6) library_names_spec='$libname$shrext' ;; *nto* | *qnx*) library_names_spec='$libname$shrext' ;; openbsd*) library_names_spec='$libname$shrext$versuffix' ;; os2*) libname_spec='$name' shrext=.dll library_names_spec='$libname.a' ;; osf3* | osf4* | osf5*) library_names_spec='$libname$shrext' ;; rdos*) ;; solaris*) library_names_spec='$libname$shrext' ;; sunos4*) library_names_spec='$libname$shrext$versuffix' ;; sysv4 | sysv4.3*) library_names_spec='$libname$shrext' ;; sysv4*MP*) library_names_spec='$libname$shrext' ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='$libname$shrext' ;; tpf*) library_names_spec='$libname$shrext' ;; uts4*) library_names_spec='$libname$shrext' ;; esac sed_quote_subst='s/\(["`$\\]\)/\\\1/g' escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` shlibext=`echo "$shrext" | sed -e 's,^\.,,'` escaped_libname_spec=`echo "X$libname_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_library_names_spec=`echo "X$library_names_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` LC_ALL=C sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' < image/svg+xml recoll-1.23.7/desktop/hotrecoll.py0000755000175000017500000000420713125527323014034 00000000000000#!/usr/bin/python # # This script should be linked to a keyboard shortcut. Under gnome, # you can do this from the main preferences menu, or directly execute # "gnome-keybinding-properties" # # Make the script executable. Install it somewhere in the executable # path ("echo $PATH" to check what's in there), and then just enter # its name as the action to perform, or copy it anywhere and copy the # full path as the action. import gtk import wnck import os import sys from optparse import OptionParser def main(): parser = OptionParser() parser.add_option("-m", "--move-away", action="store_true", default=False, dest="clear_workspace", help="iconify to other workspace to avoid crowding panel") (options, args) = parser.parse_args() screen = wnck.screen_get_default() while gtk.events_pending(): gtk.main_iteration() recollMain = "" recollwins = []; for window in screen.get_windows(): if window.get_class_group().get_name() == "Recoll": if window.get_name() == "Recoll": recollMain = window recollwins.append(window) if not recollMain: os.system("recoll&") sys.exit(0) # Check the main window state, and either activate or minimize all # recoll windows. workspace = screen.get_active_workspace() if not recollMain.is_visible_on_workspace(workspace): for win in recollwins: win.move_to_workspace(workspace) if win != recollMain: win.unminimize(gtk.get_current_event_time()) recollMain.activate(gtk.get_current_event_time()) else: otherworkspace = None if options.clear_workspace: # We try to minimize to another workspace wkspcs = screen.get_workspaces() for wkspc in wkspcs: if wkspc.get_number() != workspace.get_number(): otherworkspace = wkspc break for win in recollwins: if otherworkspace: win.move_to_workspace(otherworkspace) win.minimize() if __name__ == '__main__': main() recoll-1.23.7/desktop/recoll_index_on_ac.sh0000755000175000017500000000404213125527323015626 00000000000000#!/bin/sh # This is a shell script that starts and stops the recollindex daemon # depending on whether or not the power supply is plugged in. It should be # called from the file ~/.config/autostart/recollindex.desktop. # # That is: make the script executable (chmod +x) and replace in # recollindex.desk the line: # Exec=recollindex -w 60 -m # With # Exec=/path/to/recoll_index_on_ac.sh # # # By: The Doctor (drwho at virtadpt dot net) # License: GPLv3 # # Modifications by J.F Dockes # - replaced "acpi" usage with "on_ac_power" which seems to be both # more common and more universal. # - Changed the default to be that we run recollindex if we can't determine # power status (ie: on_ac_power not installed or not working: we're most # probably not running on a laptop). INDEXER="recollindex -w 60 -m" ACPI=`which on_ac_power` # If the on_ac_power script isn't installed, warn, but run anyway. Maybe # this is not a laptop or not linux. if test "x$ACPI" = "x" ; then echo "on_ac_power utility not found. Starting recollindex anyway." fi while true; do # Determine whether or not the power supply is plugged in. if test "x$ACPI" != "x" ; then on_ac_power STATUS=$? else STATUS=0 fi # Get the PID of the indexing daemon. if test -f ~/.recoll/index.pid ; then PID=`cat ~/.recoll/index.pid` # Make sure that this is recollindex running. pid could have # been reallocated ps ax | egrep "^[ \t]*$PID " | grep -q recollindex || PID="" fi # echo "Recollindex pid is $PID" if test $STATUS -eq 1 ; then # The power supply is not plugged in. See if the indexing daemon is # running, and if it is, kill it. The indexing daemon will not be # started. if test x"$PID" != x; then kill $PID fi else # The power supply is plugged in or we just don't know. # See if the indexing daemon is running, and if it's not start it. if test -z "$PID" ; then $INDEXER fi fi # Go to sleep for a while. sleep 120 continue done recoll-1.23.7/desktop/recoll.appdata.xml0000644000175000017500000000173113125527323015076 00000000000000 recoll.desktop CC0-1.0 GPL-2.0+ Recoll Find documents by specifying search terms

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

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

   The character set needs to be specified in the header. It does not need to
   be UTF-8 (Recoll will take care of translating it), but it must be
   accurate for good results.

   Recoll will process meta tags inside the header as possible document
   fields candidates. Documents fields can be processed by the indexer in
   different ways, for searching or displaying inside query results. This is
   described in a following section.

   By default, the indexer will process the standard header fields if they
   are present: title, meta/description, and meta/keywords are both indexed
   and stored for query-time display.

   A predefined non-standard meta tag will also be processed by Recoll
   without further configuration: if a date tag is present and has the right
   format, it will be used as the document date (for display and sorting), in
   preference to the file modification date. The date format should be as
   follows:

 
 or
 
          

   Example:

 
          

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

 

   You can embed HTML markup inside the content of custom fields, for
   improving the display inside result lists. In this case, add a (wildly
   non-standard) markup attribute to tell Recoll that the value is HTML and
   should not be escaped for display.

 

   As written above, the processing of fields is described in a further
   section.

  4.1.5. Page numbers

   The indexer will interpret ^L characters in the handler output as
   indicating page breaks, and will record them. At query time, this allows
   starting a viewer on the right page for a hit or a snippet. Currently,
   only the PDF, Postscript and DVI handlers generate page breaks.

4.2. Field data processing

   Fields are named pieces of information in or about documents, like title,
   author, abstract.

   The field values for documents can appear in several ways during indexing:
   either output by input handlers as meta fields in the HTML header section,
   or extracted from file extended attributes, or added as attributes of the
   Doc object when using the API, or again synthetized internally by Recoll.

   The Recoll query language allows searching for text in a specific field.

   Recoll defines a number of default fields. Additional ones can be output
   by handlers, and described in the fields configuration file.

   Fields can be:

     o indexed, meaning that their terms are separately stored in inverted
       lists (with a specific prefix), and that a field-specific search is
       possible.

     o stored, meaning that their value is recorded in the index data record
       for the document, and can be returned and displayed with search
       results.

   A field can be either or both indexed and stored. This and other aspects
   of fields handling is defined inside the fields configuration file.

   The sequence of events for field processing is as follows:

     o During indexing, recollindex scans all meta fields in HTML documents
       (most document types are transformed into HTML at some point). It
       compares the name for each element to the configuration defining what
       should be done with fields (the fields file)

     o If the name for the meta element matches one for a field that should
       be indexed, the contents are processed and the terms are entered into
       the index with the prefix defined in the fields file.

     o If the name for the meta element matches one for a field that should
       be stored, the content of the element is stored with the document data
       record, from which it can be extracted and displayed at query time.

     o At query time, if a field search is performed, the index prefix is
       computed and the match is only performed against appropriately
       prefixed terms in the index.

     o At query time, the field can be displayed inside the result list by
       using the appropriate directive in the definition of the result list
       paragraph format. All fields are displayed on the fields screen of the
       preview window (which you can reach through the right-click menu).
       This is independant of the fact that the search which produced the
       results used the field or not.

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

   You can also have a look at the example on the Wiki, detailing how one
   could add a page count field to pdf documents for displaying inside result
   lists.

4.3. API

  4.3.1. Interface elements

   A few elements in the interface are specific and and need an explanation.

   udi

           An udi (unique document identifier) identifies a document. Because
           of limitations inside the index engine, it is restricted in length
           (to 200 bytes), which is why a regular URI cannot be used. The
           structure and contents of the udi is defined by the application
           and opaque to the index engine. For example, the internal file
           system indexer uses the complete document path (file path +
           internal path), truncated to length, the suppressed part being
           replaced by a hash value.

   ipath

           This data value (set as a field in the Doc object) is stored,
           along with the URL, but not indexed by Recoll. Its contents are
           not interpreted, and its use is up to the application. For
           example, the Recoll internal file system indexer stores the part
           of the document access path internal to the container file (ipath
           in this case is a list of subdocument sequential numbers). url and
           ipath are returned in every search result and permit access to the
           original document.

   Stored and indexed fields

           The fields file inside the Recoll configuration defines which
           document fields are either "indexed" (searchable), "stored"
           (retrievable with search results), or both.

   Data for an external indexer, should be stored in a separate index, not
   the one for the Recoll internal file system indexer, except if the latter
   is not used at all). The reason is that the main document indexer purge
   pass would remove all the other indexer's documents, as they were not seen
   during indexing. The main indexer documents would also probably be a
   problem for the external indexer purge operation.

  4.3.2. Python interface

    4.3.2.1. Introduction

   Recoll versions after 1.11 define a Python programming interface, both for
   searching and indexing. The indexing portion has seen little use, but the
   searching one is used in the Recoll Ubuntu Unity Lens and Recoll Web UI.

   The API is inspired by the Python database API specification. There were
   two major changes in recent Recoll versions:

     o The basis for the Recoll API changed from Python database API version
       1.0 (Recoll versions up to 1.18.1), to version 2.0 (Recoll 1.18.2 and
       later).
     o The recoll module became a package (with an internal recoll module) as
       of Recoll version 1.19, in order to add more functions. For existing
       code, this only changes the way the interface must be imported.

   We will mostly describe the new API and package structure here. A
   paragraph at the end of this section will explain a few differences and
   ways to write code compatible with both versions.

   The Python interface can be found in the source package, under
   python/recoll.

   The python/recoll/ directory contains the usual setup.py. After
   configuring the main Recoll code, you can use the script to build and
   install the Python module:

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

   The normal Recoll installer installs the Python API along with the main
   code.

   When installing from a repository, and depending on the distribution, the
   Python API can sometimes be found in a separate package.

    4.3.2.2. Recoll package

   The recoll package contains two modules:

     o The recoll module contains functions and classes used to query (or
       update) the index.

     o The rclextract module contains functions and classes used to access
       document data.

    4.3.2.3. The recoll module

      Functions

   connect(confdir=None, extra_dbs=None, writable = False)
           The connect() function connects to one or several Recoll index(es)
           and returns a Db object.
              o confdir may specify a configuration directory. The usual
                defaults apply.
              o extra_dbs is a list of additional indexes (Xapian
                directories).
              o writable decides if we can index new data through this
                connection.
           This call initializes the recoll module, and it should always be
           performed before any other call or object creation.

      Classes

        The Db class

   A Db object is created by a connect() call and holds a connection to a
   Recoll index.

   Methods

   Db.close()
           Closes the connection. You can't do anything with the Db object
           after this.

   Db.query(), Db.cursor()
           These aliases return a blank Query object for this index.

   Db.setAbstractParams(maxchars, contextwords)
           Set the parameters used to build snippets (sets of keywords in
           context text fragments). maxchars defines the maximum total size
           of the abstract. contextwords defines how many terms are shown
           around the keyword.

   Db.termMatch(match_type, expr, field='', maxlen=-1, casesens=False,
   diacsens=False, lang='english')
           Expand an expression against the index term list. Performs the
           basic function from the GUI term explorer tool. match_type can be
           either of wildcard, regexp or stem. Returns a list of terms
           expanded from the input expression.

        The Query class

   A Query object (equivalent to a cursor in the Python DB API) is created by
   a Db.query() call. It is used to execute index searches.

   Methods

   Query.sortby(fieldname, ascending=True)
           Sort results by fieldname, in ascending or descending order. Must
           be called before executing the search.

   Query.execute(query_string, stemming=1, stemlang="english")
           Starts a search for query_string, a Recoll search language string.

   Query.executesd(SearchData)
           Starts a search for the query defined by the SearchData object.

   Query.fetchmany(size=query.arraysize)
           Fetches the next Doc objects in the current search results, and
           returns them as an array of the required size, which is by default
           the value of the arraysize data member.

   Query.fetchone()
           Fetches the next Doc object from the current search results.

   Query.close()
           Closes the query. The object is unusable after the call.

   Query.scroll(value, mode='relative')
           Adjusts the position in the current result set. mode can be
           relative or absolute.

   Query.getgroups()
           Retrieves the expanded query terms as a list of pairs. Meaningful
           only after executexx In each pair, the first entry is a list of
           user terms (of size one for simple terms, or more for group and
           phrase clauses), the second a list of query terms as derived from
           the user terms and used in the Xapian Query.

   Query.getxquery()
           Return the Xapian query description as a Unicode string.
           Meaningful only after executexx.

   Query.highlight(text, ishtml = 0, methods = object)
           Will insert ,  tags around the match
           areas in the input text and return the modified text. ishtml can
           be set to indicate that the input text is HTML and that HTML
           special characters should not be escaped. methods if set should be
           an object with methods startMatch(i) and endMatch() which will be
           called for each match and should return a begin and end tag

   Query.makedocabstract(doc, methods = object))
           Create a snippets abstract for doc (a Doc object) by selecting
           text around the match terms. If methods is set, will also perform
           highlighting. See the highlight method.

   Query.__iter__() and Query.next()
           So that things like for doc in query: will work.

   Data descriptors

   Query.arraysize
           Default number of records processed by fetchmany (r/w).

   Query.rowcount
           Number of records returned by the last execute.

   Query.rownumber
           Next index to be fetched from results. Normally increments after
           each fetchone() call, but can be set/reset before the call to
           effect seeking (equivalent to using scroll()). Starts at 0.

        The Doc class

   A Doc object contains index data for a given document. The data is
   extracted from the index when searching, or set by the indexer program
   when updating. The Doc object has many attributes to be read or set by its
   user. It matches exactly the Rcl::Doc C++ object. Some of the attributes
   are predefined, but, especially when indexing, others can be set, the name
   of which will be processed as field names by the indexing configuration.
   Inputs can be specified as Unicode or strings. Outputs are Unicode
   objects. All dates are specified as Unix timestamps, printed as strings.
   Please refer to the rcldb/rcldoc.h C++ file for a description of the
   predefined attributes.

   At query time, only the fields that are defined as stored either by
   default or in the fields configuration file will be meaningful in the Doc
   object. Especially this will not be the case for the document text. See
   the rclextract module for accessing document contents.

   Methods

   get(key), [] operator
           Retrieve the named doc attribute

   getbinurl()
           Retrieve the URL in byte array format (no transcoding), for use as
           parameter to a system call.

   items()
           Return a dictionary of doc object keys/values

   keys()
           list of doc object keys (attribute names).

        The SearchData class

   A SearchData object allows building a query by combining clauses, for
   execution by Query.executesd(). It can be used in replacement of the query
   language approach. The interface is going to change a little, so no
   detailed doc for now...

   Methods

   addclause(type='and'|'or'|'excl'|'phrase'|'near'|'sub', qstring=string,
   slack=0, field='', stemming=1, subSearch=SearchData)

    4.3.2.4. The rclextract module

   Index queries do not provide document content (only a partial and
   unprecise reconstruction is performed to show the snippets text). In order
   to access the actual document data, the data extraction part of the
   indexing process must be performed (subdocument access and format
   translation). This is not trivial in general. The rclextract module
   currently provides a single class which can be used to access the data
   content for result documents.

      Classes

        The Extractor class

   Methods

   Extractor(doc)
           An Extractor object is built from a Doc object, output from a
           query.

   Extractor.textextract(ipath)
           Extract document defined by ipath and return a Doc object. The
           doc.text field has the document text converted to either
           text/plain or text/html according to doc.mimetype. The typical use
           would be as follows:

 qdoc = query.fetchone()
 extractor = recoll.Extractor(qdoc)
 doc = extractor.textextract(qdoc.ipath)
 # use doc.text, e.g. for previewing

   Extractor.idoctofile(ipath, targetmtype, outfile='')
           Extracts document into an output file, which can be given
           explicitly or will be created as a temporary file to be deleted by
           the caller. Typical use:

 qdoc = query.fetchone()
 extractor = recoll.Extractor(qdoc)
 filename = extractor.idoctofile(qdoc.ipath, qdoc.mimetype)

    4.3.2.5. Example code

   The following sample would query the index with a user language string.
   See the python/samples directory inside the Recoll source for other
   examples. The recollgui subdirectory has a very embryonic GUI which
   demonstrates the highlighting and data extraction functions.

 #!/usr/bin/env python

 from recoll import recoll

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

 query = db.query()
 nres = query.execute("some user question")
 print "Result count: ", nres
 if nres > 5:
     nres = 5
 for i in range(nres):
     doc = query.fetchone()
     print "Result #%d" % (query.rownumber,)
     for k in ("title", "size"):
         print k, ":", getattr(doc, k).encode('utf-8')
     abs = db.makeDocAbstract(doc, query).encode('utf-8')
     print abs
     print



    4.3.2.6. Compatibility with the previous version

   The following code fragments can be used to ensure that code can run with
   both the old and the new API (as long as it does not use the new abilities
   of the new API of course).

   Adapting to the new package structure:


 try:
     from recoll import recoll
     from recoll import rclextract
     hasextract = True
 except:
     import recoll
     hasextract = False


   Adapting to the change of nature of the next Query member. The same test
   can be used to choose to use the scroll() method (new) or set the next
   value (old).


        rownum = query.next if type(query.next) == int else \
                  query.rownumber


Chapter 5. Installation and configuration

5.1. Installing a binary copy

   Recoll binary copies are always distributed as regular packages for your
   system. They can be obtained either through the system's normal software
   distribution framework (e.g. Debian/Ubuntu apt, FreeBSD ports, etc.), or
   from some type of "backports" repository providing versions newer than the
   standard ones, or found on the Recoll WEB site in some cases.

   There used to exist another form of binary install, as pre-compiled source
   trees, but these are just less convenient than the packages and don't
   exist any more.

   The package management tools will usually automatically deal with hard
   dependancies for packages obtained from a proper package repository. You
   will have to deal with them by hand for downloaded packages (for example,
   when dpkg complains about missing dependancies).

   In all cases, you will have to check or install supporting applications
   for the file types that you want to index beyond those that are natively
   processed by Recoll (text, HTML, email files, and a few others).

   You should also maybe have a look at the configuration section (but this
   may not be necessary for a quick test with default parameters). Most
   parameters can be more conveniently set from the GUI interface.

5.2. Supporting packages

   Recoll uses external applications to index some file types. You need to
   install them for the file types that you wish to have indexed (these are
   run-time optional dependencies. None is needed for building or running
   Recoll except for indexing their specific file type).

   After an indexing pass, the commands that were found missing can be
   displayed from the recoll File menu. The list is stored in the missing
   text file inside the configuration directory.

   A list of common file types which need external commands follows. Many of
   the handlers need the iconv command, which is not always listed as a
   dependancy.

   Please note that, due to the relatively dynamic nature of this
   information, the most up to date version is now kept on
   http://www.recoll.org/features.html along with links to the home pages or
   best source/patches pages, and misc tips. The list below is not updated
   often and may be quite stale.

   For many Linux distributions, most of the commands listed can be installed
   from the package repositories. However, the packages are sometimes
   outdated, or not the best version for Recoll, so you should take a look at
   http://www.recoll.org/features.html if a file type is important to you.

   As of Recoll release 1.14, a number of XML-based formats that were handled
   by ad hoc handler code now use the xsltproc command, which usually comes
   with libxslt. These are: abiword, fb2 (ebooks), kword, openoffice, svg.

   Now for the list:

     o Openoffice files need unzip and xsltproc.

     o PDF files need pdftotext which is part of Poppler (usually comes with
       the poppler-utils package). Avoid the original one from Xpdf.

     o Postscript files need pstotext. The original version has an issue with
       shell character in file names, which is corrected in recent packages.
       See http://www.recoll.org/features.html for more detail.

     o MS Word needs antiword. It is also useful to have wvWare installed as
       it may be be used as a fallback for some files which antiword does not
       handle.

     o MS Excel and PowerPoint are processed by internal Python handlers.

     o MS Open XML (docx) needs xsltproc.

     o Wordperfect files need wpd2html from the libwpd (or libwpd-tools on
       Ubuntu) package.

     o RTF files need unrtf, which, in its older versions, has much trouble
       with non-western character sets. Many Linux distributions carry
       outdated unrtf versions. Check http://www.recoll.org/features.html for
       details.

     o TeX files need untex or detex. Check
       http://www.recoll.org/features.html for sources if it's not packaged
       for your distribution.

     o dvi files need dvips.

     o djvu files need djvutxt and djvused from the DjVuLibre package.

     o Audio files: Recoll releases 1.14 and later use a single Python
       handler based on mutagen for all audio file types.

     o Pictures: Recoll uses the Exiftool Perl package to extract tag
       information. Most image file formats are supported. Note that there
       may not be much interest in indexing the technical tags (image size,
       aperture, etc.). This is only of interest if you store personal tags
       or textual descriptions inside the image files.

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

     o ICS: up to Recoll 1.13, iCalendar files need Python and the icalendar
       module. icalendar is not needed for newer versions, which use internal
       code.

     o Zip archives need Python (and the standard zipfile module).

     o Rar archives need Python, the rarfile Python module and the unrar
       utility.

     o Midi karaoke files need Python and the Midi module

     o Konqueror webarchive format with Python (uses the Tarfile module).

     o Mimehtml web archive format (support based on the email handler, which
       introduces some mild weirdness, but still usable).

   Text, HTML, email folders, and Scribus files are processed internally. Lyx
   is used to index Lyx files. Many handlers need iconv and the standard sed
   and awk.

5.3. Building from source

  5.3.1. Prerequisites

   If you can install any or all of the following through the package manager
   for your system, all the better. Especially Qt is a very big piece of
   software, but you will most probably be able to find a binary package.

   You may have to compile Xapian but this is easy.

   The shopping list:

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

     o Development files for Xapian core.

  Important

       If you are building Xapian for an older CPU (before Pentium 4 or
       Athlon 64), you need to add the --disable-sse flag to the configure
       command. Else all Xapian application will crash with an illegal
       instruction error.

     o Development files for Qt 4 . Recoll has not been tested with Qt 5 yet.
       Recoll 1.15.9 was the last version to support Qt 3. If you do not want
       to install or build the Qt Webkit module, Recoll has a configuration
       option to disable its use (see further).

     o Development files for X11 and zlib.

     o You may also need libiconv. On Linux systems, the iconv interface is
       part of libc and you should not need to do anything special.

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

  5.3.2. Building

   Recoll has been built on Linux, FreeBSD, Mac OS X, and Solaris, most
   versions after 2005 should be ok, maybe some older ones too (Solaris 8 is
   ok). If you build on another system, and need to modify things, I would
   very much welcome patches.

   Configure options: 

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

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

     o --with-qzeitgeist will enable sending Zeitgeist events about the
       visited search results, and needs the qzeitgeist package.

     o --disable-webkit is available from version 1.17 to implement the
       result list with a Qt QTextBrowser instead of a WebKit widget if you
       do not or can't depend on the latter.

     o --disable-idxthreads is available from version 1.19 to suppress
       multithreading inside the indexing process. You can also use the
       run-time configuration to restrict recollindex to using a single
       thread, but the compile-time option may disable a few more unused
       locks. This only applies to the use of multithreading for the core
       index processing (data input). The Recoll monitor mode always uses at
       least two threads of execution.

     o --disable-python-module will avoid building the Python module.

     o --disable-xattr will prevent fetching data from file extended
       attributes. Beyond a few standard attributes, fetching extended
       attributes data can only be useful is some application stores data in
       there, and also needs some simple configuration (see comments in the
       fields configuration file).

     o --enable-camelcase will enable splitting camelCase words. This is not
       enabled by default as it has the unfortunate side-effect of making
       some phrase searches quite confusing: ie, "MySQL manual" would be
       matched by "MySQL manual" and "my sql manual" but not "mysql manual"
       (only inside phrase searches).

     o --with-file-command Specify the version of the 'file' command to use
       (ie: --with-file-command=/usr/local/bin/file). Can be useful to enable
       the gnu version on systems where the native one is bad.

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

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

     o --disable-pic will compile Recoll with position-dependant code. This
       is incompatible with building the KIO or the Python or PHP extensions,
       but might yield very marginally faster code.

     o Of course the usual autoconf configure options, like --prefix apply.

   Normal procedure:

         cd recoll-xxx
         ./configure
         make
         (practices usual hardship-repelling invocations)
      

   There is little auto-configuration. The configure script will mainly link
   one of the system-specific files in the mk directory to mk/sysconf. If
   your system is not known yet, it will tell you as much, and you may want
   to manually copy and modify one of the existing files (the new file name
   should be the output of uname -s).

    5.3.2.1. Building on Solaris

   We did not test building the GUI on Solaris for recent versions. You will
   need at least Qt 4.4. There are some hints on an old web site page, they
   may still be valid.

   Someone did test the 1.19 indexer and Python module build, they do work,
   with a few minor glitches. Be sure to use GNU make and install.

  5.3.3. Installation

   Either type make install or execute recollinstall prefix, in the root of
   the source tree. This will copy the commands to prefix/bin and the sample
   configuration files, scripts and other shared data to prefix/share/recoll.

   If the installation prefix given to recollinstall is different from either
   the system default or the value which was specified when executing
   configure (as in configure --prefix /some/path), you will have to set the
   RECOLL_DATADIR environment variable to indicate where the shared data is
   to be found (ie for (ba)sh: export
   RECOLL_DATADIR=/some/path/share/recoll).

   You can then proceed to configuration.

5.4. Configuration overview

   Most of the parameters specific to the recoll GUI are set through the
   Preferences menu and stored in the standard Qt place
   ($HOME/.config/Recoll.org/recoll.conf). You probably do not want to edit
   this by hand.

   Recoll indexing options are set inside text configuration files located in
   a configuration directory. There can be several such directories, each of
   which defines the parameters for one index.

   The configuration files can be edited by hand or through the Index
   configuration dialog (Preferences menu). The GUI tool will try to respect
   your formatting and comments as much as possible, so it is quite possible
   to use both ways.

   The most accurate documentation for the configuration parameters is given
   by comments inside the default files, and we will just give a general
   overview here.

   By default, for each index, there are two sets of configuration files.
   System-wide configuration files are kept in a directory named like
   /usr/[local/]share/recoll/examples, and define default values, shared by
   all indexes. For each index, a parallel set of files defines the
   customized parameters.

   In addition (as of Recoll version 1.19.7), it is possible to specify two
   additional configuration directories which will be stacked before and
   after the user configuration directory. These are defined by the
   RECOLL_CONFTOP and RECOLL_CONFMID environment variables. Values from
   configuration files inside the top directory will override user ones,
   values from configuration files inside the middle directory will override
   system ones and be overriden by user ones. These two variables may be of
   use to applications which augment Recoll functionality, and need to add
   configuration data without disturbing the user's files. Please note that
   the two, currently single, values will probably be interpreted as
   colon-separated lists in the future: do not use colon characters inside
   the directory paths.

   The default location of the configuration is the .recoll directory in your
   home. Most people will only use this directory.

   This location can be changed, or others can be added with the
   RECOLL_CONFDIR environment variable or the -c option parameter to recoll
   and recollindex.

   If the .recoll directory does not exist when recoll or recollindex are
   started, it will be created with a set of empty configuration files.
   recoll will give you a chance to edit the configuration file before
   starting indexing. recollindex will proceed immediately. To avoid
   mistakes, the automatic directory creation will only occur for the default
   location, not if -c or RECOLL_CONFDIR were used (in the latter cases, you
   will have to create the directory).

   All configuration files share the same format. For example, a short
   extract of the main configuration file might look as follows:

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

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

   There are three kinds of lines:

     o Comment (starts with #) or empty.

     o Parameter affectation (name = value).

     o Section definition ([somedirname]).

   Depending on the type of configuration file, section definitions either
   separate groups of parameters or allow redefining some parameters for a
   directory sub-tree. They stay in effect until another section definition,
   or the end of file, is encountered. Some of the parameters used for
   indexing are looked up hierarchically from the current directory location
   upwards. Not all parameters can be meaningfully redefined, this is
   specified for each in the next section.

   When found at the beginning of a file path, the tilde character (~) is
   expanded to the name of the user's home directory, as a shell would do.

   White space is used for separation inside lists. List elements with
   embedded spaces can be quoted using double-quotes.

   Encoding issues. Most of the configuration parameters are plain ASCII. Two
   particular sets of values may cause encoding issues:

     o File path parameters may contain non-ascii characters and should use
       the exact same byte values as found in the file system directory.
       Usually, this means that the configuration file should use the system
       default locale encoding.

     o The unac_except_trans parameter should be encoded in UTF-8. If your
       system locale is not UTF-8, and you need to also specify non-ascii
       file paths, this poses a difficulty because common text editors cannot
       handle multiple encodings in a single file. In this relatively
       unlikely case, you can edit the configuration file as two separate
       text files with appropriate encodings, and concatenate them to create
       the complete configuration.

  5.4.1. Environment variables

   RECOLL_CONFDIR

           Defines the main configuration directory.

   RECOLL_TMPDIR, TMPDIR

           Locations for temporary files, in this order of priority. The
           default if none of these is set is to use /tmp. Big temporary
           files may be created during indexing, mostly for decompressing,
           and also for processing, e.g. email attachments.

   RECOLL_CONFTOP, RECOLL_CONFMID

           Allow adding configuration directories with priorities below and
           above the user directory (see above the Configuration overview
           section for details).

   RECOLL_EXTRA_DBS, RECOLL_ACTIVE_EXTRA_DBS

           Help for setting up external indexes. See this paragraph for
           explanations.

   RECOLL_DATADIR

           Defines replacement for the default location of Recoll data files,
           normally found in, e.g., /usr/share/recoll).

   RECOLL_FILTERSDIR

           Defines replacement for the default location of Recoll filters,
           normally found in, e.g., /usr/share/recoll/filters).

   ASPELL_PROG

           aspell program to use for creating the spelling dictionary. The
           result has to be compatible with the libaspell which Recoll is
           using.

   VARNAME

           Blabla

  5.4.2. The main configuration file, recoll.conf

   recoll.conf is the main configuration file. It defines things like what to
   index (top directories and things to ignore), and the default character
   set to use for document types which do not specify it internally.

   The default configuration will index your home directory. If this is not
   appropriate, start recoll to create a blank configuration, click Cancel,
   and edit the configuration file before restarting the command. This will
   start the initial indexing, which may take some time.

   Most of the following parameters can be changed from the Index
   Configuration menu in the recoll interface. Some can only be set by
   editing the configuration file.

    5.4.2.1. Parameters affecting what documents we index:

   topdirs

           Specifies the list of directories or files to index (recursively
           for directories). You can use symbolic links as elements of this
           list. See the followLinks option about following symbolic links
           found under the top elements (not followed by default).

   skippedNames

           A space-separated list of wilcard patterns for names of files or
           directories that should be completely ignored. The list defined in
           the default file is:

 skippedNames = #* bin CVS  Cache cache* caughtspam  tmp .thumbnails .svn \
                *~ .beagle .git .hg .bzr loop.ps .xsession-errors \
                .recoll* xapiandb recollrc recoll.conf

           The list can be redefined at any sub-directory in the indexed
           area.

           The top-level directories are not affected by this list (that is,
           a directory in topdirs might match and would still be indexed).

           The list in the default configuration does not exclude hidden
           directories (names beginning with a dot), which means that it may
           index quite a few things that you do not want. On the other hand,
           email user agents like thunderbird usually store messages in
           hidden directories, and you probably want this indexed. One
           possible solution is to have .* in skippedNames, and add things
           like ~/.thunderbird or ~/.evolution in topdirs.

           Not even the file names are indexed for patterns in this list. See
           the noContentSuffixes variable for an alternative approach which
           indexes the file names.

   noContentSuffixes

           This is a list of file name endings (not wildcard expressions, nor
           dot-delimited suffixes). Only the names of matching files will be
           indexed (no attempt at MIME type identification, no decompression,
           no content indexing). This can be redefined for subdirectories,
           and edited from the GUI. The default value is:

 noContentSuffixes = .md5 .map \
        .o .lib .dll .a .sys .exe .com \
        .mpp .mpt .vsd \
            .img .img.gz .img.bz2 .img.xz .image .image.gz .image.bz2 .image.xz \
        .dat .bak .rdf .log.gz .log .db .msf .pid \
        ,v ~ #

   skippedPaths and daemSkippedPaths

           A space-separated list of patterns for paths of files or
           directories that should be skipped. There is no default in the
           sample configuration file, but the code always adds the
           configuration and database directories in there.

           skippedPaths is used both by batch and real time indexing.
           daemSkippedPaths can be used to specify things that should be
           indexed at startup, but not monitored.

           Example of use for skipping text files only in a specific
           directory:

 skippedPaths = ~/somedir/*.txt
              

   skippedPathsFnmPathname

           The values in the *skippedPaths variables are matched by default
           with fnmatch(3), with the FNM_PATHNAME flag. This means that '/'
           characters must be matched explicitely. You can set
           skippedPathsFnmPathname to 0 to disable the use of FNM_PATHNAME
           (meaning that /*/dir3 will match /dir1/dir2/dir3).

   zipSkippedNames

           A space-separated list of patterns for names of files or
           directories that should be ignored inside zip archives. This is
           used directly by the zip handler, and has a function similar to
           skippedNames, but works independantly. Can be redefined for
           filesystem subdirectories. For versions up to 1.19, you will need
           to update the Zip handler and install a supplementary Python
           module. The details are described on the Recoll wiki.

   followLinks

           Specifies if the indexer should follow symbolic links while
           walking the file tree. The default is to ignore symbolic links to
           avoid multiple indexing of linked files. No effort is made to
           avoid duplication when this option is set to true. This option can
           be set individually for each of the topdirs members by using
           sections. It can not be changed below the topdirs level.

   indexedmimetypes

           Recoll normally indexes any file which it knows how to read. This
           list lets you restrict the indexed MIME types to what you specify.
           If the variable is unspecified or the list empty (the default),
           all supported types are processed. Can be redefined for
           subdirectories.

   excludedmimetypes

           This list lets you exclude some MIME types from indexing. Can be
           redefined for subdirectories.

   compressedfilemaxkbs

           Size limit for compressed (.gz or .bz2) files. These need to be
           decompressed in a temporary directory for identification, which
           can be very wasteful if 'uninteresting' big compressed files are
           present. Negative means no limit, 0 means no processing of any
           compressed file. Defaults to -1.

   textfilemaxmbs

           Maximum size for text files. Very big text files are often
           uninteresting logs. Set to -1 to disable (default 20MB).

   textfilepagekbs

           If set to other than -1, text files will be indexed as multiple
           documents of the given page size. This may be useful if you do
           want to index very big text files as it will both reduce memory
           usage at index time and help with loading data to the preview
           window. A size of a few megabytes would seem reasonable (default:
           1MB).

   membermaxkbs

           This defines the maximum size in kilobytes for an archive member
           (zip, tar or rar at the moment). Bigger entries will be skipped.

   indexallfilenames

           Recoll indexes file names in a special section of the database to
           allow specific file names searches using wild cards. This
           parameter decides if file name indexing is performed only for
           files with MIME types that would qualify them for full text
           indexing, or for all files inside the selected subtrees,
           independently of MIME type.

   usesystemfilecommand

           Decide if we execute a system command (file -i by default) as a
           final step for determining the MIME type for a file (the main
           procedure uses suffix associations as defined in the mimemap
           file). This can be useful for files with suffix-less names, but it
           will also cause the indexing of many bogus "text" files.

   systemfilecommand

           Command to use for mime for mime type determination if
           usesystefilecommand is set. Recent versions of xdg-mime sometimes
           work better than file.

   processwebqueue

           If this is set, process the directory where Web browser plugins
           copy visited pages for indexing.

   webqueuedir

           The path to the web indexing queue. This is hard-coded in the
           Firefox plugin as ~/.recollweb/ToIndex so there should be no need
           to change it.

    5.4.2.2. Parameters affecting how we generate terms:

   Changing some of these parameters will imply a full reindex. Also, when
   using multiple indexes, it may not make sense to search indexes that don't
   share the values for these parameters, because they usually affect both
   search and index operations.

   indexStripChars

           Decide if we strip characters of diacritics and convert them to
           lower-case before terms are indexed. If we don't, searches
           sensitive to case and diacritics can be performed, but the index
           will be bigger, and some marginal weirdness may sometimes occur.
           The default is a stripped index (indexStripChars = 1) for now.
           When using multiple indexes for a search, this parameter must be
           defined identically for all. Changing the value implies an index
           reset.

   maxTermExpand

           Maximum expansion count for a single term (e.g.: when using
           wildcards). The default of 10000 is reasonable and will avoid
           queries that appear frozen while the engine is walking the term
           list.

   maxXapianClauses

           Maximum number of elementary clauses we can add to a single Xapian
           query. In some cases, the result of term expansion can be
           multiplicative, and we want to avoid using excessive memory. The
           default of 100 000 should be both high enough in most cases and
           compatible with current typical hardware configurations.

   nonumbers

           If this set to true, no terms will be generated for numbers. For
           example "123", "1.5e6", 192.168.1.4, would not be indexed
           ("value123" would still be). Numbers are often quite interesting
           to search for, and this should probably not be set except for
           special situations, ie, scientific documents with huge amounts of
           numbers in them. This can only be set for a whole index, not for a
           subtree.

   nocjk

           If this set to true, specific east asian (Chinese Korean Japanese)
           characters/word splitting is turned off. This will save a small
           amount of cpu if you have no CJK documents. If your document base
           does include such text but you are not interested in searching it,
           setting nocjk may be a significant time and space saver.

   cjkngramlen

           This lets you adjust the size of n-grams used for indexing CJK
           text. The default value of 2 is probably appropriate in most
           cases. A value of 3 would allow more precision and efficiency on
           longer words, but the index will be approximately twice as large.

   indexstemminglanguages

           A list of languages for which the stem expansion databases will be
           built. See recollindex(1) or use the recollindex -l command for
           possible values. You can add a stem expansion database for a
           different language by using recollindex -s, but it will be deleted
           during the next indexing. Only languages listed in the
           configuration file are permanent.

   defaultcharset

           The name of the character set used for files that do not contain a
           character set definition (ie: plain text files). This can be
           redefined for any sub-directory. If it is not set at all, the
           character set used is the one defined by the nls environment (
           LC_ALL, LC_CTYPE, LANG), or iso8859-1 if nothing is set.

   unac_except_trans

           This is a list of characters, encoded in UTF-8, which should be
           handled specially when converting text to unaccented lowercase.
           For example, in Swedish, the letter a with diaeresis has full
           alphabet citizenship and should not be turned into an a. Each
           element in the space-separated list has the special character as
           first element and the translation following. The handling of both
           the lowercase and upper-case versions of a character should be
           specified, as appartenance to the list will turn-off both standard
           accent and case processing. Example for Swedish:

 unac_except_trans =  aaaa AAaa a:a: A:a: o:o: O:o:
            

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

           The default value set for unac_except_trans can't be listed here
           because I have trouble with SGML and UTF-8, but it only contains
           ligature decompositions: german ss, oe, ae, fi, fl.

           This parameter can't be defined for subdirectories, it is global,
           because there is no way to do otherwise when querying. If you have
           document sets which would need different values, you will have to
           index and query them separately.

   maildefcharset

           This can be used to define the default character set specifically
           for email messages which don't specify it. This is mainly useful
           for readpst (libpst) dumps, which are utf-8 but do not say so.

   localfields

           This allows setting fields for all documents under a given
           directory. Typical usage would be to set an "rclaptg" field, to be
           used in mimeview to select a specific viewer. If several fields
           are to be set, they should be separated with a semi-colon (';')
           character, which there is currently no way to escape. Also note
           the initial semi-colon. Example: localfields= ;rclaptg=gnus;other
           = val, then select specifier viewer with mimetype|tag=... in
           mimeview.

   testmodifusemtime

           If true, use mtime instead of default ctime to determine if a file
           has been modified (in addition to size, which is always used).
           Setting this can reduce re-indexing on systems where extended
           attributes are modified (by some other application), but not
           indexed (changing extended attributes only affects ctime). Notes:

              o This may prevent detection of change in some marginal file
                rename cases (the target would need to have the same size and
                mtime).

              o You should probably also set noxattrfields to 1 in this case,
                except if you still prefer to perform xattr indexing, for
                example if the local file update pattern makes it of value
                (as in general, there is a risk for pure extended attributes
                updates without file modification to go undetected).

           Perform a full index reset after changing the value of this
           parameter.

   noxattrfields

           Recoll versions 1.19 and later automatically translate file
           extended attributes into document fields (to be processed
           according to the parameters from the fields file). Setting this
           variable to 1 will disable the behaviour.

   metadatacmds

           This allows executing external commands for each file and storing
           the output in Recoll document fields. This could be used for
           example to index external tag data. The value is a list of field
           names and commands, don't forget an initial semi-colon. Example:

 [/some/area/of/the/fs]
 metadatacmds = ; tags = tmsu tags %f; otherfield = somecmd -xx %f
                

           As a specially disgusting hack brought by Recoll 1.19.7, if a
           "field name" begins with rclmulti, the data returned by the
           command is expected to contain multiple field values, in
           configuration file format. This allows setting several fields by
           executing a single command. Example:

 metadatacmds = ; rclmulti1 = somecmd %f
                

           If somecmd returns data in the form of:

 field1 = value1
 field2 = value for field2
                

           field1 and field2 will be set inside the document metadata.

    5.4.2.3. Parameters affecting where and how we store things:

   dbdir

           The name of the Xapian data directory. It will be created if
           needed when the index is initialized. If this is not an absolute
           path, it will be interpreted relative to the configuration
           directory. The value can have embedded spaces but starting or
           trailing spaces will be trimmed. You cannot use quotes here.

   idxstatusfile

           The name of the scratch file where the indexer process updates its
           status. Default: idxstatus.txt inside the configuration directory.

   maxfsoccuppc

           Maximum file system occupation before we stop indexing. The value
           is a percentage, corresponding to what the "Capacity" df output
           column shows. The default value is 0, meaning no checking.

   mboxcachedir

           The directory where mbox message offsets cache files are held.
           This is normally $RECOLL_CONFDIR/mboxcache, but it may be useful
           to share a directory between different configurations.

   mboxcacheminmbs

           The minimum mbox file size over which we cache the offsets. There
           is really no sense in caching offsets for small files. The default
           is 5 MB.

   webcachedir

           This is only used by the web browser plugin indexing code, and
           defines where the cache for visited pages will live. Default:
           $RECOLL_CONFDIR/webcache

   webcachemaxmbs

           This is only used by the web browser plugin indexing code, and
           defines the maximum size for the web page cache. Default: 40 MB.
           Quite unfortunately, this is only taken into account when creating
           the cache file. You need to delete the file for a change to be
           taken into account.

   idxflushmb

           Threshold (megabytes of new text data) where we flush from memory
           to disk index. Setting this can help control memory usage. A value
           of 0 means no explicit flushing, letting Xapian use its own
           default, which is flushing every 10000 (or XAPIAN_FLUSH_THRESHOLD)
           documents, which gives little memory usage control, as memory
           usage also depends on average document size. The default value is
           10, and it is probably a bit low. If your system usually has free
           memory, you can try higher values between 20 and 80. In my
           experience, values beyond 100 are always counterproductive.

    5.4.2.4. Parameters affecting multithread processing

   The Recoll indexing process recollindex can use multiple threads to speed
   up indexing on multiprocessor systems. The work done to index files is
   divided in several stages and some of the stages can be executed by
   multiple threads. The stages are:

    1. File system walking: this is always performed by the main thread.
    2. File conversion and data extraction.
    3. Text processing (splitting, stemming, etc.)
    4. Xapian index update.

   You can also read a longer document about the transformation of Recoll
   indexing to multithreading.

   The threads configuration is controlled by two configuration file
   parameters.

   thrQSizes

           This variable defines the job input queues configuration. There
           are three possible queues for stages 2, 3 and 4, and this
           parameter should give the queue depth for each stage (three
           integer values). If a value of -1 is used for a given stage, no
           queue is used, and the thread will go on performing the next
           stage. In practise, deep queues have not been shown to increase
           performance. A value of 0 for the first queue tells Recoll to
           perform autoconfiguration (no need for the two other values in
           this case) - this is the default configuration.

   thrTCounts

           This defines the number of threads used for each stage. If a value
           of -1 is used for one of the queue depths, the corresponding
           thread count is ignored. It makes no sense to use a value other
           than 1 for the last stage because updating the Xapian index is
           necessarily single-threaded (and protected by a mutex).

   The following example would use three queues (of depth 2), and 4 threads
   for converting source documents, 2 for processing their text, and one to
   update the index. This was tested to be the best configuration on the test
   system (quadri-processor with multiple disks).

 thrQSizes = 2 2 2
 thrTCounts =  4 2 1

   The following example would use a single queue, and the complete
   processing for each document would be performed by a single thread
   (several documents will still be processed in parallel in most cases). The
   threads will use mutual exclusion when entering the index update stage. In
   practise the performance would be close to the precedent case in general,
   but worse in certain cases (e.g. a Zip archive would be performed purely
   sequentially), so the previous approach is preferred. YMMV... The 2 last
   values for thrTCounts are ignored.

 thrQSizes = 2 -1 -1
 thrTCounts =  6 1 1

   The following example would disable multithreading. Indexing will be
   performed by a single thread.

 thrQSizes = -1 -1 -1

    5.4.2.5. Miscellaneous parameters:

   autodiacsens

           IF the index is not stripped, decide if we automatically trigger
           diacritics sensitivity if the search term has accented characters
           (not in unac_except_trans). Else you need to use the query
           language and the D modifier to specify diacritics sensitivity.
           Default is no.

   autocasesens

           IF the index is not stripped, decide if we automatically trigger
           character case sensitivity if the search term has upper-case
           characters in any but the first position. Else you need to use the
           query language and the C modifier to specify character-case
           sensitivity. Default is yes.

   loglevel,daemloglevel

           Verbosity level for recoll and recollindex. A value of 4 lists
           quite a lot of debug/information messages. 2 only lists errors.
           The daemversion is specific to the indexing monitor daemon.

   logfilename, daemlogfilename

           Where the messages should go. 'stderr' can be used as a special
           value, and is the default. The daemversion is specific to the
           indexing monitor daemon.

   checkneedretryindexscript

           This defines the name for a command executed by recollindex when
           starting indexing. If the exit status of the command is 0,
           recollindex retries to index all files which previously could not
           be indexed because of data extraction errors. The default value is
           a script which checks if any of the common bin directories have
           changed (indicating that a helper program may have been
           installed).

   mondelaypatterns

           This allows specify wildcard path patterns (processed with
           fnmatch(3) with 0 flag), to match files which change too often and
           for which a delay should be observed before re-indexing. This is a
           space-separated list, each entry being a pattern and a time in
           seconds, separated by a colon. You can use double quotes if a path
           entry contains white space. Example:

 mondelaypatterns = *.log:20 "this one has spaces*:10"
              

   monixinterval

           Minimum interval (seconds) for processing the indexing queue. The
           real time monitor does not process each event when it comes in,
           but will wait this time for the queue to accumulate to diminish
           overhead and in order to aggregate multiple events to the same
           file. Default 30 S.

   monauxinterval

           Period (in seconds) at which the real time monitor will regenerate
           the auxiliary databases (spelling, stemming) if needed. The
           default is one hour.

   monioniceclass, monioniceclassdata

           These allow defining the ionice class and data used by the indexer
           (default class 3, no data).

   filtermaxseconds

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

   filtermaxmbytes

           Recoll 1.20.7 and later. Maximum handler memory utilisation. This
           uses setrlimit(RLIMIT_AS) on most systems (total virtual memory
           space size limit). Some programs may start with 500 MBytes of
           mapped shared libraries, so take this into account when choosing a
           value. The default is a liberal 2000MB.

   filtersdir

           A directory to search for the external input handler scripts used
           to index some types of files. The value should not be changed,
           except if you want to modify one of the default scripts. The value
           can be redefined for any sub-directory.

   iconsdir

           The name of the directory where recoll result list icons are
           stored. You can change this if you want different images.

   idxabsmlen

           Recoll stores an abstract for each indexed file inside the
           database. The text can come from an actual 'abstract' section in
           the document or will just be the beginning of the document. It is
           stored in the index so that it can be displayed inside the result
           lists without decoding the original file. The idxabsmlen parameter
           defines the size of the stored abstract. The default value is 250
           bytes. The search interface gives you the choice to display this
           stored text or a synthetic abstract built by extracting text
           around the search terms. If you always prefer the synthetic
           abstract, you can reduce this value and save a little space.

   idxmetastoredlen

           Maximum stored length for metadata fields. This does not affect
           indexing (the whole field is processed anyway), just the amount of
           data stored in the index for the purpose of displaying fields
           inside result lists or previews. The default value is 150 bytes
           which may be too low if you have custom fields.

   aspellLanguage

           Language definitions to use when creating the aspell dictionary.
           The value must match a set of aspell language definition files.
           You can type "aspell config" to see where these are installed
           (look for data-dir). The default if the variable is not set is to
           use your desktop national language environment to guess the value.

   noaspell

           If this is set, the aspell dictionary generation is turned off.
           Useful for cases where you don't need the functionality or when it
           is unusable because aspell crashes during dictionary generation.

   mhmboxquirks

           This allows definining location-related quirks for the mailbox
           handler. Currently only the tbird flag is defined, and it should
           be set for directories which hold Thunderbird data, as their
           folder format is weird.

  5.4.3. The fields file

   This file contains information about dynamic fields handling in Recoll.
   Some very basic fields have hard-wired behaviour, and, mostly, you should
   not change the original data inside the fields file. But you can create
   custom fields fitting your data and handle them just like they were native
   ones.

   The fields file has several sections, which each define an aspect of
   fields processing. Quite often, you'll have to modify several sections to
   obtain the desired behaviour.

   We will only give a short description here, you should refer to the
   comments inside the default file for more detailed information.

   Field names should be lowercase alphabetic ASCII.

   [prefixes]

           A field becomes indexed (searchable) by having a prefix defined in
           this section.

   [stored]

           A field becomes stored (displayable inside results) by having its
           name listed in this section (typically with an empty value).

   [aliases]

           This section defines lists of synonyms for the canonical names
           used inside the [prefixes] and [stored] sections

   [queryaliases]

           This section also defines aliases for the canonic field names,
           with the difference that the substitution will only be used at
           query time, avoiding any possibility that the value would pick-up
           random metadata from documents.

   handler-specific sections

           Some input handlers may need specific configuration for handling
           fields. Only the email message handler currently has such a
           section (named [mail]). It allows indexing arbitrary email headers
           in addition to the ones indexed by default. Other such sections
           may appear in the future.

   Here follows a small example of a personal fields file. This would extract
   a specific email header and use it as a searchable field, with data
   displayable inside result lists. (Side note: as the email handler does no
   decoding on the values, only plain ascii headers can be indexed, and only
   the first occurrence will be used for headers that occur several times).

 [prefixes]
 # Index mailmytag contents (with the given prefix)
 mailmytag = XMTAG

 [stored]
 # Store mailmytag inside the document data record (so that it can be
 # displayed - as %(mailmytag) - in result lists).
 mailmytag =

 [queryaliases]
 filename = fn
 containerfilename = cfn

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

    5.4.3.1. Extended attributes in the fields file

   Recoll versions 1.19 and later process user extended file attributes as
   documents fields by default.

   Attributes are processed as fields of the same name, after removing the
   user prefix on Linux.

   The [xattrtofields] section of the fields file allows specifying
   translations from extended attributes names to Recoll field names. An
   empty translation disables use of the corresponding attribute data.

  5.4.4. The mimemap file

   mimemap specifies the file name extension to MIME type mappings.

   For file names without an extension, or with an unknown one, the system's
   file -i command will be executed to determine the MIME type (this can be
   switched off inside the main configuration file).

   The mappings can be specified on a per-subtree basis, which may be useful
   in some cases. Example: gaim logs have a .txt extension but should be
   handled specially, which is possible because they are usually all located
   in one place.

   The recoll_noindex mimemap variable has been moved to recoll.conf and
   renamed to noContentSuffixes, while keeping the same function, as of
   Recoll version 1.21. For older Recoll versions, see the documentation for
   noContentSuffixes but use recoll_noindex in mimemap.

  5.4.5. The mimeconf file

   mimeconf specifies how the different MIME types are handled for indexing,
   and which icons are displayed in the recoll result lists.

   Changing the parameters in the [index] section is probably not a good idea
   except if you are a Recoll developer.

   The [icons] section allows you to change the icons which are displayed by
   recoll in the result lists (the values are the basenames of the png images
   inside the iconsdir directory (specified in recoll.conf).

  5.4.6. The mimeview file

   mimeview specifies which programs are started when you click on an Open
   link in a result list. Ie: HTML is normally displayed using firefox, but
   you may prefer Konqueror, your openoffice.org program might be named
   oofice instead of openoffice etc.

   Changes to this file can be done by direct editing, or through the recoll
   GUI preferences dialog.

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

   In this case, the xallexcepts top level variable defines a list of MIME
   type exceptions which will be processed according to the local entries
   instead of being passed to the desktop. This is so that specific Recoll
   options such as a page number or a search string can be passed to
   applications that support them, such as the evince viewer.

   As for the other configuration files, the normal usage is to have a
   mimeview inside your own configuration directory, with just the
   non-default entries, which will override those from the central
   configuration file.

   All viewer definition entries must be placed under a [view] section.

   The keys in the file are normally MIME types. You can add an application
   tag to specialize the choice for an area of the filesystem (using a
   localfields specification in mimeconf). The syntax for the key is
   mimetype|tag

   The nouncompforviewmts entry, (placed at the top level, outside of the
   [view] section), holds a list of MIME types that should not be
   uncompressed before starting the viewer (if they are found compressed, ie:
   mydoc.doc.gz).

   The right side of each assignment holds a command to be executed for
   opening the file. The following substitutions are performed:

     o %D. Document date

     o %f. File name. This may be the name of a temporary file if it was
       necessary to create one (ie: to extract a subdocument from a
       container).

     o %i. Internal path, for subdocuments of containers. The format depends
       on the container type. If this appears in the command line, Recoll
       will not create a temporary file to extract the subdocument, expecting
       the called application (possibly a script) to be able to handle it.

     o %M. MIME type

     o %p. Page index. Only significant for a subset of document types,
       currently only PDF, Postscript and DVI files. Can be used to start the
       editor at the right page for a match or snippet.

     o %s. Search term. The value will only be set for documents with indexed
       page numbers (ie: PDF). The value will be one of the matched search
       terms. It would allow pre-setting the value in the "Find" entry inside
       Evince for example, for easy highlighting of the term.

     o %u. Url.

   In addition to the predefined values above, all strings like %(fieldname)
   will be replaced by the value of the field named fieldname for the
   document. This could be used in combination with field customisation to
   help with opening the document.

  5.4.7. The ptrans file

   ptrans specifies query-time path translations. These can be useful in
   multiple cases.

   The file has a section for any index which needs translations, either the
   main one or additional query indexes. The sections are named with the
   Xapian index directory names. No slash character should exist at the end
   of the paths (all comparisons are textual). An exemple should make things
   sufficiently clear

           [/home/me/.recoll/xapiandb]
           /this/directory/moved = /to/this/place

           [/path/to/additional/xapiandb]
           /server/volume1/docdir = /net/server/volume1/docdir
           /server/volume2/docdir = /net/server/volume2/docdir
        

  5.4.8. Examples of configuration adjustments

    5.4.8.1. Adding an external viewer for an non-indexed type

   Imagine that you have some kind of file which does not have indexable
   content, but for which you would like to have a functional Open link in
   the result list (when found by file name). The file names end in .blob and
   can be displayed by application blobviewer.

   You need two entries in the configuration files for this to work:

     o In $RECOLL_CONFDIR/mimemap (typically ~/.recoll/mimemap), add the
       following line:

 .blob = application/x-blobapp

       Note that the MIME type is made up here, and you could call it
       diesel/oil just the same.

     o In $RECOLL_CONFDIR/mimeview under the [view] section, add:

 application/x-blobapp = blobviewer %f

       We are supposing that blobviewer wants a file name parameter here, you
       would use %u if it liked URLs better.

   If you just wanted to change the application used by Recoll to display a
   MIME type which it already knows, you would just need to edit mimeview.
   The entries you add in your personal file override those in the central
   configuration, which you do not need to alter. mimeview can also be
   modified from the Gui.

    5.4.8.2. Adding indexing support for a new file type

   Let us now imagine that the above .blob files actually contain indexable
   text and that you know how to extract it with a command line program.
   Getting Recoll to index the files is easy. You need to perform the above
   alteration, and also to add data to the mimeconf file (typically in
   ~/.recoll/mimeconf):

     o Under the [index] section, add the following line (more about the
       rclblob indexing script later):

 application/x-blobapp = exec rclblob

     o Under the [icons] section, you should choose an icon to be displayed
       for the files inside the result lists. Icons are normally 64x64 pixels
       PNG files which live in /usr/[local/]share/recoll/images.

     o Under the [categories] section, you should add the MIME type where it
       makes sense (you can also create a category). Categories may be used
       for filtering in advanced search.

   The rclblob handler should be an executable program or script which exists
   inside /usr/[local/]share/recoll/filters. It will be given a file name as
   argument and should output the text or html contents on the standard
   output.

   The filter programming section describes in more detail how to write an
   input handler.
recoll-1.23.7/ChangeLog0000644000175000017500000121412213125527323011565 000000000000002010-02-02 15:33 +0100  Jean-Francois Dockes    (d11da0283f03 [tip])

	* src/common/textsplit.cpp, src/common/textsplit.h,
	src/query/plaintorich.cpp, src/query/recollq.cpp,
	src/query/wasatorcl.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/searchdata.cpp, src/rcldb/stoplist.cpp,
	src/rcldb/stoplist.h:
	cosmetics: use derived class for actual splitter instead of callback

2010-02-02 10:24 +0100  Jean-Francois Dockes    (a8caf709bcd3)

	* src/qt4gui/rclmain.ui, src/qtgui/rclmain.ui,
	src/qtgui/rclmain_w.cpp:
	QT GUI: define accelerators for res list page movements

2010-02-02 08:20 +0100  Jean-Francois Dockes    (ec31e285a553)

	* src/qtgui/reslist.cpp, src/query/reslistpager.h:
	Qt GUI: ensure that new page size is taken into account ASAP (no
	need for restarting app)

2010-02-01 17:51 +0100  Jean-Francois Dockes    (db953bb94c7f)

	* src/qt4gui/rclmain.ui, src/qtgui/preview_w.cpp,
	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h:
	QT GUI: add fullscreen mode

2010-02-01 10:31 +0100  Jean-Francois Dockes    (1eda55ae3be9)

	* src/mk/manifest.txt: new file.
	* src/excludefile, src/makesrcdist.sh, src/mk/manifest.txt:
	Making a source dist: check the new list against old reference +
	other checks

2010-01-31 19:53 +0100  Israel G. Lugo    (74d4e25d43c2)

	* src/recollinstall.in:
	Install recollq and its manpage when in cmdline mode. Don't install
	the recoll.1 manpage when in cmdline mode.

2010-01-31 19:47 +0100  Jean-Francois Dockes    (c88b0ef40512)

	* src/common/autoconfig.h.in:
	use 3-arg version of ac_define as the 1-arg one is being obsoleted

2010-01-31 19:45 +0100  Jean-Francois Dockes    (1960435ccb68)

	* src/configure.ac:
	Dispense with the x11-monitoring when neither fam nor inotify are
	configured

2010-01-31 19:35 +0100  Jean-Francois Dockes    (08e6abfc5fdf)

	* src/configure.ac:
	use 3-arg version of ac_define as the 1-arg one is being obsoleted

2010-01-31 19:34 +0100  Jean-Francois Dockes    (c0add9dd8ad4)

	* website/download.html:
	none

2010-01-30 17:47 +0100  Jean-Francois Dockes    (5ed138ff2230)

	* src/qtgui/spell_w.cpp, src/qtgui/spell_w.h:
	QT GUI: fix small problems in newly native qt4 term expander

2010-01-30 17:31 +0100  Jean-Francois Dockes    (6ecf959a8e01)

	* src/qt4gui/spell.ui: new file.
	* src/qt4gui/recollmain.ui: deleted file.
	* .hgignore, src/qt4gui/recollmain.ui, src/qt4gui/spell.ui,
	src/qt4gui/uifrom3, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h:
	QT GUI: converted the qt4 term expander dialog to native qt4

2010-01-30 14:09 +0100  Jean-Francois Dockes    (df8a91aaff88)

	* src/qt4gui/rclmain.ui: new file.
	* .hgignore, src/qt4gui/rclmain.ui, src/qt4gui/uifrom3,
	src/qtgui/confgui/confguiindex.h, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h:
	Qt GUI: made the Qt4 main window native Qt4 (no more use of
	Q3MainWindow)

2010-01-30 08:23 +0100  Jean-Francois Dockes    (ed18703563b7)

	* .hgignore, src/ChangeLog, website/BUGS.html, website/devel.html,
	website/doc.html, website/download.html, website/index.html.en:
	none

2010-01-30 08:23 +0100  Jean-Francois Dockes    (22044a3b2e2c)

	* src/qtgui/rclmain_w.h:
	Qt 4.6.1 Uic bug: change qt version test from == to <= as bug still
	here in 4.6.2

2010-01-30 08:21 +0100  Jean-Francois Dockes    (b1cb8c664953)

	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
	src/index/recollindex.cpp, src/utils/x11mon.cpp:
	Renamed WITHOUT_X11 to DISABLE_X11MON for clarification

2010-01-30 08:18 +0100  Israel G. Lugo    (be03b72e1258)

	* src/configure.ac:
	Rename option without-gui to disable-qtgui. New option disable-
	x11mon. Separate control of creation of the gui and X11 session
	monitoring.

2010-01-29 19:00 +0100  Jean-Francois Dockes    (d95c21312a15)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	KIO slave: fixed CMakeList to configure Recoll with --enable-pic

2010-01-29 17:22 +0100  Jean-Francois Dockes    (266941720a99)

	* src/python/README.txt: new file.
	* src/configure, src/configure.ac, src/doc/user/usermanual.sgml,
	src/lib/Makefile, src/lib/mkMake, src/mk/commondefs,
	src/mk/localdefs.in, src/php/00README.txt, src/python/README.txt,
	src/python/recoll/setup.py:
	Implemented configure --enable-pic flag to build the main lib with
	position-independant objects. This avoids having to edit localdefs
	by hand to build the new php extension, and voids the need for the
	Python module to recompile Recoll source files.

2010-01-29 15:47 +0100  Jean-Francois Dockes    (69c42078b8d3)

	* src/php/00README.txt: new file.
	* src/php/00README.txt, src/php/recoll/make.sh,
	src/php/recoll/recoll.cpp:
	PHP extension by Wenqiang Song : make ready for external use.
	- added minimal doc
	- fixed build script to work around php/libtool issue
	- have the module default to Query Language (instead of AND)

2010-01-28 18:22 +0100  Jean-Francois Dockes    (45e7ec5e16c5)

	* .hgignore, website/usermanual/README-dir.txt: new file.
	* packaging/debian/changelog, packaging/debian/compat,
	packaging/debian/control, packaging/debian/copyright,
	packaging/debian/docs, packaging/debian/menu,
	packaging/debian/rules, packaging/debian/watch: deleted file.
	* .hgignore, packaging/debian/changelog, packaging/debian/compat,
	packaging/debian/control, packaging/debian/copyright,
	packaging/debian/docs, packaging/debian/menu,
	packaging/debian/rules, packaging/debian/watch, src/makesrcdist.sh,
	website/usermanual/README-dir.txt:
	svn->mercurial modifications

2010-01-28 16:13 +0000  convert-repo    (e85c82d42126)

	* .hgtags: new file.
	* .hgtags:
	update tags

2010-01-26 13:23 +0000  dockes    (c0cb63a2702a)

	* last before trial switch to mercurial. really. Yeah

2010-01-26 13:22 +0000  dockes    (c40e044c63dd)

	* tests/chm/chm.sh, tests/chm/chm.txt, tests/ics/ics.sh,
	tests/ics/ics.txt, tests/zip/mcKee.zip, tests/zip/zip.sh,
	tests/zip/zip.txt, website/download-1.12.html: new file.
	* tests/chm/chm.sh, tests/chm/chm.txt, tests/ics/ics.sh,
	tests/ics/ics.txt, tests/zip/mcKee.zip, tests/zip/zip.sh,
	tests/zip/zip.txt, website/download-1.12.html:
	last before trial switch to mercurial. really

2010-01-26 13:21 +0000  dockes    (7918f7073757)

	* website/BUGS.html, website/CHANGES.html, website/download.html,
	website/index.html.en, website/index.html.fr:
	last before trial switch to mercurial

2010-01-26 07:06 +0000  dockes    (0b5ec08c2ba2)

	* src/INSTALL, src/README:
	

2010-01-26 07:06 +0000  dockes    (f6a420527382)

	* src/VERSION:
	1.13.02

2010-01-26 06:50 +0000  dockes    (b223f221578a [RECOLL_1_13_02])

	* src/doc/user/usermanual.sgml:
	clarified --prefix et al

2010-01-25 20:43 +0000  dockes    (7d69ae778654)

	* src/qt4gui/ui_rclmain.h-4.5: new file.
	* src/qt4gui/ui_rclmain.h-4.5, src/qtgui/rclmain_w.h:
	use older ui include file under qt 4.6.1, the one its uic generates
	is broken

2010-01-25 11:08 +0000  dockes    (e2e5a1dd802d)

	* src/php/recoll/recollq.h: deleted file.
	* src/php/recoll/recollq.h:
	not used?

2010-01-25 11:06 +0000  dockes    (1683475297c1)

	* src/php/recoll/config.m4, src/php/recoll/make.sh,
	src/php/recoll/php_recoll.h, src/php/recoll/recoll.cpp,
	src/php/recoll/recollq.h, src/php/sample/shell.php: new file.
	* src/php/recoll/config.m4, src/php/recoll/make.sh,
	src/php/recoll/php_recoll.h, src/php/recoll/recoll.cpp,
	src/php/recoll/recollq.h, src/php/sample/shell.php:
	initial import from W. Song

2010-01-20 07:42 +0000  dockes    (4df8ebfbb72d)

	* packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec,
	packaging/rpm/recollfedora10.spec, packaging/rpm/recollmdk.spec:
	change mail address

2010-01-10 10:18 +0000  dockes    (1c62f24a5ca4)

	* packaging/rpm/recollfedora.spec:
	updated for fc12: depend on xapian-core, use qt4

2010-01-07 15:20 +0000  dockes    (01eb4176400c)

	* src/query/recollq.cpp:
	add option to print abstracts

2010-01-07 08:42 +0000  dockes    (a41bbccff862)

	* src/VERSION:
	1.13.01

2010-01-07 08:41 +0000  dockes    (dde7b27846ef)

	* src/Makefile.in:
	distclean removes rclexecm.pyc

2010-01-07 08:34 +0000  dockes    (324bea9902a4)

	* src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
	src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h:
	moved initial db open and possible message boxes from main.cpp to
	rclmain_w.cpp first post-init job to avoid random crashes apparently
	related to the dialogs being created before app.exec(). Exact cause
	not certain, but crashes gone...

2010-01-07 08:29 +0000  dockes    (0629e02f12fe)

	* src/rcldb/searchdata.cpp:
	field values were not used in case term expansion was not performed
	(phrase or capitalized term)

2010-01-06 13:29 +0000  dockes    (e10bbaeefab5)

	* src/kde/kioslave/recoll/htmlif.cpp, src/query/recollq.cpp,
	src/query/xadump.cpp:
	adapt kio and recollq to the new internfile interface

2010-01-06 13:06 +0000  dockes    (0f2378be2603)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	add libz

2010-01-05 15:00 +0000  dockes    (1ca577447878)

	* src/utils/closefrom.cpp, src/utils/fstreewalk.cpp,
	src/utils/fstreewalk.h, tests/Maildir/Maildir.txt,
	tests/andor/andor.sh, tests/andor/andor.txt, tests/cjk/cjk.sh,
	tests/cjk/cjk.txt, tests/mail/mail.txt, tests/msword/msword.txt,
	tests/txt/txt.txt, website/download.html:
	1.13 tests txt mods + solaris port (FNM_LEADING_DIR)

2010-01-05 13:27 +0000  dockes    (0ab6a2dfc2c3)

	* website/BUGS.html, website/CHANGES.html, website/copydocs,
	website/credits.html, website/download.html, website/features.html,
	website/index.html.en, website/index.html.fr:
	web update for 1.13

2010-01-05 07:14 +0000  dockes    (cb08729afcd2)

	* src/INSTALL, src/README:
	

2010-01-05 07:14 +0000  dockes    (a1ba9ba640f7)

	* src/VERSION, src/common/rclconfig.cpp, src/doc/man/recoll.conf.5,
	src/doc/user/usermanual.sgml:
	1.13.00: fixed doc ortographic typos

2009-12-31 08:20 +0000  dockes    (c2ae39772161)

	* src/INSTALL, src/README:
	

2009-12-31 08:15 +0000  dockes    (851e5b82f3d5)

	* src/VERSION:
	1.13.0

2009-12-31 08:15 +0000  dockes    (04512125010e)

	* src/recollinstall.in:
	handle --without-gui config inside recollinstall.in

2009-12-20 14:31 +0000  dockes    (2cbda11286c5)

	* src/configure, src/configure.ac:
	typo in WIHOUT_X11

2009-12-17 20:23 +0000  dockes    (95eb8a010525)

	* src/doc/user/usermanual.sgml:
	There was an error in the mimemap format in the config exemple

2009-12-14 10:33 +0000  dockes    (1e774739395e)

	* src/INSTALL, src/README:
	

2009-12-14 10:33 +0000  dockes    (49cdfe826199)

	* src/ChangeLog:
	snapshot du jour

2009-12-14 10:23 +0000  dockes    (437be900fa14)

	* src/doc/user/Makefile, src/doc/user/usermanual.sgml:
	add --enable-camelcase doc + fix typo in doc Makefile comment

2009-12-14 10:10 +0000  dockes    (009ed00592fd)

	* src/common/autoconfig.h.in, src/common/textsplit.cpp, src/configure,
	src/configure.ac:
	add --enable-camelcase option to configure

2009-12-14 09:46 +0000  dockes    (1fabd736d16f)

	* src/doc/user/usermanual.sgml, src/index/fsindexer.cpp:
	use : as separator in localfields value before parsing as confsimple

2009-12-14 09:44 +0000  dockes    (2b09276dedc8)

	* src/utils/circache.cpp:
	fix pointer casting to make gcc happy

2009-12-14 09:44 +0000  dockes    (4ee0085fa59e)

	* src/sampleconf/fields:
	typo: keywords->keyword in prefixes

2009-12-14 09:43 +0000  dockes    (87b2caa6ec9c)

	* src/filters/rclabw, src/filters/rcldjvu, src/filters/rcldoc,
	src/filters/rcldvi, src/filters/rclflac, src/filters/rclgaim,
	src/filters/rclid3, src/filters/rclkwd, src/filters/rcllyx,
	src/filters/rclman, src/filters/rclogg, src/filters/rclopxml,
	src/filters/rclpdf, src/filters/rclppt, src/filters/rclps,
	src/filters/rclpurple, src/filters/rclrtf, src/filters/rclscribus,
	src/filters/rclsiduxman, src/filters/rclsoff, src/filters/rclsvg,
	src/filters/rcltex, src/filters/rcltext, src/filters/rclwpd,
	src/filters/rclxls, src/filters/recfiltcommon:
	iscmd: supplement -x with -d test not a dir

2009-12-14 07:26 +0000  dockes    (b8eceb552b3e)

	* src/INSTALL, src/README:
	

2009-12-14 07:25 +0000  dockes    (16dc2e0ed9fa)

	* src/makesrcdist.sh:
	

2009-12-14 07:13 +0000  dockes    (e5aae08ee26d)

	* src/Makefile.in:
	

2009-12-14 07:07 +0000  dockes    (c66c86594b35)

	* src/VERSION:
	

2009-12-14 07:06 +0000  dockes    (7229a431d686)

	* src/makesrcdist.sh:
	use different release name for beta versions

2009-12-13 21:40 +0000  dockes    (e0033b00df1e)

	* src/doc/user/usermanual.sgml:
	anacron

2009-12-13 16:16 +0000  dockes    (e148cd3f92c1)

	* src/sampleconf/recoll.conf.in:
	add localfields example

2009-12-13 16:13 +0000  dockes    (89ebf91076d8)

	* src/common/textsplit.cpp, src/internfile/mh_html.cpp,
	src/query/plaintorich.cpp, src/utils/base64.cpp:
	small amd64 fixes: 64 bits size_type, signed chars

2009-12-08 07:43 +0000  dockes    (026aa6df356f)

	* src/doc/man/recollindex.1, src/doc/man/recollq.1:
	clarify stemming options

2009-12-08 07:43 +0000  dockes    (0c698007055e)

	* src/query/recollq.cpp:
	add option -s to select stemming language

2009-12-08 07:42 +0000  dockes    (fcb5bca6adf8)

	* src/rcldb/stemdb.cpp:
	traces

2009-12-07 18:47 +0000  dockes    (6631c645c9df)

	* src/index/recollindex.cpp:
	use setpriority() to be a nice indexer

2009-12-07 17:43 +0000  dockes    (76128d18110e [RECOLL_1_13_0, RECOLL_20091214, RECOLL_1_13_01, RECOLL_1_13_00])

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	reimplemented Q3TextDocument::find() to be like the qt3 version

2009-12-07 14:32 +0000  dockes    (b02171ea3078)

	* src/qtgui/preview_w.cpp:
	switch preview qtextedit format back to plain text after loading so
	that selections copy plain text not html

2009-12-07 13:27 +0000  dockes    (3d37dc441cc9)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp:
	Term expansion: handle field issues inside rcldb::termmatch,
	ensuring that we take the field name into account for all
	expansions. Ensures that File Name searches and filename: query
	language searches work the same, + overall better consistency

2009-12-07 13:24 +0000  dockes    (fe625ef90a21)

	* src/configure.ac:
	Israel G. Lugo: make sure that only one of inotify or FAM gets
	enabled, giving priority to inotify.

2009-11-30 10:04 +0000  dockes    (a75cd5af7c71)

	* src/VERSION, src/internfile/mimehandler.cpp,
	src/kde/kioslave/recoll/htmlif.cpp, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h, src/query/plaintorich.cpp,
	src/query/plaintorich.h, src/sampleconf/mimeconf:
	add 
 tag to text/plain translated into qt html to preserve
	indentation. Removes need for rcltext (which did just this). Allow
	specifying any text/xxx as internal (allows having specific editor
	but no filter)

2009-11-30 06:34 +0000  dockes    (c4fdcda7df89)

	* src/index/rclmonrcv.cpp:
	compile either fam or inotify not both

2009-11-29 15:00 +0000  dockes    (6b9ed9ae0949)

	* src/doc/user/usermanual.sgml:
	change defaults for big text params

2009-11-29 12:56 +0000  dockes    (a04f5006fe89)

	* src/sampleconf/recoll.conf.in:
	add new 1.13 variables and defaults

2009-11-28 09:15 +0000  dockes    (4b56c2068545)

	* src/internfile/mh_execm.cpp, src/internfile/mh_text.cpp,
	src/query/docseqhist.cpp, src/utils/circache.cpp:
	new glibc missing includes

2009-11-28 08:45 +0000  dockes    (012b4b63e260)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts:
	

2009-11-28 08:14 +0000  dockes    (b0e70a20b7f1)

	* src/index/beaglequeue.cpp, src/internfile/mh_text.cpp,
	src/qtgui/confgui/confguiindex.cpp, src/qtgui/guiutils.cpp:
	set defaults usedesktoprefs, maxtext 20mb pagesz 1000k webcache 40m

2009-11-28 08:11 +0000  dockes    (ed3a574543f5)

	* src/doc/user/usermanual.sgml:
	clean-up + documented 1.13 new features

2009-11-28 06:39 +0000  dockes    (c45a690ee533)

	* src/internfile/mh_mbox.cpp:
	converted iostream to stdio because of mysterious read errors at the
	last position in the offsets file

2009-11-27 13:23 +0000  dockes    (7fa95cd57200)

	* src/internfile/mh_mail.cpp:
	add cnf(maildefcharset) to set specific mail default charset (mainly
	for readpst extracts which are utf-8 but have no charset set)

2009-11-27 13:11 +0000  dockes    (385305ee1820)

	* src/rcldb/rcldb.cpp:
	loglevel

2009-11-27 13:08 +0000  dockes    (8cc1ab099807)

	* src/internfile/mh_mbox.cpp:
	include sys/stat

2009-11-27 12:41 +0000  dockes    (c3039d4eab51)

	* src/internfile/Filter.h, src/internfile/internfile.cpp,
	src/internfile/mh_mbox.cpp, src/internfile/mh_mbox.h,
	src/internfile/mimehandler.h, src/query/docseqhist.cpp:
	implemented a cache for mbox message header offsets

2009-11-27 07:07 +0000  dockes    (a1a92e0952dd)

	* src/internfile/mh_mbox.cpp:
	Support From "bla bla" (quoted) From lines

2009-11-27 07:00 +0000  dockes    (64f09e3ad5a7)

	* src/internfile/internfile.cpp:
	update test driver

2009-11-26 14:03 +0000  dockes    (023c2a8520de)

	* src/aspell/rclaspell.cpp, src/aspell/rclaspell.h,
	src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/query/docseq.h,
	src/query/docseqdb.cpp, src/query/docseqdb.h,
	src/query/reslistpager.cpp, src/query/reslistpager.h,
	src/rcldb/rcldb.cpp, src/rcldb/searchdata.cpp,
	src/rcldb/searchdata.h:
	suggest alternate spellings if no results

2009-11-26 13:52 +0000  dockes    (4270622aa3e0)

	* src/qtgui/guiutils.cpp:
	suppressed core dump at exit on unexisting config

2009-11-26 07:17 +0000  dockes    (f02bf2b6ea30)

	* src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/rcldb/rclquery.h:
	use only match terms to build doc abstract, not all query terms
	(might save a little effort)

2009-11-26 07:15 +0000  dockes    (90776b10554c)

	* src/qtgui/rclmain_w.cpp:
	spell tool must be created even is USE_ASPELL is undefined

2009-11-25 14:37 +0000  dockes    (e3faedd237b8)

	* src/utils/md5.cpp:
	suppress unused parm warning

2009-11-25 11:07 +0000  dockes    (f8011c9579c8)

	* packaging/debian/debiankio/changelog,
	packaging/debian/debiankio/compat,
	packaging/debian/debiankio/control,
	packaging/debian/debiankio/copyright,
	packaging/debian/debiankio/dirs, packaging/debian/debiankio/docs,
	packaging/debian/debiankio/rules, packaging/debian/debiankio/watch,
	packaging/debian/debianrecoll/changelog,
	packaging/debian/debianrecoll/compat,
	packaging/debian/debianrecoll/control,
	packaging/debian/debianrecoll/copyright,
	packaging/debian/debianrecoll/docs,
	packaging/debian/debianrecoll/menu,
	packaging/debian/debianrecoll/rules,
	packaging/debian/debianrecoll/watch: new file.
	* packaging/debian/debiankio/changelog,
	packaging/debian/debiankio/compat,
	packaging/debian/debiankio/control,
	packaging/debian/debiankio/copyright,
	packaging/debian/debiankio/dirs, packaging/debian/debiankio/docs,
	packaging/debian/debiankio/rules, packaging/debian/debiankio/watch,
	packaging/debian/debianrecoll/changelog,
	packaging/debian/debianrecoll/compat,
	packaging/debian/debianrecoll/control,
	packaging/debian/debianrecoll/copyright,
	packaging/debian/debianrecoll/docs,
	packaging/debian/debianrecoll/menu,
	packaging/debian/debianrecoll/rules,
	packaging/debian/debianrecoll/watch:
	added debian dir to build kio-recoll

2009-11-24 10:25 +0000  dockes    (87057b6e2cba)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	execute minimum recoll config inside cmakelists to create rclversion
	and autoconfig includes

2009-11-24 10:24 +0000  dockes    (a6e854084ffb)

	* src/utils/smallut.h:
	gcc4

2009-11-23 19:51 +0000  dockes    (42785e498950)

	* src/index/beaglequeue.cpp:
	store beagle fields before interning the file

2009-11-23 17:38 +0000  dockes    (aaccb7e813a8)

	* src/qtgui/preview_w.cpp:
	if text is empty, display fields by default

2009-11-23 17:37 +0000  dockes    (129654f22b3c)

	* src/internfile/internfile.cpp:
	in FileInterner::FileInterner(Rcl::Doc) (query), declare the
	BeagleQueue static so that the cache persists between FileInterner
	objects

2009-11-23 17:36 +0000  dockes    (2292efb797b4)

	* src/internfile/internfile.h:
	comments

2009-11-23 16:12 +0000  dockes    (a7ed9c85c313)

	* src/query/dynconf.cpp, src/query/dynconf.h: new file.
	* src/query/history.cpp, src/query/history.h: deleted file.
	* src/lib/Makefile, src/lib/mkMake, src/qtgui/guiutils.cpp,
	src/qtgui/main.cpp, src/qtgui/preview_w.cpp,
	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h,
	src/query/docseqhist.cpp, src/query/docseqhist.h,
	src/query/dynconf.cpp, src/query/dynconf.h, src/query/history.cpp,
	src/query/history.h:
	revamped history feature to be udi-based while supporting old format

2009-11-23 16:11 +0000  dockes    (8a494a30e71f)

	* src/rcldb/rcldb.cpp:
	set udi in meta from getDoc(udi)

2009-11-23 16:10 +0000  dockes    (c432dcb83d8f)

	* src/index/beaglequeue.cpp, src/utils/circache.cpp,
	src/utils/circache.h:
	Beaglequeue: simplify index from cache now that udi entries are
	unique in cache

2009-11-22 17:27 +0000  dockes    (112515ddfd1b)

	* src/index/beaglequeue.cpp, src/utils/circache.cpp,
	src/utils/circache.h:
	only keep the latest entry for a given udi in the cache

2009-11-22 17:26 +0000  dockes    (c47346e105ac)

	* src/utils/smallut.h:
	added tempbuf class

2009-11-21 13:36 +0000  dockes    (d497773469db)

	* src/internfile/mimehandler.cpp, src/qtgui/rclmain_w.cpp:
	allow setting attrs on mimeview defs, factorize some code with
	mhExecFactory

2009-11-21 13:35 +0000  dockes    (77639dc8a584)

	* src/common/rclconfig.cpp, src/common/rclconfig.h:
	added valueSplitAttributes() method

2009-11-21 11:18 +0000  dockes    (50c2c8c764bb)

	* src/internfile/mimehandler.cpp:
	use a confsimple to parse the additional filter attributes

2009-11-21 11:14 +0000  dockes    (ba1b73290998)

	* src/qtgui/guiutils.h:
	add ipath to default paragraph format

2009-11-18 15:32 +0000  dockes    (132c512aacde)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	added beaglequeue/circache to kio build because of internfile
	dependancy

2009-11-18 14:27 +0000  dockes    (d1587dd98290)

	* src/utils/circache.cpp:
	warning

2009-11-18 14:26 +0000  dockes    (812296ef15d8)

	* src/rcldb/rclquery.cpp:
	query::getrescnt() would only work once following 1.13 mods (affects
	python api)

2009-11-18 14:25 +0000  dockes    (cc1924f2d969)

	* src/python/samples/recollq.py:
	

2009-11-18 14:03 +0000  dockes    (e60f229404a4)

	* src/python/recoll/pyrecoll.cpp:
	add some casts to avoid kwargs const warnings

2009-11-18 13:46 +0000  dockes    (0e29576743b0)

	* src/index/rclmonrcv.cpp:
	typo

2009-11-18 12:33 +0000  dockes    (da553b8d1e93)

	* src/filters/rclchm, src/filters/rclexecm.py, src/filters/rclics,
	src/internfile/mh_execm.cpp, src/internfile/mh_execm.h:
	handle REFILTERROR in execm

2009-11-18 10:26 +0000  dockes    (f28392bec173)

	* src/internfile/mh_mail.cpp, src/rcldb/rcldb.cpp:
	mh_mail: use truncate_to_word to avoid cutting an utf8 char. rcldb:
	logdeb text_to_word errors

2009-11-18 08:24 +0000  dockes    (c9b8704e7ffa)

	* src/index/beaglequeue.cpp, src/mk/FreeBSD:
	beaglequeue fully functional, small fixes remaining?

2009-11-18 07:57 +0000  dockes    (0f863324690f)

	* src/index/beaglequeue.cpp:
	ok with compression

2009-11-18 07:46 +0000  dockes    (7925e58ac0d9)

	* src/utils/circache.cpp, src/utils/circache.h:
	compression works

2009-11-17 14:52 +0000  dockes    (122d9a523dc7)

	* src/utils/circache.cpp, src/utils/circache.h:
	circache ok

2009-11-16 16:18 +0000  dockes    (88021fc84abd)

	* src/internfile/internfile.cpp:
	Lack of error checking after have_document() in preview case could
	lead to looping, and cancellation was not checked to make things
	worse

2009-11-16 16:16 +0000  dockes    (22e0540453bc)

	* src/configure:
	--without-gui

2009-11-16 16:12 +0000  dockes    (d3e16fb089de)

	* src/qt4gui/recoll.pro.in:
	stupid mistake in previous cosmetic change

2009-11-16 16:11 +0000  dockes    (a422d8f6d6fd)

	* src/index/fsindexer.cpp:
	make very sure ~/.beagle is in the skippedPaths

2009-11-16 16:10 +0000  dockes    (effac8983ab5)

	* src/internfile/mh_mail.cpp:
	reason msg

2009-11-16 12:50 +0000  dockes    (bfc0df6ab067)

	* src/Makefile.in, src/common/autoconfig.h.in, src/configure.ac,
	src/index/Makefile, src/mk/localdefs.in, src/utils/x11mon.cpp:
	add --without-gui configure option

2009-11-15 16:41 +0000  dockes    (81edb2c4cef7)

	* src/index/beaglequeue.cpp, src/index/fsindexer.cpp,
	src/utils/circache.cpp:
	catch cancel exceptions cast by internfile()

2009-11-15 14:39 +0000  dockes    (4539869b5761)

	* src/index/fsindexer.h, src/qtgui/rclmain_w.cpp,
	src/query/reslistpager.cpp, src/rcldb/rcldoc.cpp,
	src/rcldb/rcldoc.h, src/sampleconf/fields:
	changed apptag field name to rclaptg

2009-11-15 14:18 +0000  dockes    (b41678f5ad12)

	* src/qt4gui/recoll.pro.in, src/qtgui/recoll.pro.in:
	add -ldl -lX11 for binutils-gold

2009-11-15 08:38 +0000  dockes    (3801ee9a51c6)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/index/fsindexer.cpp, src/index/rclmonrcv.cpp,
	src/utils/fstreewalk.cpp, src/utils/fstreewalk.h,
	src/utils/smallut.cpp, src/utils/smallut.h:
	rationalized how we recompute things on setkeydir. recoll_noindex
	and skippedNames can now be changed at any point in the tree

2009-11-14 11:34 +0000  dockes    (a922eac98d16)

	* src/index/rclmonprc.cpp:
	monitor: accumulate mods during 30S before indexing

2009-11-14 10:29 +0000  dockes    (ea134de640e0)

	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
	src/index/fsindexer.cpp, src/index/indexer.cpp,
	src/index/rclmonrcv.cpp, src/index/recollindex.cpp,
	src/utils/circache.cpp:
	monitor the beagle queue

2009-11-14 10:25 +0000  dockes    (42421f027b94)

	* src/filters/rclchm, src/filters/rclics, src/filters/rcltext:
	emit helpernotfound

2009-11-14 08:21 +0000  dockes    (93baac7e87ac)

	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
	src/index/fsindexer.cpp, src/index/fsindexer.h,
	src/index/indexer.cpp, src/index/indexer.h,
	src/index/recollindex.cpp, src/index/recollindex.h,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	beaglequeue indexFiles

2009-11-13 13:29 +0000  dockes    (7d0c4d7a917c)

	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
	src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/confgui/confguiindex.cpp, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp,
	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
	src/sampleconf/fields:
	1st beagle version with index/preview working

2009-11-13 09:08 +0000  dockes    (71f8c28cbeba)

	* src/qtgui/idxthread.cpp:
	integrate beaglequeueindexer for indexing. Work remains for
	indexfiles() at least

2009-11-13 09:08 +0000  dockes    (dda5121a7c45)

	* src/utils/circache.cpp, src/utils/circache.h:
	integrate beaglequeueindexer for indexing. Work remains for
	indexfiles() at least

2009-11-13 09:07 +0000  dockes    (364d46e16faf)

	* src/index/beaglequeue.cpp, src/index/beaglequeue.h,
	src/index/fsindexer.cpp, src/index/fsindexer.h,
	src/index/indexer.cpp, src/index/indexer.h,
	src/index/recollindex.cpp:
	integrate beaglequeueindexer for indexing. Work remains for
	indexfiles() at least

2009-11-13 09:04 +0000  dockes    (7e32466740a7)

	* src/configure.ac:
	Israel G. Lugo: give priority to the user's PATH when looking for
	qmake (fixes detecting the wrong qmake when more than one exists).

2009-11-13 09:01 +0000  dockes    (3503bfba6b70)

	* src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h:
	make dump const

2009-11-13 09:01 +0000  dockes    (b4c8330037e7)

	* src/lib/Makefile, src/lib/mkMake:
	add beaglequeue, fsindexer

2009-11-13 08:58 +0000  dockes    (63ee628229e7)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h:
	add panel for beaglequeue parameters + arrange so that a checkbox
	can enable/disable other params

2009-11-13 08:54 +0000  dockes    (5edf24b7552e)

	* src/sampleconf/fields:
	comments

2009-11-13 08:15 +0000  dockes    (a829fce15458)

	* src/filters/rclchm, src/filters/rclexecm.py, src/filters/rclics,
	src/filters/rclimg, src/filters/rclzip, src/internfile/mh_execm.cpp:
	dont use 0-sized doc to mean eof now

2009-11-11 18:09 +0000  dockes    (21b6ba1309c7)

	* src/filters/rclimg:
	send mimetype

2009-11-11 18:07 +0000  dockes    (7f2a7a7214fb)

	* src/internfile/mh_execm.cpp:
	set mimetype for the non-ipath case

2009-11-11 07:47 +0000  dockes    (75f9d10cf2f3)

	* src/index/fsindexer.cpp, src/index/fsindexer.h,
	src/index/indexer.cpp, src/index/indexer.h,
	src/index/recollindex.cpp:
	moved common db code from fsindexer to confindexer

2009-11-10 18:11 +0000  dockes    (e079c8ce273f)

	* src/index/beaglequeue.cpp, src/index/beaglequeue.h: new file.
	* src/index/beaglequeue.cpp, src/index/beaglequeue.h:
	

2009-11-10 18:10 +0000  dockes    (698e70099ec0)

	* src/index/fsindexer.cpp, src/index/fsindexer.h,
	src/index/recollindex.h: new file.
	* src/index/fsindexer.cpp, src/index/fsindexer.h,
	src/index/indexer.cpp, src/index/indexer.h, src/index/rclmonprc.cpp,
	src/index/recollindex.cpp, src/index/recollindex.h:
	dbindexer->fsindexer, split into its own file

2009-11-10 17:42 +0000  dockes    (ccf674432104)

	* src/ChangeLog:
	

2009-11-10 17:42 +0000  dockes    (065c40b8964d)

	* src/index/recollindex.cpp:
	small cleanups and add option to call beaglequeue

2009-11-10 17:41 +0000  dockes    (d4ff290d1615)

	* src/index/indexer.cpp:
	small cleanups and comments

2009-11-10 17:39 +0000  dockes    (00c5f0c09ef9)

	* src/index/indexer.h:
	comments

2009-11-10 17:38 +0000  dockes    (02b632bcbeca)

	* src/index/rclmonrcv.cpp:
	remove indexer.h include

2009-11-10 17:38 +0000  dockes    (ba2255ec8b62)

	* src/common/rclinit.h:
	comment

2009-11-10 17:37 +0000  dockes    (915bf923b8da)

	* src/utils/fstreewalk.cpp, src/utils/fstreewalk.h:
	add nocanon option

2009-11-10 17:34 +0000  dockes    (29b753cd1f78)

	* src/utils/circache.cpp, src/utils/circache.h:
	intermediary checkpoint (things work, no index, no compression)

2009-11-10 17:32 +0000  dockes    (16e0d5965055)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	removed the useless keep_updated flag

2009-11-10 17:31 +0000  dockes    (75878eb08588)

	* src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h:
	added dump function

2009-11-10 17:30 +0000  dockes    (35b43d00db47)

	* src/query/recollq.cpp:
	added explicit flag parameter to Internfile constructeur for helping
	with beagle queue integration

2009-11-10 17:29 +0000  dockes    (75255bb8d7a0)

	* src/sampleconf/fields:
	add dc:description as keywords alias

2009-11-10 09:39 +0000  dockes    (ee6104876da9)

	* src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/kde/kioslave/recoll/htmlif.cpp, src/qtgui/preview_w.cpp:
	added explicit flag parameter to Internfile constructeur for helping
	with beagle queue integration

2009-11-09 09:26 +0000  dockes    (7c3c0eed036b)

	* src/utils/circache.cpp, src/utils/circache.h: new file.
	* src/lib/Makefile, src/lib/mkMake, src/utils/Makefile,
	src/utils/circache.cpp, src/utils/circache.h:
	circache

2009-11-09 09:26 +0000  dockes    (877bb76973aa)

	* src/utils/conftree.cpp, src/utils/conftree.h:
	add some constness

2009-11-06 11:33 +0000  dockes    (944e0b9d1d53)

	* src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
	src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h,
	src/query/docseqhist.cpp, src/query/docseqhist.h,
	src/utils/fileudi.h, src/utils/pathut.cpp, src/utils/pathut.h:
	allow opening parent/enclosing doc with native editor in reslist

2009-11-06 11:26 +0000  dockes    (1d9a5530d7bf)

	* src/sampleconf/mimeview:
	added okular as chm viewer

2009-11-04 13:52 +0000  dockes    (226d88ccb6c1)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp:
	store file names using local8bit qstring conversions

2009-11-04 13:43 +0000  dockes    (b57bd81d3e8e)

	* src/utils/fstreewalk.h:
	comment

2009-11-04 13:42 +0000  dockes    (2037ae120bcf)

	* src/utils/cancelcheck.h:
	comment

2009-10-31 09:00 +0000  dockes    (3ad7f6c85ce2)

	* src/internfile/mh_mail.cpp, src/internfile/mh_mail.h:
	extract msgid + generate abstract at start of txt, excluding headers

2009-10-31 08:59 +0000  dockes    (9e7ae93bd35b)

	* src/utils/mimeparse.cpp:
	change rfc2047 mail header decoding (=?iso-xx stuff) so that a start
	of encoding section can be recognized even not after white space

2009-10-30 19:05 +0000  dockes    (eb9ed35f9fe0)

	* src/qtgui/rclmain_w.cpp:
	allow substituting all doc fields in viewer command line

2009-10-30 19:04 +0000  dockes    (d8065c96ceae)

	* src/qtgui/viewaction.ui:
	clarify using desktop defs in action choice dialog

2009-10-30 10:16 +0000  dockes    (4a744302db21)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/qtgui/rclmain_w.cpp, src/query/reslistpager.cpp,
	src/sampleconf/fields:
	Allow setting fields in fs subtree. Use for an application tag used
	for starting a specialized viewer

2009-10-30 08:59 +0000  dockes    (bdd54ae7a182)

	* src/VERSION, src/common/rclconfig.h, src/index/indexer.cpp,
	src/index/indexer.h, src/internfile/mimehandler.cpp,
	src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/utils/conftree.cpp,
	src/utils/conftree.h:
	Allow fields local to a subtree to be set in the configuration

2009-10-30 08:53 +0000  dockes    (aa8c442a67ec)

	* src/configure.ac:
	use /bin/sh to execute recollinstall instead of making it executable

2009-10-30 08:53 +0000  dockes    (0faf1f6ccf5f)

	* src/Makefile.in, src/configure:
	use /bin/sh to execute recollinstall instead of making it executable

2009-10-29 18:11 +0000  dockes    (2338d18226f2)

	* src/qtgui/uiprefs.ui:
	move the use-desktop-preference checkbox close to the choose editors
	button

2009-10-29 18:10 +0000  dockes    (4b6f29c1e3c3)

	* src/sampleconf/mimeconf:
	

2009-10-29 18:09 +0000  dockes    (2de2f1804086)

	* src/common/rclconfig.cpp, src/common/rclconfig.h:
	support wildcard filtering in getConfNames() + implement config
	checking function in test driver

2009-10-29 18:08 +0000  dockes    (78c287d1d2da)

	* src/utils/conftree.cpp, src/utils/conftree.h:
	bugfix: if last line ended with backslash, entry was ignored. new
	function: filter by wildcard expr in getNames()

2009-10-29 13:44 +0000  dockes    (26ae4011727a)

	* src/sampleconf/mimeconf, src/sampleconf/mimemap:
	chm+comments

2009-10-29 13:34 +0000  dockes    (178273f496f2)

	* src/sampleconf/recoll.conf.in:
	comment

2009-10-28 13:08 +0000  dockes    (9435a56f1962)

	* src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	fix signal/slot type mismatch for setSortParams

2009-10-26 13:19 +0000  dockes    (2a369661c70c)

	* src/qtgui/uiprefs_w.cpp:
	disable app-choosing button when use-desktop-prefs is activated

2009-10-26 11:16 +0000  dockes    (8cdb908a253d)

	* src/qtgui/rclmain_w.cpp:
	qt4 sometimes doesnt display the status bar if its not created in
	init

2009-10-26 10:00 +0000  dockes    (758f39788d0c)

	* src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
	arrange to send pageup/down and shift-home to the reslist

2009-10-24 15:02 +0000  dockes    (7d98b5c330c1)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp,
	src/rcldb/rclquery_p.h:
	unified retrying for databaseModified errors

2009-10-24 11:00 +0000  dockes    (9d49d2991eed)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldb_p.h,
	src/rcldb/rclquery.cpp:
	renamed fields for clarity

2009-10-24 06:37 +0000  dockes    (1486d8f630fc)

	* src/filters/rclchm, src/filters/rclics, src/filters/rclzip:
	cleanup

2009-10-24 06:17 +0000  dockes    (6a8a9821c17c)

	* src/filters/rclexecm.py, src/filters/rclzip:
	use python zipfile

2009-10-23 16:45 +0000  dockes    (436e03b2f0c1)

	* src/filters/rclchm:
	comments

2009-10-23 16:03 +0000  dockes    (be653b19dd28)

	* src/filters/rclchm: new file.
	* src/filters/rclchm:
	first working

2009-10-23 16:03 +0000  dockes    (99a819213c2a)

	* src/filters/rclzip:
	comment

2009-10-22 17:28 +0000  dockes    (e5f16d6d23db)

	* src/doc/user/usermanual.sgml:
	%(fldname) specs

2009-10-22 17:27 +0000  dockes    (3e37f6aac6c5)

	* src/doc/user/docbook.css:
	new freebsd version

2009-10-22 17:27 +0000  dockes    (1535c07dd8a6)

	* src/sampleconf/mimeconf:
	ics

2009-10-22 17:16 +0000  dockes    (deaef902d7e3)

	* src/sampleconf/mimeconf:
	add ics + more programming languages

2009-10-22 17:16 +0000  dockes    (98009bab1e61)

	* src/sampleconf/mimemap:
	add ics + more programming languages

2009-10-22 17:13 +0000  dockes    (bf9a0c5eeb5c)

	* src/filters/rclics: new file.
	* src/filters/rclexecm.py, src/filters/rclics:
	initial support for icalendar splitting

2009-10-22 12:24 +0000  dockes    (f97b91cb8153)

	* src/filters/rclexecm.py: new file.
	* src/filters/rclexecm.py, src/filters/rclzip:
	made rclexecm a class in a separate module

2009-10-22 11:58 +0000  dockes    (9361ab690eec)

	* src/filters/rclzip:
	fully extracted common code

2009-10-21 21:00 +0000  dockes    (39b12da95a76)

	* src/filters/rclzip: new file.
	* src/filters/rclzip:
	initial

2009-10-21 20:59 +0000  dockes    (ef17d33ea782)

	* website/download.html:
	1.12.2

2009-10-21 12:02 +0000  dockes    (2baccf2235b6)

	* src/qtgui/rclmain_w.cpp, src/query/docseqdb.cpp,
	src/query/docseqdb.h, src/query/reslistpager.cpp,
	src/query/reslistpager.h, src/utils/Makefile, src/utils/smallut.cpp,
	src/utils/smallut.h:
	fix queryBuildAbstract option functionality. Allow substituting
	%(fieldname) in reslist paragraph format

2009-10-21 12:00 +0000  dockes    (30a02a6bada8)

	* src/internfile/mimehandler.h:
	warning

2009-10-21 11:58 +0000  dockes    (ebc82bec7704)

	* src/kde/kioslave/recoll/CMakeLists.txt, src/utils/closefrom.cpp:
	linux

2009-10-21 11:32 +0000  dockes    (1cc979921a0d)

	* src/internfile/mh_text.cpp, src/utils/closefrom.cpp:
	gcc43+linux compile

2009-10-21 07:48 +0000  dockes    (72168c28c9bb)

	* src/makestaticdist.sh:
	cleanup .svn directories

2009-10-21 07:24 +0000  dockes    (a550073d34d4)

	* src/makestaticdist.sh:
	get makestaticdist to work with qt4

2009-10-21 07:15 +0000  dockes    (e44497010880)

	* packaging/debian/changelog, packaging/debian/control,
	packaging/debian/menu, packaging/debian/rules,
	packaging/rpm/recollmdk.spec, tests/lyx/lyx.txt:
	1.12.2 release fixes

2009-10-21 07:15 +0000  dockes    (cecbbb5e3c23)

	* website/pics/mario.png, website/pics/smile.png: new file.
	* website/mario.png, website/smile.png: deleted file.
	* website/BUGS.html, website/CHANGES.html, website/devel.html,
	website/download.html, website/features.html, website/index.html.en,
	website/index.html.fr, website/mario.png, website/pics/index.html,
	website/pics/mario.png, website/pics/recoll5-thumb.png,
	website/pics/recoll5.png, website/pics/smile.png, website/smile.png:
	1.12.2 release

2009-10-19 16:20 +0000  dockes    (b2a9b0c5fc47)

	* src/lib/Makefile, src/lib/mkMake:
	add closefrom

2009-10-19 16:19 +0000  dockes    (5b3c0f9438a9)

	* src/README, src/doc/man/recoll.conf.5, src/doc/man/recollindex.1,
	src/doc/user/usermanual.sgml, src/filters/rclsvg:
	explict(e)ly errors again

2009-10-19 10:51 +0000  dockes    (70ed5ded2a5e)

	* src/qtgui/uiprefs.ui:
	move the use-desktop-preference checkbox close to the choose editors
	button

2009-10-19 07:30 +0000  dockes    (d25d7050d60c)

	* src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp:
	catch xapian exceptions in 2 more places.

2009-10-18 07:57 +0000  dockes    (cbcf397757a1)

	* src/qtgui/reslist.cpp:
	reslist: rightclick popup would not work inside table

2009-10-17 06:38 +0000  dockes    (cb08cd6b282b)

	* src/Makefile.in, src/index/recollindex.cpp, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	rclversion.h must not include xapian.h. Replace with
	Rcl::version_string()

2009-10-15 15:50 +0000  dockes    (6d01b54d3cf5)

	* src/qtgui/preview_w.cpp:
	compile with qt3

2009-10-15 12:32 +0000  dockes    (749d93d72709)

	* src/index/rclmonprc.cpp:
	only call x11IsAlive from the main thread

2009-10-15 12:32 +0000  dockes    (7339dd810b4c)

	* src/utils/Makefile, src/utils/conftree.cpp, src/utils/execmd.cpp:
	small linux include and makefile adjustments

2009-10-14 12:25 +0000  dockes    (4bfcb9f6483a)

	* src/utils/execmd.cpp, src/utils/execmd.h:
	m_cancelRequest->m_killRequest to avoid confusion with cancelcheck +
	close descriptors before exec

2009-10-14 12:24 +0000  dockes    (834b841865f0)

	* src/internfile/mh_exec.cpp:
	no timeout if filtermaxseconds is -1

2009-10-14 12:23 +0000  dockes    (894b94a986c2)

	* src/qtgui/confgui/confguiindex.cpp, src/sampleconf/recoll.conf.in:
	add filtermaxseconds to config

2009-10-14 12:22 +0000  dockes    (eec367c78b29)

	* src/utils/closefrom.cpp, src/utils/closefrom.h: new file.
	* src/utils/closefrom.cpp, src/utils/closefrom.h:
	

2009-10-14 06:21 +0000  dockes    (48782c4d99bd)

	* src/filters/rclimg, src/index/recollindex.cpp,
	src/internfile/mh_execm.cpp, src/internfile/mh_execm.h,
	src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/utils/execmd.cpp:
	execm first working zip version

2009-10-13 17:32 +0000  dockes    (ac8388c11bcb)

	* src/utils/idfile.cpp, src/utils/idfile.h:
	allow working on memory string

2009-10-13 16:37 +0000  dockes    (25cd49e5f3b2)

	* src/internfile/mh_exec.cpp:
	comments

2009-10-13 12:22 +0000  dockes    (f8f821415451)

	* src/internfile/mh_exec.cpp:
	handle interrupt requests and set timeout on execs

2009-10-13 12:21 +0000  dockes    (0ec65928f00f)

	* src/utils/execmd.cpp:
	use process group to control/kill execd processes

2009-10-13 12:20 +0000  dockes    (ad3f88e0578e)

	* src/sampleconf/recoll.conf.in:
	added loop.ps to skippedFiles

2009-10-12 16:27 +0000  dockes    (2d5321b8e32c)

	* src/common/rclinit.cpp:
	also block USR1 USR2

2009-10-09 13:58 +0000  dockes    (9ef52b9903d4)

	* src/internfile/mh_execm.cpp, src/internfile/mh_execm.h: new file.
	* src/filters/rclimg, src/internfile/mh_exec.cpp,
	src/internfile/mh_exec.h, src/internfile/mh_execm.cpp,
	src/internfile/mh_execm.h, src/internfile/mimehandler.cpp,
	src/lib/Makefile, src/lib/mkMake, src/sampleconf/mimeconf:
	execm persistent filters

2009-10-09 13:57 +0000  dockes    (94243b4ecca6)

	* src/common/textsplit.cpp:
	process camelCase

2009-10-09 13:34 +0000  dockes    (9129980cfe0e)

	* src/utils/execmd.cpp, src/utils/execmd.h, src/utils/netcon.cpp,
	src/utils/netcon.h:
	Execmd: added count parameter to receive(), and new getline()
	function Netcon: fix receive() to properly handle the case where
	there is initially data in the line buffer

2009-10-04 13:25 +0000  dockes    (f81cdfd36952)

	* src/utils/readfile.cpp:
	

2009-10-04 13:24 +0000  dockes    (fe1c983b582e)

	* src/mk/commondefs:
	remove -I/usr/local/include from commondefs!

2009-09-30 15:53 +0000  dockes    (401a53878320)

	* src/internfile/mh_text.cpp:
	dont set ipath for the first page in text files to avoid dual
	records for files under the page size

2009-09-30 15:45 +0000  dockes    (1ce015f48d3a)

	* src/internfile/mh_text.cpp, src/internfile/mh_text.h,
	src/qtgui/confgui/confguiindex.cpp, src/sampleconf/recoll.conf.in,
	src/utils/readfile.cpp, src/utils/readfile.h:
	implemented paged text files

2009-09-29 15:58 +0000  dockes    (b288f2d22754)

	* src/internfile/mh_text.cpp, src/qtgui/confgui/confguiindex.cpp,
	src/sampleconf/recoll.conf.in:
	textfilemaxmbs

2009-09-29 15:58 +0000  dockes    (a41ae31020fa)

	* src/utils/execmd.cpp:
	loglevels

2009-09-29 14:49 +0000  dockes    (89ab6fcd4bef)

	* src/utils/netcon.cpp, src/utils/netcon.h: new file.
	* src/utils/netcon.cpp, src/utils/netcon.h:
	

2009-09-29 14:49 +0000  dockes    (254aad5cdd17)

	* src/utils/netcon.cpp, src/utils/netcon.h: deleted file.
	* src/utils/netcon.cpp, src/utils/netcon.h:
	

2009-09-29 08:47 +0000  dockes    (302c0dd0dfa0)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	got rid of the preview tabdata array

2009-09-29 07:48 +0000  dockes    (f65d40e808c6)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	make print a slot in the editor, not the preview

2009-09-28 18:19 +0000  dockes    (5c03bd6d7d00)

	* src/doc/user/usermanual.sgml, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h:
	Preview printing

2009-09-28 17:53 +0000  dockes    (564c8022205f)

	* src/utils/execmd.cpp:
	adjust log levels

2009-09-26 09:30 +0000  dockes    (231f842cfa1a)

	* src/utils/netcon.cpp, src/utils/netcon.h: new file.
	* src/lib/Makefile, src/lib/mkMake, src/utils/execmd.cpp,
	src/utils/execmd.h, src/utils/netcon.cpp, src/utils/netcon.h:
	execmd uses netcon

2009-09-26 09:05 +0000  dockes    (3883518b318e)

	* src/rcldb/rclquery.cpp:
	dont abort on get_mset exception

2009-08-13 06:34 +0000  dockes    (71e1aa73c37e)

	* src/utils/refcntr.h:
	add release() method

2009-08-13 06:32 +0000  dockes    (75501a297534)

	* src/index/indexer.cpp, src/internfile/internfile.cpp,
	src/internfile/internfile.h, src/internfile/mimehandler.cpp,
	src/internfile/mimehandler.h:
	xattrs: make them work with non-text files. Use ctime for up to date
	checks

2009-08-13 06:29 +0000  dockes    (45721e5ace5a)

	* src/common/autoconfig.h.in:
	allow choosing the "file" command from configure

2009-08-13 06:28 +0000  dockes    (817bbeb36f34)

	* src/qtgui/rclmain_w.cpp:
	Make sure db is open at all times (caused problems when sorting
	query started from the command line)

2009-08-13 06:27 +0000  dockes    (05b809bbb7d0)

	* src/qtgui/preview_w.cpp:
	

2009-08-13 06:26 +0000  dockes    (b5b49b39dc8a)

	* src/configure, src/configure.ac, src/index/mimetype.cpp:
	allow choosing the "file" command from configure

2009-08-13 06:24 +0000  dockes    (902b5dc99b09)

	* src/ChangeLog:
	

2009-08-13 06:23 +0000  dockes    (3ee15899a458)

	* src/sampleconf/recoll.conf.in:
	add indexedmimetypes to sample file

2009-07-02 13:26 +0000  dockes    (a0f0be9546bb)

	* src/filters/rclman:
	

2009-07-02 10:26 +0000  dockes    (82d09aa4b256)

	* src/index/indexer.cpp, src/qtgui/rclmain_w.cpp:
	improve periodic indexing status reporting and timer processing

2009-07-02 06:17 +0000  dockes    (b8cdf0ab08a9)

	* src/qtgui/main.cpp, src/rcldb/searchdata.h, src/utils/mimeparse.cpp,
	src/utils/mimeparse.h:
	explicitely->explicitly

2009-06-26 09:25 +0000  dockes    (98153ad73366)

	* src/filters/rclman, src/sampleconf/mimemap:
	improve man page handling

2009-06-22 16:41 +0000  dockes    (5003fe921249)

	* src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
	moved periodic timer control from main.cpp to rclmain_w.cpp

2009-06-22 15:25 +0000  dockes    (a420554375c5)

	* src/qtgui/idxthread.cpp, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp:
	use proper locking/sleeping object for idx thread sync

2009-06-22 08:58 +0000  dockes    (d4fdc68fab47)

	* src/filters/rclman:
	use groff html output!

2009-06-22 08:57 +0000  dockes    (01a166e9f9e7)

	* src/index/indexer.cpp:
	debug trace

2009-06-01 06:32 +0000  dockes    (272067257953)

	* src/qtgui/main.cpp:
	fixed bug in handling remaining arguments as question pieces

2009-05-29 06:28 +0000  dockes    (091488ca1543)

	* src/bincimapmime/convert.h, src/utils/base64.cpp:
	change strchr() return parameter to const for new libc

2009-05-25 08:59 +0000  dockes    (6231c20d3e23)

	* src/filters/rcllyx:
	bug report from d.prost: spaces and accents in lyx file names

2009-05-04 08:06 +0000  dockes    (20f1f5746b3e)

	* src/qtgui/guiutils.cpp, src/qtgui/preview_w.h,
	src/qtgui/spell_w.cpp:
	gcc44

2009-04-27 11:49 +0000  dockes    (ba8db4a9fcf6)

	* packaging/rpm/recollfedora10.spec: new file.
	* packaging/rpm/recollfedora10.spec:
	

2009-04-27 11:42 +0000  dockes    (85e5723e268a)

	* tests/cjk/cjk.txt: new file.
	* tests/cjk/cjk.txt:
	

2009-04-27 09:40 +0000  dockes    (a7cf61bb3e6a)

	* website/BUGS.html, website/download.html, website/index.html.en,
	website/index.html.fr:
	1.12 release changes

2009-04-27 09:15 +0000  dockes    (eb2d1da3c9ee)

	* website/BUGS.html:
	

2009-04-27 08:05 +0000  dockes    (c26df870665c)

	* src/utils/md5.cpp, src/utils/readfile.cpp:
	gcc 4.4 includes fixes

2009-04-27 08:03 +0000  dockes    (5e892d5aa963)

	* src/python/recoll/setup.py:
	pathhash->fileudi

2009-02-24 18:30 +0000  dockes    (d897d4f128ce)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp:
	implement option to display the catg filter as a toolbar combobox

2009-02-23 07:57 +0000  dockes    (5eb3b91eca18)

	* src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
	new ru/uk translations from Michael

2009-02-06 16:49 +0000  dockes    (0946c032bea8)

	* src/utils/refcntr.h:
	make RefCntr(x*) explicit

2009-02-06 16:48 +0000  dockes    (1f50a0e7a3ac)

	* src/internfile/mimehandler.cpp:
	comments

2009-02-05 14:35 +0000  dockes    (1eb8b93ed85b)

	* src/utils/execmd.cpp, src/utils/execmd.h:
	1st execcmd cleanup

2009-01-30 13:27 +0000  dockes    (55d06dfa9b04)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts, src/qtgui/reslist.cpp:
	small pbs with reslist translations

2009-01-30 11:43 +0000  dockes    (af28dae4f689)

	* src/INSTALL, src/README:
	

2009-01-30 11:43 +0000  dockes    (581a47458445 [RECOLL_1_12_0])

	* website/BUGS.html, website/CHANGES.html:
	1.12.0?

2009-01-30 11:42 +0000  dockes    (fd6cc84e76ce)

	* src/doc/user/usermanual.sgml:
	1.12 manual

2009-01-30 10:22 +0000  dockes    (f683b3907dd1)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts:
	updated message files, translated french

2009-01-29 14:24 +0000  dockes    (f09b8b421535)

	* src/filters/rcltext:
	simplified rcltext. No need for awk and no assumptions on charset

2009-01-29 11:27 +0000  dockes    (c8b882dea260)

	* src/ChangeLog, website/CHANGES.html, website/doc.html:
	

2009-01-29 11:04 +0000  dockes    (0bf58162416f)

	* src/VERSION:
	1.12.0 une

2009-01-29 10:47 +0000  dockes    (40e8e1f2f59b)

	* packaging/debian/changelog, packaging/rpm/recoll.spec,
	packaging/rpm/recollCooker.spec, packaging/rpm/recollfedora.spec,
	packaging/rpm/recollmdk.spec:
	

2009-01-29 10:08 +0000  dockes    (2af56852a361)

	* src/qtgui/main.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h:
	have ssearch install the lang help section when needed

2009-01-28 17:41 +0000  dockes    (8654c9b9d56d)

	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp:
	erase history would crash with empty reslist docsource

2009-01-28 17:21 +0000  dockes    (8b56ccfdd91b)

	* src/qtgui/rclmain_w.cpp:
	fixed status bar messages (were cleared by periodic100 every 100ms)

2009-01-28 17:05 +0000  dockes    (b435cf90abb0)

	* src/qtgui/rclhelp.cpp, src/qtgui/rclhelp.h: new file.
	* src/qtgui/rclhelp.cpp, src/qtgui/rclhelp.h:
	F1 context-enhanced help

2009-01-28 16:56 +0000  dockes    (e5410627d9d5)

	* src/qt4gui/recoll.pro.in:
	F1 context-enhanced help

2009-01-28 16:56 +0000  dockes    (741df5618110)

	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h,
	src/qtgui/main.cpp, src/qtgui/preview_w.cpp,
	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/recoll.h,
	src/qtgui/recoll.pro.in, src/qtgui/reslist.cpp,
	src/qtgui/sort_w.cpp, src/qtgui/spell_w.cpp:
	F1 context-enhanced help

2009-01-28 14:58 +0000  dockes    (7e804d156dc5)

	* src/qtgui/rclmain_w.cpp:
	dont encode urls used for starting help browser

2009-01-28 14:22 +0000  dockes    (e696212a674c)

	* src/Makefile.in:
	add xapian version to version string

2009-01-28 08:45 +0000  dockes    (46251043fd88)

	* src/qtgui/advsearch.ui, src/qtgui/sort.ui, src/qtgui/spell.ui,
	src/qtgui/uiprefs.ui:
	avoid setting 0 sizes

2009-01-28 08:40 +0000  dockes    (1c551a065bdd)

	* src/configure, src/configure.ac:
	allow setting QMAKE in the environment

2009-01-27 18:12 +0000  dockes    (fb41a05985ed)

	* src/utils/pxattr.cpp:
	

2009-01-27 11:19 +0000  dockes    (3f5897bb4b8d)

	* tests/stemming/stemming.sh, tests/stemming/stemming.txt: new file.
	* tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
	tests/andor/andor.sh, tests/andor/andor.txt,
	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
	tests/boolean/boolean.sh, tests/boolean/boolean.txt,
	tests/cjk/cjk.sh, tests/delete/delete.sh, tests/delete/delete.txt,
	tests/dirwithblanks/dirwithblanks.sh,
	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
	tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
	tests/html/html.txt, tests/images/images.sh,
	tests/images/images.txt, tests/koi8r/koi8r.sh,
	tests/koi8r/koi8r.txt, tests/lyx/lyx.sh, tests/lyx/lyx.txt,
	tests/mail/mail.sh, tests/mail/mail.txt, tests/media/media.sh,
	tests/media/media.txt, tests/msword/msword.sh,
	tests/msword/msword.txt, tests/notypes/notypes.sh,
	tests/notypes/notypes.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
	tests/ppt/ppt.txt, tests/rfc2231/rfc2231.sh,
	tests/rfc2231/rfc2231.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
	tests/runtests.sh, tests/scribus/scribus.sh,
	tests/scribus/scribus.txt, tests/skipped/skipped.sh,
	tests/skipped/skipped.txt, tests/special/special.sh,
	tests/special/special.txt, tests/stemming/stemming.sh,
	tests/stemming/stemming.txt, tests/txt/txt.sh, tests/txt/txt.txt,
	tests/utf8/utf8.sh, tests/utf8/utf8.txt, tests/xls/xls.sh,
	tests/xls/xls.txt:
	remove recoll query text from compared test outputs

2009-01-27 10:25 +0000  dockes    (57dd90e8b55d)

	* src/common/textsplit.cpp, src/common/textsplit.h:
	Emit a_b intermediary span when splitting a_b.c

2009-01-26 18:30 +0000  dockes    (e2238061ec9d)

	* src/query/plaintorich.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
	src/rcldb/searchdata.cpp:
	modified the time at which we unaccent so that we can do the
	Capitalized->nostemming test on single words (this had been broken
	by the change of noac/split order done earlier to get japanese to
	work)

2009-01-26 18:26 +0000  dockes    (8529cb7d58c7)

	* tests/cjk/cjk.sh:
	

2009-01-26 17:52 +0000  dockes    (8a5b4971a703)

	* tests/cjk/cjk.sh: new file.
	* tests/cjk/cjk.sh:
	

2009-01-26 17:34 +0000  dockes    (e65566ba6690)

	* website/BUGS.html, website/CHANGES.html, website/features.html,
	website/index.html.en, website/index.html.fr,
	website/pics/index.html, website/pics/recoll-
	HTML_search_results.html, website/pics/recoll0.html,
	website/pics/recoll0.txt, website/pics/recoll1.html,
	website/pics/recoll2.html, website/pics/recoll3.html,
	website/pics/recoll4.html, website/pics/recoll5.html,
	website/pics/recoll_chinese.html:
	website

2009-01-26 13:29 +0000  dockes    (61198659243f)

	* src/utils/smallut.cpp, src/utils/smallut.h:
	add overloaded neutchars with different parameters

2009-01-26 13:27 +0000  dockes    (61567bc09eab)

	* src/utils/transcode.cpp:
	tested and decided against cacheing iconv_open

2009-01-23 15:56 +0000  dockes    (1998b1608eb0)

	* src/ChangeLog, src/qtgui/advsearch_w.cpp, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h:
	temp ckpt: need to test on real unix

2009-01-23 11:07 +0000  dockes    (3631372e04f1)

	* src/qtgui/uiprefs.ui:
	avoid name duplication

2009-01-23 11:03 +0000  dockes    (0dba2718e1aa)

	* src/qtgui/uiprefs.ui:
	one button for choosing native editors

2009-01-23 10:38 +0000  dockes    (167a153bcf3c)

	* src/kde/kioslave/recoll/data/searchable.html:
	simplified javascrip: no ie here!

2009-01-23 09:41 +0000  dockes    (b71166d61782)

	* src/qtgui/rclmain_w.cpp:
	toLocal8Bit->local8bit

2009-01-23 09:30 +0000  dockes    (c3565b4a7244)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h:
	use normal text/html ext app for viewing help

2009-01-23 09:27 +0000  dockes    (c025fa3fe99d)

	* src/utils/execmd.cpp, src/utils/execmd.h:
	accept additional path argument to execmd::which

2009-01-22 14:25 +0000  dockes    (967d5e013a33)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	allow toggle show text/fields in preview

2009-01-21 16:42 +0000  dockes    (f950b7d75e66)

	* src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	added saveToFile menu entry to reslist

2009-01-21 13:55 +0000  dockes    (033fe406a666)

	* src/utils/pxattr.cpp, src/utils/pxattr.h: new file.
	* src/common/autoconfig.h.in, src/common/rclconfig.cpp,
	src/common/rclconfig.h, src/configure, src/configure.ac,
	src/internfile/internfile.cpp, src/internfile/mh_exec.h,
	src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp,
	src/internfile/mh_mbox.cpp, src/internfile/mh_text.cpp,
	src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp,
	src/internfile/mimehandler.h, src/lib/Makefile, src/lib/mkMake,
	src/sampleconf/fields, src/utils/pxattr.cpp, src/utils/pxattr.h:
	added optional extended file attributes support

2009-01-21 11:11 +0000  dockes    (f269f00857ec)

	* src/sampleconf/mimeconf:
	comments

2009-01-21 11:11 +0000  dockes    (fda5a0a6fccb)

	* src/filters/rcldoc:
	try to use wvWare if present and antiword fails

2009-01-21 10:49 +0000  dockes    (394e160f7032)

	* src/utils/readfile.cpp:
	initialize the error buffer for gnu strerror_r

2009-01-21 10:24 +0000  dockes    (7580c4ed79ce)

	* src/utils/readfile.cpp:
	fix errno printing

2009-01-21 10:17 +0000  dockes    (f1dca213efee)

	* src/rcldb/rcldb.cpp:
	fixed typo that would prevent stopfile use

2009-01-17 14:57 +0000  dockes    (90f03bbd715c)

	* src/doc/man/recoll.conf.5, src/doc/user/usermanual.sgml:
	added compressedfilemaxkbs

2009-01-17 14:56 +0000  dockes    (78d1dd932d5b)

	* src/internfile/internfile.cpp, src/qtgui/confgui/confguiindex.cpp,
	src/sampleconf/recoll.conf.in:
	added compressedfilemaxkbs

2009-01-16 17:40 +0000  dockes    (fcc2539b18b4)

	* src/kde/kioslave/recoll/data/searchable.html:
	

2009-01-16 16:42 +0000  dockes    (11cc037db8a9)

	* src/kde/kioslave/recoll/00README.txt:
	

2009-01-16 11:32 +0000  dockes    (baaf38fdbca9)

	* src/kde/kioslave/recoll/00README.txt,
	src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/notes.txt:
	fixed docs + removed dead code

2009-01-15 17:07 +0000  dockes    (144b35bd64c0)

	* src/filters/rcluncomp, src/internfile/internfile.cpp:
	fixed handling of decompression errors, which was wrong but not
	catastrophly so in most cases

2009-01-15 17:05 +0000  dockes    (4b10b961d158)

	* src/qtgui/reslist.cpp:
	disable printing to tmp file

2009-01-15 14:37 +0000  dockes    (9392e278bb0a)

	* src/query/docseq.h, src/query/filtseq.cpp, src/query/filtseq.h,
	src/query/sortseq.cpp, src/query/sortseq.h:
	refactor operations delegated to subsequence by sortseq and filtspec
	into superclass

2009-01-15 09:47 +0000  dockes    (f02a34f835b4)

	* src/rcldb/rcldb.cpp:
	removed unused variable

2009-01-15 09:45 +0000  dockes    (2440f3259cd0)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/reslist.cpp,
	src/qtgui/uiprefs_w.cpp:
	ensure reslist parformat is refreshed after edit (1.11 bug)

2009-01-14 07:52 +0000  dockes    (b3c89a56c9a1)

	* src/qtgui/advsearch.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h,
	src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp,
	src/qtgui/viewaction_w.h:
	arrange so that the select action dialog is preselected on the right
	mime type after missing action

2009-01-13 16:03 +0000  dockes    (2d8517785a8e)

	* src/common/textsplit.cpp:
	add _ to wordsep/spanglue chars. Add non-ascii test to isCJK for
	optimization

2009-01-13 16:02 +0000  dockes    (cbfb1f939c9d)

	* src/common/uproplist.h:
	small fix : remove diaeresis from seps + comments

2009-01-13 08:56 +0000  dockes    (ee8989c89330)

	* src/doc/user/usermanual.sgml:
	

2009-01-13 08:49 +0000  dockes    (93e74953ed0b)

	* src/doc/user/usermanual.sgml:
	update version

2009-01-13 08:02 +0000  dockes    (051bf6d49898)

	* src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rclquery.h:
	minor visibility cleanup

2009-01-13 08:01 +0000  dockes    (c550fb351f5f)

	* src/qtgui/ssearchb.ui:
	fix obsolete tooltip message

2009-01-12 18:31 +0000  dockes    (3cefac6eb52d)

	* src/doc/user/usermanual.sgml:
	doc: better adv search explanation + duplicates collapsing

2009-01-12 17:50 +0000  dockes    (f8cb21911962)

	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
	simplified dialog structure, apparently allowed to get rid of size
	hacks

2009-01-12 16:42 +0000  dockes    (48ca278dcd42)

	* src/qtgui/advsearch.ui:
	suppressed unused vbox

2009-01-12 15:55 +0000  dockes    (b5486bd5b85d)

	* src/qtgui/advsearch.ui, src/qtgui/searchclause_w.cpp,
	src/qtgui/searchclause_w.h:
	suppressed unused layout in searchClause

2009-01-09 14:56 +0000  dockes    (073523a33ffe)

	* src/internfile/mh_exec.cpp, src/internfile/mh_html.cpp,
	src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp,
	src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
	src/rcldb/rclquery.h:
	compute md5 checksums for all docs and optionally collapse
	duplicates in results

2009-01-09 12:23 +0000  dockes    (f89119e58f79)

	* src/qtgui/reslist.cpp:
	add space/backspace as pager keys for reslist

2009-01-09 12:23 +0000  dockes    (36eb326513d5)

	* src/utils/Makefile, src/utils/md5.cpp, src/utils/md5.h,
	src/utils/readfile.cpp, src/utils/readfile.h:
	implement md5 convenience file and string wrappers. Modify readfile
	to support this

2009-01-09 07:27 +0000  dockes    (de3507d26de4)

	* src/rcldb/pathhash.cpp, src/rcldb/pathhash.h: deleted file.
	* src/lib/Makefile, src/lib/mkMake, src/rcldb/pathhash.cpp,
	src/rcldb/pathhash.h, src/rcldb/rcldb.cpp:
	got rid of pathhash in rcldb, not used since 11.0

2009-01-08 09:55 +0000  dockes    (1fc0cdb06859)

	* src/excludefile:
	adapt to svn

2009-01-08 09:50 +0000  dockes    (867f1a9f6b02)

	* src/makesrcdist.sh:
	adapt distrib script to svn

2009-01-08 09:40 +0000  dockes    (33a7fbc42386 [RECOLL_1_12_1exp5])

	* src/VERSION:
	

2009-01-06 18:48 +0000  dockes    (2e111dad7cba)

	* src/doc/user/bldloop: new file.
	* packaging/FreeBSD/recoll/Makefile,
	packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg-
	plist, src/doc/user/bldloop, tests/koi8r/koi8r.sh, tests/shared.sh:
	*** empty log message ***

2009-01-06 18:40 +0000  dockes    (c82fbe0ee8fc)

	* packaging/debian/changelog, packaging/rpm/recoll.spec,
	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
	src/ChangeLog, website/devel.html, website/download.html:
	*** empty log message ***

2009-01-06 18:40 +0000  dockes    (7ebc18a8b4d7)

	* unac/builder.in, unac/unac.c, unac/unac.h:
	new unac approach for japanese: dont decompose at all

2009-01-06 17:40 +0000  dockes    (a0b7ed1f2bda)

	* website/xapUpg100.html: new file.
	* website/BUGS.html, website/BUGS.txt, website/CHANGES.html,
	website/doc.html, website/download.html, website/index.html.en,
	website/index.html.fr, website/xapUpg100.html:
	*** empty log message ***

2009-01-06 17:30 +0000  dockes    (636e0f9f2a77)

	* website/howtos/index.html,
	website/howtos/prevent_indexing_a_directory/index.html,
	website/howtos/use_multiple_indexes/index.html,
	website/pics/piclist.txt, website/pics/recoll-HTML_search_results-
	thumb.png, website/pics/recoll-HTML_search_results.html,
	website/pics/recoll-HTML_search_results.png, website/pics/recoll-
	HTML_search_results.txt, website/pics/recoll0-thumb.png,
	website/pics/recoll0.html, website/pics/recoll0.png,
	website/pics/recoll0.txt, website/pics/recoll1-thumb.png,
	website/pics/recoll1.html, website/pics/recoll1.png,
	website/pics/recoll1.txt, website/pics/recoll2-thumb.png,
	website/pics/recoll2.html, website/pics/recoll2.png,
	website/pics/recoll2.txt, website/pics/recoll3-thumb.png,
	website/pics/recoll3.html, website/pics/recoll3.png,
	website/pics/recoll3.txt, website/pics/recoll4-thumb.png,
	website/pics/recoll4.html, website/pics/recoll4.png,
	website/pics/recoll4.txt, website/pics/recoll5-thumb.png,
	website/pics/recoll5.html, website/pics/recoll5.png,
	website/pics/recoll5.txt, website/pics/recoll_chinese-thumb.png,
	website/pics/recoll_chinese.html, website/pics/recoll_chinese.png,
	website/pics/recoll_chinese.txt: new file.
	* website/howtos/index.html,
	website/howtos/prevent_indexing_a_directory/index.html,
	website/howtos/use_multiple_indexes/index.html,
	website/pics/piclist.txt, website/pics/recoll-HTML_search_results-
	thumb.png, website/pics/recoll-HTML_search_results.html,
	website/pics/recoll-HTML_search_results.png, website/pics/recoll-
	HTML_search_results.txt, website/pics/recoll0-thumb.png,
	website/pics/recoll0.html, website/pics/recoll0.png,
	website/pics/recoll0.txt, website/pics/recoll1-thumb.png,
	website/pics/recoll1.html, website/pics/recoll1.png,
	website/pics/recoll1.txt, website/pics/recoll2-thumb.png,
	website/pics/recoll2.html, website/pics/recoll2.png,
	website/pics/recoll2.txt, website/pics/recoll3-thumb.png,
	website/pics/recoll3.html, website/pics/recoll3.png,
	website/pics/recoll3.txt, website/pics/recoll4-thumb.png,
	website/pics/recoll4.html, website/pics/recoll4.png,
	website/pics/recoll4.txt, website/pics/recoll5-thumb.png,
	website/pics/recoll5.html, website/pics/recoll5.png,
	website/pics/recoll5.txt, website/pics/recoll_chinese-thumb.png,
	website/pics/recoll_chinese.html, website/pics/recoll_chinese.png,
	website/pics/recoll_chinese.txt:
	*** empty log message ***

2008-12-21 13:17 +0000  dockes    (74da01dd27c2)

	* src/unac/unac.c, src/unac/unac.h:
	new unac approach for japanese: dont decompose at all

2008-12-21 13:05 +0000  dockes    (273dad0916bb)

	* unac/unac_version.h: new file.
	* unac/unac_version.h:
	*** empty log message ***

2008-12-19 09:55 +0000  dockes    (1a2dd90e07b4)

	* src/rcldb/rcldb.h, src/rcldb/rclquery.cpp, src/rcldb/searchdata.cpp:
	getMainConfig not actually needed and possibly harmful

2008-12-19 09:44 +0000  dockes    (3a16629b24f5)

	* src/rcldb/searchdata.cpp, src/unac/unac.c, src/unac/unac.h:
	dont unaccent japanese + fix bug in unac/split ordering in
	searchdata

2008-12-19 08:39 +0000  dockes    (b895714a6500)

	* src/python/recoll/setup.py:
	pyrecoll: port to linux, update

2008-12-18 14:11 +0000  dockes    (33bffc499e78)

	* src/query/xadump.cpp:
	diag: prevent char combination by inserting spaces

2008-12-18 11:58 +0000  dockes    (a3863a0c1f62)

	* unac/builder.in, unac/unac.c:
	no going out of the basic plane!

2008-12-18 11:12 +0000  dockes    (ac1315d2a94f)

	* unac/unac.c:
	added recoll memory allocation checks

2008-12-18 11:05 +0000  dockes    (cfb4210ce7d5)

	* unac/CaseFolding-5.1.0.txt, unac/UnicodeData-5.1.0.txt: new file.
	* unac/CaseFolding-5.1.0.txt, unac/UnicodeData-5.1.0.txt:
	*** empty log message ***

2008-12-18 11:04 +0000  dockes    (cc609462a402)

	* unac/builder.in, unac/configure, unac/configure.ac, unac/unac.c,
	unac/unac.h:
	use unicode 5.1.0 + dont unaccent katakana/hiragana. Main change in
	unicode is that letters ae and o with stroke dont decompose anymore
	into a+e and o+e we may actually want to restore this if it proves a
	problem

2008-12-17 16:20 +0000  dockes    (65fd4fda84d3)

	* src/rcldb/rcldb.cpp:
	fix to previous abstract fix

2008-12-17 15:12 +0000  dockes    (9e9e84a23da6)

	* src/qtgui/reslist.cpp:
	use local hiliter

2008-12-17 14:26 +0000  dockes    (ada853f1e3b8)

	* src/common/Makefile, src/rcldb/rcldb.cpp:
	fix abstract generation when the match term is a multiword span
	(esp. for japanese)

2008-12-17 14:26 +0000  dockes    (9705bf172f13)

	* src/rcldb/searchdata.cpp:
	comment

2008-12-17 08:01 +0000  dockes    (42bc5b3b5abf)

	* src/index/indexer.cpp, src/index/indexer.h,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/python/recoll/pyrecoll.cpp, src/qtgui/main.cpp,
	src/query/recollq.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	simplified db open by getting rid of the illusion that we could have
	several writeable dbs per config

2008-12-16 17:43 +0000  dockes    (1d040e634db3 [RECOLL_1_12_1exp4])

	* src/README, src/VERSION,
	src/kde/kioslave/recoll/data/searchable.html,
	src/kde/kioslave/recoll/data/welcome.html:
	*** empty log message ***

2008-12-16 17:30 +0000  dockes    (18f65ef55dd6)

	* src/kde/kioslave/recoll/data/searchable.html:
	*** empty log message ***

2008-12-16 17:28 +0000  dockes    (e991bdd3d8c7)

	* src/kde/kioslave/recoll/data/searchable.html: new file.
	* src/kde/kioslave/recoll/data/searchable.html,
	src/kde/kioslave/recoll/data/welcome.html,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h:
	updated kioslave for small changes in reslistpager after main i/f
	integration. + javascript to search page

2008-12-16 14:20 +0000  dockes    (7bc14752b5f3)

	* src/qtgui/preview_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
	src/query/plaintorich.h, src/query/reslistpager.cpp,
	src/query/reslistpager.h, src/utils/debuglog.cpp,
	src/utils/debuglog.h:
	converted qt reslist to reslistpager

2008-12-16 08:54 +0000  dockes    (c702627139c8)

	* src/query/wasastringtoquery.cpp:
	OR chain longer than 2 would swallow preceding AND terms

2008-12-15 15:04 +0000  dockes    (62e1b7eaa7b9)

	* src/kde/kioslave/recoll/htmlif.cpp, src/query/reslistpager.cpp:
	kio: use right ipath for preview

2008-12-15 14:39 +0000  dockes    (30b71a18e961)

	* src/query/xadump.cpp, src/rcldb/searchdata.cpp:
	make gcc happy

2008-12-15 13:51 +0000  dockes    (f93dda12024f)

	* website/howtos/template.html:
	*** empty log message ***

2008-12-15 11:20 +0000  dockes    (4a74871e9823)

	* website/howtos/buildindex.sh, website/howtos/fragend.html,
	website/howtos/fraghead.html, website/howtos/newdir.sh,
	website/howtos/template.html: new file.
	* website/BUGS.html, website/BUGS.txt, website/CHANGES.html,
	website/copydocs, website/download.html,
	website/howtos/buildindex.sh, website/howtos/fragend.html,
	website/howtos/fraghead.html, website/howtos/newdir.sh,
	website/howtos/template.html, website/index.html.en,
	website/index.html.fr, website/pics/index.html:
	*** empty log message ***

2008-12-15 09:33 +0000  dockes    (afc0ef4911b2)

	* src/doc/user/usermanual.sgml:
	more search tips

2008-12-15 09:24 +0000  dockes    (59cd1bdd4d3f)

	* src/rcldb/searchdata.cpp:
	reorganize code + add boost to phrase element to match boost of
	original user terms

2008-12-12 11:53 +0000  dockes    (4121cbc09d70)

	* src/common/textsplit.cpp, src/common/textsplit.h,
	src/rcldb/rcldb.cpp:
	dont insert space in cjk abstracts

2008-12-12 11:02 +0000  dockes    (37fd1c31af49)

	* src/rcldb/rcldb.cpp:
	message level

2008-12-12 11:01 +0000  dockes    (d2a8c016d05c)

	* src/qtgui/reslist.cpp:
	add %i for displaying ipath

2008-12-12 11:00 +0000  dockes    (151d6a590152)

	* src/qtgui/main.cpp:
	add all extra cmd line args to the question

2008-12-08 17:43 +0000  dockes    (90b62656b326)

	* src/kde/kioslave/recoll/htmlif.cpp:
	set name as preview title

2008-12-08 17:42 +0000  dockes    (5717c313d23a)

	* src/kde/kioslave/recoll/dirif.cpp:
	removed a few traces

2008-12-08 14:34 +0000  dockes    (de392f657f81)

	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt:
	previews

2008-12-08 11:22 +0000  dockes    (877b674c328c)

	* src/utils/Makefile, src/utils/readfile.cpp:
	file_to_string: stat+reserve makes faster

2008-12-05 13:15 +0000  dockes    (19ef9198e3d5)

	* src/VERSION:
	branched maintenance for 1.11 kio devs on main now 1.12

2008-12-05 11:09 +0000  dockes    (b27d4070bbf8)

	* src/common/textsplit.cpp, src/common/textsplit.h,
	src/common/uproplist.h, src/kde/kioslave/recoll/kio_recoll.cpp,
	src/qtgui/ssearch_w.cpp, src/query/recollq.cpp,
	src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp:
	take care of splitting user string with respect to unicode white
	space, not only ascii

2008-12-05 07:38 +0000  dockes    (d102970d3aee)

	* src/utils/smallut.h:
	comment

2008-12-04 12:41 +0000  dockes    (a3f25963b2da [RECOLL_1_11_1exp3])

	* src/kde/kioslave/recoll/recollf.protocol: new file.
	* src/kde/kioslave/recoll/recollf.protocol:
	*** empty log message ***

2008-12-04 12:23 +0000  dockes    (adffbb42e449)

	* src/kde/kioslave/recoll/dirif.cpp:
	kde 4.0 compile

2008-12-04 11:50 +0000  dockes    (fef6cc6c4c97)

	* src/VERSION:
	*** empty log message ***

2008-12-04 11:49 +0000  dockes    (d1b1a426ddfa)

	* src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt, src/query/reslistpager.cpp,
	src/query/reslistpager.h, src/rcldb/rcldb.cpp, src/utils/pathut.h:
	kio_recoll: html/dir switching

2008-12-03 17:04 +0000  dockes    (a762165399a2)

	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt:
	cleaned up virtual tree and url handling. Drag to desktop now works
	with appropriate name. recollf protocol

2008-12-03 10:02 +0000  dockes    (127dbb400363)

	* src/kde/kioslave/recoll/dirif.cpp:
	better stat

2008-12-02 13:41 +0000  dockes    (6e55b23fb64f)

	* src/kde/kioslave/recoll/dirif.cpp:
	*** empty log message ***

2008-12-02 13:38 +0000  dockes    (66b031be3559)

	* src/kde/kioslave/recoll/dirif.cpp:
	*** empty log message ***

2008-12-02 13:16 +0000  dockes    (619e41b1537b)

	* src/INSTALL, src/README, src/VERSION, src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-12-02 13:14 +0000  dockes    (fff18d4ea953)

	* src/kde/kioslave/recoll/00README.txt,
	src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/data/welcome.html,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/notes.txt, src/query/reslistpager.cpp:
	kio goes to testing

2008-12-01 18:42 +0000  dockes    (714fdf15621e)

	* src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h:
	small cleanups and comments. Still some weirdness

2008-12-01 15:37 +0000  dockes    (8d9ea1f1c645)

	* src/kde/kioslave/recoll/cleancmakestuff.sh:
	*** empty log message ***

2008-12-01 15:36 +0000  dockes    (8504e2e278dd)

	* src/kde/kioslave/recoll/data/help.html: new file.
	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/cleancmakestuff.sh,
	src/kde/kioslave/recoll/data/help.html,
	src/kde/kioslave/recoll/data/welcome.html,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt:
	seems to work by re-rerunning search whenever it changes. Still had
	one crash, needs cleanup

2008-11-28 09:14 +0000  dockes    (ee6a7d32843e)

	* src/kde/kioslave/recoll/recollnolist.protocol: new file.
	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt,
	src/kde/kioslave/recoll/recoll.protocol,
	src/kde/kioslave/recoll/recollnolist.protocol:
	ensured compatibility with kde4.0

2008-11-27 17:48 +0000  dockes    (d461029ef29c)

	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt,
	src/kde/kioslave/recoll/recoll.protocol:
	bits of dual mode working

2008-11-27 14:05 +0000  dockes    (8cc177e8775a)

	* src/query/reslistpager.cpp:
	safety check

2008-11-27 13:35 +0000  dockes    (4d28c4942bc1)

	* src/sampleconf/mimeconf:
	*** empty log message ***

2008-11-27 09:49 +0000  dockes    (394d882caa0c)

	* src/sampleconf/mimeconf:
	remove obsolete [prefixes] section

2008-11-27 09:39 +0000  dockes    (0ec8260d8d7c)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-11-26 15:03 +0000  dockes    (b6a62dc24003)

	* src/kde/kioslave/recoll/cleancmakestuff.sh,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/notes.txt: new file.
	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/cleancmakestuff.sh,
	src/kde/kioslave/recoll/dirif.cpp,
	src/kde/kioslave/recoll/htmlif.cpp,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h,
	src/kde/kioslave/recoll/notes.txt,
	src/kde/kioslave/recoll/recoll.protocol:
	listdir doesnt work on kde 4.0 because on parent/child assumptions
	in kdirmodel have to check on kde 4.1

2008-11-24 17:42 +0000  dockes    (9333f13ac4c7)

	* src/VERSION:
	*** empty log message ***

2008-11-24 17:38 +0000  dockes    (a761936ec65e)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	check for dlopen

2008-11-24 16:42 +0000  dockes    (0f7e0292212f)

	* src/kde/kioslave/recoll/CMakeLists.txt:
	have to cc the pic objects, cant use librcl

2008-11-24 15:47 +0000  dockes    (d06dd2891012)

	* src/Makefile.in, src/aspell/Makefile, src/common/Makefile,
	src/common/autoconfig.h.in, src/common/rclconfig.h, src/configure,
	src/configure.ac, src/index/Makefile, src/internfile/Makefile,
	src/lib/Makefile, src/lib/mkMake, src/mk/Darwin, src/mk/FreeBSD,
	src/mk/OpenBSD, src/mk/SunOS, src/mk/commondefs,
	src/qt4gui/recoll.pro.in, src/qtgui/recoll.pro.in,
	src/query/Makefile, src/unac/unac.c, src/utils/pathut.cpp:
	make it easier to maintain the kio cmake by moving as much stuff as
	possible to autoconfig.h, merging libmime and librcl etc.

2008-11-24 15:23 +0000  dockes    (7d9add059cc1)

	* src/qtgui/confgui/main.cpp, src/qtgui/guiutils.cpp,
	src/qtgui/main.cpp, src/qtgui/recoll.h:
	replace local variable recoll_datadir with access to config

2008-11-24 14:54 +0000  dockes    (7005bf515a0b)

	* src/unac/unac_version.h: new file.
	* src/unac/unac.c, src/unac/unac_version.h:
	*** empty log message ***

2008-11-21 16:43 +0000  dockes    (5c4559fa9d49)

	* src/makesrcdist.sh:
	*** empty log message ***

2008-11-21 16:37 +0000  dockes    (e92347cad84d)

	* src/kde/kioslave/recoll/00README.txt, src/makesrcdist.sh:
	ccmake cleanup in kio_recoll

2008-11-21 16:02 +0000  dockes    (f691d6ad3333)

	* src/excludefile:
	*** empty log message ***

2008-11-20 18:00 +0000  dockes    (5063f4280d8d)

	* src/kde/kioslave/recoll/Makefile: deleted file.
	* src/kde/kioslave/recoll/Makefile:
	*** empty log message ***

2008-11-20 15:10 +0000  dockes    (dc45badd0c45)

	* src/VERSION:
	*** empty log message ***

2008-11-20 14:16 +0000  dockes    (c653773059df)

	* src/kde/kioslave/recoll/00README.txt:
	*** empty log message ***

2008-11-20 13:10 +0000  dockes    (8b5eea7103b5)

	* src/kde/kioslave/recoll/data/welcome.html: new file.
	* src/kde/kioslave/recoll/00README.txt,
	src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/data/welcome.html,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h, src/query/reslistpager.cpp,
	src/query/reslistpager.h:
	kioslave sort of works

2008-11-19 12:28 +0000  dockes    (93e6b483f5c4)

	* src/kde/kioslave/recoll/kio_recoll.cpp:
	*** empty log message ***

2008-11-19 12:19 +0000  dockes    (9b0d90b61574)

	* src/query/plaintorich.cpp, src/query/plaintorich.h,
	src/query/reslistpager.cpp, src/query/reslistpager.h: new file.
	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: deleted file.
	* src/lib/Makefile, src/lib/mkMake, src/qt4gui/recoll.pro.in,
	src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/recoll.pro.in, src/query/plaintorich.cpp,
	src/query/plaintorich.h, src/query/reslistpager.cpp,
	src/query/reslistpager.h:
	moved plaintorich from qtgui/ to query/

2008-11-19 10:06 +0000  dockes    (350dd565c80d)

	* src/qtgui/reslist.cpp, src/utils/smallut.cpp, src/utils/smallut.h:
	moved code from qtgui to smallut

2008-11-18 13:51 +0000  dockes    (fae04b17c778)

	* src/utils/cancelcheck.h:
	comment

2008-11-18 13:25 +0000  dockes    (4d54c32dbee7)

	* src/index/csguess.cpp, src/index/mimetype.cpp,
	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
	src/query/wasatorcl.cpp:
	add a few includes for new gcc version

2008-11-18 13:24 +0000  dockes    (9455c0affe0a)

	* src/utils/cancelcheck.h:
	comments

2008-11-18 10:23 +0000  dockes    (d09d14bf2e24)

	* src/utils/debuglog.h:
	*** empty log message ***

2008-11-17 14:51 +0000  dockes    (9d4e9515342e)

	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/Makefile.kde3: new file.
	* src/kde/kioslave/recoll/CMakeLists.txt,
	src/kde/kioslave/recoll/Makefile,
	src/kde/kioslave/recoll/Makefile.kde3,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h:
	1st kde test. cmake doesnt work need to use buildit script

2008-11-14 15:49 +0000  dockes    (13ca00d869a1)

	* src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.h:
	*** empty log message ***

2008-11-13 10:57 +0000  dockes    (5cd3ce5481df)

	* src/kde/kioslave/recoll/00README.txt,
	src/kde/kioslave/recoll/Makefile,
	src/kde/kioslave/recoll/kio_recoll.cpp,
	src/kde/kioslave/recoll/kio_recoll.la, src/query/docseqdb.cpp:
	got the kio_slave working again

2008-11-08 11:00 +0000  dockes    (81b9fe1d7644)

	* src/qtgui/reslist.cpp:
	Copy entries in the rght clck menu copy both to selection and
	clipboard

2008-10-18 07:04 +0000  dockes    (33b4eec42ac8)

	* website/BUGS.html: new file.
	* website/BUGS.html, website/download.html:
	*** empty log message ***

2008-10-18 06:51 +0000  dockes    (b885092a2488)

	* website/CHANGES.html: new file.
	* website/CHANGES.txt: deleted file.
	* website/BUGS.txt, website/CHANGES.html, website/CHANGES.txt,
	website/download.html, website/index.html.en, website/index.html.fr:
	*** empty log message ***

2008-10-15 08:30 +0000  dockes    (6657f5e0f698)

	* src/sampleconf/recoll.conf.in:
	add .git .hg .bzr to skipped

2008-10-14 07:50 +0000  dockes    (2321044edfb9 [RECOLL_1_11_0])

	* src/rcldb/searchdata.cpp, src/rcldb/searchdata.h,
	src/utils/refcntr.h:
	highlighting would not work with cat filt active because ClausSub
	did not implement getTerms

2008-10-14 06:07 +0000  dockes    (6ecc84bb82aa)

	* src/index/recollindex.cpp:
	print version in recollindex help

2008-10-13 11:46 +0000  dockes    (1cd1451bbb74)

	* src/excludefile, src/makesrcdist.sh:
	change in excludefile handling

2008-10-13 11:46 +0000  dockes    (609bbaa80120)

	* src/qtgui/ssearch_w.cpp, src/query/filtseq.cpp:
	warnings

2008-10-13 11:44 +0000  dockes    (809f8c3eb265)

	* src/qtgui/plaintorich.cpp:
	compil warn

2008-10-13 08:35 +0000  dockes    (a5d743b90fe8)

	* src/INSTALL, src/README:
	*** empty log message ***

2008-10-13 08:23 +0000  dockes    (5874f0e6fc82)

	* src/query/recollq.cpp:
	dont change recollq output, used for tests!

2008-10-13 07:57 +0000  dockes    (bf5637bbe652)

	* src/doc/user/usermanual.sgml, src/qtgui/i18n/recoll_de.ts,
	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_tr.ts,
	src/qtgui/i18n/recoll_uk.ts, src/qtgui/i18n/recoll_xx.ts,
	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp:
	messages and manual

2008-10-10 08:19 +0000  dockes    (d5a5fb9959b7)

	* src/doc/user/usermanual.sgml:
	added python api doc

2008-10-10 08:18 +0000  dockes    (4771280faa9c)

	* src/python/recoll/pyrecoll.cpp, src/python/samples/rclmbox.py,
	src/python/samples/recollqsd.py:
	fix executesd

2008-10-10 08:05 +0000  dockes    (f613511f9e1a)

	* src/python/recoll/pyrecoll.cpp:
	add delete purge

2008-10-10 08:04 +0000  dockes    (2547574a0242)

	* src/internfile/internfile.cpp:
	log levels

2008-10-09 09:36 +0000  dockes    (4fb973a50769)

	* src/python/recoll/pyrecoll.cpp:
	stemming went from query to searchdata

2008-10-09 09:21 +0000  dockes    (e112c834fca2)

	* src/filters/rclflac, src/filters/rclid3, src/sampleconf/mimeconf:
	improved mp3/flac filter. use pstotext directly

2008-10-09 09:19 +0000  dockes    (cf2e0559c3d9)

	* src/internfile/mh_exec.cpp, src/internfile/mimehandler.cpp:
	need to transcode text to utf-8

2008-10-09 09:19 +0000  dockes    (d250c2a0a26f)

	* src/utils/transcode.h:
	comments

2008-10-09 06:41 +0000  dockes    (721f4b3d08f4)

	* src/filters/rclimg:
	*** empty log message ***

2008-10-09 06:38 +0000  dockes    (e9d7fde008f9)

	* src/filters/rclimg:
	*** empty log message ***

2008-10-09 06:31 +0000  dockes    (4b76370655c3)

	* src/filters/rclimg:
	conform to filter error usual protocol

2008-10-08 16:15 +0000  dockes    (d60a26ce4397)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/filters/rcldvi, src/index/indexer.cpp, src/index/indexer.h,
	src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h, src/utils/smallut.cpp, src/utils/smallut.h:
	added menu to display missing helpers

2008-10-08 16:12 +0000  dockes    (30da9114943c)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-10-08 08:27 +0000  dockes    (8a78ee8cc158)

	* src/filters/rclabw, src/filters/rcldjvu, src/filters/rclid3,
	src/filters/rclkwd, src/filters/rclogg, src/filters/rclopxml,
	src/filters/rclppt, src/filters/rclsoff, src/filters/rclsvg,
	src/filters/rclxls, src/sampleconf/fields, src/sampleconf/mimeconf:
	improved rclid3 and rclogg

2008-10-07 16:19 +0000  dockes    (c922f7984106)

	* src/qtgui/preview_w.cpp:
	message

2008-10-07 08:07 +0000  dockes    (7e7e59b8a48f)

	* src/doc/user/usermanual.sgml:
	query language precisions

2008-10-07 06:52 +0000  dockes    (0b46df2d0a1d)

	* src/query/wasatorcl.cpp:
	*** empty log message ***

2008-10-07 06:44 +0000  dockes    (a6e8f2583e65)

	* src/ChangeLog, src/common/rclconfig.cpp,
	src/python/recoll/pyrecoll.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/rclquery.cpp, src/sampleconf/fields:
	let rclconfig take care of field name lowercasing

2008-10-06 06:22 +0000  dockes    (26eae5316b88)

	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h,
	src/internfile/mimehandler.cpp, src/utils/execmd.cpp:
	Disable filters with missing helpers for the whole indexing pass

2008-10-04 14:26 +0000  dockes    (556c7fa5998c)

	* src/index/indexer.cpp, src/internfile/Filter.h,
	src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/internfile/mh_exec.cpp, src/internfile/mh_exec.h,
	src/internfile/mh_html.h, src/internfile/mh_mail.cpp,
	src/internfile/mh_mail.h, src/internfile/mh_mbox.cpp,
	src/internfile/mh_mbox.h, src/internfile/mh_text.h,
	src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp,
	src/internfile/mimehandler.h:
	allow specifying format and charset for ext filters. Cache and reuse
	filters

2008-10-03 16:02 +0000  dockes    (6f5d875c2923)

	* src/utils/Makefile:
	*** empty log message ***

2008-10-03 16:02 +0000  dockes    (8d1e930cc9e2)

	* src/qtgui/preview_w.cpp:
	message

2008-10-03 08:19 +0000  dockes    (cf75be4a88cf)

	* src/common/rclconfig.cpp:
	*** empty log message ***

2008-10-03 08:09 +0000  dockes    (068bc565bf8b)

	* src/common/rclconfig.cpp, src/qtgui/guiutils.cpp,
	src/qtgui/guiutils.h, src/qtgui/plaintorich.cpp,
	src/qtgui/plaintorich.h, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp:
	add option to preview html instead of plain text

2008-10-03 06:23 +0000  dockes    (bd1a6a560e25)

	* src/internfile/internfile.cpp, src/internfile/internfile.h:
	arrange for setting aside an html version when working for preview

2008-10-03 06:17 +0000  dockes    (b10d8b6906a0)

	* src/internfile/mh_html.cpp, src/internfile/mh_html.h:
	save transcoded html for preview

2008-10-02 13:30 +0000  dockes    (f469cf040425)

	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h:
	comments

2008-09-30 12:38 +0000  dockes    (6ff81f690928)

	* src/index/recollindex.cpp, src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h:
	added index format version checking

2008-09-29 11:33 +0000  dockes    (2691a6abf645)

	* src/kde/kioslave/recoll/kio_recoll.cpp,
	src/python/recoll/pyrecoll.cpp, src/qtgui/rclmain_w.cpp,
	src/qtgui/reslist.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
	src/query/docseqdb.h, src/query/filtseq.cpp, src/query/filtseq.h,
	src/query/recollq.cpp, src/query/sortseq.cpp, src/query/sortseq.h,
	src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
	src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
	move stemlang from RclQuery to SearchData. Allow DocSequences to do
	the sorting/filtering themselves

2008-09-29 08:59 +0000  dockes    (00bc43d91e91)

	* src/kde/kioslave/recoll/kio_recoll.cpp,
	src/python/recoll/pyrecoll.cpp, src/qtgui/reslist.cpp,
	src/query/docseq.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
	src/query/docseqdb.h, src/query/docseqhist.cpp,
	src/query/docseqhist.h, src/query/filtseq.cpp, src/query/filtseq.h,
	src/query/recollq.cpp, src/query/sortseq.cpp, src/query/sortseq.h,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rclquery.cpp,
	src/rcldb/rclquery.h:
	doc.pc now only place where relevancy is stored

2008-09-29 07:13 +0000  dockes    (da809a196cc5)

	* src/qtgui/reslist.h:
	comments

2008-09-29 06:58 +0000  dockes    (dccf6cb38207)

	* src/python/recoll/pyrecoll.cpp, src/query/recollq.cpp,
	src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
	src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
	move sort params from searchdata to rclquery

2008-09-28 14:20 +0000  dockes    (0ce1cca8cac2)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.ui,
	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
	src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/qtgui/sort_w.cpp,
	src/query/filtseq.h, src/query/sortseq.cpp, src/query/sortseq.h,
	src/sampleconf/mimeconf:
	1st impl of catg filtering in reslist

2008-09-28 07:40 +0000  dockes    (5e29feefc554)

	* src/query/filtseq.cpp, src/query/filtseq.h: new file.
	* src/lib/Makefile, src/lib/mkMake, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h,
	src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h,
	src/query/filtseq.cpp, src/query/filtseq.h:
	rearranged some reslist/rclmain functions + add but not use filtseq
	code

2008-09-25 09:08 +0000  dockes    (8588b8cc05d1)

	* src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py:
	*** empty log message ***

2008-09-25 09:07 +0000  dockes    (40e028763fab)

	* src/python/xesam/xesam-recoll-service:
	arret apres hackfest

2008-09-25 06:17 +0000  dockes    (811009efeb96)

	* src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_tr.ts,
	src/qtgui/i18n/recoll_uk.ts, src/qtgui/i18n/recoll_xx.ts:
	*** empty log message ***

2008-09-25 06:14 +0000  dockes    (ce29702ab7cc)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts:
	*** empty log message ***

2008-09-25 06:02 +0000  dockes    (a065c833e601)

	* src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
	new russian/ukrainian translations

2008-09-25 06:00 +0000  dockes    (ba80af83d32f)

	* src/qtgui/advsearch_w.cpp, src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts, src/qtgui/rclmain_w.cpp,
	src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui:
	fixed typos

2008-09-24 06:50 +0000  dockes    (695914bd6d5d)

	* src/kde/recoll_applet/0README.Recoll:
	*** empty log message ***

2008-09-24 06:44 +0000  dockes    (48bbf0a115cc)

	* src/query/recollq.cpp:
	command line args must be processed as local 8 bit

2008-09-24 06:34 +0000  dockes    (e90ac2ed62fe)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-09-24 05:35 +0000  dockes    (36e2522b06b2)

	* src/qtgui/main.cpp:
	command line args must be processed as local 8 bit

2008-09-24 05:31 +0000  dockes    (9b420f1d25f8)

	* src/qtgui/main.cpp:
	command line args must be processed as local 8 bit

2008-09-23 14:32 +0000  dockes    (cd440e5917d3)

	* src/configure, src/configure.ac:
	use $QMAKE not qmake when checking version

2008-09-16 10:19 +0000  dockes    (2bc72ad13a9b)

	* src/python/recoll/pyrecoll.cpp:
	fields, indexing i/f

2008-09-16 10:13 +0000  dockes    (ff10e8072c66)

	* src/qtgui/rclmain_w.cpp:
	have to setkeydir before calling internfile when opening

2008-09-16 08:18 +0000  dockes    (c78945994f7c)

	* src/python/samples/recollqsd.py: new file.
	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/internfile/internfile.cpp, src/python/recoll/pyrecoll.cpp,
	src/python/recoll/setup.py, src/python/samples/recollqsd.py,
	src/python/xesam/xesam-recoll-service, src/query/recollq.cpp,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldb_p.h,
	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/rcldb/rclquery.cpp,
	src/rcldb/rclquery.h, src/rcldb/searchdata.cpp,
	src/rcldb/searchdata.h, src/sampleconf/fields:
	general field name handling cleanup + sort facility in rclquery

2008-09-16 08:13 +0000  dockes    (bd4c0f6fd812)

	* src/internfile/mh_mail.cpp:
	emit field for recipients

2008-09-15 08:03 +0000  dockes    (11ba5592559e)

	* src/sampleconf/fields, src/sampleconf/mimeconf,
	src/sampleconf/mimemap, src/sampleconf/mimeview:
	added rcltext/python/purple

2008-09-15 08:02 +0000  dockes    (8af411ff9bf6)

	* src/filters/rclpurple: new file.
	* src/filters/rclpurple, src/qtgui/mtpics/README,
	src/utils/base64.cpp, src/utils/smallut.cpp, src/utils/smallut.h,
	src/utils/transcode.cpp:
	*** empty log message ***

2008-09-15 07:55 +0000  dockes    (49401228a5ef)

	* src/filters/rclpython, src/qtgui/mtpics/pidgin.png,
	src/qtgui/mtpics/text-x-python.png: new file.
	* src/filters/rclpython, src/qtgui/mtpics/pidgin.png,
	src/qtgui/mtpics/text-x-python.png:
	*** empty log message ***

2008-09-13 12:56 +0000  dockes    (299644545ca0)

	* src/python/xesam/xesam-recoll-service: new file.
	* src/python/xesam/xesam-recoll-service:
	*** empty log message ***

2008-09-12 11:35 +0000  dockes    (5c85f26d124d)

	* src/sampleconf/mimeconf:
	index c code with the new rcltext generic filter

2008-09-12 11:30 +0000  dockes    (b8277032f494)

	* src/filters/rcltext: new file.
	* src/filters/rcltext:
	*** empty log message ***

2008-09-09 12:58 +0000  dockes    (a3afe9b35b57)

	* src/rcldb/rcldb.cpp:
	debug messages

2008-09-08 16:49 +0000  dockes    (a18ab0c682a4)

	* src/rcldb/rcldoc.cpp, src/sampleconf/fields: new file.
	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/internfile/internfile.cpp, src/lib/Makefile, src/lib/mkMake,
	src/python/recoll/pyrecoll.cpp, src/python/samples/recollq.py,
	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp, src/query/docseq.h,
	src/query/docseqdb.cpp, src/query/recollq.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/rcldoc.cpp, src/rcldb/rcldoc.h, src/recollinstall.in,
	src/sampleconf/fields:
	foundation work for configurable stored/indexed fields

2008-09-08 15:47 +0000  dockes    (861e4211280b)

	* src/rcldb/searchdata.h:
	unused args warning

2008-09-08 15:47 +0000  dockes    (3f6468e20038)

	* src/utils/smallut.cpp:
	test driver

2008-09-08 15:46 +0000  dockes    (581ee503208b)

	* src/ChangeLog:
	*** empty log message ***

2008-09-07 07:22 +0000  dockes    (dfe4dd53d0b9)

	* src/Makefile.in, src/qt4gui/uifrom3:
	cleanup

2008-09-07 07:08 +0000  dockes    (95c2a94321a3)

	* src/Makefile.in:
	cleaning

2008-09-07 06:43 +0000  dockes    (6294638c2504)

	* src/Makefile.in, src/VERSION, src/mk/localdefs.in:
	improved cleaning

2008-09-05 11:45 +0000  dockes    (8532ebb84453)

	* src/rcldb/rclquery.cpp:
	gcc4.3

2008-09-05 10:36 +0000  dockes    (2ada099a7545)

	* src/internfile/internfile.cpp, src/internfile/internfile.h:
	strimline and restructure the doctree-exploring loop to make it
	close to understandable

2008-09-05 10:34 +0000  dockes    (404aa368d498)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp:
	add relevancyrating to the metadata when querying

2008-09-05 10:33 +0000  dockes    (bc0210deda18)

	* src/internfile/myhtmlparse.cpp:
	accept iso date format (2008-09-05T11:55:32)

2008-09-05 10:26 +0000  dockes    (4b17d6defb3c)

	* src/doc/man/recollindex.1:
	*** empty log message ***

2008-09-01 20:39 +0000  dockes    (39ff03712b54)

	* src/sampleconf/mimeconf, src/sampleconf/mimeview:
	openxml types

2008-09-01 17:31 +0000  dockes    (f0fde685acc8)

	* src/filters/rclopxml:
	sort of works

2008-09-01 17:21 +0000  dockes    (dfd3281994ff)

	* src/filters/rclopxml: new file.
	* src/filters/rclopxml:
	almost almost ok excepts outputs some formatting directives for ppt

2008-08-31 15:28 +0000  dockes    (7756d792699d [RECOLL_1_11_1exp1, RECOLL_1_11_1exp2, RECOLL_1_11_1exp])

	* packaging/debian/changelog, packaging/debian/control,
	packaging/debian/rules:
	*** empty log message ***

2008-08-30 12:21 +0000  dockes    (60b122f6f4d6)

	* src/rcldb/rcldb.cpp:
	typo in xfsn len fix

2008-08-30 07:38 +0000  dockes    (d516181ad7a0)

	* src/rcldb/rcldb.cpp:
	truncate simple file names at max term length

2008-08-30 07:34 +0000  dockes    (59326d99e18d)

	* src/utils/smallut.cpp:
	utf8truncate

2008-08-30 07:31 +0000  dockes    (8f5c5fba53d1)

	* src/utils/smallut.cpp, src/utils/smallut.h:
	utf8truncate

2008-08-29 14:12 +0000  dockes    (41c405565cd4)

	* tests/boolean/boolean.sh:
	or->OR

2008-08-29 13:05 +0000  dockes    (6454f838026e)

	* src/internfile/mh_mbox.cpp:
	accept weird date format in From lines used by (old?) tbird

2008-08-29 09:51 +0000  dockes    (b830b6d6b04d)

	* src/index/recollindex.cpp:
	be more informative when monitoring not configured

2008-08-28 15:44 +0000  dockes    (27a9bf47f895)

	* src/python/recoll/pyrecoll.cpp, src/python/samples/rcldlkp.py,
	src/python/samples/rclmbox.py, src/rcldb/rcldb.cpp,
	src/sampleconf/mimeview:
	*** empty log message ***

2008-08-28 15:43 +0000  dockes    (d28eac37bdd9)

	* src/query/wasatorcl.cpp, src/rcldb/searchdata.h:
	use a refcntr for the sub SearchData

2008-08-28 15:42 +0000  dockes    (417a8f1346df)

	* src/rcldb/searchdata.cpp:
	ensure that a negative clause is not first or only in list

2008-08-27 12:34 +0000  dockes    (658ca4b955c8)

	* src/python/recoll/pyrecoll.cpp:
	reorganize+traces

2008-08-27 12:12 +0000  dockes    (37791b8e66aa)

	* src/python/recoll/pyrecoll.cpp:
	doc

2008-08-26 13:50 +0000  dockes    (af43f86ffe99)

	* src/query/wasastringtoquery.cpp:
	make AND and OR case-sensitive

2008-08-26 13:47 +0000  dockes    (bda91f767e32)

	* src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h,
	src/query/wasatorcl.cpp:
	try to parse the whole of Xesam user language 0.95

2008-08-26 07:56 +0000  dockes    (6a17726c7e41)

	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
	src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
	src/python/samples/recollq.py:
	renamed a few things

2008-08-26 07:38 +0000  dockes    (c97de92889e3)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	copy author back from data record to Doc

2008-08-26 07:36 +0000  dockes    (d6e27e630844)

	* src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
	src/python/samples/recollq.py: new file.
	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
	src/python/samples/rcldlkp.py, src/python/samples/rclmbox.py,
	src/python/samples/recollq.py:
	*** empty log message ***

2008-08-26 07:33 +0000  dockes    (1d6816c32358)

	* src/rcldb/rcldoc.h:
	comments

2008-08-26 07:33 +0000  dockes    (4e86d4c4f3d9)

	* src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/reslist.cpp:
	move ipath computations from reslist to internfile

2008-08-26 07:31 +0000  dockes    (b44f4950a084)

	* src/internfile/mh_exec.cpp, src/internfile/mh_exec.h:
	implement skip_to_document

2008-08-25 16:12 +0000  dockes    (936499917659)

	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	opxml formats

2008-07-30 13:16 +0000  dockes    (0f1387a8a565)

	* src/rcldb/stemdb.cpp:
	fixed inocuous but nasty bad string value test

2008-07-29 08:25 +0000  dockes    (a7888d48c2a6)

	* src/rcldb/rcldb.h, src/rcldb/rcldoc.h:
	comments

2008-07-29 06:25 +0000  dockes    (28ebb7cac39d)

	* src/index/indexer.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
	src/rcldb/rcldb_p.h, src/rcldb/rcldoc.h:
	use explicit parent udi term instead of Qterm structure to express
	parent-child relationship

2008-07-28 12:24 +0000  dockes    (5cb926be362f)

	* src/index/indexer.cpp, src/lib/Makefile, src/lib/mkMake,
	src/query/docseqhist.cpp, src/rcldb/pathhash.cpp,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/rcldoc.h,
	src/utils/Makefile, src/utils/fileudi.cpp:
	replaced path|ipath with unique doc id in rcldb i/f. Still depends
	on udi structure for parent/child

2008-07-28 10:20 +0000  dockes    (07bc933efb70)

	* src/utils/fileudi.cpp, src/utils/fileudi.h: new file.
	* src/utils/fileudi.cpp, src/utils/fileudi.h:
	*** empty log message ***

2008-07-28 08:42 +0000  dockes    (825cb66f8be3)

	* src/index/indexer.cpp, src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rcldoc.h,
	src/utils/base64.h:
	begin i/f cleanup: opacify doc uptodate sig (size+mtime)

2008-07-04 09:29 +0000  dockes    (6551cb55fa98 [RECOLL_1_10_3])

	* src/qtgui/plaintorich.cpp:
	turn dbg off

2008-07-01 13:00 +0000  dockes    (19e926f99256)

	* src/ChangeLog, src/VERSION:
	1.10.3: checkpoint for 1.10 branch maintenance

2008-07-01 12:11 +0000  dockes    (910f409cb0be)

	* src/bincimapmime/convert.h:
	suppressed a few wasteful string-cstr conversions

2008-07-01 11:57 +0000  dockes    (913963d84bc5)

	* src/bincimapmime/convert.cc, src/bincimapmime/convert.h,
	src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-
	printheader.cc:
	suppressed a few wasteful string-cstr conversions

2008-07-01 11:51 +0000  dockes    (54f3a868fb92)

	* src/bincimapmime/address.cc, src/internfile/mh_mail.cpp,
	src/query/wasastringtoquery.cpp, src/query/xadump.cpp,
	src/rcldb/rcldb.cpp, src/rcldb/rclquery.cpp, src/rcldb/searchdata.h,
	src/utils/conftree.cpp, src/utils/conftree.h, src/utils/idfile.cpp,
	src/utils/mimeparse.cpp, src/utils/pathut.cpp, src/utils/pathut.h,
	src/utils/smallut.cpp:
	suppressed a few wasteful string-cstr conversions

2008-07-01 10:29 +0000  dockes    (3e1aa9958af4)

	* src/index/mimetype.cpp, src/index/mimetype.h,
	src/internfile/mh_mail.cpp:
	mh_mail now uses mimetype() to try and better identify application
	/octet-stream

2008-07-01 08:31 +0000  dockes    (3665315a4fdd)

	* src/ChangeLog:
	*** empty log message ***

2008-07-01 08:31 +0000  dockes    (928e08cb2cc8)

	* src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
	src/rcldb/rclquery_p.h:
	small cleanups and comments

2008-07-01 08:28 +0000  dockes    (e5847d808877)

	* src/rcldb/rcldb.h:
	comments

2008-07-01 08:27 +0000  dockes    (97cd50050ecf)

	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
	src/qtgui/reslist.cpp:
	cleaned up plaintorich. Now a proper subclassable class + highlights
	multiple groups, not just the first

2008-07-01 08:27 +0000  dockes    (3ef1709e5955)

	* src/qtgui/confgui/confguiindex.cpp:
	typo

2008-07-01 08:26 +0000  dockes    (f6ddabbf59a2)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/utils/pathut.cpp,
	src/utils/pathut.h:
	moved printableUrl() to pathut

2008-07-01 08:24 +0000  dockes    (413a8a75c5af)

	* src/python/recoll/pyrecoll.cpp:
	added abstract i/f

2008-06-17 11:43 +0000  dockes    (009a912c3daf)

	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py:
	basic functionality ok, more funcs and options needed

2008-06-13 18:23 +0000  dockes    (58a4b54fa103)

	* src/utils/refcntr.h:
	separated rcldb and rclquery

2008-06-13 18:22 +0000  dockes    (a52ef2510839)

	* src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp, src/rcldb/rclquery.h,
	src/rcldb/rclquery_p.h: new file.
	* src/kde/kioslave/recoll/kio_recoll.cpp, src/lib/Makefile,
	src/lib/mkMake, src/python/recoll/pyrecoll.cpp,
	src/python/recoll/setup.py, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/query/docseq.h, src/query/docseqdb.cpp,
	src/query/docseqdb.h, src/query/recollq.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/rcldb.h, src/rcldb/rcldb_p.h, src/rcldb/rclquery.cpp,
	src/rcldb/rclquery.h, src/rcldb/rclquery_p.h,
	src/rcldb/searchdata.h, src/utils/pathut.cpp, src/utils/refcntr.h:
	separated rcldb and rclquery

2008-06-13 18:14 +0000  dockes    (e39af9faad92)

	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
	src/mk/Darwin, src/mk/FreeBSD, src/mk/Linux, src/mk/OpenBSD:
	move few things from the mk/sys files to autoconf

2008-06-10 06:30 +0000  dockes    (822b88ae3d1f)

	* src/qtgui/mtpics/License_sidux.txt: new file.
	* src/qtgui/mtpics/License_sidux.txt:
	*** empty log message ***

2008-06-09 09:14 +0000  dockes    (c9953f1a54ee)

	* src/filters/rclsiduxman, src/qtgui/mtpics/sidux-book.png: new file.
	* src/filters/rclsiduxman, src/qtgui/mtpics/sidux-book.png,
	src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	sidux manual support

2008-05-27 10:46 +0000  dockes    (2afb8b8ec073)

	* 1.10.2

2008-05-27 10:45 +0000  dockes    (62c7f8ba0eb8)

	* packaging/debian/changelog, packaging/rpm/recoll.spec,
	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
	src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py,
	website/BUGS.txt, website/CHANGES.txt, website/download.html,
	website/features.html, website/index.html.en, website/index.html.fr,
	website/styles/style.css:
	1.10.2

2008-05-27 06:47 +0000  dockes    (b120e7a059cd [RECOLL_1_10_2])

	* src/README:
	*** empty log message ***

2008-05-27 06:46 +0000  dockes    (70d9bb153b58)

	* src/VERSION:
	1.10.2

2008-05-27 06:18 +0000  dockes    (305829599fb1)

	* src/utils/pathut.cpp:
	suppress warning

2008-05-27 05:40 +0000  dockes    (f611211f012a)

	* src/internfile/internfile.cpp:
	log message

2008-05-26 09:07 +0000  dockes    (dbb469971d76)

	* src/ChangeLog:
	*** empty log message ***

2008-05-21 07:21 +0000  dockes    (b1ee79619cca)

	* src/qtgui/advsearch_w.cpp, src/qtgui/confgui/confgui.cpp,
	src/qtgui/confgui/confgui.h, src/qtgui/preview_w.cpp,
	src/qtgui/reslist.cpp, src/utils/idfile.cpp:
	openSuse 11 compile issues

2008-05-20 10:09 +0000  dockes    (f047b0f61753)

	* src/qtgui/advsearch_w.cpp, src/rcldb/rcldb.cpp:
	*** empty log message ***

2008-05-20 10:09 +0000  dockes    (f2e76fada01c)

	* src/unac/unac.c:
	make strict gcc happy

2008-05-09 12:34 +0000  dockes    (be08db2c226e)

	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py: new
	file.
	* src/python/recoll/pyrecoll.cpp, src/python/recoll/setup.py:
	*** empty log message ***

2008-05-08 10:00 +0000  dockes    (2ff9f42dc279)

	* src/rcldb/searchdata.h:
	comments

2008-05-08 09:57 +0000  dockes    (bd6106d7f9ab)

	* src/utils/smallut.cpp, src/utils/smallut.h:
	*** empty log message ***

2008-05-08 09:31 +0000  dockes    (70f8eab20535)

	* src/ChangeLog:
	*** empty log message ***

2008-05-07 06:14 +0000  dockes    (f3d36126287d)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-05-05 20:31 +0000  dockes    (d271616c4b99)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-05-05 20:28 +0000  dockes    (02b1484f3eee)

	* src/doc/user/usermanual.sgml, src/qtgui/guiutils.cpp,
	src/qtgui/guiutils.h, src/qtgui/preview_w.cpp,
	src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp:
	allow setting query term highlight color in prefs

2008-05-05 16:38 +0000  dockes    (763298305d15)

	* src/qtgui/reslist.cpp:
	Edit -> Open in links

2008-05-05 13:13 +0000  dockes    (d2fc5c651024)

	* src/bincimapmime/mime-parsefull.cc:
	part data was sometimes truncated because of bad handling of
	consecutive mime boundaries. Most common symptom: error in base64
	decoding

2008-04-18 11:41 +0000  dockes    (32155182993c)

	* src/mk/localdefs.in:
	get CXXFLAGS from autoconf

2008-04-18 11:39 +0000  dockes    (72073f033a45)

	* src/query/xadump.cpp:
	xadump would sometimes dump core with -b

2008-04-18 11:38 +0000  dockes    (ef6566c2ac8e)

	* src/qtgui/preview_w.cpp:
	walking the search terms hits backwards would go forward

2008-04-18 11:37 +0000  dockes    (018890cfdbd7)

	* src/utils/Makefile, src/utils/base64.cpp, src/utils/readfile.cpp:
	base64 testing code

2008-02-19 08:02 +0000  dockes    (34b45c5acd1c)

	* src/qtgui/main.cpp:
	make first sort after -q work

2008-02-19 08:02 +0000  dockes    (1293fc15412b)

	* src/qtgui/rclmain_w.cpp:
	comments+debug

2008-02-19 07:41 +0000  dockes    (efbaeed44ee9)

	* src/rcldb/rcldb.cpp:
	traces

2008-02-11 10:21 +0000  dockes    (81923201adc7)

	* src/utils/idfile.cpp:
	hack for Mark B.: allow treating (single-message) mbox files as
	message/rfc822

2008-02-08 08:37 +0000  dockes    (ddcce838e7d0)

	* src/qtgui/i18n/recoll_de.ts:
	update by Frank Thieme

2008-02-05 10:45 +0000  dockes    (51a501984fd4)

	* src/sampleconf/mimeconf:
	*** empty log message ***

2008-02-03 16:24 +0000  dockes    (825bb43d67ca)

	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	rclsvg

2008-02-03 16:05 +0000  dockes    (81794c3a6d9e)

	* src/filters/rclsvg:
	*** empty log message ***

2008-02-03 16:04 +0000  dockes    (40c35a7fb1bb)

	* src/filters/rclsvg: new file.
	* src/filters/rclsvg:
	*** empty log message ***

2008-01-29 10:14 +0000  dockes    (fd74eae7e8b4 [RECOLL_1_10_1])

	* src/README:
	*** empty log message ***

2008-01-29 10:11 +0000  dockes    (a1fee09bfc3d)

	* src/rcldb/searchdata.h:
	m_haveWildCards was sometimes not init

2008-01-29 08:41 +0000  dockes    (ebc971754f92)

	* src/ChangeLog:
	*** empty log message ***

2008-01-24 09:34 +0000  dockes    (301425122a56)

	* src/qtgui/main.cpp:
	*** empty log message ***

2008-01-17 11:15 +0000  dockes    (af11c991aff3)

	* src/qtgui/idxthread.cpp, src/qtgui/idxthread.h,
	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h:
	allow stopping indexing through menu action

2008-01-17 11:14 +0000  dockes    (4c108ac6227a)

	* src/query/wasastringtoquery.h:
	comment

2008-01-17 11:13 +0000  dockes    (7b2a9225dbef)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-01-16 11:14 +0000  dockes    (ddfe49735bc2)

	* src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp,
	src/rcldb/searchdata.h:
	express query language OR chains as rcldb subqueries so that field
	specs will work inside them

2008-01-16 10:52 +0000  dockes    (6487da12360f)

	* src/ChangeLog, src/doc/user/usermanual.sgml:
	*** empty log message ***

2008-01-16 08:43 +0000  dockes    (592d1258c5e4)

	* src/rcldb/searchdata.cpp:
	splitString filename queries

2007-12-20 09:08 +0000  dockes    (e99decc750eb)

	* src/index/indexer.cpp, src/rcldb/rcldb.cpp:
	ensure that the names of files with filter errors get indexed anyway

2007-12-13 06:58 +0000  dockes    (de422a0df409)

	* src/aspell/rclaspell.cpp, src/bincimapmime/convert.h,
	src/common/rclconfig.cpp, src/common/rclinit.cpp,
	src/common/textsplit.cpp, src/common/unacpp.cpp,
	src/index/csguess.cpp, src/index/indexer.cpp,
	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
	src/index/recollindex.cpp, src/internfile/htmlparse.cpp,
	src/internfile/mh_mail.cpp, src/internfile/mh_mbox.cpp,
	src/internfile/myhtmlparse.cpp, src/query/docseqhist.cpp,
	src/query/history.cpp, src/query/recollq.cpp,
	src/rcldb/pathhash.cpp, src/rcldb/rcldb.cpp, src/utils/base64.cpp,
	src/utils/conftree.cpp, src/utils/copyfile.cpp,
	src/utils/fstreewalk.cpp, src/utils/idfile.cpp,
	src/utils/mimeparse.cpp, src/utils/pathut.cpp,
	src/utils/readfile.cpp, src/utils/wipedir.cpp:
	gcc 4 compat, thanks to Kartik Mistry

2007-12-04 10:17 +0000  dockes    (f2bd537aad87)

	* src/qtgui/rclmain_w.cpp:
	directly open editor action choice dialog when user says so

2007-12-04 10:16 +0000  dockes    (9a289ca30889)

	* src/qtgui/uiprefs_w.cpp, src/utils/utf8iter.cpp:
	*** empty log message ***

2007-11-25 07:29 +0000  dockes    (3782c85019d4)

	* src/qtgui/i18n/recoll_tr.ts:
	*** empty log message ***

2007-11-24 16:51 +0000  dockes    (a41099c58ac0)

	* src/qtgui/i18n/recoll_fr.ts:
	accents

2007-11-24 16:43 +0000  dockes    (eecb572a0935)

	* src/qtgui/confgui/confguiindex.h:
	make conftoppanelw a q_object for translations to work

2007-11-24 10:41 +0000  dockes    (343184d41f3b)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts:
	*** empty log message ***

2007-11-21 16:34 +0000  dockes    (966333a903a9)

	* src/VERSION:
	*** empty log message ***

2007-11-21 16:34 +0000  dockes    (aed5f0389421)

	* 1.10.0

2007-11-21 16:34 +0000  dockes    (4918fce7a71a)

	* packaging/debian/changelog, packaging/debian/control,
	packaging/debian/menu, packaging/debian/rules,
	packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec,
	packaging/rpm/recollmdk.spec, tests/shared.sh, website/CHANGES.txt,
	website/devel.html, website/download.html, website/features.html,
	website/fr/features.html, website/index.html.en,
	website/index.html.fr, website/pics/index.html,
	website/styles/style.css:
	1.10.0

2007-11-21 14:15 +0000  dockes    (9c57d53ad305 [RECOLL_1_10_0])

	* src/qtgui/confgui/confguiindex.cpp, src/qtgui/main.cpp,
	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.h:
	allow opening config gui if no index on first start

2007-11-21 09:42 +0000  dockes    (b1db39055b6d)

	* src/excludefile:
	*** empty log message ***

2007-11-21 09:34 +0000  dockes    (cca64d1bdb79)

	* src/utils/conftree.cpp:
	explicitely detect lines beginning with #

2007-11-21 09:00 +0000  dockes    (2cb85a4bd555)

	* src/INSTALL, src/README:
	*** empty log message ***

2007-11-16 15:20 +0000  dockes    (1f90c7302746)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-11-16 14:28 +0000  dockes    (d7f21b7adf20)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/internfile/internfile.cpp, src/internfile/mimehandler.cpp,
	src/internfile/mimehandler.h:
	indexedmimetypes

2007-11-16 12:21 +0000  dockes    (8221e8f1ce4f)

	* src/query/wasastringtoquery.cpp, src/query/wasatorcl.cpp:
	very small effort to look like xesam simple query

2007-11-16 07:34 +0000  dockes    (1398d49de21d)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-11-16 07:19 +0000  dockes    (eedcef5d56b7)

	* src/qtgui/i18n/recoll_tr.ts:
	*** empty log message ***

2007-11-15 18:44 +0000  dockes    (99e585288200)

	* src/qtgui/preview_w.cpp:
	comment

2007-11-15 18:39 +0000  dockes    (1ee213030954)

	* src/qt4gui/q3richtext_p.h: new file.
	* src/qt4gui/q3richtext_p.h, src/qt4gui/recoll.pro.in:
	qt4 movetoanchor

2007-11-15 18:39 +0000  dockes    (335db8a5c8cb)

	* src/qtgui/i18n/recoll_it.ts:
	*** empty log message ***

2007-11-15 18:34 +0000  dockes    (b3bb7b017f2a)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	moveToAnchor qt4

2007-11-15 18:05 +0000  dockes    (1fe63dd4f268)

	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
	src/qtgui/recoll.pro.in:
	finally got anchors to work. qt3

2007-11-15 18:05 +0000  dockes    (3158e59fd92e)

	* src/qtgui/reslist.cpp:
	*** empty log message ***

2007-11-13 18:42 +0000  dockes    (1a7029e2dd4e)

	* src/doc/man/recoll.1:
	*** empty log message ***

2007-11-13 18:40 +0000  dockes    (a5a94cfbfa7d)

	* src/query/recollq.cpp:
	keep format constant

2007-11-13 18:40 +0000  dockes    (09f615e1a305)

	* src/doc/user/usermanual.sgml:
	text

2007-11-13 18:39 +0000  dockes    (ce5a12bb92bd)

	* tests/badsuffs1/badsuffs1.txt, tests/html/html.txt,
	tests/mail/mail.txt, tests/ooff/ooff.txt, tests/special/special.txt:
	1.10+small changes in dataset

2007-11-13 15:35 +0000  dockes    (3a8d3f5af0e8)

	* src/ChangeLog:
	*** empty log message ***

2007-11-13 15:34 +0000  dockes    (d23b6a94f4c0)

	* src/VERSION:
	1.10.0?

2007-11-13 10:07 +0000  dockes    (f3338fa8cb4e)

	* src/doc/man/recollq.1: new file.
	* src/doc/man/recollq.1:
	*** empty log message ***

2007-11-09 18:48 +0000  dockes    (7859ad070bfc)

	* src/qtgui/i18n/recoll_fr.ts:
	1.9 ?

2007-11-09 18:07 +0000  dockes    (557d4b9ce60a)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_tr.ts, src/qtgui/i18n/recoll_uk.ts,
	src/qtgui/i18n/recoll_xx.ts:
	*** empty log message ***

2007-11-09 15:56 +0000  dockes    (2c201bdce017)

	* src/filters/rcltex:
	*** empty log message ***

2007-11-09 15:46 +0000  dockes    (7960c1dd4d0a)

	* src/kde/kioslave/recoll/00README.txt,
	src/kde/kioslave/recoll/Makefile,
	src/kde/kioslave/recoll/kio_recoll.cpp:
	get things to compile with recoll 1.9 and suse + kde 3.5.5

2007-11-09 13:44 +0000  dockes    (6196dbaf0aec)

	* src/sampleconf/mimeview:
	tex

2007-11-09 11:55 +0000  dockes    (10ce7112596d)

	* src/filters/rcltex: new file.
	* src/filters/rclmedia: deleted file.
	* src/filters/rclmedia, src/filters/rcltex, src/sampleconf/mimeconf,
	src/sampleconf/mimemap:
	added support for indexing TeX text

2007-11-09 11:54 +0000  dockes    (5a35ec87ecf2)

	* src/filters/rclid3:
	comments

2007-11-08 09:35 +0000  dockes    (bdde14acf3bd)

	* src/query/recollq.h: new file.
	* src/lib/Makefile, src/lib/mkMake, src/qtgui/main.cpp,
	src/qtgui/recoll.pro.in, src/query/Makefile, src/query/recollq.cpp,
	src/query/recollq.h:
	allow recoll to be used as a recollq driver

2007-11-08 09:34 +0000  dockes    (06e94674b8e2)

	* src/utils/execmd.cpp:
	include pthread

2007-11-08 09:34 +0000  dockes    (d6e84478935d)

	* src/rcldb/stemdb.cpp:
	debug

2007-11-08 09:32 +0000  dockes    (9f3349e7358b)

	* src/qt4gui/recoll.pro.in:
	turkish

2007-11-08 09:31 +0000  dockes    (cd6b8b7d2a36)

	* src/mk/OpenBSD:
	*** empty log message ***

2007-11-08 07:54 +0000  dockes    (6e986b6d1e64)

	* src/query/recollq.cpp:
	add -b option to only output url list

2007-11-06 11:55 +0000  dockes    (2b0e2fc0dd88)

	* src/qtgui/i18n/recoll_tr.ts: new file.
	* src/qtgui/i18n/recoll_tr.ts:
	*** empty log message ***

2007-10-27 16:40 +0000  dockes    (e8ac0b8f6c46)

	* src/rcldb/rcldb.cpp:
	comment

2007-10-27 08:40 +0000  dockes    (2ccaf4ef243e)

	* src/ChangeLog, src/qtgui/i18n/recoll_de.ts,
	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-10-27 08:40 +0000  dockes    (e647e4592daa)

	* src/filters/rcluncomp:
	allow uncompressing suffix-less files

2007-10-27 08:40 +0000  dockes    (dc6d97a86685)

	* src/internfile/internfile.cpp:
	use pcSubst

2007-10-27 08:39 +0000  dockes    (54ba3ef75586)

	* src/rcldb/rcldb.cpp:
	adjust MatchDecider return type according to xapian version

2007-10-27 07:06 +0000  dockes    (54b798d7fa02)

	* src/qtgui/i18n/recoll_xx.ts:
	sent to ning

2007-10-26 10:42 +0000  dockes    (acfa4e6c24ba)

	* src/doc/user/usermanual.sgml:
	index config gui

2007-10-25 15:51 +0000  dockes    (12d12311134a)

	* src/qtgui/confgui/confguiindex.cpp:
	labels

2007-10-25 15:51 +0000  dockes    (2a1d29582446)

	* src/qtgui/confgui/confgui.cpp:
	use new style combobox constructor

2007-10-25 15:50 +0000  dockes    (8b45d32c605c)

	* src/internfile/mh_exec.h:
	cleanup

2007-10-25 08:04 +0000  dockes    (0bf8540b6c22)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-10-25 07:27 +0000  dockes    (5d57c38993af)

	* src/query/recollq.cpp, src/query/wasatorcl.cpp:
	added option to query language for filtering on directory

2007-10-25 07:09 +0000  dockes    (d1adc7006d08)

	* src/rcldb/rcldb.cpp:
	add filter topdir to query description

2007-10-24 15:38 +0000  dockes    (5f1863c33239)

	* src/rcldb/rcldb.cpp:
	use a Xapian MatchDecider to filter on dir path

2007-10-24 08:42 +0000  dockes    (2d337545271f)

	* src/rcldb/rcldb.cpp:
	make filter a xapian::MatchDecider, dont change mechanism

2007-10-19 15:25 +0000  dockes    (935a92d6db39)

	* src/qtgui/ssearch_w.cpp, src/utils/smallut.cpp:
	consider cr and lf as whitespace when splitting strings

2007-10-19 14:31 +0000  dockes    (bb88b5f4fc25)

	* src/qtgui/confgui/confgui.h, src/qtgui/confgui/confguiindex.cpp:
	small sizing adjustments

2007-10-18 10:39 +0000  dockes    (f34f0260a62a)

	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp:
	let plaintorich do the chunking, easier to make sure we dont confuse
	textedit by cutting inside a tag

2007-10-18 10:15 +0000  dockes    (7c46f29559fe)

	* src/qtgui/confgui/confguiindex.cpp:
	qt3

2007-10-17 16:12 +0000  dockes    (41f711edeb0b)

	* src/qtgui/plaintorich.cpp:
	replaced utf8 cgj with good ole bel

2007-10-17 11:40 +0000  dockes    (102fcc4aa169)

	* src/internfile/mh_mail.cpp, src/internfile/mh_mail.h,
	src/utils/mimeparse.cpp:
	text/plain attachments were not transcoded to utf-8

2007-10-17 09:57 +0000  dockes    (dd33128e3a59)

	* src/common/rclconfig.cpp, src/internfile/internfile.cpp:
	*** empty log message ***

2007-10-15 13:08 +0000  dockes    (0a095e89bfb9)

	* src/kde/recoll_applet/0README.Recoll, src/kde/recoll_applet/AUTHORS,
	src/kde/recoll_applet/COPYING, src/kde/recoll_applet/ChangeLog,
	src/kde/recoll_applet/Doxyfile, src/kde/recoll_applet/INSTALL,
	src/kde/recoll_applet/Makefile.am,
	src/kde/recoll_applet/Makefile.cvs,
	src/kde/recoll_applet/Makefile.in, src/kde/recoll_applet/NEWS,
	src/kde/recoll_applet/README, src/kde/recoll_applet/TODO,
	src/kde/recoll_applet/acinclude.m4,
	src/kde/recoll_applet/aclocal.m4,
	src/kde/recoll_applet/admin/Doxyfile.am,
	src/kde/recoll_applet/admin/Doxyfile.global,
	src/kde/recoll_applet/admin/Makefile.common,
	src/kde/recoll_applet/admin/acinclude.m4.in,
	src/kde/recoll_applet/admin/am_edit,
	src/kde/recoll_applet/admin/bcheck.pl,
	src/kde/recoll_applet/admin/compile,
	src/kde/recoll_applet/admin/conf.change.pl,
	src/kde/recoll_applet/admin/config.guess,
	src/kde/recoll_applet/admin/config.pl,
	src/kde/recoll_applet/admin/config.sub,
	src/kde/recoll_applet/admin/configure.in.bot.end,
	src/kde/recoll_applet/admin/configure.in.min,
	src/kde/recoll_applet/admin/cvs.sh,
	src/kde/recoll_applet/admin/debianrules,
	src/kde/recoll_applet/admin/depcomp,
	src/kde/recoll_applet/admin/deps.am, src/kde/recoll_applet/admin
	/detect-autoconf.pl, src/kde/recoll_applet/admin/doxygen.sh,
	src/kde/recoll_applet/admin/install-sh,
	src/kde/recoll_applet/admin/libtool.m4.in,
	src/kde/recoll_applet/admin/ltmain.sh,
	src/kde/recoll_applet/admin/missing,
	src/kde/recoll_applet/admin/mkinstalldirs,
	src/kde/recoll_applet/admin/nmcheck,
	src/kde/recoll_applet/admin/oldinclude.m4.in,
	src/kde/recoll_applet/admin/pkg.m4.in,
	src/kde/recoll_applet/admin/ylwrap,
	src/kde/recoll_applet/config.h.in, src/kde/recoll_applet/configure,
	src/kde/recoll_applet/configure.files,
	src/kde/recoll_applet/configure.in,
	src/kde/recoll_applet/configure.in.in,
	src/kde/recoll_applet/doc/Makefile.am,
	src/kde/recoll_applet/doc/Makefile.in,
	src/kde/recoll_applet/doc/en/Makefile.am,
	src/kde/recoll_applet/doc/en/Makefile.in,
	src/kde/recoll_applet/doc/en/index.docbook,
	src/kde/recoll_applet/po/Makefile.am,
	src/kde/recoll_applet/po/Makefile.in,
	src/kde/recoll_applet/src/Makefile.am,
	src/kde/recoll_applet/src/Makefile.in,
	src/kde/recoll_applet/src/kpixmapcombo.cpp,
	src/kde/recoll_applet/src/kpixmapcombo.h,
	src/kde/recoll_applet/src/recoll_applet.cpp,
	src/kde/recoll_applet/src/recoll_applet.desktop,
	src/kde/recoll_applet/src/recoll_applet.h,
	src/kde/recoll_applet/src/recoll_applet.lsm,
	src/kde/recoll_applet/stamp-h.in, src/kde/recoll_applet/subdirs: new
	file.
	* src/kde/recoll_applet/0README.Recoll, src/kde/recoll_applet/AUTHORS,
	src/kde/recoll_applet/COPYING, src/kde/recoll_applet/ChangeLog,
	src/kde/recoll_applet/Doxyfile, src/kde/recoll_applet/INSTALL,
	src/kde/recoll_applet/Makefile.am,
	src/kde/recoll_applet/Makefile.cvs,
	src/kde/recoll_applet/Makefile.in, src/kde/recoll_applet/NEWS,
	src/kde/recoll_applet/README, src/kde/recoll_applet/TODO,
	src/kde/recoll_applet/acinclude.m4,
	src/kde/recoll_applet/aclocal.m4,
	src/kde/recoll_applet/admin/Doxyfile.am,
	src/kde/recoll_applet/admin/Doxyfile.global,
	src/kde/recoll_applet/admin/Makefile.common,
	src/kde/recoll_applet/admin/acinclude.m4.in,
	src/kde/recoll_applet/admin/am_edit,
	src/kde/recoll_applet/admin/bcheck.pl,
	src/kde/recoll_applet/admin/compile,
	src/kde/recoll_applet/admin/conf.change.pl,
	src/kde/recoll_applet/admin/config.guess,
	src/kde/recoll_applet/admin/config.pl,
	src/kde/recoll_applet/admin/config.sub,
	src/kde/recoll_applet/admin/configure.in.bot.end,
	src/kde/recoll_applet/admin/configure.in.min,
	src/kde/recoll_applet/admin/cvs.sh,
	src/kde/recoll_applet/admin/debianrules,
	src/kde/recoll_applet/admin/depcomp,
	src/kde/recoll_applet/admin/deps.am, src/kde/recoll_applet/admin
	/detect-autoconf.pl, src/kde/recoll_applet/admin/doxygen.sh,
	src/kde/recoll_applet/admin/install-sh,
	src/kde/recoll_applet/admin/libtool.m4.in,
	src/kde/recoll_applet/admin/ltmain.sh,
	src/kde/recoll_applet/admin/missing,
	src/kde/recoll_applet/admin/mkinstalldirs,
	src/kde/recoll_applet/admin/nmcheck,
	src/kde/recoll_applet/admin/oldinclude.m4.in,
	src/kde/recoll_applet/admin/pkg.m4.in,
	src/kde/recoll_applet/admin/ylwrap,
	src/kde/recoll_applet/config.h.in, src/kde/recoll_applet/configure,
	src/kde/recoll_applet/configure.files,
	src/kde/recoll_applet/configure.in,
	src/kde/recoll_applet/configure.in.in,
	src/kde/recoll_applet/doc/Makefile.am,
	src/kde/recoll_applet/doc/Makefile.in,
	src/kde/recoll_applet/doc/en/Makefile.am,
	src/kde/recoll_applet/doc/en/Makefile.in,
	src/kde/recoll_applet/doc/en/index.docbook,
	src/kde/recoll_applet/po/Makefile.am,
	src/kde/recoll_applet/po/Makefile.in,
	src/kde/recoll_applet/src/Makefile.am,
	src/kde/recoll_applet/src/Makefile.in,
	src/kde/recoll_applet/src/kpixmapcombo.cpp,
	src/kde/recoll_applet/src/kpixmapcombo.h,
	src/kde/recoll_applet/src/recoll_applet.cpp,
	src/kde/recoll_applet/src/recoll_applet.desktop,
	src/kde/recoll_applet/src/recoll_applet.h,
	src/kde/recoll_applet/src/recoll_applet.lsm,
	src/kde/recoll_applet/stamp-h.in, src/kde/recoll_applet/subdirs:
	*** empty log message ***

2007-10-14 16:07 +0000  dockes    (aea3ceac265d)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-10-09 14:08 +0000  dockes    (008fb8da2cfe)

	* src/qt4gui/recoll.pro.in, src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h, src/qtgui/idxthread.cpp,
	src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h, src/qtgui/recoll.pro.in:
	indexing confgui seems to sort of work

2007-10-09 11:08 +0000  dockes    (8e165638db48)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
	src/qtgui/confgui/main.cpp:
	*** empty log message ***

2007-10-09 09:43 +0000  dockes    (bda697547b28)

	* src/common/rclconfig.cpp, src/common/rclconfig.h:
	modified mechanism for confgui updates

2007-10-09 09:40 +0000  dockes    (314568630e50)

	* src/utils/conftree.h:
	*** empty log message ***

2007-10-07 20:22 +0000  dockes    (a4407de529dc)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confguiindex.cpp:
	*** empty log message ***

2007-10-06 07:44 +0000  dockes    (e12dcaba9422)

	* src/sampleconf/mimeconf:
	*** empty log message ***

2007-10-06 07:26 +0000  dockes    (8c03c83a6353)

	* src/ChangeLog, src/INSTALL, src/README, src/VERSION:
	*** empty log message ***

2007-10-06 07:13 +0000  dockes    (80c8e77d75e3)

	* src/qtgui/i18n/recoll_xx.ts: new file.
	* src/doc/user/usermanual.sgml, src/qtgui/i18n/recoll_xx.ts:
	*** empty log message ***

2007-10-05 14:00 +0000  dockes    (3f47738c7b7f)

	* src/query/wasatorcl.cpp:
	add rclcat prefix to query languages + adapt find_applet to use it

2007-10-05 08:03 +0000  dockes    (eb9ae456f872)

	* src/qtgui/main.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h:
	add cmd line option to run query when starting

2007-10-04 12:26 +0000  dockes    (479712bd069b)

	* src/rcldb/searchdata.cpp:
	when search includes composite spans + other terms, increase slack
	instead of switching to word split

2007-10-04 12:21 +0000  dockes    (67c23cd41df2)

	* src/common/rclconfig.cpp, src/common/textsplit.cpp,
	src/common/textsplit.h:
	make cjk ngramlen configurable

2007-10-04 12:20 +0000  dockes    (e9e128bf43ab)

	* src/index/indexer.cpp:
	trace

2007-10-03 14:53 +0000  dockes    (b8852ea7a80c)

	* src/internfile/Makefile, src/internfile/mh_mbox.cpp,
	src/internfile/mh_mbox.h:
	Improve From_ line detection

2007-10-02 14:25 +0000  dockes    (3379ab8d9013)

	* src/doc/user/docbook.css, src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-10-02 14:22 +0000  dockes    (29a402a23d12)

	* src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	a few more image files

2007-10-02 14:00 +0000  dockes    (d0e7241eeb0e)

	* src/filters/rclflac, src/filters/rclogg: new file.
	* src/filters/rcljpeg: deleted file.
	* src/filters/rclflac, src/filters/rcljpeg, src/filters/rclogg:
	*** empty log message ***

2007-10-02 13:56 +0000  dockes    (e180ca729bea)

	* src/filters/rclimg:
	comments,GPL

2007-10-02 11:39 +0000  dockes    (7777fdc5d30a)

	* src/common/rclconfig.cpp, src/common/textsplit.cpp,
	src/common/textsplit.h:
	add flag to disable cjk processing

2007-10-01 17:56 +0000  dockes    (29b1aeb75d23)

	* src/filters/rclimg: new file.
	* src/filters/rclimg:
	initial version from Cedric Scott

2007-10-01 15:57 +0000  dockes    (b3aeb47d6a43)

	* src/utils/conftree.cpp:
	added updates/erase tests

2007-10-01 06:35 +0000  dockes    (b29617933c16)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp, src/qtgui/confgui/main.cpp,
	src/qtgui/confgui/trconf.pro:
	qt4 port

2007-10-01 06:19 +0000  dockes    (78068b236681)

	* src/VERSION, src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/qtgui/confgui/confgui.cpp, src/utils/conftree.cpp,
	src/utils/conftree.h:
	config update enabling functions

2007-09-29 09:06 +0000  dockes    (e38c26097ece)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
	*** empty log message ***

2007-09-27 15:47 +0000  dockes    (9ac07bf91591)

	* src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h:
	new file.
	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/confguiindex.cpp,
	src/qtgui/confgui/confguiindex.h, src/qtgui/confgui/conflinkrcl.h,
	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
	*** empty log message ***

2007-09-27 11:03 +0000  dockes    (436530279a09)

	* src/utils/conftree.h:
	comment

2007-09-27 11:02 +0000  dockes    (a466c387c485)

	* src/utils/conftree.cpp, src/utils/conftree.h:
	avoid adding unneeded entries in confstack. fix erase-add resulting
	in duplicate

2007-09-26 12:16 +0000  dockes    (8e1e4edb4f4a)

	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro: new file.
	* src/qtgui/confgui/confgui.cpp, src/qtgui/confgui/confgui.h,
	src/qtgui/confgui/main.cpp, src/qtgui/confgui/trconf.pro:
	*** empty log message ***

2007-09-22 08:51 +0000  dockes    (8072f3278663)

	* src/common/textsplit.cpp, src/utils/utf8iter.h:
	include assert.h when needed

2007-09-21 16:45 +0000  dockes    (d85479652341)

	* src/INSTALL, src/README, src/VERSION, src/doc/user/usermanual.sgml,
	src/qtgui/recoll.pro.in:
	*** empty log message ***

2007-09-20 12:22 +0000  dockes    (28a9c536ebba)

	* src/common/textsplit.cpp:
	logs

2007-09-20 08:45 +0000  dockes    (415256bd7508)

	* src/common/textsplit.cpp, src/common/textsplit.h,
	src/utils/utf8iter.h:
	initial cjk support

2007-09-20 08:43 +0000  dockes    (66200ff61f31)

	* src/rcldb/searchdata.cpp:
	comments,formatting

2007-09-20 08:42 +0000  dockes    (750b59dea1e9)

	* src/qtgui/rclmain_w.cpp:
	restore cursor if cant start query

2007-09-18 20:35 +0000  dockes    (1d01904f2b55)

	* src/common/textsplit.cpp, src/common/textsplit.h:
	use m_ prefix for members

2007-09-18 20:34 +0000  dockes    (49381b7f40f6)

	* src/qt4gui/recoll.pro.in:
	add recoll_xx.ts

2007-09-18 07:01 +0000  dockes    (7dea06d57ada)

	* src/qtgui/i18n/recoll_it.ts:
	changes by Giovanni Cannizzaro

2007-09-11 08:23 +0000  dockes    (615a70a64b94 [RECOLL_1_9_0])

	* src/desktop/recoll-searchgui.desktop:
	desktop file corrected as per Kartik Mistry patch

2007-09-10 05:44 +0000  dockes    (78b0c9bd47bb)

	* src/qtgui/i18n/recoll_fr.ts:
	long menu labels cause pbs at least on macosx

2007-09-08 17:26 +0000  dockes    (ef2964b2e49e)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-09-08 17:25 +0000  dockes    (000b2b01844d)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
	src/qtgui/preview_w.cpp, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp:
	change hghlight text size limit to configurable value

2007-09-08 17:21 +0000  dockes    (c0ab1e961f0a)

	* src/qtgui/viewaction_w.cpp:
	added missing space in string

2007-09-08 17:21 +0000  dockes    (f70ce9c4c753)

	* src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp:
	renamed preferencesQuery_PrefsAction to queryPrefsAction

2007-09-08 17:19 +0000  dockes    (17eefeb77500 [RECOLL_1_9_1cjk2, RECOLL_1_9_1cjk1])

	* src/qtgui/plaintorich.cpp:
	comment

2007-09-08 09:44 +0000  dockes    (8aabe9bc2d85)

	* src/utils/readfile.cpp:
	small pb in solaris fix

2007-09-08 08:07 +0000  dockes    (4b862559adbb)

	* src/mk/SunOS, src/utils/pathut.cpp, src/utils/readfile.cpp:
	SunOS 2.8 fixes

2007-09-07 14:58 +0000  dockes    (f0b17af1f5d7)

	* src/configure, src/configure.ac:
	always add lz to lxapian

2007-09-07 12:39 +0000  dockes    (b10ac30fe130)

	* website/CHANGES.txt:
	*** empty log message ***

2007-09-07 08:05 +0000  dockes    (f031116372e8)

	* src/rcldb/rcldb.cpp:
	improve purge error message printing

2007-09-07 08:04 +0000  dockes    (276b259f9ec6)

	* src/qtgui/i18n/recoll_it.ts:
	new 1.9 translation by C. Rigamont

2007-09-07 08:04 +0000  dockes    (450e1342467c)

	* src/sampleconf/mimemap:
	fix wordperfect spurious extensions

2007-09-07 08:03 +0000  dockes    (624a100107be [RECOLL_1_9_1cjk])

	* website/BUGS.txt:
	update xapian near to 1.0.2

2007-09-07 08:03 +0000  dockes    (a0d360caf71e)

	* website/copydocs:
	to_mac

2007-09-01 19:12 +0000  dockes    (3ebdb5af664f)

	* src/qt4gui/recoll.pro.in, src/qtgui/i18n/recoll_de.ts,
	src/qtgui/recoll.pro.in:
	*** empty log message ***

2007-08-31 09:04 +0000  dockes    (32533d0d11d0)

	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
	pressing CR in advsearch would run query twice because of start
	autodefault

2007-08-31 07:23 +0000  dockes    (bb17fa4cfaca)

	* src/qtgui/images/d_firstpage.png, src/qtgui/images/firstpage.png:
	new file.
	* src/qtgui/images/d_firstpage.png, src/qtgui/images/firstpage.png:
	*** empty log message ***

2007-08-30 10:11 +0000  dockes    (c75b5f42b33d)

	* src/INSTALL, src/README, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-08-30 10:00 +0000  dockes    (7c4ccceae2a7)

	* website/BUGS.txt, website/CHANGES.txt, website/download.html,
	website/features.html:
	*** empty log message ***

2007-08-30 09:01 +0000  dockes    (687cad7b46de)

	* src/doc/user/usermanual.sgml, src/index/indexer.cpp,
	src/index/indexer.h, src/index/rclmonrcv.cpp,
	src/sampleconf/recoll.conf.in, src/utils/fstreewalk.cpp,
	src/utils/fstreewalk.h:
	add followLinks option

2007-08-30 08:39 +0000  dockes    (6af3a2216074)

	* src/doc/user/usermanual.sgml:
	add followLinks option

2007-08-28 08:12 +0000  dockes    (6385c6a9c88e)

	* src/index/indexer.cpp:
	allow symlinks in topdirs

2007-08-28 08:08 +0000  dockes    (a3df89087437)

	* src/utils/fstreewalk.cpp, src/utils/fstreewalk.h:
	follow top (entry) symlinks even if nofollow is set

2007-08-28 08:07 +0000  dockes    (19ac4f90b7e7)

	* src/internfile/internfile.cpp:
	error msg

2007-08-26 13:52 +0000  dockes    (fa08f95a4d95)

	* src/doc/user/usermanual.sgml:
	add wordperfect ext app info

2007-08-26 13:34 +0000  dockes    (ac877cc2e3ad)

	* src/filters/rclwpd: new file.
	* src/filters/rclwpd, src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	added wordperfect support

2007-08-26 13:34 +0000  dockes    (7472abcdbc4a)

	* src/sampleconf/recoll.conf.in:
	add commented entries for daem*

2007-08-07 08:45 +0000  dockes    (ad6dad566902)

	* src/qtgui/rclmain_w.cpp:
	*** empty log message ***

2007-08-07 08:42 +0000  dockes    (2040417c73e4)

	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp:
	qt3 adjustments

2007-08-07 08:26 +0000  dockes    (55c7dc79c190)

	* src/aspell/rclaspell.cpp, src/sampleconf/recoll.conf.in:
	*** empty log message ***

2007-08-05 05:55 +0000  dockes    (3acd192c01d1)

	* src/utils/conftree.h:
	comments

2007-08-05 05:49 +0000  dockes    (afee970ae166)

	* src/utils/conftree.h:
	*** empty log message ***

2007-08-04 07:22 +0000  dockes    (9afb2050f462)

	* src/utils/conftree.cpp, src/utils/conftree.h:
	Allow updates in confstacks

2007-08-03 07:50 +0000  dockes    (28ae2e572dcf)

	* src/utils/Makefile, src/utils/conftree.cpp, src/utils/conftree.h:
	have conftree preserve comments and ordering

2007-08-02 06:33 +0000  dockes    (4da8b2dbcaa6)

	* src/qt4gui/recoll.qrc, src/qtgui/rclmain.ui,
	src/qtgui/rclmain_w.cpp, src/qtgui/recoll.pro.in,
	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	added gotofirstpage action

2007-08-01 10:04 +0000  dockes    (c91831fab8a0)

	* src/qtgui/guiutils.h, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h, src/qtgui/ssearch_w.cpp,
	src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h,
	src/rcldb/stemdb.cpp, src/rcldb/stemdb.h:
	Allow stem expansion for several (all) stemming languages at a time

2007-08-01 07:55 +0000  dockes    (5d13d87e6e14)

	* src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp,
	src/qtgui/rclmain_w.h, src/qtgui/uiprefs_w.cpp,
	src/qtgui/uiprefs_w.h:
	allow setting stemlang from prefs menu

2007-07-20 14:50 +0000  dockes    (573069870fd4)

	* src/configure, src/configure.ac:
	check for uic3 during qt4 configure

2007-07-20 14:43 +0000  dockes    (32ae47904cca)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	preview: dont search for anchors if we have none

2007-07-20 14:32 +0000  dockes    (eac614c9a725)

	* src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	*** empty log message ***

2007-07-20 11:44 +0000  dockes    (6133f68f886f)

	* src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
	factorize previewNext/Prev

2007-07-20 11:38 +0000  dockes    (4dfc3942351a)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h:
	more preview window interface cleanup

2007-07-20 10:55 +0000  dockes    (d57bd5e6cb2d)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
	src/qtgui/rclmain_w.cpp:
	cleaned up preview window interface

2007-07-14 16:53 +0000  dockes    (35087158d61f)

	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
	src/mk/AIX, src/mk/Darwin, src/mk/Linux, src/mk/SunOS,
	src/utils/execmd.cpp:
	handle putenv arg constness in configure

2007-07-13 10:24 +0000  dockes    (98774298901d)

	* src/INSTALL, src/README, src/doc/man/recoll.conf.5,
	src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts,
	website/BUGS.txt, website/CHANGES.txt, website/download.html:
	*** empty log message ***

2007-07-13 07:17 +0000  dockes    (d2c5a6098bbd)

	* src/doc/user/docbook.css, src/doc/user/usermanual.sgml:
	1.9 changes

2007-07-13 07:10 +0000  dockes    (2569115962c0)

	* src/qtgui/uiprefs.ui:
	msg

2007-07-13 07:00 +0000  dockes    (2bd0371b8e12)

	* src/qtgui/plaintorich.cpp:
	adjust term beacon for better finding ?

2007-07-13 06:31 +0000  dockes    (f7d41e95166c)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h,
	src/qtgui/rclmain_w.cpp:
	better handle preview close during load

2007-07-12 17:28 +0000  dockes    (5b6f1204d077)

	* src/rcldb/rcldb.cpp:
	*** empty log message ***

2007-07-12 17:13 +0000  dockes    (9345d3db5ff2)

	* src/filters/rclpdf:
	dont use anchored regexps for stripping whitespace, ubuntu mawk
	ignores the anchor

2007-07-12 13:41 +0000  dockes    (1fb4e582fe5b)

	* src/utils/cancelcheck.h:
	*** empty log message ***

2007-07-12 10:53 +0000  dockes    (eb352f6c17ae)

	* src/index/rclmonrcv.cpp, src/utils/fstreewalk.cpp,
	src/utils/fstreewalk.h:
	monitor: dont add watch on created dir if in skippedXXX

2007-07-12 10:13 +0000  dockes    (d55862505674)

	* src/ChangeLog, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
	fix v1.8 default format string if we find it

2007-07-12 08:34 +0000  dockes    (b69b14b67cd2)

	* src/rcldb/rcldb.cpp:
	use uniform code for Xapian exception catching + catch a few more,
	esp. databaseModified cases

2007-07-12 08:23 +0000  dockes    (ffe9a12f9237)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/reslist.cpp,
	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
	icon now part of paragraph format

2007-07-11 10:05 +0000  dockes    (a8d4da32f304)

	* src/qtgui/reslist.cpp:
	dont create popup in irrelevant areas

2007-07-10 09:24 +0000  dockes    (993776d69bab)

	* src/sampleconf/recoll.conf.in:
	idxflushnb default 10

2007-07-10 09:23 +0000  dockes    (e800d4e4d1de)

	* src/doc/man/recollindex.1, src/index/indexer.cpp,
	src/index/indexer.h, src/index/recollindex.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/rcldb.h:
	recollindex -l

2007-07-10 05:44 +0000  dockes    (7247df0336ab)

	* src/sampleconf/recoll.conf.in:
	*** empty log message ***

2007-07-09 17:21 +0000  dockes    (ef8eddb1b94a)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-07-01 06:52 +0000  dockes    (03cb707d9122)

	* src/filters/rclid3: new file.
	* src/filters/rclid3, src/sampleconf/mimeconf, src/sampleconf/mimemap,
	src/sampleconf/mimeview:
	audio tags support improvement: flac+ogg. use FORPREVIEW

2007-06-26 17:07 +0000  dockes    (ec5b66db8aea)

	* src/qtgui/i18n/recoll_de.ts, src/qtgui/i18n/recoll_fr.ts,
	src/qtgui/i18n/recoll_it.ts, src/qtgui/i18n/recoll_ru.ts,
	src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-06-26 16:58 +0000  dockes    (34658791397a)

	* *** empty log message ***

2007-06-26 16:58 +0000  dockes    (26a811724423)

	* packaging/rpm/recollCooker.spec, website/fr/features.html,
	website/mario.png, website/perfs.html, website/smile.png: new file.
	* packaging/rpm/recollCooker.spec, src/doc/user/usermanual.sgml,
	website/BUGS.txt, website/CHANGES.txt, website/credits.html,
	website/doc.html, website/download.html, website/features.html,
	website/fr/features.html, website/index.html.en,
	website/index.html.fr, website/mario.png, website/perfs.html,
	website/rclidxfmt.html, website/smile.png, website/styles/style.css:
	*** empty log message ***

2007-06-26 16:09 +0000  dockes    (d4a3058d613e)

	* src/internfile/internfile.cpp, src/internfile/internfile.h:
	comments

2007-06-26 16:08 +0000  dockes    (7115d37ab33d)

	* src/configure, src/configure.ac, src/mk/Darwin,
	src/qtgui/reslist.cpp, src/recollinstall.in:
	get things to sort of compile / install on macosx

2007-06-26 15:38 +0000  dockes    (02621fd62ca0)

	* src/ChangeLog: new file.
	* src/ChangeLog:
	*** empty log message ***

2007-06-26 11:59 +0000  dockes    (51061217635d)

	* src/excludefile, src/makesrcdist.sh:
	small mkdist fixes

2007-06-25 18:31 +0000  dockes    (5f173fcd227f)

	* src/INSTALL, src/README:
	*** empty log message ***

2007-06-25 10:25 +0000  dockes    (048658cd678b)

	* src/rcldb/rcldb.cpp:
	simplified and hopefully improved abstract generation

2007-06-25 10:13 +0000  dockes    (14ecb9d719e7)

	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/reslist.cpp:
	plaintorich: only setup beacons if needed

2007-06-22 06:14 +0000  dockes    (0584daa67e7c)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/query/wasatorcl.cpp, src/rcldb/rcldb.cpp,
	src/rcldb/searchdata.cpp, src/sampleconf/mimeconf:
	handle mime: and ext: in qlang

2007-06-21 11:56 +0000  dockes    (e5102468f77e)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	slightly reorganized Db::close/~Db code

2007-06-21 11:14 +0000  dockes    (e360a50fdaa5)

	* src/common/rclconfig.cpp:
	beware of unsigneds diffs when comparing to 0 !

2007-06-20 13:16 +0000  dockes    (e515c5541bd4)

	* src/qtgui/preview_w.cpp, src/qtgui/rclmain.ui,
	src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h,
	src/query/history.cpp, src/query/history.h:
	menu entry to reset document history

2007-06-19 16:19 +0000  dockes    (675d2fed7a32)

	* src/qtgui/rclmain_w.cpp, src/qtgui/sort_w.cpp:
	fix sort state restoration which didnt work

2007-06-19 15:48 +0000  dockes    (36fa1c12d616)

	* src/rcldb/rcldb.cpp:
	try to better print delete exception messages

2007-06-19 15:47 +0000  dockes    (304862edc545)

	* src/query/xadump.cpp:
	option X

2007-06-19 15:47 +0000  dockes    (23a728d3cdd7)

	* src/query/recollq.cpp:
	compile

2007-06-19 12:27 +0000  dockes    (5ee1b5e9168e)

	* src/internfile/internfile.cpp, src/internfile/internfile.h:
	get test driver to compile

2007-06-19 12:17 +0000  dockes    (8974a52d2baa)

	* src/internfile/htmlparse.h, src/internfile/mh_html.cpp,
	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h:
	renamed the html charset values to stick to omega usage

2007-06-19 10:28 +0000  dockes    (e66870aeadb6)

	* src/internfile/htmlparse.cpp, src/internfile/htmlparse.h,
	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h:
	updated html parser to omega 1.0.1 + moved entity decoder to
	myhtmlparse to minimize amount of diffs

2007-06-19 08:36 +0000  dockes    (e2533617731d)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/internfile/internfile.cpp, src/internfile/mh_html.cpp,
	src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h,
	src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp, src/query/docseq.h,
	src/query/docseqdb.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h,
	src/rcldb/rcldoc.h, src/rcldb/searchdata.cpp,
	src/sampleconf/mimeconf:
	added open-ended field name handling

2007-06-19 07:52 +0000  dockes    (73ccb629ad66)

	* src/common/autoconfig.h.in, src/configure, src/configure.ac,
	src/index/csguess.cpp, src/utils/transcode.cpp:
	added test for iconv parm 2 constness

2007-06-18 13:04 +0000  dockes    (bb1262134776)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp,
	src/sampleconf/mimeconf:
	implement dynamic field name to prefix translation, query side

2007-06-15 11:41 +0000  dockes    (5eccc05a2ae7)

	* src/filters/rclabw, src/filters/rclsoff, src/sampleconf/mimeconf,
	src/sampleconf/mimemap, src/sampleconf/mimeview:
	added abiword + some oofice cleanup

2007-06-15 09:25 +0000  dockes    (f5b1666a10e6)

	* src/filters/rclabw: new file.
	* src/filters/rclabw:
	*** empty log message ***

2007-06-14 08:20 +0000  dockes    (dc698e7b3c84)

	* src/rcldb/rcldb.cpp:
	removed the "weak" date, not used and not in omega anymore

2007-06-13 17:03 +0000  dockes    (3d509dbc275c)

	* src/qtgui/reslist.cpp:
	textedit autext sometimes switched to plain at eol?

2007-06-12 13:31 +0000  dockes    (793abec1cee4)

	* src/qtgui/plaintorich.cpp, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp,
	src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	somewhat fixed qt4 selection problems

2007-06-12 10:33 +0000  dockes    (261ca6c11087)

	* src/qtgui/ssearch_w.cpp:
	adjust event handling for qt4, get esc-spc to work

2007-06-12 10:32 +0000  dockes    (97c9f158e297)

	* src/qtgui/plaintorich.cpp:
	comments

2007-06-12 08:50 +0000  dockes    (28d503078074)

	* src/qtgui/rclmain_w.cpp:
	*** empty log message ***

2007-06-12 08:46 +0000  dockes    (d3f305e57522)

	* src/query/recollq.cpp:
	getMainConfig

2007-06-11 08:33 +0000  dockes    (5542196b466a)

	* src/qtgui/rclmain_w.cpp:
	set busy cursor while search runs

2007-06-11 05:51 +0000  dockes    (bf5090aed2fd)

	* src/Makefile.in:
	*** empty log message ***

2007-06-11 05:49 +0000  dockes    (9327b736d7ff)

	* src/Makefile.in, src/qt4gui/uifrom3:
	*** empty log message ***

2007-06-11 05:45 +0000  dockes    (cbb602782461)

	* src/desktop/recoll.png, src/desktop/recoll.xcf: new file.
	* src/desktop/recoll-searchgui.png, src/desktop/recoll-searchgui.xcf:
	deleted file.
	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
	searchgui.png, src/desktop/recoll-searchgui.xcf,
	src/desktop/recoll.png, src/desktop/recoll.xcf,
	src/makestaticdist.sh, src/recollinstall.in:
	icon named recoll.png

2007-06-11 05:38 +0000  dockes    (9268fba2c65c)

	* src/index/indexer.cpp:
	changed level of missing helpers message

2007-06-10 12:26 +0000  dockes    (f5b6dcd36de0)

	* src/mk/OpenBSD: new file.
	* src/mk/OpenBSD:
	*** empty log message ***

2007-06-08 16:47 +0000  dockes    (96f2807957dd)

	* src/common/rclconfig.h, src/index/indexer.cpp,
	src/index/recollindex.cpp, src/mk/FreeBSD, src/qtgui/main.cpp,
	src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	added file system usage check

2007-06-08 16:46 +0000  dockes    (0c11deb1a678)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-06-08 16:46 +0000  dockes    (4f2c0d45e15b)

	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
	searchgui.png, src/desktop/recoll-searchgui.xcf:
	new icon

2007-06-08 16:05 +0000  dockes    (6835d2fbb56c)

	* src/rcldb/rcldb.h:
	comments and ordering

2007-06-08 15:30 +0000  dockes    (aeffac1f3f2d)

	* src/utils/pathut.cpp, src/utils/pathut.h:
	fsocc

2007-06-08 14:01 +0000  dockes    (7c47d8aae3cc)

	* src/filters/rclkwd: new file.
	* src/filters/rclkwd, src/sampleconf/mimeview:
	kword support

2007-06-08 13:51 +0000  dockes    (53a1012a564f)

	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
	src/filters/rclgaim, src/filters/rcljpeg, src/filters/rcllyx,
	src/filters/rclman, src/filters/rclmedia, src/filters/rclpdf,
	src/filters/rclppt, src/filters/rclps, src/filters/rclrtf,
	src/filters/rclscribus, src/filters/rclsoff, src/filters/rclxls,
	src/filters/recfiltcommon, src/sampleconf/mimeconf,
	src/sampleconf/mimemap:
	kword support

2007-06-08 12:33 +0000  dockes    (a56bc180327b)

	* src/query/recollq.cpp:
	added stopfile parameter

2007-06-08 12:32 +0000  dockes    (7b3710f69cd0)

	* src/filters/rcljpeg: new file.
	* src/filters/rcljpeg, src/sampleconf/mimeconf:
	rcljpeg

2007-06-08 12:31 +0000  dockes    (0b20447d105e)

	* src/common/rclconfig.cpp:
	improve message about bad config

2007-06-02 08:30 +0000  dockes    (dfa3e5682035)

	* src/rcldb/Makefile, src/rcldb/stoplist.cpp, src/rcldb/stoplist.h:
	new file.
	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/index/indexer.cpp, src/lib/Makefile, src/lib/mkMake,
	src/qtgui/main.cpp, src/rcldb/Makefile, src/rcldb/rcldb.cpp,
	src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/stoplist.cpp,
	src/rcldb/stoplist.h, src/utils/readfile.cpp, src/utils/readfile.h:
	minimal experimental stopword functionality

2007-06-01 05:44 +0000  dockes    (b9f3d4b61852)

	* src/qtgui/preview_w.cpp:
	preview: space and backspace bound to pgdown/pgup

2007-05-30 12:31 +0000  dockes    (105744d9f609)

	* src/index/indexer.cpp, src/internfile/mh_html.cpp,
	src/internfile/mh_html.h, src/qtgui/plaintorich.cpp,
	src/query/xadump.cpp, src/utils/transcode.cpp:
	improve transcode error printing

2007-05-30 12:30 +0000  dockes    (d4fa167018eb)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-05-30 12:30 +0000  dockes    (6027fd8afb12)

	* src/rcldb/rcldb.cpp:
	improve add_document error message printing

2007-05-30 12:29 +0000  dockes    (234dc300c26b)

	* src/qtgui/reslist.cpp, src/qtgui/reslist.h:
	escape possibly not html-safe text

2007-05-24 09:35 +0000  dockes    (ec684a070c43)

	* src/rcldb/stemdb.cpp:
	comment

2007-05-24 07:48 +0000  dockes    (deedeff93a6e)

	* src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/sort_w.cpp,
	src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp:
	optionally remember sorting state between invocations

2007-05-24 07:47 +0000  dockes    (e6bb3bced970)

	* src/configure, src/configure.ac, src/qt4gui/uifrom3:
	make uifrom3 a makefile

2007-05-23 09:19 +0000  dockes    (4f9ab7436818)

	* src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h,
	src/qtgui/preview.ui, src/qtgui/preview_w.cpp,
	src/qtgui/preview_w.h:
	in preview window if search line empty look for search terms

2007-05-23 08:29 +0000  dockes    (644c4e20106b)

	* src/internfile/internfile.cpp:
	*** empty log message ***

2007-05-23 08:28 +0000  dockes    (1927522b5826)

	* src/common/rclinit.cpp, src/utils/execmd.cpp:
	cant block sigcld globally cause qt needs it

2007-05-22 08:33 +0000  dockes    (2c0d94ae674a)

	* src/internfile/internfile.cpp, src/internfile/mh_html.cpp:
	let email attachments inherit date and author from parent message

2007-05-22 07:40 +0000  dockes    (fc644359e793)

	* src/index/indexer.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	implemented adjustable indexing flush threshold

2007-05-21 14:26 +0000  dockes    (d70d7b6988f0)

	* src/qtgui/rclmain_w.cpp:
	reopen db for each search during query

2007-05-21 13:30 +0000  dockes    (7f65a405e028)

	* src/common/rclinit.cpp, src/common/rclinit.h,
	src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp,
	src/index/recollindex.cpp, src/qtgui/idxthread.cpp,
	src/qtgui/main.cpp, src/rcldb/rcldb.cpp, src/utils/execmd.cpp,
	src/utils/execmd.h:
	make sure signals are only handled by the main thread. Fix bus error
	on rclmon exit (double delete)

2007-05-21 12:03 +0000  dockes    (7af2d0c361be)

	* src/utils/smallut.h:
	*** empty log message ***

2007-05-21 09:00 +0000  dockes    (9ee50650bd6f)

	* src/index/indexer.cpp, src/index/rclmonprc.cpp:
	better handle aspell errors: dont exit from monitor on aux db
	creation failure, and dont retry forever

2007-05-21 07:24 +0000  dockes    (53f18ed9c2f8)

	* src/VERSION, src/configure, src/configure.ac,
	src/doc/user/usermanual.sgml, src/qt4gui/uifrom3,
	src/sampleconf/recoll.conf.in:
	removed --enable-qt4, rely on qmake output instead

2007-05-21 06:46 +0000  dockes    (d6267bb0e30f)

	* website/BUGS.txt, website/CHANGES.txt, website/devel.html,
	website/doc.html, website/download.html, website/index.html.en,
	website/index.html.fr:
	*** empty log message ***

2007-05-19 07:32 +0000  dockes    (cbbd4158e0a8)

	* website/doc.html: new file.
	* website/doc.html:
	*** empty log message ***

2007-05-18 12:05 +0000  dockes    (75610b300ee1 [RECOLL_1_8_2])

	* src/recollinstall.in:
	qt4 install glitches

2007-05-18 11:16 +0000  dockes    (c9a0be6210be)

	* src/README:
	*** empty log message ***

2007-05-18 07:49 +0000  dockes    (eaf500145dd5)

	* src/VERSION:
	1.8.2

2007-05-18 07:49 +0000  dockes    (fc64434e87c0)

	* packaging/debian/changelog, tests/runtests.sh, website/BUGS.txt,
	website/CHANGES.txt, website/download.html:
	*** empty log message ***

2007-05-18 07:41 +0000  dockes    (6bec0784b8fd)

	* src/doc/user/usermanual.sgml:
	doc fix

2007-05-18 07:41 +0000  dockes    (022d354a0a2f)

	* src/sampleconf/recoll.conf.in:
	add .beagle to stops

2007-05-18 07:41 +0000  dockes    (451a13663a00)

	* src/rcldb/rcldb.cpp, src/rcldb/stemdb.cpp:
	change method name deprecated in xap 1.0

2007-05-18 07:40 +0000  dockes    (54bfc83a6186)

	* src/query/Makefile:
	*** empty log message ***

2007-05-18 07:40 +0000  dockes    (ef599af3e2e7)

	* src/configure.ac:
	use $libdir instead of /usr/lib (64bits machs)

2007-05-16 11:28 +0000  dockes    (2cced3d0aa32)

	* src/qtgui/i18n/recoll_it.ts:
	*** empty log message ***

2007-04-22 07:36 +0000  dockes    (8628fca949e7)

	* src/qtgui/i18n/recoll_de.ts: new file.
	* src/qtgui/i18n/recoll_de.ts:
	*** empty log message ***

2007-03-28 19:30 +0000  dockes    (51c5bdb227cd)

	* website/BUGS.txt, website/download.html, website/index.html.en,
	website/index.html.fr:
	*** empty log message ***

2007-03-08 12:24 +0000  dockes    (0efcbb1564f2)

	* packaging/FreeBSD/recoll/Makefile,
	packaging/FreeBSD/recoll/distinfo:
	1.8.1

2007-03-08 12:04 +0000  dockes    (813c82bcc951 [RECOLL_1_8_1])

	* packaging/FreeBSD/recoll/Makefile,
	packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg-
	plist, packaging/debian/changelog, packaging/rpm/recoll.spec,
	packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec,
	src/VERSION, src/makestaticdist.sh, website/BUGS.txt,
	website/CHANGES.txt, website/download.html:
	version 1.8.1 ?

2007-02-20 09:30 +0000  dockes    (817cdab71c1c [RECOLL_1_8_0])

	* src/recollinstall.in:
	go back to not using xdg

2007-02-20 07:57 +0000  dockes    (d1f1b31e4a58)

	* website/index.html.en, website/index.html.fr: new file.
	* website/index.html: deleted file.
	* packaging/debian/changelog, website/BUGS.txt, website/CHANGES.txt,
	website/credits.html, website/download.html, website/features.html,
	website/index.html, website/index.html.en, website/index.html.fr:
	*** empty log message ***

2007-02-20 07:43 +0000  dockes    (1f4b07f4cb62)

	* src/qtgui/recoll.pro.in:
	*** empty log message ***

2007-02-20 07:33 +0000  dockes    (dc922603c639)

	* src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_it.ts,
	src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts:
	*** empty log message ***

2007-02-20 07:19 +0000  dockes    (d6b63dc759cd)

	* src/INSTALL, src/README:
	*** empty log message ***

2007-02-19 18:15 +0000  dockes    (a1331ff143f7)

	* src/qtgui/preview_w.cpp, src/qtgui/preview_w.h:
	make shift-arrow in preview work with qt4 and avoid reentrancy while
	loading a file

2007-02-19 18:14 +0000  dockes    (66c79bcff30e)

	* src/utils/execmd.cpp:
	block sigcld, it sometimes causes eintrs during the select() call

2007-02-19 18:05 +0000  dockes    (db9e1830a040)

	* src/internfile/internfile.cpp:
	check file name not empty on return from uncomp exec

2007-02-19 16:28 +0000  dockes    (19982a948347)

	* src/qtgui/spell_w.cpp:
	stemming language choice was not observed in term explorer

2007-02-19 16:10 +0000  dockes    (26815f6c7ce0)

	* src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h:
	cleanup ign file types handling/saving

2007-02-14 15:02 +0000  dockes    (714300cb7780)

	* tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
	tests/html/html.txt, tests/images/images.sh,
	tests/images/images.txt, tests/koi8r/koi8r.sh,
	tests/koi8r/koi8r.txt, tests/mail/mail.sh, tests/mail/mail.txt,
	tests/notypes/notypes.sh, tests/notypes/notypes.txt,
	tests/rfc2231/rfc2231.sh, tests/rfc2231/rfc2231.txt,
	tests/special/special.sh, tests/special/special.txt,
	tests/txt/txt.sh, tests/txt/txt.txt, tests/utf8/utf8.sh,
	tests/utf8/utf8.txt: new file.
	* tests/empty/empty.sh, tests/empty/empty.txt, tests/html/html.sh,
	tests/html/html.txt, tests/images/images.sh,
	tests/images/images.txt, tests/koi8r/koi8r.sh,
	tests/koi8r/koi8r.txt, tests/lyx/lyx.txt, tests/mail/mail.sh,
	tests/mail/mail.txt, tests/notypes/notypes.sh,
	tests/notypes/notypes.txt, tests/rfc2231/rfc2231.sh,
	tests/rfc2231/rfc2231.txt, tests/special/special.sh,
	tests/special/special.txt, tests/txt/txt.sh, tests/txt/txt.txt,
	tests/utf8/utf8.sh, tests/utf8/utf8.txt:
	*** empty log message ***

2007-02-14 11:52 +0000  dockes    (b3f3859ce5e5)

	* tests/boolean/boolean.sh, tests/boolean/boolean.txt,
	tests/delete/delete.sh, tests/delete/delete.txt,
	tests/dirwithblanks/dirwithblanks.sh,
	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
	tests/lyx/lyx.sh, tests/lyx/lyx.txt, tests/media/media.sh,
	tests/media/media.txt, tests/msword/msword.sh,
	tests/msword/msword.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
	tests/ppt/ppt.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
	tests/scribus/scribus.sh, tests/scribus/scribus.txt,
	tests/xls/xls.sh, tests/xls/xls.txt: new file.
	* tests/Maildir1/Maildir1.txt, tests/andor/andor.txt,
	tests/badsuffs1/badsuffs1.txt, tests/boolean/boolean.sh,
	tests/boolean/boolean.txt, tests/delete/delete.sh,
	tests/delete/delete.txt, tests/dirwithblanks/dirwithblanks.sh,
	tests/dirwithblanks/dirwithblanks.txt, tests/djvu/djvu.sh,
	tests/djvu/djvu.txt, tests/dvi/dvi.sh, tests/dvi/dvi.txt,
	tests/lyx/lyx.sh, tests/lyx/lyx.txt, tests/media/media.sh,
	tests/media/media.txt, tests/msword/msword.sh,
	tests/msword/msword.txt, tests/ooff/ooff.sh, tests/ooff/ooff.txt,
	tests/pdf/pdf.sh, tests/pdf/pdf.txt, tests/postscript/postscript.sh,
	tests/postscript/postscript.txt, tests/ppt/ppt.sh,
	tests/ppt/ppt.txt, tests/rtf/rtf.sh, tests/rtf/rtf.txt,
	tests/scribus/scribus.sh, tests/scribus/scribus.txt,
	tests/shared.sh, tests/skipped/skipped.sh,
	tests/skipped/skipped.txt, tests/xls/xls.sh, tests/xls/xls.txt:
	*** empty log message ***

2007-02-14 10:10 +0000  dockes    (04c3156fd4dd)

	* src/doc/user/usermanual.sgml, src/makestaticdist.sh,
	src/qtgui/guiutils.cpp, src/qtgui/guiutils.h,
	src/qtgui/rclmain_w.cpp, src/qtgui/uiprefs.ui,
	src/qtgui/uiprefs_w.cpp, src/recollinstall.in,
	src/sampleconf/mimeview:
	add user pref to use xdg-open for all document edits

2007-02-14 10:09 +0000  dockes    (7886dd99d419)

	* src/rcldb/rcldb.cpp:
	during indexing use simple file name as title if this is empty. This
	allows storing the sfn for subdocs for which the url sfn doesnt make
	sense as title

2007-02-14 10:08 +0000  dockes    (fb42e10e5a7b)

	* src/query/recollq.cpp:
	adjust format to help the test set scripts

2007-02-14 08:54 +0000  dockes    (5e02666b38db)

	* src/desktop/xdg-utils-1.0.1/scripts/xdg-open: new file.
	* src/desktop/xdg-utils-1.0.1/scripts/xdg-open:
	*** empty log message ***

2007-02-14 08:16 +0000  dockes    (eb0fd52ef15a)

	* tests/Maildir/Maildir.sh, tests/Maildir/Maildir.txt,
	tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
	tests/andor/andor.sh, tests/andor/andor.txt,
	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
	tests/runtests.sh, tests/shared.sh, tests/skipped/skipped.sh,
	tests/skipped/skipped.txt: new file.
	* tests/Maildir/Maildir.sh, tests/Maildir/Maildir.txt,
	tests/Maildir1/Maildir1.sh, tests/Maildir1/Maildir1.txt,
	tests/andor/andor.sh, tests/andor/andor.txt,
	tests/badsuffs/badsuffs.sh, tests/badsuffs/badsuffs.txt,
	tests/badsuffs1/badsuffs1.sh, tests/badsuffs1/badsuffs1.txt,
	tests/runtests.sh, tests/shared.sh, tests/skipped/skipped.sh,
	tests/skipped/skipped.txt:
	*** empty log message ***

2007-02-13 10:58 +0000  dockes    (19c29e100995)

	* src/query/wasatorcl.cpp, src/rcldb/searchdata.cpp,
	src/rcldb/searchdata.h:
	propagate wasa nostem modifier

2007-02-12 18:16 +0000  dockes    (bf3060f2e259)

	* src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h:
	add wasabi modifiers

2007-02-12 18:14 +0000  dockes    (6ae625065d64)

	* src/qtgui/guiutils.cpp:
	dont set Helvetica as default font

2007-02-08 17:05 +0000  dockes    (f23e18da0362)

	* src/index/indexer.cpp, src/index/indexer.h,
	src/internfile/internfile.cpp, src/internfile/internfile.h,
	src/qtgui/preview_w.cpp, src/utils/smallut.cpp, src/utils/smallut.h:
	improve handling of missing helpers messages

2007-02-08 17:03 +0000  dockes    (f53e952b71cd)

	* src/filters/rcldvi:
	typos

2007-02-08 12:25 +0000  dockes    (ba982598a66f)

	* src/internfile/internfile.h, src/query/recollq.cpp:
	clarify temp dir usage in internfile

2007-02-08 09:03 +0000  dockes    (876ec27bd9c0)

	* src/qtgui/reslist.cpp, src/qtgui/uiprefs_w.cpp,
	src/qtgui/uiprefs_w.h:
	qt4 compilation glitches

2007-02-07 17:18 +0000  dockes    (2f05854b010a)

	* src/filters/injectcommon.sh, src/filters/recfiltcommon: new file.
	* src/filters/injectcommon.sh, src/filters/recfiltcommon:
	*** empty log message ***

2007-02-07 17:17 +0000  dockes    (39e4d9e07461)

	* src/recoll.desktop, src/recoll.png, src/recoll.xcf: deleted file.
	* src/recoll.desktop, src/recoll.png, src/recoll.xcf,
	src/recollinstall.in:
	use xdg scripts to install desktop file and icon

2007-02-07 17:17 +0000  dockes    (3161a2dabc0a)

	* src/common/rclconfig.cpp, src/doc/user/usermanual.sgml:
	dont autocreate config specified with -c or RECOLL_CONFDIR

2007-02-07 16:31 +0000  dockes    (f89cbedba93f)

	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
	searchgui.png, src/desktop/recoll-searchgui.xcf, src/desktop/xdg-
	utils-1.0.1/LICENSE, src/desktop/xdg-utils-1.0.1/scripts/xdg-
	desktop-menu, src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource:
	new file.
	* src/desktop/recoll-searchgui.desktop, src/desktop/recoll-
	searchgui.png, src/desktop/recoll-searchgui.xcf, src/desktop/xdg-
	utils-1.0.1/LICENSE, src/desktop/xdg-utils-1.0.1/scripts/xdg-
	desktop-menu, src/desktop/xdg-utils-1.0.1/scripts/xdg-icon-resource,
	src/query/recollq.cpp:
	*** empty log message ***

2007-02-07 16:31 +0000  dockes    (2494c5157c22)

	* src/aspell/rclaspell.cpp:
	improve db creation error message

2007-02-07 12:00 +0000  dockes    (3c02ca709886)

	* src/query/recollq.cpp: new file.
	* src/query/Makefile, src/query/recollq.cpp, src/query/wasatorcl.cpp,
	src/query/wasatorcl.h:
	recollq

2007-02-06 18:01 +0000  dockes    (1992c71741c0)

	* src/index/indexer.cpp, src/internfile/internfile.cpp,
	src/internfile/internfile.h, src/internfile/mh_exec.cpp,
	src/qtgui/preview_w.cpp:
	arrange for error info about missing helpers to trickle up to the
	user

2007-02-06 18:01 +0000  dockes    (d5e12cec5aeb)

	* src/sampleconf/mimeconf, src/sampleconf/mimemap:
	added config+filter for man pages

2007-02-06 15:08 +0000  dockes    (ef2eef3c33e9)

	* src/filters/rclman: new file.
	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
	src/filters/rclgaim, src/filters/rcllyx, src/filters/rclman,
	src/filters/rclmedia, src/filters/rclpdf, src/filters/rclppt,
	src/filters/rclps, src/filters/rclrtf, src/filters/rclscribus,
	src/filters/rclsoff, src/filters/rclxls:
	factored out filter script common code

2007-02-06 14:18 +0000  dockes    (7812fc3157a4)

	* src/common/rclconfig.cpp, src/utils/pathut.cpp, src/utils/pathut.h:
	make sure the -c argument is turned absolute before use

2007-02-06 10:19 +0000  dockes    (243d1fffdfb9)

	* src/qtgui/ssearch_w.cpp:
	no space in query -> phrase

2007-02-06 10:18 +0000  dockes    (d1b8dd6a7182)

	* src/qtgui/reslist.cpp:
	try to make sure that the old reslist is cleared while searching

2007-02-06 10:18 +0000  dockes    (24163d1804e5)

	* src/qt4gui/uifrom3:
	link images/ from qtgui to qt4gui

2007-02-03 16:46 +0000  dockes    (d27849ad572f)

	* website/styles/style.css:
	*** empty log message ***

2007-02-02 10:27 +0000  dockes    (3c82d463b36c)

	* src/doc/user/usermanual.sgml:
	add skippedPaths and daemSkippedPaths config variables

2007-02-02 10:12 +0000  dockes    (0232602ba055)

	* src/common/rclconfig.cpp, src/common/rclconfig.h,
	src/index/indexer.cpp, src/index/rclmonrcv.cpp,
	src/utils/fstreewalk.cpp:
	add skippedPaths and daemSkippedPaths config variables

2007-02-02 10:10 +0000  dockes    (12a2a255dedc)

	* src/rcldb/rcldb.cpp, src/rcldb/rcldb.h:
	sort and uniquify termMatch results out of stem expansion

2007-02-02 10:09 +0000  dockes    (344b11ebced1)

	* src/index/recollindex.cpp:
	do x11 check between sleeping and starting in recollindex -m

2007-02-02 10:06 +0000  dockes    (3a9bb20130c8)

	* src/doc/user/usermanual-italian.html: new file.
	* src/doc/user/usermanual-italian.html, src/qtgui/i18n/recoll_it.ts:
	*** empty log message ***

2007-02-02 10:06 +0000  dockes    (9a6092dbecea)

	* src/lib/Makefile, src/lib/mkMake:
	fix $(depth) usage for easier kio compilation

2007-02-02 10:05 +0000  dockes    (a645eeae729a)

	* src/doc/user/usermanual.sgml:
	added config examples

2007-02-02 10:01 +0000  dockes    (a0640e49ab3a)

	* src/recollinstall.in:
	removed old filter in examples cleanup

2007-02-01 15:01 +0000  dockes    (db53657c868d)

	* src/aspell/rclaspell.cpp, src/mk/localdefs.in:
	use configure libdir to search for aspell lib (mainly for 64 bits
	machines)

2007-02-01 12:43 +0000  dockes    (7f3d33405e53)

	* src/kde/kioslave/recoll/Makefile,
	src/kde/kioslave/recoll/kio_recoll.cpp:
	fixed kio compilation. Dont know if it works

2007-01-30 11:39 +0000  dockes    (1aa8e8c3d93a)

	* src/filters/rcldjvu, src/filters/rcldoc, src/filters/rcldvi,
	src/filters/rclpdf, src/filters/rclps, src/filters/rclrtf,
	src/filters/rclsoff:
	hide awk BEGIN statements - make debian linda happy

2007-01-29 13:51 +0000  dockes    (f207a83f0617)

	* src/rcldb/searchdata.cpp:
	more field name synonyms

2007-01-25 15:50 +0000  dockes    (ba53fd450dc5)

	* src/rcldb/searchdata.cpp, src/rcldb/searchdata.h:
	better wildcards handling. Tuning of user term boosting

2007-01-25 15:47 +0000  dockes    (026e24e9aafc)

	* src/doc/user/usermanual.sgml:
	*** empty log message ***

2007-01-25 15:47 +0000  dockes    (31cd60d81a3a)

	* src/rcldb/rcldb.cpp:
	dont explicitely anchor regexp in termMatch

2007-01-25 15:46 +0000  dockes    (8c7afe9df6fb)

	* src/qtgui/ssearch_w.cpp:
	Dont add auto phrase if there are wildcards

2007-01-25 15:45 +0000  dockes    (d35369f54699)

	* src/query/wasatorcl.cpp:
	comment

2007-01-25 15:40 +0000  dockes    (2d7b13ebd2c8)

	* src/common/textsplit.cpp:
	[] are also wildcard chars

2007-01-25 12:04 +0000  dockes    (27310036f46c)

	* src/qtgui/i18n/recoll_it.ts:
	*** empty log message ***

2007-01-25 08:27 +0000  dockes    (876d5192bdde)

	* src/qtgui/i18n/recoll_it.ts: new file.
	* src/qtgui/i18n/recoll_it.ts:
	*** empty log message ***

2007-01-24 12:40 +0000  dockes    (dd470677dbf2)

	* src/qtgui/guiutils.cpp:
	make AND the initial default for ssearch

2007-01-24 11:20 +0000  dockes    (623c6533e0f0)

	* src/qtgui/uiprefs.ui, src/qtgui/viewaction.ui:
	change MyDialog and Form1 dialog captions

2007-01-24 11:15 +0000  dockes    (9dc93d749ea8)

	* src/filters/rclscribus:
	transate \r to 
(for older scribus files) 2007-01-24 11:00 +0000 dockes (7ea73b206760) * src/sampleconf/mimeconf, src/sampleconf/mimemap: scribus scd files 2007-01-23 07:23 +0000 dockes (0f9e96c72d1c) * src/filters/rcllyx: *** empty log message *** 2007-01-23 07:22 +0000 dockes (5fc9550be90c) * src/filters/rcllyx: *** empty log message *** 2007-01-23 07:16 +0000 dockes (55734c5d16c2) * src/filters/rcllyx: *** empty log message *** 2007-01-23 07:14 +0000 dockes (dafabbcdaf1a) * src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/mimeview: lyx filter 2007-01-23 07:14 +0000 dockes (d5ac3c0cf64f) * src/filters/rcllyx: new file. * src/filters/rcllyx: lyx filter 2007-01-22 16:34 +0000 dockes (e76e39a890d0) * src/sampleconf/mimeconf, src/sampleconf/mimemap: added scribus support 2007-01-22 16:32 +0000 dockes (0b142f40e0c7) * src/filters/rclscribus: new file. * src/filters/rclscribus: added scribus support 2007-01-21 16:41 +0000 dockes (8e06e0f7914e) * src/filters/rclsoff: fix shell syntax for debian 2007-01-19 15:22 +0000 dockes (084098d57a50) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h, src/query/docseqhist.h, src/query/sortseq.cpp, src/query/sortseq.h: try to limit the places which use Rcl:: stuff 2007-01-19 15:19 +0000 dockes (1d1bdf98f176) * src/rcldb/stemdb.cpp: make sure that both the user term and the stem are in the expanded list 2007-01-19 10:32 +0000 dockes (757f49c23d93) * src/query/docseqdb.cpp, src/query/docseqdb.h, src/query/docseqhist.cpp, src/query/docseqhist.h: new file. * src/lib/Makefile, src/lib/mkMake, src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/ssearch_w.cpp, src/query/docseq.cpp, src/query/docseq.h, src/query/docseqdb.cpp, src/query/docseqdb.h, src/query/docseqhist.cpp, src/query/docseqhist.h, src/query/sortseq.cpp, src/query/sortseq.h: cleanup docseq, arrange things so that we can page reslist past the initial result count estimate if there are more 2007-01-19 10:23 +0000 dockes (d4ecd356406a) * src/rcldb/searchdata.cpp: the relevance-boosted original term needs a prefix too 2007-01-19 10:23 +0000 dockes (cacb9b50f1cf) * src/rcldb/rcldb.cpp: adjust makeAbstract for prefixed terms 2007-01-19 10:22 +0000 dockes (95d569102c37) * src/query/wasatorcl.cpp, src/query/wasatorcl.h: add direct qstring to rcl function 2007-01-18 14:23 +0000 dockes (157d8676b256) * src/utils/mimeparse.cpp: debug msg 2007-01-18 12:09 +0000 dockes (b0647b310dec) * src/common/textsplit.cpp, src/common/textsplit.h, src/rcldb/searchdata.cpp: handle wildcards in search terms 2007-01-17 14:06 +0000 dockes (65d2617d690c) * src/query/Makefile, src/query/wasatorcl.cpp: *** empty log message *** 2007-01-17 13:53 +0000 dockes (82c00cf9d054) * src/internfile/internfile.cpp, src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h, src/lib/Makefile, src/lib/mkMake, src/query/Makefile, src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, src/query/wasatorcl.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldoc.h, src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: added field/prefixes for author and title + command line query language 2007-01-16 10:58 +0000 dockes (f56d8a303798) * src/sampleconf/recoll.conf.in: add recollrc to skipped 2007-01-16 10:58 +0000 dockes (a28d7ea5359b) * website/BUGS.txt, website/CHANGES.txt, website/download.html, website/index.html: 1.7.5 2007-01-16 10:58 +0000 dockes (83b10dc2e5ea) * src/bincimapmime/trbinc.cc, src/utils/debuglog.cpp: wrong copyrights 2007-01-16 10:56 +0000 dockes (e51d7ee21ffd) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec: 1.7.5 packaging 2007-01-16 09:22 +0000 dockes (7f8fea3bed13) * packaging/debian/manpages: deleted file. * packaging/debian/changelog, packaging/debian/control, packaging/debian/copyright, packaging/debian/manpages, packaging/debian/rules: 2007-01-12 comments 2007-01-15 19:16 +0000 dockes (740528a1cd7d) * packaging/debian/dirs: deleted file. * packaging/debian/dirs: *** empty log message *** 2007-01-15 13:06 +0000 dockes (12e31e690f9e) * src/internfile/internfile.cpp, src/internfile/internfile.h: dont stop processing a complex document on the first next_document error: pop level and go on 2007-01-15 13:03 +0000 dockes (6d3f8a71e602) * src/doc/user/usermanual.sgml: *** empty log message *** 2007-01-13 15:21 +0000 dockes (b04adc5188d5) * src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: improved external index dialog with listview 2007-01-13 14:41 +0000 dockes (f9567f0fed32) * src/query/xadump.cpp: add option to dump raw terms 2007-01-13 10:28 +0000 dockes (fc890008108f) * src/internfile/mh_mail.cpp: handle multipart/signed 2007-01-12 09:01 +0000 dockes (1782d39f9d4d) * src/qtgui/reslist.cpp: Use sample from Rcl::Doc if makeAbstract() fails 2007-01-12 06:42 +0000 dockes (8223a4aa9ad4) * packaging/debian/copyright: include gpl statement 2007-01-10 16:03 +0000 dockes (66247acdb470) * packaging/debian/changelog, packaging/debian/compat, packaging/debian/control, packaging/debian/copyright, packaging/debian/dirs, packaging/debian/docs, packaging/debian/manpages, packaging/debian/menu, packaging/debian/rules, packaging/debian/watch: new file. * packaging/debian/changelog, packaging/debian/compat, packaging/debian/control, packaging/debian/copyright, packaging/debian/dirs, packaging/debian/docs, packaging/debian/manpages, packaging/debian/menu, packaging/debian/rules, packaging/debian/watch, src/Makefile.in, src/VERSION: *** empty log message *** 2007-01-10 12:27 +0000 dockes (733bc11b5526) * packaging/FreeBSD/recoll/Makefile: *** empty log message *** 2007-01-09 15:34 +0000 dockes (9583ff723edf [RECOLL_1_7_3]) * packaging/rpm/recollfedora.spec: new file. * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist, packaging/rpm/recoll.spec, packaging/rpm/recollfedora.spec, packaging/rpm/recollmdk.spec: 1.7.3 2007-01-09 14:39 +0000 dockes (f108471cd099) * website/BUGS.txt, website/CHANGES.txt, website/download.html: 1.7.3 2007-01-09 07:25 +0000 dockes (e0c1d14a73c5) * src/VERSION: *** empty log message *** 2007-01-09 07:25 +0000 dockes (f06dbc019ff4) * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts: french messages 2007-01-08 15:21 +0000 dockes (906e56e99e81) * src/VERSION, src/qtgui/main.cpp: initial indexation with gui would not work 2007-01-08 13:00 +0000 dockes (44d2b5d58ac6 [RECOLL_1_7_1]) * src/VERSION: 1.7.1 2007-01-08 12:43 +0000 dockes (2cb748432b10) * src/qtgui/advsearch.ui: lost sizers? 2007-01-08 10:11 +0000 dockes (67c4375292e5) * src/qtgui/rclmain_w.cpp: fix the previous icon fix 2007-01-08 10:01 +0000 dockes (8eb24fe9db4f) * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h: reslist menu openParent opens containing folder if not a subdoc 2007-01-08 09:40 +0000 dockes (b38401a650c3) * src/qtgui/uiprefs.ui: fix resizing of prefs dialog 2007-01-08 07:02 +0000 dockes (5a2fb87a2c55) * src/qtgui/rclmain_w.cpp: get rid of messages about missing d_xxx images 2007-01-08 07:01 +0000 dockes (8a2c6d2cba46) * src/qtgui/reslist.cpp: synthetic abstracts not displayed 2006-12-24 08:07 +0000 dockes (e42dca990bea [RECOLL_1_7_0]) * src/Makefile.in: better cleanup -> 1.7.0 NOW 2006-12-24 08:02 +0000 dockes (916d6e831996 [RECOLL_1_7_2]) * packaging/FreeBSD/recoll/pkg-plist, src/excludefile, website/BUGS.txt, website/CHANGES.txt, website/download.html, website/features.html, website/index.html, website/pics/index.html, website/rclidxfmt.html: 1.7.0 2006-12-24 07:53 +0000 dockes (b37a6e3566b9) * src/INSTALL, src/README, src/doc/user/usermanual.sgml: *** empty log message *** 2006-12-24 07:40 +0000 dockes (69573fe97b89) * src/configure, src/configure.ac, src/doc/man/recollindex.1, src/doc/user/usermanual.sgml, src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/recollindex.cpp: option -x to disable x11 session monitoring 2006-12-23 13:07 +0000 dockes (fb731b7d3ab1) * src/configure, src/configure.ac, src/index/Makefile, src/index/rclmonprc.cpp, src/lib/Makefile, src/lib/mkMake, src/mk/localdefs.in, src/utils/pathut.cpp: x11 session end detection 2006-12-23 12:23 +0000 dockes (00532204c17f) * src/utils/x11mon.cpp, src/utils/x11mon.h: new file. * src/utils/Makefile, src/utils/x11mon.cpp, src/utils/x11mon.h: *** empty log message *** 2006-12-22 16:48 +0000 dockes (ee878b9d311e) * src/qt4gui/recoll.qrc, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/spell_w.cpp: get all icons out of .ui files to avoid qt4 startup messages 2006-12-22 11:01 +0000 dockes (078acb3ab4fd) * src/doc/man/recollindex.1, src/doc/user/usermanual.sgml, src/qtgui/spell_w.h: *** empty log message *** 2006-12-21 10:08 +0000 dockes (d36d26d5b5d5) * src/index/rclmonprc.cpp: try to be more responsive to interruptions 2006-12-21 09:22 +0000 dockes (818387de5d92) * src/index/indexer.cpp, src/index/rclmonrcv.cpp, src/index/recollindex.cpp, src/sampleconf/mimemap, src/utils/fstreewalk.cpp: always skip indexing of confdir and dbdir. start index monitor with normal indexing pass 2006-12-21 09:21 +0000 dockes (13c7229ee6dc) * src/qtgui/advsearch.ui, src/qtgui/ssearchb.ui: tooltips 2006-12-21 08:22 +0000 dockes (c1e9892c3ba1) * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h: add skipped paths 2006-12-20 14:28 +0000 dockes (f580e9aa026a) * src/internfile/internfile.cpp: msg 2006-12-20 14:09 +0000 dockes (e3d7f975546f) * src/qtgui/preview_w.cpp: try to improve error message for internfile failure 2006-12-20 13:55 +0000 dockes (0a07075dd464) * src/qtgui/preview_w.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h: reslist: added menu entry to see parent doc of attachment 2006-12-20 13:12 +0000 dockes (733a59947cfb) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/sampleconf/mimeconf: mime categories 2006-12-20 10:47 +0000 dockes (591625eb1d38) * src/INSTALL, src/README: *** empty log message *** 2006-12-20 09:54 +0000 dockes (c563fb138893) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/doc/user/usermanual.sgml, src/index/mimetype.cpp: changed stopsuffixes processing 2006-12-20 09:41 +0000 dockes (64488c2687be) * src/index/recollindex.cpp: opt -e 2006-12-19 12:38 +0000 dockes (6d4a0c0f8cc3) * src/qtgui/spell_w.cpp: qt4 2006-12-19 12:11 +0000 dockes (a3e7c86f79d7) * src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, src/qtgui/ssearch_w.cpp, src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/stemdb.cpp, src/rcldb/stemdb.h, src/utils/smallut.cpp, src/utils/smallut.h: merge stemExpand into termExpand. return term frequencies from there and display in spellW 2006-12-19 08:40 +0000 dockes (3bbff3062a89) * src/common/rclconfig.cpp, src/index/indexer.cpp, src/index/mimetype.cpp, src/index/mimetype.h, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mimehandler.cpp, src/qtgui/preview_w.cpp, src/sampleconf/mimeconf, src/sampleconf/mimeview: index directory names 2006-12-19 07:48 +0000 dockes (7301c237649a) * src/qtgui/mtpics/folder.png: new file. * src/qtgui/mtpics/folder.png: *** empty log message *** 2006-12-18 16:45 +0000 dockes (0a640477a752) * src/qt4gui/recoll.pro.in, src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h: qt4 2006-12-18 12:06 +0000 dockes (5f17ab347621) * src/doc/user/usermanual.sgml, src/internfile/mh_mail.cpp, src/utils/smallut.cpp, src/utils/smallut.h: mh_mail needs to lowercase contentypes 2006-12-18 12:05 +0000 dockes (03363b562546) * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h: dblclick to edit in viewAction 2006-12-16 15:39 +0000 dockes (a3027dd4b920) * src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/mh_text.h, src/internfile/mimehandler.h, src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h: mail attachments sort of ok 2006-12-16 15:31 +0000 dockes (7d335e595c2b) * src/utils/pathut.cpp, src/utils/pathut.h: added TempFile class 2006-12-16 15:30 +0000 dockes (89fed05a6ace) * src/internfile/Filter.h: *** empty log message *** 2006-12-16 15:30 +0000 dockes (5f74c84fa800) * src/index/indexer.cpp: dont clobber utf8fn from filter 2006-12-16 15:30 +0000 dockes (b5f77fb6530b) * src/common/rclconfig.cpp, src/common/rclconfig.h: added getSuffixFromMimeType() 2006-12-16 07:15 +0000 dockes (ef72575e285c) * src/internfile/Filter.h: *** empty log message *** 2006-12-15 16:33 +0000 dockes (df6232340341) * src/index/indexer.cpp, src/internfile/Filter.h, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/myhtmlparse.h: test data indexing result same terms as 1.6.3 2006-12-15 12:40 +0000 dockes (5156a319f219) * src/internfile/Filter.h, src/internfile/mh_mbox.cpp, src/internfile/mh_mbox.h: new file. * src/internfile/Filter.h, src/internfile/Makefile, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/mh_mbox.cpp, src/internfile/mh_mbox.h, src/internfile/mh_text.cpp, src/internfile/mh_text.h, src/internfile/mh_unknown.h, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/internfile/myhtmlparse.h, src/lib/Makefile, src/lib/mkMake, src/utils/smallut.cpp, src/utils/smallut.h: Dijon filters 1st step: mostly working needs check and optim 2006-12-14 14:54 +0000 dockes (2f7d4fb90b31) * src/rcldb/rcldoc.h: new file. * src/rcldb/rcldb.h, src/rcldb/rcldoc.h: split rcldb.h -> rcldoc.h 2006-12-14 13:53 +0000 dockes (839454238284) * src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h, src/sampleconf/mimeview: new file. * src/common/rclconfig.cpp, src/common/rclconfig.h, src/doc/user/usermanual.sgml, src/index/indexer.cpp, src/qtgui/preview_w.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/recoll.pro.in, src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h, src/qtgui/viewaction.ui, src/qtgui/viewaction_w.cpp, src/qtgui/viewaction_w.h, src/recollinstall.in, src/sampleconf/mimeconf, src/sampleconf/mimeview, src/utils/Makefile, src/utils/conftree.cpp, src/utils/conftree.h, src/utils/execmd.cpp, src/utils/execmd.h, src/utils/pathut.cpp, src/utils/pathut.h, src/utils/smallut.cpp, src/utils/smallut.h: created mimeview and the viewer conf edit dialog 2006-12-13 09:13 +0000 dockes (ca4c21f5ad44) * src/common/rclconfig.cpp, src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, src/internfile/mimehandler.cpp: move findFilter usage out of mh_exec 2006-12-11 14:56 +0000 dockes (dd4f283c9753 [BEFORE_Dijon20061215]) * src/qtgui/plaintorich.cpp: not calling textsplit with onlyspans improves highlighting 2006-12-11 14:50 +0000 dockes (c6d552528f6c) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/mimetype.cpp, src/utils/smallut.cpp, src/utils/smallut.h: rationalize stopsuffix list usage 2006-12-11 09:05 +0000 dockes (87037320fddf) * packaging/FreeBSD/recoll/pkg-plist: try to cleanup the share/icons tree 2006-12-10 17:03 +0000 dockes (0d0fec69b4e4 [MAPSTRMAPSTRSTR]) * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, src/query/wasatorcl.cpp, src/query/wasatorcl.h: added sort and type specs parsing 2006-12-08 17:18 +0000 dockes (9d443b2ad416) * src/query/wasatorcl.h: 1st query 2006-12-08 10:54 +0000 dockes (dc4914858b42) * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h: *** empty log message *** 2006-12-08 07:11 +0000 dockes (df1ce4c7c9bf) * src/common/textsplit.cpp, src/common/textsplit.h, src/qtgui/ssearch_w.cpp: only autophrase if query has several terms 2006-12-08 06:45 +0000 dockes (6b96cd852343) * src/qtgui/ssearch_w.cpp: make autophrase do the right thing: add a subclause, not modify the query string 2006-12-07 16:38 +0000 dockes (e0b7c11d4054) * src/query/qtry.cpp, src/query/qxtry.cpp: deleted file. * src/query/Makefile, src/query/qtry.cpp, src/query/qxtry.cpp, src/query/xadump.cpp: removed qtry and merged qxtry into xadump 2006-12-07 13:24 +0000 dockes (11f50dc2ced9) * src/rcldb/rcldb.cpp: comment 2006-12-07 13:14 +0000 dockes (0137bc80c8a5) * website/rclidxfmt.html: new file. * website/rclidxfmt.html: *** empty log message *** 2006-12-07 13:02 +0000 dockes (e36e165c1055) * src/rcldb/rcldb.cpp: comments 2006-12-07 08:23 +0000 dockes (6bdb3421d1ca) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- plist: 1.6.3 2006-12-07 08:06 +0000 dockes (2ca80dafce2a) * src/internfile/mh_mail.cpp: fix bug with bad message "From " delimiter detection 2006-12-07 07:07 +0000 dockes (92354b8e641a) * src/qtgui/rclmain_w.cpp, src/utils/mimeparse.h, src/utils/smallut.cpp, src/utils/smallut.h: fix pb with executing viewer for files with single-quotes in pathnames 2006-12-07 07:06 +0000 dockes (b415958c3148) * src/internfile/mh_mail.cpp: fix bug with bad message "From " delimiter detection 2006-12-05 15:25 +0000 dockes (451489717e47) * src/internfile/mh_mail.cpp: use regexp to better discriminate From delimiter lines in mbox. Avoid reading mboxes twice 2006-12-05 15:23 +0000 dockes (282880e83069) * src/qtgui/advsearch.ui, src/qtgui/main.cpp, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/qtgui/sort.ui, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h: avoid generating abstracts before theyre needed (ie: not during sort). have the sort tools redisplay the results when sort criteria are applied 2006-12-05 15:18 +0000 dockes (069f87c83682) * src/query/sortseq.cpp, src/query/sortseq.h: use refcntr to access docsequence 2006-12-05 15:17 +0000 dockes (f7bad3e61904) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: expose abstract synthesis to let users decide when they want it done 2006-12-05 15:17 +0000 dockes (57148c851c44) * src/rcldb/searchdata.h: clauseCount 2006-12-05 15:16 +0000 dockes (d6d5ee7b750b) * src/utils/refcntr.h: fix pbs with empty object 2006-12-04 09:56 +0000 dockes (1173f38c9de4) * src/configure, src/configure.ac, src/qtgui/advsearch_w.h, src/qtgui/main.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/sort_w.h, src/qtgui/spell_w.h, src/qtgui/ssearch_w.h, src/qtgui/uiprefs_w.h, src/utils/refcntr.h: qt4 compiles and sort of works 2006-12-04 09:49 +0000 dockes (00bc69d47f20) * src/qt4gui/recoll.qrc, src/qt4gui/uifrom3: new file. * src/qt4gui/recoll.pro.in, src/qt4gui/recoll.qrc, src/qt4gui/uifrom3: *** empty log message *** 2006-12-04 08:17 +0000 dockes (c92f84765756) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/sort_w.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: compiles (doesnt work) on qt4 2006-12-04 06:19 +0000 dockes (5a7d6794967e) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/preview.ui, src/qtgui/preview_w.h, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h, src/qtgui/sort_w.h, src/qtgui/spell.ui, src/qtgui/spell_w.h, src/qtgui/ssearch_w.h, src/qtgui/ssearchb.ui, src/qtgui/uiprefs_w.h: qt4 ckpt 2006-12-02 07:32 +0000 dockes (45564d318a93) * src/utils/idfile.cpp: improved tests to check for mail 2006-12-01 10:05 +0000 dockes (8c3b51bc117f) * src/query/xadump.cpp: *** empty log message *** 2006-11-30 18:12 +0000 dockes (e41c0db701ae) * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, src/query/wasatorcl.cpp, src/query/wasatorcl.h: new file. * src/query/wasastringtoquery.cpp, src/query/wasastringtoquery.h, src/query/wasatorcl.cpp, src/query/wasatorcl.h: *** empty log message *** 2006-11-30 13:44 +0000 dockes (5ef831ae4659) * website/download.html: *** empty log message *** 2006-11-30 13:38 +0000 dockes (6e49658236c6) * src/qtgui/images/cancel.png, src/qtgui/images/close.png: new file. * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- plist, packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec, src/README, src/aspell/rclaspell.cpp, src/doc/user/usermanual.sgml, src/index/indexer.cpp, src/index/indexer.h, src/makesrcdist.sh, src/makestaticdist.sh, src/mk/SunOS, src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, src/qtgui/images/cancel.png, src/qtgui/images/close.png, src/qtgui/main.cpp, src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview.ui, src/qtgui/preview_w.cpp, src/qtgui/rclmain.ui, src/qtgui/recoll.pro.in, src/qtgui/reslist.cpp, src/qtgui/searchclause_w.cpp, src/qtgui/spell_w.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui, src/rcldb/searchdata.cpp, src/recoll.desktop, src/recollinstall.in, src/sampleconf/recoll.conf.in, src/utils/execmd.cpp, src/utils/mimeparse.cpp, src/utils/smallut.cpp, website/BUGS.txt, website/CHANGES.txt, website/download.html, website/features.html, website/index.html: merged 1.6 maint branch modifs up to MERGED_TO_TRUNK_20061130 2006-11-22 09:29 +0000 dockes (568c34cf75e9) * src/VERSION, website/BUGS.txt, website/CHANGES.txt, website/credits.html, website/download.html: *** empty log message *** 2006-11-21 14:00 +0000 dockes (f247e019bf08 [RECOLL_1_6_0]) * src/INSTALL, src/README: *** empty log message *** 2006-11-21 13:05 +0000 dockes (23604b23773d) * src/aspell/rclaspell.cpp, src/configure, src/configure.ac: mdk 2006 aspell quirks 2006-11-21 09:18 +0000 dockes (17597459707c) * packaging/FreeBSD/recoll/pkg-plist, packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec, src/doc/user/usermanual.sgml, src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, website/BUGS.txt, website/CHANGES.txt, website/copydocs, website/download.html, website/index.html: *** empty log message *** 2006-11-21 08:47 +0000 dockes (f434e776fec8) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, src/qtgui/uiprefs_w.cpp: added stem expansion mode to term explorer 2006-11-20 18:07 +0000 dockes (bc85af9f678c) * src/doc/man/recoll.conf.5, src/doc/man/recollindex.1, src/doc/user/usermanual.sgml: doc 2006-11-20 17:46 +0000 dockes (28cb0d8c325a) * src/doc/user/usermanual.sgml: *** empty log message *** 2006-11-20 17:06 +0000 dockes (9252428377e4) * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts: *** empty log message *** 2006-11-20 15:35 +0000 dockes (192c101b8b7c) * src/qtgui/advsearch.ui: tooltip 2006-11-20 15:29 +0000 dockes (73ca6e78a1dd) * src/filters/rclxls, src/utils/transcode.cpp: *** empty log message *** 2006-11-20 15:28 +0000 dockes (9bb875d3bfcf) * src/rcldb/rcldb.cpp: clear abstract if its only ... 2006-11-20 15:28 +0000 dockes (5ef1b603c3be) * src/common/rclconfig.cpp: test driver 2006-11-20 15:28 +0000 dockes (1c4807a363f9) * src/common/rclconfig.h: fix defaultcharset reset 2006-11-20 11:17 +0000 dockes (ef95275586d1) * src/common/Makefile, src/common/textsplit.cpp, src/common/textsplit.h: improved textsplit speed (needs utf8iter modifs too 2006-11-20 11:16 +0000 dockes (e05653621eb4) * src/utils/Makefile, src/utils/utf8iter.cpp, src/utils/utf8iter.h: cleaned and speeded up utf8iter 2006-11-19 18:37 +0000 dockes (756bc7569b34) * src/common/textsplit.cpp, src/common/textsplit.h: optim ckpt 2006-11-18 12:56 +0000 dockes (bf6e4de3a902) * src/qtgui/plaintorich.cpp: firsttermocc init was not always done 2006-11-18 12:31 +0000 dockes (1703e5a7b03e) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp: improve positionning on term groups by storing/passing an occurrence index 2006-11-18 12:30 +0000 dockes (f065c8063ff3) * src/rcldb/searchdata.cpp: correctly generate highlighting term groups when stem-expanding NEAR queries 2006-11-17 15:26 +0000 dockes (ee4a13877b24) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h: Save adv search clause list + add delete button 2006-11-17 12:55 +0000 dockes (679a2cb3d3e7) * src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h: get shift+clicklink to open new preview window instead of tab 2006-11-17 12:32 +0000 dockes (51f7db5eff83) * src/qtgui/plaintorich.cpp: small opts + fixed near region detection code 2006-11-17 12:31 +0000 dockes (c0ba08efc3dd) * src/qtgui/plaintorich.h: comments 2006-11-17 12:31 +0000 dockes (e54183706237) * src/utils/utf8iter.h: removed not strictly needed error checking code 2006-11-17 10:09 +0000 dockes (7e44d4280e2d) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/reslist.h: Remember searchData and use it in plaintorich for phrase/group highlighting 2006-11-17 10:08 +0000 dockes (c175799e9e72) * src/qtgui/advsearch_w.cpp: better data encap in searchdata 2006-11-17 10:06 +0000 dockes (0ea302968170) * src/rcldb/rcldb.cpp, src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: added code to remember search terms and term groups in searchdata 2006-11-15 14:57 +0000 dockes (188b5b28427d) * src/common/Makefile, src/lib/Makefile, src/lib/mkMake, src/mk/commondefs, src/qtgui/recoll.pro.in, src/rcldb/pathhash.cpp, src/rcldb/pathhash.h, src/rcldb/rcldb.cpp, src/rcldb/searchdata.h, src/rcldb/stemdb.h: distributed files from common/ into rcld, internfile, common 2006-11-15 07:27 +0000 dockes (5bfc0444c072) * src/internfile/Makefile: new file. * src/internfile/Makefile: *** empty log message *** 2006-11-14 18:29 +0000 dockes (c45d7a2b1c63) * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h: got rid of the static clause names 2006-11-14 18:17 +0000 dockes (e4789b229585) * src/qtgui/advsearch.ui: *** empty log message *** 2006-11-14 17:56 +0000 dockes (ae916c13c591) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp: added conjunction choice in advsearch 2006-11-14 17:41 +0000 dockes (dfc71f06c1ce) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h, src/rcldb/searchdata.cpp: use SearchClauseW for all advsearch fields 2006-11-14 15:13 +0000 dockes (300f3705d6cf) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp: *** empty log message *** 2006-11-14 14:58 +0000 dockes (c5f65c6f8fb9) * src/qtgui/recoll.pro.in: *** empty log message *** 2006-11-14 13:55 +0000 dockes (9e98c3d86016) * src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h: new file. * src/doc/user/usermanual.sgml, src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/rclmain_w.cpp, src/qtgui/searchclause_w.cpp, src/qtgui/searchclause_w.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: added dynamic clauses to adv search. Still needs work 2006-11-13 14:51 +0000 dockes (5c9db8d08690) * src/rcldb/rcldb.cpp: *** empty log message *** 2006-11-13 14:48 +0000 dockes (edec86240778) * src/rcldb/rcldb.cpp: use wdfs for better selection of doc extracts in makeAbstract 2006-11-13 11:59 +0000 dockes (fdf0f43cd03e) * src/utils/smallut.h: *** empty log message *** 2006-11-13 08:58 +0000 dockes (c48e54f96603) * src/utils/refcntr.h: new file. * src/utils/refcntr.h: *** empty log message *** 2006-11-13 08:58 +0000 dockes (40853ad94507) * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/reslist.cpp, src/qtgui/reslist.h, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h: make searchdata a more flexible struct 2006-11-13 08:50 +0000 dockes (e585bfd6e725) * src/rcldb/searchdata.cpp: new file. * src/lib/Makefile, src/lib/mkMake, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.cpp, src/rcldb/searchdata.h: make searchdata a more flexible struct 2006-11-13 08:49 +0000 dockes (db3490f9b522) * src/kde/kioslave/recoll/kio_recoll.cpp: *** empty log message *** 2006-11-13 08:15 +0000 dockes (7240ec62ffac) * src/qtgui/plaintorich.cpp: new splitter interface 2006-11-12 08:35 +0000 dockes (ff9f3aed6a5b) * src/common/textsplit.cpp, src/common/textsplit.h, src/rcldb/rcldb.cpp: phrase queries with bot spans and words must be splitted as words only 2006-11-11 15:30 +0000 dockes (25647c7c5aac) * src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui: have more compact list header + %N 2006-11-10 17:53 +0000 dockes (d423490bea37) * src/qtgui/reslist.cpp: Really use the rich abstracts 2006-11-10 17:18 +0000 dockes (9fc1a2d1b7af) * src/rcldb/rcldb.cpp: optimized abstract building: bybye big vector 2006-11-10 13:32 +0000 dockes (8cfbbddd355a) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain_w.cpp, src/qtgui/reslist.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: make result list paragraph format user-adjustable 2006-11-10 13:30 +0000 dockes (933509968125) * src/utils/smallut.cpp, src/utils/smallut.h: pcSubst() 2006-11-10 13:29 +0000 dockes (17e0ecfb5834) * src/internfile/internfile.cpp: errlog 2006-11-09 19:04 +0000 dockes (814af75ba7a8) * src/qtgui/preview_w.cpp: better handle the situation of mbox file name matching search 2006-11-09 17:38 +0000 dockes (3c996d97497a) * src/Makefile.in: *** empty log message *** 2006-11-09 17:37 +0000 dockes (c13aab8ac186) * src/qtgui/reslist.cpp: nbsp to prevent line date wrap before tz 2006-11-09 17:37 +0000 dockes (573934250b27) * src/rcldb/rcldb.cpp: dont continue adding ellipsis into the abstract when its maxlen! 2006-11-09 08:59 +0000 dockes (baafe52b9d1b) * src/utils/mimeparse.cpp: test driver modifs 2006-11-08 15:34 +0000 dockes (025fa484738a) * src/common/rclinit.cpp, src/utils/debuglog.cpp, src/utils/debuglog.h: fix pb with special log file names 2006-11-08 15:32 +0000 dockes (a32333c18e9f) * src/configure, src/configure.ac: aspell help string 2006-11-08 13:04 +0000 dockes (f5f0e953f42e) * src/qtgui/plaintorich.cpp: use vector instead of list for positions 2006-11-08 07:22 +0000 dockes (de7777528655) * src/common/rclinit.cpp, src/common/rclinit.h, src/index/recollindex.cpp: allow daemon-specific log parameters 2006-11-08 06:56 +0000 dockes (451b31555bc2) * src/utils/conftree.cpp, src/utils/conftree.h: volatile conf 2006-11-08 06:49 +0000 dockes (ba1e8fb12e39) * src/recollinstall.in: install rclmon.sh 2006-11-07 18:28 +0000 dockes (fb26679a6cec) * src/qtgui/reslist.cpp, src/utils/mimeparse.cpp: 1.5.9: fix bad tz correction in email dates + display tz in reslist 2006-11-07 16:51 +0000 dockes (affd0b42e8ae) * src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp: traces 2006-11-07 12:02 +0000 dockes (70ed645d27f3) * src/rcldb/rcldb.cpp: use both size and mtime changes as updateneeding indicator 2006-11-07 09:11 +0000 dockes (2491b468f55d) * src/qtgui/uiprefs.ui: improved autophrase tooltip 2006-11-07 09:04 +0000 dockes (ba7c28e1a205) * src/qtgui/uiprefs_w.cpp: Cancel did not reset uiprefs dialog to stored state 2006-11-07 08:57 +0000 dockes (c9f2b8c02171) * src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: Cancel did not reset uiprefs dialog to stored state 2006-11-07 06:41 +0000 dockes (fea8781e4829) * src/index/indexer.cpp: record/show mtime instead of ctime 2006-11-06 17:37 +0000 dockes (a82b3932ac69) * src/doc/user/usermanual.sgml, src/qtgui/rclmain.ui, src/qtgui/spell_w.cpp, src/rcldb/rcldb.cpp: wrote manual for term explorer and fixed a few problems 2006-11-05 21:10 +0000 dockes (f4fc6544cb74) * src/bincimapmime/mime-parsefull.cc: fix binc imap infinite loop on multipart with null boundary 2006-11-05 18:02 +0000 dockes (9306096cb34f) * src/bincimapmime/depot.h, src/bincimapmime/session.h: deleted file. * src/bincimapmime/address.cc, src/bincimapmime/address.h, src/bincimapmime/convert.cc, src/bincimapmime/convert.h, src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.h, src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime- inputsource.h, src/bincimapmime/mime-parsefull.cc, src/bincimapmime /mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime-printdoc.cc, src/bincimapmime/mime- printheader.cc, src/bincimapmime/mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/mime.h, src/bincimapmime/session.h: included bincimap 1.3.3 to 1.3.4 diffs (mostly cosmetic) 2006-11-04 17:09 +0000 dockes (3e0e0d4b152f) * src/qtgui/spell.ui, src/qtgui/spell_w.cpp: fix aspell version of term explorer 2006-11-04 14:49 +0000 dockes (7f914235875b) * src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h: change ctrl-tab to esc-spc 2006-10-30 12:59 +0000 dockes (2454d0c418a2) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain_w.cpp, src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/ssearch_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: Turn spell tool into multimode spell/wild/regexp 2006-10-25 11:50 +0000 dockes (66843e6e167c) * src/index/indexer.cpp: make tmpdir only once 2006-10-25 10:52 +0000 dockes (10c2b1b74822) * src/index/indexer.cpp, src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp, src/rcldb/rcldb.cpp: added some debugging msgs (too much) 2006-10-24 15:16 +0000 dockes (1fc3f90d5ee3) * src/mk/Darwin: *** empty log message *** 2006-10-24 14:28 +0000 dockes (33512e5ceddb) * src/index/indexer.cpp, src/index/indexer.h, src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/recollindex.cpp: create stemming db on queue timeout if needed 2006-10-24 13:22 +0000 dockes (21df8a0f4856) * src/index/rclmon.sh: new file. * src/index/rclmon.sh: *** empty log message *** 2006-10-24 12:48 +0000 dockes (4af32c44f8ea) * src/index/rclmon.h, src/index/rclmonprc.cpp: setup lockfile for monitor 2006-10-24 11:42 +0000 dockes (f922b4dda121) * src/query/Makefile: *** empty log message *** 2006-10-24 11:42 +0000 dockes (f1da6521f1ff) * src/qtgui/ssearch_w.cpp: explain error for C-TAB too many expansions 2006-10-24 09:28 +0000 dockes (3228b6b8093a) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: fix slowness in needUpdate by using Database instead of WritableDatabase 2006-10-24 09:09 +0000 dockes (0d72c341e2eb) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/indexer.cpp, src/index/rclmonrcv.cpp: centralize skippedNames computation to add dbdir always 2006-10-23 15:01 +0000 dockes (6a07dc59db99) * src/index/rclmon.h, src/index/rclmonrcv.cpp: handle directory creation 2006-10-23 15:00 +0000 dockes (672e4b4bfe51) * src/utils/pathut.cpp, src/utils/pathut.h: add path_isdir() 2006-10-23 14:29 +0000 dockes (d395ca679c7a) * src/common/autoconfig.h.in, src/configure, src/configure.ac, src/index/rclmonrcv.cpp: raw inotify support 2006-10-22 15:55 +0000 dockes (de0702a6c5e2) * src/mk/Linux: *** empty log message *** 2006-10-22 15:54 +0000 dockes (35832011eaf9) * src/rcldb/rcldb.cpp: simplify needUpdate test 2006-10-22 14:47 +0000 dockes (733c7646ca29) * src/configure, src/configure.ac, src/index/Makefile, src/index/indexer.cpp, src/index/indexer.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp, src/index/recollindex.cpp, src/mk/localdefs.in, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: monitor: purge docs for deleted files from db 2006-10-20 08:31 +0000 dockes (6d54039efe79) * src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts: new Ukrainian+Russian messages from Michael 2006-10-20 08:29 +0000 dockes (ebcb12870038) * src/qtgui/advsearch.ui, src/qtgui/rclmain.ui, src/qtgui/uiprefs.ui: small fixes on label strings 2006-10-17 14:41 +0000 dockes (ea77c15d81a6) * src/common/autoconfig.h.in, src/configure, src/configure.ac, src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp, src/index/recollindex.cpp: fam autoconfig 2006-10-16 15:33 +0000 dockes (aa570fc97bf9) * src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp: new file. * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/Makefile, src/index/indexer.cpp, src/index/indexer.h, src/index/rclmon.h, src/index/rclmonprc.cpp, src/index/rclmonrcv.cpp, src/index/recollindex.cpp: 1st version of real time monitor 2006-10-15 13:07 +0000 dockes (aa97f764d4a6) * src/qtgui/rclmain_w.cpp, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: dbl click in spell win to add to ssearch 2006-10-12 14:46 +0000 dockes (78a3a37209ae) * src/configure.ac, src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp: recollindex -i now checks that the files are descendants of topdirs 2006-10-12 08:39 +0000 dockes (ab66430f3f7d) * src/doc/user/usermanual.sgml: *** empty log message *** 2006-10-11 16:09 +0000 dockes (1cf66e2b486f) * src/aspell/rclaspell.cpp, src/utils/execmd.cpp, src/utils/execmd.h: improve execcmd to avoid allocating an allterms buffer when creating dico 2006-10-11 14:16 +0000 dockes (26e08a8fc135) * src/qtgui/images/d_spell.png, src/qtgui/images/spell.png, src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h: new file. * src/aspell/rclaspell.cpp, src/aspell/rclaspell.h, src/common/autoconfig.h.in, src/common/rclconfig.h, src/configure, src/configure.ac, src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/mk/commondefs, src/mk/localdefs.in, src/qtgui/images/d_spell.png, src/qtgui/images/spell.png, src/qtgui/main.cpp, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/recoll.h, src/qtgui/recoll.pro.in, src/qtgui/spell.ui, src/qtgui/spell_w.cpp, src/qtgui/spell_w.h, src/sampleconf/recoll.conf.in, src/utils/smallut.cpp, src/utils/smallut.h: 1st full version of aspell support 2006-10-10 10:58 +0000 dockes (ed60d657e8e9) * src/aspell/aspell-local.h, src/common/autoconfig.h.in: new file. * src/aspell/aspell-local.h, src/common/autoconfig.h.in: *** empty log message *** 2006-10-09 16:37 +0000 dockes (93d9009c4d51) * src/VERSION, src/aspell/rclaspell.cpp, src/aspell/rclaspell.h, src/index/Makefile, src/lib/Makefile, src/lib/mkMake, src/makesrcdist.sh, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/stemdb.cpp, src/utils/execmd.cpp, src/utils/execmd.h: aspell checkpoint 2006-10-09 14:05 +0000 dockes (711360b10738) * src/aspell/Makefile, src/aspell/rclaspell.cpp, src/aspell/rclaspell.h: new file. * src/aspell/Makefile, src/aspell/rclaspell.cpp, src/aspell/rclaspell.h: *** empty log message *** 2006-10-03 08:34 +0000 dockes (4033d57b83da) * packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec: 1.5 2006-10-02 13:30 +0000 dockes (562f54fc8029) * src/VERSION, src/makestaticdist.sh: small glitches in makestaticdist 2006-10-02 12:33 +0000 dockes (7be5b4b7d6c0) * src/VERSION, src/configure, src/configure.ac, src/query/history.h: small glitches detected on suse / gcc 4.1 2006-10-02 11:25 +0000 dockes (8731b62606fe [RECOLL-1_5_8, RECOLL-1_5_3, RECOLL-1_5_6, RECOLL-1_5_7, RECOLL-1_5_4, RECOLL-1_5_5]) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist: 1.5.2 2006-10-02 08:38 +0000 dockes (ee82de281263) * src/VERSION: *** empty log message *** 2006-10-02 08:26 +0000 dockes (bafb3e762d82) * src/sampleconf/mimeconf: added 2 icons 2006-10-02 08:25 +0000 dockes (c3d47772ea99) * src/qtgui/mtpics/image.png, src/qtgui/mtpics/source.png: new file. * src/qtgui/mtpics/image.png, src/qtgui/mtpics/source.png: *** empty log message *** 2006-10-02 07:50 +0000 dockes (fe9700b5a6fe [RECOLL-1_5_2, RECOLL-1_5_1]) * src/INSTALL, src/README, website/BUGS.txt, website/CHANGES.txt, website/download.html, website/index.html: *** empty log message *** 2006-10-02 07:45 +0000 dockes (bc3c93581184) * src/VERSION, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts: 1.5.1 2006-09-29 11:43 +0000 dockes (bd51dd85dc0f) * src/doc/user/usermanual.sgml: aspell pass 2006-09-29 08:26 +0000 dockes (026d0b177533) * src/rcldb/rcldb.cpp: syntabs: remove size limit. Handle overlapping chunks. Make sure we use only one term per position 2006-09-29 08:24 +0000 dockes (49342357f800) * src/qtgui/reslist.cpp: reset curPvDoc on setDocSource 2006-09-29 08:23 +0000 dockes (a9cef42dd219) * src/qtgui/uiprefs.ui: bump up limits on max abstract size parameters 2006-09-29 07:13 +0000 dockes (7973023d7c1b) * src/qtgui/ssearch_w.cpp: bad/unneeded conversion to utf8 while saving ssearch history would cause some string sizes in history to double at each program invocation 2006-09-28 14:32 +0000 dockes (a5bba26b0ac0) * src/qtgui/i18n/recoll_fr.ts: 1.5 2006-09-28 14:31 +0000 dockes (71d5895b7848) * src/qtgui/ssearchb.ui: improved tip 2006-09-28 14:30 +0000 dockes (903f443a7150) * src/doc/user/usermanual.sgml: reordered the tips 2006-09-28 11:55 +0000 dockes (3bf818bd1e39) * src/qtgui/main.cpp: debug messages 2006-09-23 13:32 +0000 dockes (3cf269bf18f0) * website/BUGS.txt, website/CHANGES.txt, website/download.html, website/features.html, website/index.html: *** empty log message *** 2006-09-23 13:13 +0000 dockes (06ed627f182d [RECOLL-1_5_0]) * src/INSTALL, src/README, src/makesrcdist.sh: *** empty log message *** 2006-09-23 13:11 +0000 dockes (0533f47f1c34) * src/INSTALL, src/doc/user/usermanual.sgml: *** empty log message *** 2006-09-23 13:09 +0000 dockes (9b8fdf62ad07) * src/doc/user/usermanual.sgml: *** empty log message *** 2006-09-23 07:39 +0000 dockes (33e469ad3a2e) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/preview_w.cpp, src/qtgui/reslist.cpp: fix file name display in tooltips 2006-09-23 07:39 +0000 dockes (e47ebb4e22ce) * src/internfile/mh_mail.cpp: fix newlines 2006-09-23 07:21 +0000 dockes (b5b530ea2ec9) * src/rcldb/rcldb.cpp: message 2006-09-22 14:11 +0000 dockes (3ef29a8417c7) * src/qtgui/i18n/recoll_fr.ts, src/rcldb/rcldb.cpp: msg 2006-09-22 10:46 +0000 dockes (9ade76cc0df5) * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, src/qtgui/uiprefs_w.cpp: messages 2006-09-22 08:19 +0000 dockes (c228a1515468) * src/qtgui/recoll.pro.in: *** empty log message *** 2006-09-22 07:51 +0000 dockes (df858f3508f4) * src/qtgui/recoll.pro.in: names cleanup 2006-09-22 07:42 +0000 dockes (de54384ab321) * src/utils/mimeparse.h: comment 2006-09-22 07:41 +0000 dockes (f37052248b5b) * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h: new file. * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts, src/qtgui/recollmain.ui: deleted file. * src/qtgui/i18n/recoll_fr.ts, src/qtgui/i18n/recoll_ru.ts, src/qtgui/i18n/recoll_uk.ts, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclmain.ui, src/qtgui/rclmain_w.cpp, src/qtgui/rclmain_w.h, src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts, src/qtgui/recollmain.ui: names cleanup: rclmain, translations 2006-09-22 07:38 +0000 dockes (c17bf757689b) * src/recollinstall.in: names cleanup: translations 2006-09-22 07:29 +0000 dockes (2d749704a22b) * src/qtgui/reslist.cpp, src/qtgui/reslist.h: new file. * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: deleted file. * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, src/qtgui/reslist.cpp, src/qtgui/reslist.h: names cleanup: reslist 2006-09-22 07:22 +0000 dockes (cd9f046bf5e3) * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: clarified preview paragraph coloring in reslist 2006-09-22 07:19 +0000 dockes (c700f9f95168) * src/internfile/mh_mail.cpp: clarified depth processing and increased limit 2006-09-21 12:56 +0000 dockes (334ef2914129) * src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: synchronize preview tab and colored paragraph in result list 2006-09-21 09:37 +0000 dockes (43c279d4d112) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, src/query/sortseq.cpp, src/query/sortseq.h: remember sort criteria 2006-09-21 05:59 +0000 dockes (e5e9c1ffa44c) * src/internfile/myhtmlparse.cpp: dont throw away text even if html is weird 2006-09-21 05:59 +0000 dockes (4e99ebec009f) * src/common/textsplit.cpp: 132.jpg was not split 2006-09-21 05:57 +0000 dockes (3bc572456a49) * src/common/Makefile, src/utils/Makefile: *** empty log message *** 2006-09-20 06:21 +0000 dockes (5829221e8612) * src/rcldb/stemdb.cpp: comments 2006-09-19 14:30 +0000 dockes (598f2c534c4c) * src/rcldb/stemdb.cpp: Stems with unique parent must be in db too so that one can search on stem (which is not a term) 2006-09-19 14:30 +0000 dockes (98cd92c958bd) * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: walk the full mime tree instead of staying at level 1 2006-09-19 14:19 +0000 dockes (12fcb57186c2) * src/configure, src/configure.ac: *** empty log message *** 2006-09-19 14:19 +0000 dockes (88bbc8f18b9e) * src/utils/mimeparse.cpp: disable date debug msgs 2006-09-19 14:18 +0000 dockes (a0016b0e9969) * src/query/xadump.cpp: add option to dump a recoll stemdb 2006-09-18 12:17 +0000 dockes (e662e0bbe85e) * src/README: *** empty log message *** 2006-09-15 16:50 +0000 dockes (315f1c1d3dd3) * src/VERSION, src/doc/user/usermanual.sgml, src/internfile/mh_mail.cpp, src/utils/mimeparse.cpp, src/utils/mimeparse.h: Use own code to parse rfc822 dates, strptime() cant do 2006-09-15 16:49 +0000 dockes (ca133771bc5b) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/recoll.pro.in, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: small typo fixes 2006-09-15 12:36 +0000 dockes (47354227e577) * src/INSTALL, src/README: *** empty log message *** 2006-09-14 07:13 +0000 dockes (b717321f9de4 [RECOLL-1_4_4]) * *** empty log message *** 2006-09-14 07:13 +0000 dockes (919e6e0dfc56) * website/BUGS.txt, website/CHANGES.txt, website/copydocs, website/credits.html, website/devel.html, website/download.html, website/features.html, website/index.html, website/pics/index.html, website/styles/style.css: new file. * website/BUGS.txt, website/CHANGES.txt, website/copydocs, website/credits.html, website/devel.html, website/download.html, website/features.html, website/index.html, website/pics/index.html, website/styles/style.css: *** empty log message *** 2006-09-13 15:31 +0000 dockes (9bd2431eaa66) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: autophrase parameter 2006-09-13 14:57 +0000 dockes (0d952f522055) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/rclreslist.cpp, src/query/docseq.cpp, src/query/docseq.h: colorize search terms in abstracts 2006-09-13 13:53 +0000 dockes (5980807171a8) * src/index/indexer.cpp, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/ssearch_w.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/sampleconf/recoll.conf.in: make constant lengths for abstracts config params 2006-09-13 08:13 +0000 dockes (6e43869ceb61) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs_w.cpp: add feature to save asearch ignored file types as startup default 2006-09-12 10:11 +0000 dockes (9b323c436beb) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui: allow paging through results inside a preview window with shift-up shift-down 2006-09-11 14:22 +0000 dockes (f0dd93428e23) * src/doc/user/usermanual.sgml, src/qtgui/advsearch.ui: try to make clearer that adv search fields will accept phrases as well as single words 2006-09-11 12:05 +0000 dockes (f455fbc6a42a) * src/qtgui/advsearch.ui, src/qtgui/advsearch_w.cpp, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui, src/query/history.cpp, src/query/history.h: remember history of restrict subdirs in adv search 2006-09-11 09:08 +0000 dockes (ad274e633ffb) * src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.h, src/qtgui/uiprefs.ui, src/query/docseq.h, src/query/history.cpp, src/query/history.h: use the (should be renamed) history file to store external databases lists 2006-09-11 07:10 +0000 dockes (6cb09384f54a) * src/qtgui/ssearch_w.cpp, src/qtgui/ssearchb.ui: maintain ssearches listbox in mru order 2006-09-11 06:58 +0000 dockes (b62d0be5650e) * src/qtgui/advsearch.ui, src/qtgui/sort.ui, src/qtgui/uiprefs.ui: ensure dialogs are sized according to font size 2006-09-08 09:02 +0000 dockes (a5a31c9b0a37) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/rclinit.cpp, src/common/rclinit.h, src/doc/man/recoll.1, src/doc/man/recoll.conf.5, src/doc/man/recollindex.1, src/doc/user/usermanual.sgml, src/index/recollindex.cpp, src/qtgui/guiutils.cpp, src/qtgui/main.cpp: Add -c option to recoll and recollindex 2006-09-08 08:51 +0000 dockes (315e0865ec26) * src/sampleconf/recoll.conf.in: The dbdir default value is now relative to the cnf dir 2006-09-06 09:50 +0000 dockes (e696d98fe7fe) * src/qtgui/uiprefs_w.cpp: Used to reset the buildAbstract replaceAbstract options because of setDown instead of setChecked 2006-09-06 09:14 +0000 dockes (0dedd735c86e) * src/utils/mimeparse.cpp, src/utils/mimeparse.h: implement rfc2231 decoding for mime parameter values 2006-09-05 17:09 +0000 dockes (95fd6b3a5b9a) * src/internfile/mh_mail.cpp: let mimeparse handle decoding or param values 2006-09-05 09:52 +0000 dockes (44182523e711) * src/filters/rclppt, src/filters/rclxls: new file. * src/filters/rclppt, src/filters/rclxls, src/sampleconf/mimeconf, src/sampleconf/mimemap: added support for ppt and xls via catdoc 2006-09-05 08:05 +0000 dockes (587719349228) * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: index and display attachment file names 2006-09-05 08:04 +0000 dockes (6f8b09a74d14) * src/utils/mimeparse.cpp, src/utils/mimeparse.h: comments only 2006-09-04 15:13 +0000 dockes (0f11e18480b2) * src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/preview.ui, src/qtgui/preview.ui.h, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h, src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: new file. * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: deleted file. * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/advsearch_w.cpp, src/qtgui/advsearch_w.h, src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/preview.ui, src/qtgui/preview.ui.h, src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp, src/qtgui/preview_w.cpp, src/qtgui/preview_w.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.pro.in, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/qtgui/sort_w.cpp, src/qtgui/sort_w.h, src/qtgui/ssearch_w.cpp, src/qtgui/ssearch_w.h, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h, src/qtgui/uiprefs_w.cpp, src/qtgui/uiprefs_w.h: mostly cosmetic changes to prepare for a future qt4 port: better separate form design from code 2006-06-29 11:05 +0000 dockes (8f28af2cb548) * src/qt4gui/recollmain.ui: *** empty log message *** 2006-06-24 09:56 +0000 dockes (fb2180e4d577) * src/qt4gui/recollmain.ui: qt4 cleanup: merged back rclmainbase and rclmain 2006-06-24 07:40 +0000 dockes (e1b5ffd88b25) * src/Makefile.in, src/VERSION, src/configure, src/configure.ac, src/doc/user/usermanual.sgml, src/qt4gui/recoll.pro.in, src/qt4gui/recollmain.ui, src/recollinstall.in: more qt4, unfinished 2006-06-23 08:07 +0000 dockes (46a46e406504) * src/qt4gui/recoll.pro.in, src/qt4gui/recollmain.ui: new file. * src/qt4gui/recoll.pro.in, src/qt4gui/recollmain.ui: added qt4gui code from Gennadi Sushko 2006-05-22 07:04 +0000 dockes (2663a50d4760) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo: 1.4.3 2006-05-09 10:15 +0000 dockes (c9a62f0cb289) * src/rcldb/rcldb.cpp: perform stem expansion using all active dbs 2006-05-09 07:56 +0000 dockes (29feec461985) * src/qtgui/preview/preview.ui.h, src/qtgui/rclreslist.cpp: esc quits preview + prev/next links 2006-05-08 07:08 +0000 dockes (185da0be6900) * src/recollinstall.in: install icon 2006-05-08 07:08 +0000 dockes (7dbebc260389) * src/qtgui/rclreslist.cpp: *** empty log message *** 2006-05-07 14:18 +0000 dockes (2f273f645a91) * packaging/rpm/recoll.spec: 1.4.3 2006-05-07 14:18 +0000 dockes (16b38a704d8e) * packaging/rpm/recoll.spec, packaging/rpm/recollmdk.spec: 1.3.3 2006-05-07 14:10 +0000 dockes (4ab20caea142 [RECOLL-1_4_3]) * src/VERSION: Release 1.4.3 2006-05-06 17:25 +0000 dockes (e7b4fd0f97fa) * src/recoll.png, src/recoll.xcf: new file. * src/qtgui/recoll.pro.in, src/recoll.png, src/recoll.xcf: *** empty log message *** 2006-05-06 17:24 +0000 dockes (aae37ad598a9) * src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts: new from michael 2006-05-02 09:49 +0000 dockes (fb5bb4665925 [RECOLL-1_4_2]) * src/qtgui/guiutils.cpp, src/rcldb/stemdb.cpp, src/unac/unac.c: more fbsd4 tweaks: Release 1.4.2 2006-04-30 07:44 +0000 dockes (d686e45d4b5e) * src/rcldb/rcldb.cpp: fbsd4 tweaks 2006-04-30 07:39 +0000 dockes (b889e57b87d6) * src/VERSION, src/index/indexer.cpp, src/index/indexer.h, src/lib/Makefile, src/lib/mkMake: fbsd4 tweaks 2006-04-30 07:26 +0000 dockes (72f2881955d1 [RECOLL-1_4_1]) * src/Makefile.in, src/README: *** empty log message *** 2006-04-30 07:23 +0000 dockes (172a9e09b77c) * src/Makefile.in: *** empty log message *** 2006-04-30 07:20 +0000 dockes (7be76a62e017) * src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts: lupdate+french 2006-04-28 07:54 +0000 dockes (5b44017502c3) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/indexer.cpp, src/index/recollindex.cpp, src/kde/kioslave/recoll/kio_recoll.cpp, src/qtgui/main.cpp, src/query/qtry.cpp: centralize dbdir computation in rclconfig+cat with conffdir if not absolute 2006-04-28 07:23 +0000 dockes (436f58f83459) * src/utils/transcode.cpp: change debug log trace 2006-04-27 09:23 +0000 dockes (3df68e37cdd9) * src/doc/user/usermanual.sgml, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h: make ssearch a combobox 2006-04-27 06:12 +0000 dockes (e7c0f6cd73f0) * src/configure, src/configure.ac, src/lib/Makefile, src/lib/mkMake: fix pb with .deps not existing 2006-04-27 06:12 +0000 dockes (83e1c6a16ca6) * src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: use getmatchingterms instead of getqueryterms for highlighting etc. in preview 2006-04-26 11:51 +0000 dockes (fa1cc55f05e9) * src/INSTALL, src/README: *** empty log message *** 2006-04-26 11:29 +0000 dockes (d92273eb3274) * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: dblclck in reslist adds to search lineedit 2006-04-25 09:59 +0000 dockes (16f32a4eda4c) * src/index/indexer.cpp, src/rcldb/rcldb.cpp: new way for doc unique terms: only path for monodoc, only path+ipath for doc inside multidoc, add pseudo-doc for file itself 2006-04-25 08:17 +0000 dockes (4c947b29c23c) * src/common/textsplit.cpp, src/rcldb/rcldb.cpp: fixed small glitch in abstract text splitting 2006-04-23 13:37 +0000 dockes (ea8caddeb344) * src/lib/mkMake: new file. * src/lib/mkMake: *** empty log message *** 2006-04-22 06:27 +0000 dockes (1b0dd24cad31) * src/qtgui/main.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.h: turn-off abst. build for fname search (no terms) + prototype query expansion (xapian e-set on chosen doc) + dbl-click in preview adds term to ssearch 2006-04-20 09:20 +0000 dockes (4b9c3c7bcb49) * src/common/rclconfig.cpp, src/lib/Makefile, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/qtgui/ssearchb.ui.h, src/query/sortseq.cpp, src/query/sortseq.h: mode 700 on .recoll. move showquerydetails to rclreslist 2006-04-19 08:26 +0000 dockes (9ec7ff1d0d53) * src/rcldb/searchdata.h: new file. * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/main.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/rcldb/searchdata.h: compacted res list + completions in ssearch + additional or field 2006-04-18 08:53 +0000 dockes (7c4352949f19) * src/index/recollindex.cpp, src/lib/Makefile, src/qtgui/advsearch.ui, src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h: new libs Makefile+autoSearchOnWS 2006-04-15 17:15 +0000 dockes (cc178f316e64) * src/qtgui/main.cpp, src/query/Makefile: small aix tweaks 2006-04-15 16:51 +0000 dockes (356148054ef1) * src/mk/AIX: new file. * src/mk/AIX: *** empty log message *** 2006-04-13 09:50 +0000 dockes (fe982a2684e4) * src/rcldb/stemdb.cpp, src/rcldb/stemdb.h: new file. * src/lib/Makefile, src/rcldb/rcldb.cpp, src/rcldb/stemdb.cpp, src/rcldb/stemdb.h: extracted stem database from rcldb to make it smaller 2006-04-12 10:41 +0000 dockes (6892025a5c8e) * src/index/indexer.cpp, src/index/indexer.h, src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/rclmain.cpp, src/qtgui/recollmain.ui, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: improve indexing status reporting 2006-04-12 07:26 +0000 dockes (44ac63815611) * src/qtgui/rclmain.cpp, src/rcldb/rcldb.cpp: Fix history not working after thread index run 2006-04-11 07:14 +0000 dockes (bd453ed96f6a) * src/rcldb/rcldb.cpp: fix rare case where stem itself was forgotten in list of possible derivatives 2006-04-11 06:49 +0000 dockes (dd7f793fdf8e) * src/common/textsplit.cpp, src/rcldb/rcldb.cpp, src/utils/smallut.cpp, src/utils/smallut.h: comments and moving some util routines out of rcldb.cpp 2006-04-08 14:00 +0000 dockes (d60e656c348f) * src/VERSION, src/doc/user/usermanual.sgml: *** empty log message *** 2006-04-07 13:10 +0000 dockes (dc4ff4178b85) * src/qtgui/advsearch.ui.h, src/rcldb/rcldb.cpp: check for and forbid pure negative query 2006-04-07 13:08 +0000 dockes (7da00eb0c7aa) * src/qtgui/guiutils.cpp: RECOLL_EXTRA_DBS environment variable 2006-04-07 13:07 +0000 dockes (f040ff3bf0aa) * src/doc/user/usermanual.sgml: use indexing instead of indexation 2006-04-07 08:51 +0000 dockes (52451e342e49) * src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: comments+conventions 2006-04-06 17:39 +0000 dockes (7d2906a0371d) * packaging/FreeBSD/recoll/pkg-plist: merge modif from committer 2006-04-06 14:28 +0000 dockes (52d4a2c2a341) * src/sampleconf/recoll.conf.in: stem only for english by default 2006-04-06 13:09 +0000 dockes (fa565da09aa7 [RECOLL-1_4_0]) * src/VERSION: 1.4.0 2006-04-06 13:08 +0000 dockes (1436c843e74e) * src/VERSION, src/rcldb/rcldb.h, src/recollinstall.in: rpmlint wants 755 for execs 2006-04-06 12:34 +0000 dockes (687369f6736c) * src/INSTALL, src/README: *** empty log message *** 2006-04-05 15:41 +0000 dockes (359711d5fbe3) * src/recollinstall.in: fix the installed file perms 2006-04-05 13:39 +0000 dockes (fdd0d33d5c2e) * src/qtgui/guiutils.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: small fixes for extra db selection 2006-04-05 13:30 +0000 dockes (3277935457e9) * src/doc/user/usermanual.sgml: small fixes 2006-04-05 12:50 +0000 dockes (98d8d7d74aee) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: additional search databases 2006-04-05 06:26 +0000 dockes (e8f1cc7c2bbf) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: simplified class structure 2006-04-04 16:03 +0000 dockes (ddb66052e3e8 [RECOLL-1_4_0pre1]) * src/filters/rcldjvu, src/filters/rclmedia, src/filters/rclps, src/filters/rclsoff: handle paths with embedded spaces 2006-04-04 15:44 +0000 dockes (933f89f10033) * src/filters/rcluncomp: handle paths with embedded spaces 2006-04-04 13:49 +0000 dockes (dec4932652ae) * src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/rclmain.cpp: make indexation more easily cancellable 2006-04-04 12:37 +0000 dockes (17342a5b330b) * src/doc/user/usermanual.sgml, src/index/indexer.cpp, src/index/indexer.h: check for symlinks in the topdirs list. Generate diags in confIndexer 2006-04-04 10:38 +0000 dockes (ec632eb29364) * src/qtgui/guiutils.cpp, src/qtgui/rclreslist.cpp: setup initial default window size smaller 2006-04-04 09:36 +0000 dockes (d175998d9270) * src/common/unacpp.cpp, src/unac/unac.c: clarify/clean up mem buffer handling 2006-04-04 09:35 +0000 dockes (b14f9df37817) * src/utils/conftree.h: fix potential minor memory leak when copying conftrees 2006-04-04 09:34 +0000 dockes (aaddcbb06c7a) * src/index/indexer.cpp, src/index/indexer.h: cosmetic: add m_ prefix to private vars 2006-04-04 07:55 +0000 dockes (1bda0dcafd17) * src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp: Get things to compile with QT_NO_STL 2006-04-03 14:16 +0000 dockes (4957b439000e) * packaging/FreeBSD/recoll/Makefile: add mods from port tree 2006-04-03 12:59 +0000 dockes (62a51f626e46) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo: *** empty log message *** 2006-04-03 11:43 +0000 dockes (0449d2ba4099 [RECOLL-1_3_3]) * src/VERSION: 1.3.3 2006-04-03 11:43 +0000 dockes (6b54e368d2d1) * src/common/rclconfig.cpp: small port fixes for fbsd4 and solaris 2006-04-03 09:42 +0000 dockes (cd9fe4976fae) * src/utils/execmd.cpp: warning 2006-04-01 21:02 +0000 dockes (eef792b97ce8 [RECOLL-1_3_2]) * src/VERSION, src/qtgui/rclmain.cpp: limit max length of displayed query details. 1.3.2 2006-04-01 09:15 +0000 dockes (315da01fb1a5 [RECOLL-1_3_1]) * src/INSTALL, src/README: *** empty log message *** 2006-04-01 09:15 +0000 dockes (e9f0a85fc18e) * src/INSTALL, src/README, src/qtgui/rclreslist.cpp, src/qtgui/ssearchb.ui: updated INSTALL+README. Fix tab focus in main window 2006-04-01 08:07 +0000 dockes (916faf93fb66) * src/qtgui/rclmain.cpp: urlencode file name before executing ext app with url param 2006-04-01 07:48 +0000 dockes (adbde9cd60b9) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- plist: 1.3.1 2006-04-01 07:34 +0000 dockes (4cd3e4e4074c) * src/sampleconf/mimeconf, src/sampleconf/mimemap: Allow ext edit for c/c++ files. 1.3.1 2? 2006-03-31 17:19 +0000 dockes (35db6f17bdd8) * src/VERSION, src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, src/qtgui/recoll_ru.ts, src/qtgui/recoll_uk.ts: fixed reslist header charset issues. 1.3.1 first 2006-03-31 09:02 +0000 dockes (ae3d9c9deb6d) * src/INSTALL, src/README: *** empty log message *** 2006-03-31 07:51 +0000 dockes (0fccf51c6905 [RECOLL-1_3_1pre3]) * src/qtgui/recoll_uk.ts: new file. * src/qtgui/recoll_uk.ts: *** empty log message *** 2006-03-30 13:00 +0000 dockes (b41828dda0ac) * src/common/Makefile: cleanup rclconfig 2006-03-30 10:31 +0000 dockes (afbdbc31ff1c) * src/sampleconf/recoll.conf.in: dont set defaultcharset to 8859-1: will let nls info be used 2006-03-30 10:31 +0000 dockes (582fa2a09db3) * src/doc/user/usermanual.sgml: *** empty log message *** 2006-03-30 08:19 +0000 dockes (89efa1c78c3c [RECOLL-1_3_1pre2]) * src/qtgui/recoll_fr.ts, src/qtgui/recoll_ru.ts: lupdate 2006-03-30 07:54 +0000 dockes (0b236faa0b9d) * src/qtgui/advsearch.ui: cleaned up layout 2006-03-29 17:31 +0000 dockes (7cb115f5789c) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h, src/qtgui/main.cpp, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h: gui: replaced checkboxes for all/filename in simple search with droplist 2006-03-29 13:08 +0000 dockes (ce199bb02759) * src/VERSION, src/common/Makefile, src/common/rclconfig.cpp, src/common/rclconfig.h, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/qtgui/rclreslist.cpp, src/sampleconf/mimeconf, src/sampleconf/mimemap: result list: show preview and edit links only when they can be used 2006-03-29 11:18 +0000 dockes (5f22b93705b4) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/rclinit.cpp, src/index/indexer.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/pathut.cpp, src/utils/pathut.h, src/utils/transcode.cpp, src/utils/transcode.h: try to better handle non-ascii file names 2006-03-28 12:49 +0000 dockes (a081a1b65de1) * src/doc/man/recoll.conf.5, src/doc/user/usermanual.sgml, src/qtgui/recoll.pro.in, src/recollinstall.in, src/sampleconf/recoll.conf.in: 1.3.1pre1 2006-03-28 12:18 +0000 dockes (7429c22d162b) * src/INSTALL, src/README: *** empty log message *** 2006-03-28 09:38 +0000 dockes (25e1ed25acc5) * src/filters/rclmedia, src/qtgui/mtpics/sownd.png: new file. * src/filters/rclmedia, src/qtgui/mtpics/sownd.png, src/sampleconf/mimeconf, src/sampleconf/mimemap: filter for indexing mp3 tags 2006-03-28 09:36 +0000 dockes (fb852147db29) * src/internfile/mh_unknown.h: new file. * src/internfile/mh_unknown.h: added code to specifically index/search file names 2006-03-22 16:24 +0000 dockes (4467274ce405) * src/index/indexer.cpp, src/index/indexer.h, src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/rclmain.cpp, src/qtgui/recollmain.ui: show current filename as feedback during indexation 2006-03-22 14:25 +0000 dockes (5dae5f8a140d) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/utils/conftree.cpp, src/utils/conftree.h: Replace user config with central values + override 2006-03-22 11:17 +0000 dockes (1f04e3bfeb4a) * src/qtgui/rclreslist.cpp: fix size display 2006-03-21 15:11 +0000 dockes (88d6359d2739) * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: implement right click menu in result list 2006-03-21 13:46 +0000 dockes (56610f5d03b3) * src/qtgui/rclmain.cpp, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: replaced (double)clicks in the result list with links 2006-03-21 13:27 +0000 dockes (cc41e73a4f5a) * src/qtgui/rclreslist.cpp: ckpt 2006-03-21 11:04 +0000 dockes (b1dc67961a45) * src/index/mimetype.cpp: sanity check on file -i return 2006-03-21 09:15 +0000 dockes (8589c7c01f25) * src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h: new file. * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: deleted file. * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/rclreslist.cpp, src/qtgui/rclreslist.h, src/qtgui/recollmain.ui, src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: reslistb form replaced by object derived from QTextBrowser 2006-03-20 16:05 +0000 dockes (70c0ec0275a9) * src/VERSION, src/index/indexer.cpp, src/internfile/internfile.cpp, src/internfile/mimehandler.cpp, src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/ssearchb.ui, src/qtgui/ssearchb.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: added code to specifically index/search file names 2006-03-20 15:14 +0000 dockes (86bb2d64fdd9) * src/internfile/mh_text.cpp: get rid of unused temp 2006-03-20 09:54 +0000 dockes (fea74448199d) * src/utils/pathut.h: comments 2006-03-20 09:54 +0000 dockes (bf4772fd96ff) * src/sampleconf/mimemap: add # to ignd suffixes 2006-03-20 09:51 +0000 dockes (218c67bcb769) * src/common/rclconfig.cpp, src/common/rclconfig.h: try to get default charset from LANG if not in config 2006-03-20 09:50 +0000 dockes (2d633e45c451) * src/makestaticdist.sh: desktop file 2006-03-16 14:00 +0000 dockes (b45dd89bb177) * src/recoll.desktop: new file. * src/recoll.desktop: initial version from Michael Shigorin 2006-03-16 13:49 +0000 dockes (e3e216dfacb6) * src/qtgui/recoll_ru.ts: new file. * src/qtgui/recoll_ru.ts: initial version from Michael Shigorin 2006-03-04 10:09 +0000 dockes (983d0984e972 [RECOLL-1_2_3]) * src/VERSION, src/doc/user/usermanual.sgml: 1.2.3 2006-02-21 12:57 +0000 dockes (29500b27662b) * src/INSTALL, src/README: *** empty log message *** 2006-02-21 12:56 +0000 dockes (0bc6bf836dfe) * src/Makefile.in, src/configure, src/configure.ac: ensure Makefile uses same qmake as configure 2006-02-21 12:52 +0000 dockes (9a69d49b1448) * src/query/docseq.h, src/query/sortseq.h: sorted sequence title would never show 2006-02-07 10:26 +0000 dockes (8881db16fe21) * src/qtgui/reslistb.ui.h, src/query/docseq.cpp, src/query/docseq.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: fix problems with doc fetch sequence (have to know where to stop) 2006-02-07 09:44 +0000 dockes (fbfb30458fc2) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h: replace computation of term positions in editor text with search for 1st query term 2006-02-03 11:47 +0000 dockes (1dbf9bcedfc0) * src/filters/rcldvi: option to use catdvi 2006-02-03 10:53 +0000 dockes (f219261a580b) * src/filters/rcldjvu, src/filters/rcldvi: new file. * src/filters/rcldjvu, src/filters/rcldvi, src/filters/rclps, src/sampleconf/mimeconf, src/sampleconf/mimemap: added dvi and djvu support 2006-02-02 09:45 +0000 dockes (71a4b9e391e0) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo: 1.2.2 2006-02-02 08:58 +0000 dockes (c2f3b36a7169 [RECOLL-1_2_2]) * src/rcldb/rcldb.cpp, src/utils/pathut.cpp: suppress 2 compilation warnings (one was actual 64bits bug but inocuous 2006-02-02 08:35 +0000 dockes (4d473bd0d9a8) * src/Makefile.in, src/VERSION, src/configure, src/configure.ac, src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h: fix small cc glitches: qt3.1, xapian-config 2006-02-01 14:34 +0000 dockes (a4deac6ede77 [RECOLL-1_2_1]) * src/qtgui/guiutils.cpp, src/qtgui/reslistb.ui.h: fbsd4 cc 2006-02-01 14:27 +0000 dockes (b005945089dc) * src/VERSION: *** empty log message *** 2006-02-01 14:18 +0000 dockes (1f6da4b2f946) * src/common/textsplit.cpp: use string::erase() not clear() 2006-02-01 09:00 +0000 dockes (09b3a24a6173 [RECOLL-1_2_0]) * src/recollinstall.in: *** empty log message *** 2006-02-01 08:19 +0000 dockes (bef8d87339d0) * packaging/rpm/recoll.spec: *** empty log message *** 2006-02-01 07:14 +0000 dockes (5c4deca7b177) * src/excludefile, src/utils/base64.cpp: *** empty log message *** 2006-02-01 07:12 +0000 dockes (77e021af3fa0) * src/INSTALL, src/README, src/doc/user/usermanual.sgml, src/excludefile, src/makesrcdist.sh: *** empty log message *** 2006-01-31 11:39 +0000 dockes (73f22e91d844) * src/qtgui/reslistb.ui.h: Clicking on "No results found" will also display the expanded query 2006-01-31 11:39 +0000 dockes (c225bd05e9c1) * src/qtgui/recoll.h: close/reopen db by default: let us see results of recollindex -i 2006-01-30 12:51 +0000 dockes (cd40d5627d38) * src/qtgui/recoll_fr.ts: *** empty log message *** 2006-01-30 11:15 +0000 dockes (962649c706ef) * src/common/rclconfig.h, src/common/rclinit.h, src/common/textsplit.h, src/common/unacpp.h, src/common/uproplist.h, src/index/csguess.h, src/index/indexer.h, src/index/mimetype.h, src/internfile/htmlparse.cpp, src/internfile/htmlparse.h, src/internfile/indextext.h, src/internfile/internfile.h, src/internfile/mh_exec.h, src/internfile/mh_html.h, src/internfile/mh_mail.h, src/internfile/mh_text.h, src/internfile/mimehandler.h, src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h, src/qtgui/advsearch.ui.h, src/qtgui/guiutils.h, src/qtgui/idxthread.h, src/qtgui/plaintorich.h, src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.h, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/qtgui/reslistb.ui.h, src/qtgui/sort.ui.h, src/qtgui/ssearchb.ui.h, src/qtgui/uiprefs.ui.h, src/query/docseq.h, src/query/history.h, src/query/sortseq.h, src/rcldb/pathhash.h, src/rcldb/rcldb.h, src/utils/base64.h, src/utils/cancelcheck.h, src/utils/conftree.h, src/utils/copyfile.h, src/utils/debuglog.h, src/utils/execmd.h, src/utils/fstreewalk.h, src/utils/idfile.h, src/utils/mimeparse.h, src/utils/pathut.h, src/utils/readfile.h, src/utils/smallut.h, src/utils/transcode.h, src/utils/utf8iter.h, src/utils/wipedir.h: *** empty log message *** 2006-01-30 10:01 +0000 dockes (f683194d38a4) * src/qtgui/preview/preview.ui.h: dont highlight terms in very big docs: too slow 2006-01-30 09:32 +0000 dockes (dc8cbf051f54) * src/mk/localdefs.in: -O2 2006-01-30 09:28 +0000 dockes (af56f00261eb) * src/qtgui/guiutils.cpp, src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h: help browser selection in prefs 2006-01-30 09:28 +0000 dockes (df275d18bee6) * src/utils/execmd.cpp: *** empty log message *** 2006-01-30 09:28 +0000 dockes (6d7b08c3bba0) * src/common/textsplit.cpp: moved span cleanup where it belonged 2006-01-28 15:36 +0000 dockes (b65e6344a9e4) * src/common/textsplit.cpp, src/common/textsplit.h: *** empty log message *** 2006-01-28 10:23 +0000 dockes (507b05e72779) * src/common/textsplit.cpp, src/common/textsplit.h, src/configure, src/configure.ac, src/query/xadump.cpp, src/utils/utf8iter.h: more textsplit tweaking 2006-01-27 13:43 +0000 dockes (8ed38cba7965) * src/utils/cancelcheck.h: new file. * src/utils/cancelcheck.h: *** empty log message *** 2006-01-27 13:43 +0000 dockes (fa13d8fe2fc9) * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h: new file. * src/qtgui/guiutils.cpp, src/qtgui/guiutils.h: extracted code from main and others 2006-01-27 13:42 +0000 dockes (96572eee9528) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp: implement cancellation in preview loading 2006-01-27 13:38 +0000 dockes (3ad2458e654a) * src/internfile/myhtmlparse.cpp: strip whitespace and newlines (as the original version), except in pre tags 2006-01-27 13:37 +0000 dockes (80dbbac5b981) * src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, src/filters/rclsoff: fix to output
when needed + other misc pbs 2006-01-27 13:34 +0000 dockes (538235c10cd7) * src/rcldb/rcldb.cpp: define some constants and increase abstract context width 2006-01-27 11:25 +0000 dockes (1d381cea9ec3) * src/internfile/htmlparse.cpp: missing amp entity translation 2006-01-26 17:59 +0000 dockes (15b82e0f9689) * src/internfile/mh_exec.cpp: check for cancellation 2006-01-26 17:59 +0000 dockes (81f5d1264b7d) * src/utils/execmd.cpp, src/utils/execmd.h: also test cancel on select timeout 2006-01-26 17:44 +0000 dockes (77efdf7b7e93) * src/utils/execmd.cpp, src/utils/execmd.h: make execCmd exception-safe 2006-01-26 14:02 +0000 dockes (ffd1ec38fb9f) * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/recoll.h, src/qtgui/uiprefs.ui, src/qtgui/uiprefs.ui.h: abstract params 2006-01-26 14:01 +0000 dockes (c34965eaaa05) * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: abstracts + doc sizes 2006-01-26 12:30 +0000 dockes (c3718d2ceeae) * src/query/docseq.cpp: let the db do whats needed to get a result count 2006-01-26 12:29 +0000 dockes (bc0a233de310) * src/utils/smallut.cpp, src/utils/smallut.h: chrono 2006-01-26 12:28 +0000 dockes (69be9a0edd98) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: abstract building from position data 2006-01-26 07:03 +0000 dockes (2c5403cbdbc1) * src/qtgui/recoll.pro: deleted file. * src/qtgui/recoll.pro: replaced by recoll.pro.in 2006-01-26 07:03 +0000 dockes (7a03d26ad54d) * src/qtgui/recoll.pro, src/qtgui/recoll.pro.in, src/utils/smallut.h: *** empty log message *** 2006-01-26 07:02 +0000 dockes (de94ebf3cb51) * src/index/indexer.cpp: pass size info to db.add 2006-01-25 08:39 +0000 dockes (fc5ab7249caa) * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: reenable stripping newlines 2006-01-25 08:09 +0000 dockes (1ce613930379) * src/query/Makefile, src/query/xadump.cpp: xadump improvements 2006-01-24 12:22 +0000 dockes (6a16d14c076e) * src/qtgui/rclmain.cpp: fix signal type 2006-01-24 12:22 +0000 dockes (322a0f010b59) * src/utils/execmd.cpp, src/utils/execmd.h: add feedback and possible cancellation 2006-01-23 17:21 +0000 dockes (d16bcca9bc1e) * src/qtgui/images/d_nextpage.png, src/qtgui/images/d_prevpage.png: new file. * src/qtgui/images/d_nextpage.png, src/qtgui/images/d_prevpage.png, src/qtgui/rclmain.cpp, src/qtgui/recoll.pro, src/qtgui/recollmain.ui: slightly improved the icon situation 2006-01-23 16:52 +0000 dockes (a51e0cfa77db) * src/qtgui/images/asearch.png, src/qtgui/images/history.png, src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, src/qtgui/images/sortparms.png: *** empty log message *** 2006-01-23 15:43 +0000 dockes (907a44f71ddc) * src/qtgui/images/editcopy, src/qtgui/images/editcut, src/qtgui/images/editpaste, src/qtgui/images/filenew, src/qtgui/images/fileopen, src/qtgui/images/filesave, src/qtgui/images/print, src/qtgui/images/redo, src/qtgui/images/searchfind, src/qtgui/images/undo: deleted file. * src/qtgui/images/editcopy, src/qtgui/images/editcut, src/qtgui/images/editpaste, src/qtgui/images/filenew, src/qtgui/images/fileopen, src/qtgui/images/filesave, src/qtgui/images/print, src/qtgui/images/redo, src/qtgui/images/searchfind, src/qtgui/images/undo: *** empty log message *** 2006-01-23 13:32 +0000 dockes (b27df12a0147) * src/common/rclconfig.cpp, src/common/rclinit.cpp, src/common/textsplit.cpp, src/common/unacpp.cpp, src/index/csguess.cpp, src/index/indexer.cpp, src/index/mimetype.cpp, src/index/recollindex.cpp, src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp, src/internfile/mimehandler.cpp, src/query/docseq.cpp, src/query/history.cpp, src/query/qtry.cpp, src/query/qxtry.cpp, src/query/sortseq.cpp, src/query/xadump.cpp, src/rcldb/pathhash.cpp, src/rcldb/rcldb.cpp, src/utils/base64.cpp, src/utils/conftree.cpp, src/utils/copyfile.cpp, src/utils/debuglog.cpp, src/utils/execmd.cpp, src/utils/fstreewalk.cpp, src/utils/idfile.cpp, src/utils/mimeparse.cpp, src/utils/pathut.cpp, src/utils/readfile.cpp, src/utils/smallut.cpp, src/utils/transcode.cpp, src/utils/utf8iter.cpp, src/utils/wipedir.cpp: reference to GPL in all .cpp files 2006-01-23 13:32 +0000 dockes (c2c52e3c568f) * src/qtgui/idxthread.cpp, src/qtgui/main.cpp, src/qtgui/plaintorich.cpp, src/qtgui/rclmain.cpp, src/qtgui/recoll.h, src/qtgui/recoll.pro, src/qtgui/reslistb.ui.h, src/qtgui/uiprefs.ui.h: more refactoring 2006-01-23 07:15 +0000 dockes (639d2208e231) * src/qtgui/rclmain.cpp: *** empty log message *** 2006-01-23 07:07 +0000 dockes (29cad268f7ba) * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, src/qtgui/ssearchb.ui.h: more modularization 2006-01-22 18:46 +0000 dockes (c329a0d633e1) * src/qtgui/recoll.pro.in: new file. * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.pro, src/qtgui/recoll.pro.in, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, src/qtgui/ssearchb.ui: extract functionality from main window 2006-01-22 15:16 +0000 dockes (f8f81a690e3d) * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h: *** empty log message *** 2006-01-22 13:56 +0000 dockes (b62fca0983d3) * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, src/qtgui/ssearchb.ui.h: new file. * src/qtgui/reslistb.ui, src/qtgui/reslistb.ui.h, src/qtgui/ssearchb.ui.h: *** empty log message *** 2006-01-22 07:41 +0000 dockes (50553b4f8d29 [T1_2]) * src/qtgui/ssearchb.ui: *** empty log message *** 2006-01-22 07:25 +0000 dockes (f5ecee171cca) * src/qtgui/ssearchb.ui: new file. * src/qtgui/ssearchb.ui: *** empty log message *** 2006-01-21 15:36 +0000 dockes (283be80e303b) * src/configure: *** empty log message *** 2006-01-21 15:36 +0000 dockes (57061cf4c252) * src/Makefile.in, src/configure, src/configure.ac, src/makesrcdist.sh, src/qtgui/recoll.pro: enable building from inside qtgui/ 2006-01-21 15:25 +0000 dockes (ce790ab8e905) * packaging/rpm/recollmdk.spec: new file. * packaging/rpm/recollmdk.spec: *** empty log message *** 2006-01-21 10:47 +0000 dockes (47b92b35b369) * src/INSTALL, src/README: *** empty log message *** 2006-01-20 14:58 +0000 dockes (9dfcca9b0073) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/qtgui/main.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.h: qt main program cleanup 2006-01-20 12:46 +0000 dockes (04782d3c08bb) * src/qtgui/rclmain.cpp, src/qtgui/rclmain.h: new file. * src/qtgui/main.cpp, src/qtgui/rclmain.cpp, src/qtgui/rclmain.h, src/qtgui/recoll.pro, src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: separated code from design by subclassing recollmain 2006-01-20 10:01 +0000 dockes (f1c90fc5dd19) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/kde/kioslave/recoll/00README.txt, src/mk/commondefs, src/mk/localdefs.in, src/qtgui/idxthread.cpp, src/qtgui/idxthread.h, src/qtgui/main.cpp, src/utils/conftree.h, src/utils/debuglog.h: cleanup 2006-01-19 17:11 +0000 dockes (b6465d0ee08c) * src/Makefile.in: new file. * src/Makefile: deleted file. * src/Makefile, src/Makefile.in, src/common/rclconfig.cpp, src/common/rclconfig.h, src/configure, src/configure.ac, src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, src/mk/localdefs.in, src/qtgui/main.cpp, src/qtgui/recoll.pro, src/recollinstall.in: slight config cleanup 2006-01-19 15:08 +0000 dockes (211c1066ac8f) * src/kde/kioslave/recoll/00README.txt: new file. * src/kde/kioslave/recoll/00README.txt: end of test, doesnt look very useful 2006-01-19 14:57 +0000 dockes (302ee688e96a) * src/kde/kioslave/recoll/kio_recoll.la: new file. * src/kde/kioslave/recoll/Makefile, src/kde/kioslave/recoll/kio_recoll.cpp, src/kde/kioslave/recoll/kio_recoll.h, src/kde/kioslave/recoll/kio_recoll.la: end of initial experimentation 2006-01-19 12:03 +0000 dockes (ffb549062074) * src/utils/Makefile: *** empty log message *** 2006-01-19 12:01 +0000 dockes (0e6b7d796f28) * packaging/FreeBSD/recoll/Makefile, src/Makefile, src/VERSION, src/bincimapmime/Makefile, src/common/Makefile, src/doc/user/usermanual.sgml, src/index/Makefile, src/kde/kioslave/recoll/Makefile, src/kde/kioslave/recoll/kio_recoll.cpp, src/kde/kioslave/recoll/kio_recoll.h, src/lib/Makefile, src/makestaticdist.sh, src/mk/Darwin, src/mk/FreeBSD, src/mk/Linux, src/mk/SunOS, src/mk/commondefs, src/mk/localdefs.in, src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/recollmain.ui.h, src/query/Makefile, src/utils/Makefile, src/utils/smallut.cpp, src/utils/smallut.h: misc small mods to help with building kio_recoll 2006-01-18 13:41 +0000 dockes (ebf94c8fc21c) * src/kde/kioslave/recoll/Makefile, src/kde/kioslave/recoll/kio_recoll.cpp, src/kde/kioslave/recoll/kio_recoll.h, src/kde/kioslave/recoll/recoll.protocol: new file. * src/kde/kioslave/recoll/Makefile, src/kde/kioslave/recoll/kio_recoll.cpp, src/kde/kioslave/recoll/kio_recoll.h, src/kde/kioslave/recoll/recoll.protocol: *** empty log message *** 2006-01-17 10:08 +0000 dockes (9784891fd0a7) * src/utils/mimeparse.h: comments and clarification 2006-01-17 09:31 +0000 dockes (08549e5e4a9e) * src/index/indexer.cpp, src/utils/fstreewalk.cpp, src/utils/fstreewalk.h: cleanup and comments 2006-01-14 13:09 +0000 dockes (d7ac146b7dd5) * src/configure, src/configure.ac: do a better search for qt configuration 2006-01-14 11:48 +0000 dockes (d073ecc93317) * src/Makefile, src/configure, src/configure.ac: do a better search for qt configuration 2006-01-12 09:29 +0000 dockes (2dfd16f6a9a4 [RECOLL-1_1_0]) * src/qtgui/recoll_fr.ts: *** empty log message *** 2006-01-12 09:16 +0000 dockes (deb6607d43bf) * src/README: *** empty log message *** 2006-01-12 09:13 +0000 dockes (7635781b18c5) * src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp: handle removed docs in history 2006-01-11 17:41 +0000 dockes (bd54a740def9) * src/qtgui/recollmain.ui.h: *** empty log message *** 2006-01-11 15:09 +0000 dockes (108917b10bf3) * src/qtgui/uiprefs.ui.h: new file. * src/qtgui/uiprefs.ui.h: *** empty log message *** 2006-01-11 15:08 +0000 dockes (a03b6696412a) * src/doc/user/usermanual.sgml, src/index/Makefile, src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/docseq.h, src/query/sortseq.cpp, src/query/sortseq.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: translation of result list title. Show query details when clicking on header 2006-01-10 17:46 +0000 dockes (d4cc3428e381) * src/recollinstall.in: *** empty log message *** 2006-01-10 14:53 +0000 dockes (c873b3133cdd) * packaging/rpm/recoll.spec: *** empty log message *** 2006-01-10 13:52 +0000 dockes (ab4934e066f9) * src/recollinstall.in: *** empty log message *** 2006-01-10 13:41 +0000 dockes (23d6e8ae7155) * src/recollinstall.in: *** empty log message *** 2006-01-10 13:32 +0000 dockes (526cfe52f2e1) * src/recollinstall.in: *** empty log message *** 2006-01-10 13:27 +0000 dockes (a2f47b62ca03) * src/recollinstall.in: *** empty log message *** 2006-01-10 13:16 +0000 dockes (72d6ccffea15) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- plist, src/recollinstall.in: install man pages 2006-01-10 12:58 +0000 dockes (3a7d0fd4ceb7) * src/Makefile, src/common/rclconfig.cpp: warning 2006-01-10 12:55 +0000 dockes (aaeb49f89a98) * src/rcldb/rcldb.cpp: include unistd 2006-01-10 12:06 +0000 dockes (9b804748017f) * src/INSTALL, src/README: *** empty log message *** 2006-01-10 11:07 +0000 dockes (01e4fe9772b0) * src/common/rclconfig.h, src/doc/user/usermanual.sgml, src/index/recollindex.cpp, src/sampleconf/recoll.conf.in: doc + got rid of unused defaultlanguage config param 2006-01-10 09:10 +0000 dockes (34638d9bd009) * src/doc/man/recoll.conf.5: new file. * src/doc/man/recoll.conf.5: *** empty log message *** 2006-01-10 08:14 +0000 dockes (a9b485ada811) * src/doc/man/recoll.1, src/doc/man/recollindex.1: new file. * src/doc/man/recoll.1, src/doc/man/recollindex.1: *** empty log message *** 2006-01-09 16:53 +0000 dockes (29f37b7888d3) * src/excludefile, src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile, src/utils/pathut.cpp, src/utils/pathut.h: allow independant creation / deletion of stem dbs 2006-01-06 13:55 +0000 dockes (8831260252d9) * src/rcldb/rcldb.cpp: do a better test for a capitalized query term (no stem expand) 2006-01-06 13:20 +0000 dockes (82e02042773f) * src/qtgui/uiprefs.ui: new file. * src/qtgui/uiprefs.ui: *** empty log message *** 2006-01-06 13:19 +0000 dockes (29cdbe2390e4) * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, src/utils/caseconvert.h, src/utils/gencasefold.sh: deleted file. * src/lib/Makefile, src/rcldb/rcldb.cpp, src/unac/unac.c, src/unac/unac.h, src/utils/CaseFolding.txt, src/utils/Makefile, src/utils/caseconvert.cpp, src/utils/caseconvert.h, src/utils/gencasefold.sh: integrated case-folding into unac for better performance 2006-01-06 13:18 +0000 dockes (7840fc0ec48b) * src/common/Makefile, src/common/unacpp.cpp, src/common/unacpp.h, src/rcldb/rcldb.cpp: integrated case-folding into unac for better performance 2006-01-06 13:10 +0000 dockes (15e715082e40) * unac/CaseFolding-3.2.0.txt: new file. * unac/CaseFolding-3.2.0.txt, unac/builder.in, unac/unac.c, unac/unac.h: implemented additional case-folding 2006-01-06 13:08 +0000 dockes (f27aa43e32ef [UNAC_1_7_0]) * unac/.version, unac/AUTHORS, unac/COPYING, unac/ChangeLog, unac/INSTALL, unac/Makefile.am, unac/Makefile.in, unac/NEWS, unac/README, unac/THANKS, unac/UnicodeData-3.2.0.txt, unac/acinclude.m4, unac/aclocal.m4, unac/builder.in, unac/config.guess, unac/config.h.in, unac/config.sub, unac/configure, unac/configure.ac, unac/depcomp, unac/getopt.c, unac/getopt.h, unac/install-sh, unac/ltconfig, unac/ltmain.sh, unac/missing, unac/mkinstalldirs, unac/stamp-h.in, unac/t_unac.in, unac/unac.3, unac/unac.c, unac/unac.h, unac/unac.pc.in, unac/unac.spec.in, unac/unaccent.1, unac/unaccent.c, unac/unactest.c, unac/unactest1.c: new file. * unac/.version, unac/AUTHORS, unac/COPYING, unac/ChangeLog, unac/INSTALL, unac/Makefile.am, unac/Makefile.in, unac/NEWS, unac/README, unac/THANKS, unac/UnicodeData-3.2.0.txt, unac/acinclude.m4, unac/aclocal.m4, unac/builder.in, unac/config.guess, unac/config.h.in, unac/config.sub, unac/configure, unac/configure.ac, unac/depcomp, unac/getopt.c, unac/getopt.h, unac/install-sh, unac/ltconfig, unac/ltmain.sh, unac/missing, unac/mkinstalldirs, unac/stamp-h.in, unac/t_unac.in, unac/unac.3, unac/unac.c, unac/unac.h, unac/unac.pc.in, unac/unac.spec.in, unac/unaccent.1, unac/unaccent.c, unac/unactest.c, unac/unactest1.c: initial import 2006-01-06 07:59 +0000 dockes (52c86ee701fd) * src/index/Makefile, src/qtgui/recoll.pro: ensure relink for changed lib 2006-01-05 16:37 +0000 dockes (a2ef019b6308) * src/common/unacpp.cpp, src/common/unacpp.h, src/lib/Makefile, src/rcldb/rcldb.cpp, src/utils/Makefile: Use proper unicode lowercasing 2006-01-05 16:16 +0000 dockes (158267ddbcb6) * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, src/utils/caseconvert.h, src/utils/gencasefold.sh: new file. * src/utils/CaseFolding.txt, src/utils/caseconvert.cpp, src/utils/caseconvert.h, src/utils/gencasefold.sh: *** empty log message *** 2006-01-05 10:27 +0000 dockes (f1af15efef34) * packaging/rpm/recoll.spec: new file. * packaging/rpm/recoll.spec: *** empty log message *** 2006-01-05 10:24 +0000 dockes (55284d2ed66e) * src/Makefile, src/recollinstall.in: install tweaks for rpm compatibility 2006-01-04 11:33 +0000 dockes (236c587eb180) * src/VERSION, src/common/rclconfig.h, src/makesrcdist.sh, src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/recollinstall.in, src/utils/smallut.cpp, src/utils/smallut.h: add menu entry to start browser on html doc 2006-01-04 11:16 +0000 dockes (2075c2a6d71e) * src/INSTALL, src/README: *** empty log message *** 2006-01-04 11:09 +0000 dockes (9a4cceb219aa) * src/doc/user/Makefile, src/doc/user/docbook.css, src/doc/user/usermanual.sgml: new file. * src/doc/user/Makefile, src/doc/user/docbook.css, src/doc/user/usermanual.sgml: *** empty log message *** 2006-01-03 11:35 +0000 dockes (188ffc87b7d3) * src/INSTALL, src/README: *** empty log message *** 2005-12-16 10:08 +0000 dockes (789da9d2380c) * src/query/Makefile, src/query/xadump.cpp, src/unac/unac.c, src/utils/mimeparse.cpp: 64 bits fixes 2005-12-16 10:06 +0000 dockes (cf18fa6d2a7b) * src/Makefile, src/mk/localdefs.in, src/qtgui/main.cpp, src/qtgui/recoll.pro, src/recollinstall.in: get prefix to really work 2005-12-16 08:00 +0000 dockes (cca6b156e460) * src/excludefile: dont copy localdefs 2005-12-16 07:58 +0000 dockes (7b20df9408ce) * src/mk/localdefs: deleted file. * src/mk/localdefs: *** empty log message *** 2005-12-15 14:39 +0000 dockes (959564d835fd) * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/sampleconf/recoll.conf.in: user prefs tweaks. Allow switching stemlang from ui 2005-12-15 13:41 +0000 dockes (bf3c45bf931d) * src/qtgui/main.cpp: *** empty log message *** 2005-12-14 16:15 +0000 dockes (229d1902798e) * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: user interface preferences settable from ui 2005-12-14 11:00 +0000 dockes (3e5f6f1c000d) * src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/internfile/mh_html.cpp, src/internfile/mh_text.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/Makefile: allow indexing individual files. Fix pb with preview and charsets (local defcharset ignored) 2005-12-13 17:20 +0000 dockes (0895be2b8196) * src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: add allTerms checkbutton, save state in settings 2005-12-13 17:20 +0000 dockes (b522d74e613c) * src/qtgui/advsearch.ui: avoid activating random buttons when typing CR... 2005-12-13 12:43 +0000 dockes (0448daf8c23e) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist, src/common/rclconfig.cpp, src/doc/prog/Doxyfile, src/doc/prog/Makefile, src/doc/prog/filters.txt, src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/utils/fstreewalk.cpp, src/utils/pathut.cpp, src/utils/pathut.h, src/utils/smallut.cpp, src/utils/wipedir.cpp: pgup/down in result list 2005-12-08 08:44 +0000 dockes (ec006d171797) * src/common/Makefile, src/internfile/htmlparse.cpp, src/internfile/htmlparse.h, src/internfile/internfile.cpp, src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: process text from html files without a tag 2005-12-07 15:41 +0000 dockes (a44bf0c6a081 [RECOLL-1_0_14]) * src/VERSION, src/internfile/mh_mail.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, src/query/docseq.cpp, src/utils/utf8iter.h: freebsd 4 port 2005-12-06 15:59 +0000 dockes (812bc8f9232b) * packaging/FreeBSD/recoll/distinfo: 0.13 really now 2005-12-06 15:41 +0000 dockes (3a7b74624ff4) * src/recollinstall.in: strip execs 2005-12-06 15:20 +0000 dockes (fa8c19799a41) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- plist: recoll-0.13 2005-12-06 15:10 +0000 dockes (b6df28b0d0e3) * src/README: *** empty log message *** 2005-12-06 15:10 +0000 dockes (e66dba4d628c [RECOLL-1_0_13]) * src/Makefile, src/VERSION, src/recollinstall.in: no recollinstall install 2005-12-06 12:55 +0000 dockes (cbfcc5627111) * packaging/FreeBSD/recoll/pkg-descr: *** empty log message *** 2005-12-06 10:30 +0000 dockes (d132e05e40ac) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist: *** empty log message *** 2005-12-06 09:40 +0000 dockes (f93d6a9b2336) * src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp: previous html fix didnt work 2005-12-06 08:35 +0000 dockes (a3eec94f6861) * src/VERSION, src/internfile/internfile.cpp, src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp: fix nasty html parse bug introduced in 1.0.9 2005-12-06 07:16 +0000 dockes (c1ccf42bf359 [RECOLL-1_0_12, RECOLL-1_0_11]) * src/qtgui/recollmain.ui: move search/clear buttons to the left side 2005-12-05 17:47 +0000 dockes (37952b251aee) * src/VERSION: 1.0.11? 2005-12-05 16:45 +0000 dockes (eecd7a311e8f) * src/qtgui/recollmain.ui.h: no %F on solaris8 2005-12-05 16:13 +0000 dockes (cd9899dcdec1) * src/utils/copyfile.cpp: *** empty log message *** 2005-12-05 16:13 +0000 dockes (7e7e675138b2) * src/query/docseq.cpp, src/query/docseq.h: avoid unneeded getDoc(0) + normalize private var names 2005-12-05 15:00 +0000 dockes (6aa562bb0180) * src/INSTALL, src/Makefile, src/README, src/qtgui/main.cpp: *** empty log message *** 2005-12-05 14:09 +0000 dockes (d3954ac2c5ec) * src/utils/copyfile.cpp, src/utils/copyfile.h: new file. * src/common/rclconfig.cpp, src/lib/Makefile, src/mk/localdefs, src/mk/localdefs.in, src/utils/copyfile.cpp, src/utils/copyfile.h: create personal config if it does not exist 2005-12-05 12:02 +0000 dockes (6d38fb24e3b1) * src/qtgui/images/asearch.png, src/qtgui/images/history.png, src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, src/qtgui/images/sortparms.png: new file. * src/qtgui/images/asearch.png, src/qtgui/images/history.png, src/qtgui/images/nextpage.png, src/qtgui/images/prevpage.png, src/qtgui/images/sortparms.png, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/qtgui/sort.ui.h, src/query/docseq.cpp, src/query/sortseq.cpp: use toolbar buttons for prev/next + misc cleanups 2005-12-05 10:39 +0000 dockes (55a212b17808) * src/rcldb/rcldb.cpp: also index file path as terms 2005-12-04 17:10 +0000 dockes (a4005adeece9) * src/qtgui/recoll.pro: more 2005-12-04 17:10 +0000 dockes (15ce414ea700) * src/common/textsplit.cpp: split stdin 2005-12-04 14:58 +0000 dockes (369372321681) * src/qtgui/recollmain.ui: *** empty log message *** 2005-12-02 16:18 +0000 dockes (b8ea8500fe26) * src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/query/sortseq.cpp, src/query/sortseq.h, src/rcldb/rcldb.h: 1st version of sorting interface. Needs polishing 2005-12-02 16:17 +0000 dockes (fba2b55c4ba7) * src/filters/rclpdf: new version of pdftotext broke us 2005-12-02 16:17 +0000 dockes (a31234c89a73) * src/common/rclconfig.cpp, src/recollinstall.in, src/sampleconf/recoll.conf.in: install filters to /usr/local 2005-12-02 14:18 +0000 dockes (7b585689ce4a) * src/query/sortseq.cpp: *** empty log message *** 2005-12-01 16:23 +0000 dockes (c7393c3bc8b5) * src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/query/sortseq.cpp, src/query/sortseq.h: new file. * src/lib/Makefile, src/qtgui/recoll.pro, src/qtgui/recollmain.ui.h, src/qtgui/sort.ui, src/qtgui/sort.ui.h, src/query/sortseq.cpp, src/query/sortseq.h: sorting 1st steps 2005-11-30 18:37 +0000 dockes (ddba9ec4f65f) * src/configure: make recollinstall executable 2005-11-30 18:28 +0000 dockes (35f236d5ad1f) * src/configure.ac: make recollinstall executable 2005-11-30 18:26 +0000 dockes (580ae261b629) * src/sampleconf/recoll.conf.in: keep log level at 4 for index feedback 2005-11-30 18:20 +0000 dockes (2fb51c4552fb) * src/sampleconf/recoll.conf.in: decrease log level 2005-11-30 18:10 +0000 dockes (0ad46d9bcaa5) * src/query/history.cpp: *** empty log message *** 2005-11-30 18:05 +0000 dockes (653e0a145731) * src/qtgui/form1.ui.h: deleted file. * src/excludefile, src/qtgui/form1.ui.h: *** empty log message *** 2005-11-30 18:04 +0000 dockes (dfff4ecb1918) * src/qtgui/form1.ui: deleted file. * src/excludefile, src/qtgui/form1.ui: *** empty log message *** 2005-11-30 18:01 +0000 dockes (a63a8d7c49f3) * src/excludefile: *** empty log message *** 2005-11-30 17:58 +0000 dockes (7676c325de57) * src/excludefile: *** empty log message *** 2005-11-30 17:58 +0000 dockes (6ddc4c210c87) * src/utils/transcode.cpp: try harder to convert bad encodings 2005-11-30 10:36 +0000 dockes (7e0aab848f91 [RECOLL-1_0_10]) * src/README, src/qtgui/recollmain.ui: *** empty log message *** 2005-11-30 10:35 +0000 dockes (1f97b79ea735) * src/VERSION: v1.0.10 2005-11-30 10:25 +0000 dockes (3c2bcb1ec527) * src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: disable/enable buttons dep. on state 2005-11-30 09:46 +0000 dockes (a75b091acbae) * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/sampleconf/mimeconf: *** empty log message *** 2005-11-30 09:46 +0000 dockes (30a527e5014f) * src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/rcldb/rcldb.cpp: add option to rezero db before index 2005-11-28 15:31 +0000 dockes (d9e31422258b) * src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/query/docseq.cpp, src/query/docseq.h, src/query/history.cpp, src/query/history.h: store and display dates in history. Needs more work 2005-11-25 14:36 +0000 dockes (18bc54d4e426) * src/qtgui/recollmain.ui.h, src/query/history.cpp, src/utils/conftree.cpp, src/utils/smallut.cpp, src/utils/smallut.h: show history newest first + prune duplicate entries 2005-11-25 10:26 +0000 dockes (3ad346d3f29e) * src/qtgui/main.cpp, src/qtgui/recoll_fr.ts, src/recollinstall.in: install translations to share/recoll/translations 2005-11-25 10:02 +0000 dockes (6ed5669a337b) * src/query/docseq.cpp, src/query/docseq.h: new file. * src/lib/Makefile, src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/docseq.cpp, src/query/docseq.h: 1st version of doc history 2005-11-25 09:14 +0000 dockes (69bab5c09012) * src/index/indexer.cpp, src/index/mimetype.cpp, src/sampleconf/mimeconf: *** empty log message *** 2005-11-25 09:13 +0000 dockes (55e99bcc0a46) * src/common/rclconfig.cpp, src/common/rclconfig.h: get all mime list from mimeconf, not mimemap 2005-11-25 09:12 +0000 dockes (87febfb9c3be) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: added method to retrieve doc from path/ipath 2005-11-25 08:53 +0000 dockes (756168516697) * src/Makefile, src/internfile/mimehandler.cpp, src/rcldb/rcldb.h: *** empty log message *** 2005-11-25 08:50 +0000 dockes (6fda25d19678) * src/utils/conftree.cpp, src/utils/conftree.h, src/utils/smallut.cpp, src/utils/smallut.h: add methods useful for history. move stuff to smallut 2005-11-25 08:49 +0000 dockes (bd6b75c162a5) * src/utils/base64.cpp: Strip extra null byte that we were appending 2005-11-24 18:21 +0000 dockes (ba604719481c) * src/query/history.cpp, src/query/history.h: new file. * src/query/Makefile, src/query/history.cpp, src/query/history.h, src/query/qtry.cpp, src/query/xadump.cpp: *** empty log message *** 2005-11-24 07:16 +0000 dockes (1fc7382994a5) * src/recollinstall.in, src/sampleconf/recoll.conf.in: new file. * src/bincimapmime/address.cc, src/bincimapmime/convert.cc, src/bincimapmime/iodevice.cc, src/bincimapmime/iofactory.cc, src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime- parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/trbinc.cc, src/common/rclconfig.cpp, src/common/textsplit.cpp, src/common/unacpp.cpp, src/configure, src/configure.ac, src/index/csguess.cpp, src/index/indexer.cpp, src/index/mimetype.cpp, src/internfile/htmlparse.cpp, src/internfile/htmlparse.h, src/internfile/internfile.cpp, src/internfile/mh_exec.cpp, src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, src/internfile/mh_text.cpp, src/internfile/mimehandler.cpp, src/makestaticdist.sh, src/qtgui/advsearch.ui.h, src/qtgui/main.cpp, src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp, src/qtgui/recollmain.ui.h, src/query/qtry.cpp, src/query/qxtry.cpp, src/query/xadump.cpp, src/rcldb/pathhash.cpp, src/rcldb/rcldb.cpp, src/recollinstall.in, src/sampleconf/recoll.conf.in, src/utils/base64.cpp, src/utils/execmd.cpp, src/utils/fstreewalk.cpp, src/utils/idfile.cpp, src/utils/mimeparse.cpp, src/utils/pathut.cpp, src/utils/readfile.cpp, src/utils/smallut.cpp, src/utils/smallut.h, src/utils/transcode.cpp, src/utils/utf8iter.cpp, src/utils/wipedir.cpp: *** empty log message *** 2005-11-23 13:12 +0000 dockes (a8ff464ec720) * src/recollinstall, src/sampleconf/recoll.conf: deleted file. * src/recollinstall, src/sampleconf/recoll.conf: *** empty log message *** 2005-11-23 11:11 +0000 dockes (4ba2ad248537) * src/utils/execmd.cpp: *** empty log message *** 2005-11-23 11:00 +0000 dockes (66cac25635e1) * src/INSTALL, src/README, src/rcldb/rcldb.cpp: *** empty log message *** 2005-11-23 10:57 +0000 dockes (45f106d04652 [RECOLL-1_0_9]) * src/Makefile: use prefix instead of PREFIX 2005-11-23 10:19 +0000 dockes (e7a6edd38c56) * src/Makefile, src/VERSION, src/filters/rclrtf, src/index/Makefile, src/index/mimetype.cpp, src/utils/debuglog.cpp, src/utils/mimeparse.cpp: *** empty log message *** 2005-11-23 10:18 +0000 dockes (4e530d6556d2) * src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h: document already shown test was wrong, wouldnt show more docs from same file 2005-11-23 10:17 +0000 dockes (9944ac86338d) * src/utils/execmd.cpp: need to do _exit not exit after exec failure 2005-11-23 10:16 +0000 dockes (085c66533884) * src/internfile/mh_html.cpp, src/utils/smallut.cpp, src/utils/smallut.h: improve charset name comparison 2005-11-21 17:18 +0000 dockes (9c398b7ee69e [RECOLL-1_0_8]) * src/configure, src/configure.ac, src/index/mimetype.cpp, src/internfile/myhtmlparse.cpp, src/mk/Linux, src/mk/SunOS, src/recollinstall, src/utils/execmd.cpp: glitches in linux/solaris compil. + install 2005-11-21 16:16 +0000 dockes (7594b3dd0dc5) * src/README: *** empty log message *** 2005-11-21 16:06 +0000 dockes (8a82b3826a4a) * src/VERSION: *** empty log message *** 2005-11-21 16:05 +0000 dockes (9cc42706006d) * src/filters/rclrtf: new file. * src/filters/rclrtf, src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/recoll.conf: add support for rtf 2005-11-21 16:04 +0000 dockes (8169ca3ae210) * src/Makefile, src/makestaticdist.sh, src/recollinstall: install pics and samples to $PREFIX/local/recoll 2005-11-21 14:32 +0000 dockes (f0aaac1df843) * src/filters/rclgaim: just needs awk 2005-11-21 14:31 +0000 dockes (88649af9a0ac [RECOLL-1_0_7]) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/indexer.cpp, src/index/mimetype.cpp, src/index/mimetype.h, src/internfile/internfile.cpp, src/internfile/mh_html.cpp, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h, src/lib/Makefile, src/qtgui/recollmain.ui.h, src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/recoll.conf: mimemap processing recentered in rclconfig. Handle directory-local suffix to mime-type definitions. Implement gaim log handling 2005-11-18 17:03 +0000 dockes (ae7d483398d2) * src/filters/rclgaim: new file. * src/filters/rclgaim: *** empty log message *** 2005-11-18 15:19 +0000 dockes (9c8cb27e5749) * src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mh_exec.cpp, src/internfile/mimehandler.h, src/utils/execmd.h: misc cleanup + tell filters if working for preview or index 2005-11-18 13:52 +0000 dockes (9d83fd6a7d8c) * src/utils/execmd.cpp, src/utils/execmd.h: add putenv interface 2005-11-18 13:23 +0000 dockes (c3d0cfc77a9f) * src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, src/internfile/mh_text.cpp, src/internfile/mh_text.h: new file. * src/internfile/mh_exec.cpp, src/internfile/mh_exec.h, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/mh_text.cpp, src/internfile/mh_text.h, src/internfile/mimehandler.cpp, src/lib/Makefile: restructuring on mimehandler files 2005-11-17 17:39 +0000 dockes (e530dcacaf42) * src/VERSION: *** empty log message *** 2005-11-17 17:36 +0000 dockes (64437283f61f) * src/rcldb/rcldb.cpp: use OP_FILTER instead of OP_AND to filter on file types 2005-11-17 12:47 +0000 dockes (e9efe66d79c0) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/sampleconf/recoll.conf, src/utils/conftree.cpp, src/utils/conftree.h: allow tilde expansion for section names in config file 2005-11-16 18:31 +0000 dockes (e319e6fa047d) * src/qtgui/recollmain.ui.h: *** empty log message *** 2005-11-16 17:30 +0000 dockes (70dbf29f84e0) * src/excludefile: *** empty log message *** 2005-11-16 17:29 +0000 dockes (4c957598f6fd [RECOLL-1_0_6]) * src/mk/localdefs, src/rcldb/rcldb.cpp: use and_maybe in adv search 2005-11-16 15:07 +0000 dockes (a19870cd6761) * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/qtgui/main.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/sampleconf/mimeconf, src/sampleconf/recoll.conf: Optionnally show mime type icons in result list 2005-11-16 15:05 +0000 dockes (6464421540ca) * src/qtgui/mtpics/README, src/qtgui/mtpics/document.png, src/qtgui/mtpics/drawing.png, src/qtgui/mtpics/html.png, src/qtgui/mtpics/message.png, src/qtgui/mtpics/mozilla_doc.png, src/qtgui/mtpics/pdf.png, src/qtgui/mtpics/postscript.png, src/qtgui/mtpics/presentation.png, src/qtgui/mtpics/soffice.png, src/qtgui/mtpics/spreadsheet.png, src/qtgui/mtpics/txt.png, src/qtgui/mtpics/wordprocessing.png: new file. * src/qtgui/mtpics/README, src/qtgui/mtpics/document.png, src/qtgui/mtpics/drawing.png, src/qtgui/mtpics/html.png, src/qtgui/mtpics/message.png, src/qtgui/mtpics/mozilla_doc.png, src/qtgui/mtpics/pdf.png, src/qtgui/mtpics/postscript.png, src/qtgui/mtpics/presentation.png, src/qtgui/mtpics/soffice.png, src/qtgui/mtpics/spreadsheet.png, src/qtgui/mtpics/txt.png, src/qtgui/mtpics/wordprocessing.png: *** empty log message *** 2005-11-16 11:22 +0000 dockes (f29236269564) * src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h: Implemented better feedback during preview loading 2005-11-16 08:17 +0000 dockes (44b8c2233623) * src/Makefile, src/VERSION, src/qtgui/main.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recoll_fr.ts, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: about dialog, remember previous mainwin geometry 2005-11-14 09:59 +0000 dockes (f196f00bd521) * src/internfile/internfile.cpp, src/internfile/internfile.h, src/qtgui/recollmain.ui.h: fix rare case where indexed file could not be previewed because of change in file identification config param 2005-11-14 09:57 +0000 dockes (5610887cf602) * src/index/indexer.cpp: comment 2005-11-14 09:56 +0000 dockes (b6c7dd9504b9) * src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: stem expansion was never done for adv search 2005-11-12 14:36 +0000 dockes (87b02b667eef) * src/README, src/mk/Linux: *** empty log message *** 2005-11-12 14:33 +0000 dockes (5743f1558790) * src/mk/localdefs.in: typo 2005-11-12 14:31 +0000 dockes (0dd4948b5c2f) * src/Makefile, src/configure, src/configure.ac: more config tweaks 2005-11-12 14:24 +0000 dockes (6d47a227c1b2) * src/utils/conftree.cpp, src/utils/conftree.h, src/utils/debuglog.cpp, src/utils/debuglog.h: new file. * src/utils/conftree.cpp, src/utils/conftree.h, src/utils/debuglog.cpp, src/utils/debuglog.h: local versions of utility files 2005-11-12 14:23 +0000 dockes (c77e47fdc6fb) * src/Makefile: *** empty log message *** 2005-11-12 14:19 +0000 dockes (49499e32e341) * src/configure.ac, src/mk/localdefs, src/mk/localdefs.in: new file. * src/Makefile, src/configure, src/configure.ac, src/mk/Darwin, src/mk/FreeBSD, src/mk/Linux, src/mk/SunOS, src/mk/commondefs, src/mk/localdefs, src/mk/localdefs.in: introduced some autoconf 2005-11-12 11:26 +0000 dockes (b13e733c2796) * src/Makefile, src/bincimapmime/Makefile, src/common/Makefile, src/index/Makefile, src/lib/Makefile, src/mk/commondefs, src/qtgui/recoll.pro, src/query/Makefile, src/sampleconf/mimemap, src/utils/Makefile: cleaned-up makes 2005-11-10 08:47 +0000 dockes (06490e6e7dc1) * src/index/Makefile, src/index/indexer.cpp, src/index/indexer.h, src/index/mimetype.cpp, src/index/mimetype.h, src/internfile/internfile.cpp, src/sampleconf/recoll.conf: add config parameter to decide if we use the file command as a final step of mimetype identification 2005-11-10 08:46 +0000 dockes (d9a64999d22d) * src/sampleconf/mimeconf, src/sampleconf/mimemap: add .Z compressed files 2005-11-09 21:40 +0000 dockes (1dd753a59d1c) * src/sampleconf/mimemap: add .odt -> openoffice. Add .php and others to ignored types 2005-11-09 21:39 +0000 dockes (a8b54cf24c83) * src/common/rclinit.cpp: test cleanup and sigcleanup not zero for small uts that dont need this 2005-11-08 21:02 +0000 dockes (344fc56239c8) * src/internfile/internfile.cpp, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h: renamed MimeHandler::worker to mkDoc + comments for doxygen 2005-11-08 21:02 +0000 dockes (1ac76bfea47d) * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist, src/doc/prog/filters.txt, src/doc/prog/top.txt: new file. * packaging/FreeBSD/recoll/Makefile, packaging/FreeBSD/recoll/distinfo, packaging/FreeBSD/recoll/pkg- descr, packaging/FreeBSD/recoll/pkg-plist, src/doc/prog/Doxyfile, src/doc/prog/Makefile, src/doc/prog/filters.txt, src/doc/prog/top.txt: *** empty log message *** 2005-11-08 21:00 +0000 dockes (54bcdfd186f1) * src/doc/prog/Doxyfile, src/doc/prog/Makefile: new file. * src/doc/prog/Doxyfile, src/doc/prog/Makefile: *** empty log message *** 2005-11-07 15:52 +0000 dockes (a0bde5fbc55b [RECOLL-1_0_5]) * src/INSTALL, src/Makefile, src/README, src/excludefile, src/makesrcdist.sh, src/makestaticdist.sh: *** empty log message *** 2005-11-07 15:37 +0000 dockes (c6a8f5375981) * src/README: *** empty log message *** 2005-11-07 15:36 +0000 dockes (5ca00f4db306) * src/INSTALL, src/README: *** empty log message *** 2005-11-07 15:11 +0000 dockes (8ae633ae4194) * src/VERSION: *** empty log message *** 2005-11-07 15:06 +0000 dockes (6be191f54656) * src/Makefile, src/mk/commondefs, src/recollinstall: fixed installation script 2005-11-07 11:21 +0000 dockes (e48ddf065716) * src/VERSION: *** empty log message *** 2005-11-06 15:07 +0000 dockes (fef6e5d66e29 [RECOLL-1_05]) * src/qtgui/idxthread.cpp, src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/utils/base64.cpp: slightly better status printing while loading preview 2005-11-06 11:16 +0000 dockes (0fa0ac2c3e5b) * src/rcldb/pathhash.cpp, src/rcldb/pathhash.h, src/utils/base64.cpp, src/utils/base64.h, src/utils/md5.cpp, src/utils/md5.h: new file. * src/lib/Makefile, src/rcldb/pathhash.cpp, src/rcldb/pathhash.h, src/rcldb/rcldb.cpp, src/utils/base64.cpp, src/utils/base64.h, src/utils/md5.cpp, src/utils/md5.h, src/utils/mimeparse.cpp: limit path therm length through hashing 2005-11-05 15:30 +0000 dockes (eea6ede9ce9a) * src/INSTALL, src/README, src/VERSION: *** empty log message *** 2005-11-05 15:29 +0000 dockes (c99e6c9d50df) * src/rcldb/rcldb.cpp: debug message 2005-11-05 15:17 +0000 dockes (a3463f8f8c63) * src/mk/commondefs: unused def 2005-11-05 14:40 +0000 dockes (47c04f4507d0 [RECOLL-1_04]) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/rclinit.cpp, src/common/rclinit.h, src/index/indexer.cpp, src/index/recollindex.cpp, src/internfile/mh_mail.cpp, src/mk/SunOS, src/qtgui/main.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: separate file and document dates (mainly for email folders). Better check configuration at startup 2005-11-02 12:36 +0000 dockes (e0d52b43cd5c) * src/lib/Makefile, src/mk/commondefs: add def for RANLIB 2005-11-01 10:55 +0000 dockes (2b858432af00) * src/mk/Darwin: new file. * src/mk/Darwin: *** empty log message *** 2005-10-31 08:59 +0000 dockes (65fd4f89de80) * src/internfile/mh_mail.cpp, src/utils/mimeparse.cpp: fixed base64 decoding of email parts: str[x] = ch does not adjust length! and be more lenient with encoding errors 2005-10-22 13:10 +0000 dockes (9a5b142d31f3) * src/README: *** empty log message *** 2005-10-22 13:10 +0000 dockes (d5ccf5480db1 [RECOLL-1_03]) * src/VERSION, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: update status line when starting lengthy operations 2005-10-22 07:29 +0000 dockes (df8ad947685b) * src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: get clicks in res list to behave: drag->no click. dblclick->no single click 2005-10-22 05:35 +0000 dockes (c566d157cfd3) * src/qtgui/recoll_fr.ts: new file. * src/qtgui/main.cpp, src/qtgui/recoll.pro, src/qtgui/recoll_fr.ts: i8n 2005-10-21 15:45 +0000 dockes (34b797e01868) * src/mk/commondefs: new file. * src/mk/commondefs: *** empty log message *** 2005-10-21 15:41 +0000 dockes (08f9ad818cb3 [RECOLL-1_02]) * src/makestaticdist.sh, src/recollinstall: more verbosity in install 2005-10-21 15:22 +0000 dockes (aa642ead5a8e) * src/INSTALL: *** empty log message *** 2005-10-21 15:11 +0000 dockes (1c74d6d926b7) * src/INSTALL: *** empty log message *** 2005-10-21 14:14 +0000 dockes (662fe9bab837) * src/excludefile: *** empty log message *** 2005-10-21 14:11 +0000 dockes (1856de4bf3f6) * src/makestaticdist.sh: new file. * src/Makefile, src/makestaticdist.sh: static bin dists 2005-10-21 13:34 +0000 dockes (0c861c8b6029) * src/INSTALL, src/README: *** empty log message *** 2005-10-21 13:33 +0000 dockes (7256b6e4e2ff) * src/Makefile, src/excludefile, src/index/Makefile, src/makesrcdist.sh, src/mk/FreeBSD, src/mk/Linux, src/mk/SunOS, src/qtgui/recoll.pro: rearrange make includes+prepare bin static distrib 2005-10-21 12:15 +0000 dockes (a9773a1a4715) * src/unac/unac.c: fix args to iconv to get rid of warnings 2005-10-21 08:14 +0000 dockes (f50d252ec29b) * src/Makefile, src/VERSION, src/excludefile, src/mk/FreeBSD, src/mk/Linux, src/qtgui/preview/pvmain.cpp, src/utils/smallut.cpp: more small build tweaks. use mkdtemp if available 2005-10-20 16:20 +0000 dockes (b5fe53035720 [RECOLL-1_01]) * src/qtgui/advsearch.ui, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h: CR->search in advanced dialog. ^W close tab in preview 2005-10-20 15:42 +0000 dockes (a9e9ecfba2d2) * src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, src/filters/rclsoff, src/mk/SunOS: small fixes for SunOS 2005-10-20 12:17 +0000 dockes (bc70bba2564c) * src/README, src/makesrcdist.sh: *** empty log message *** 2005-10-20 12:17 +0000 dockes (4e8de2aee40d) * src/INSTALL, src/README: *** empty log message *** 2005-10-20 12:17 +0000 dockes (39b33b1f4e36) * src/INSTALL, src/README: *** empty log message *** 2005-10-20 12:16 +0000 dockes (45a324ad4baa) * src/INSTALL, src/README: *** empty log message *** 2005-10-20 12:16 +0000 dockes (73b1f99aef21) * src/INSTALL, src/README: *** empty log message *** 2005-10-20 12:12 +0000 dockes (b3a8d1bceb51) * src/INSTALL, src/README: *** empty log message *** 2005-10-20 11:38 +0000 dockes (5966cd48c62c) * src/sampleconf/recoll.conf: defaultlanguage->english 2005-10-20 11:33 +0000 dockes (4ba3bd42973e) * src/recollinstall: new file. * src/bincimapmime/Makefile, src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, src/filters/rclsoff, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/recollinstall: small installation tweaks 2005-10-20 08:34 +0000 dockes (8ce6cff4ca9c) * src/Makefile, src/VERSION, src/bincimapmime/Makefile, src/excludefile, src/lib/Makefile, src/mk/FreeBSD, src/qtgui/plaintorich.cpp, src/qtgui/preview/preview.ui.h, src/qtgui/recoll.pro: small warning and compilation adjustments 2005-10-20 07:51 +0000 dockes (b6f58b26d846 [RECOLL-1_0]) * src/configure: new file. * src/README, src/configure: *** empty log message *** 2005-10-19 16:29 +0000 dockes (46a91fdb7a8e) * src/INSTALL, src/README: *** empty log message *** 2005-10-19 16:27 +0000 dockes (92e16891b11d) * src/INSTALL: *** empty log message *** 2005-10-19 16:09 +0000 dockes (0dda1bd16921) * src/README, src/VERSION: *** empty log message *** 2005-10-19 15:22 +0000 dockes (88cadb2e703e) * src/qtgui/recollmain.ui: *** empty log message *** 2005-10-19 14:14 +0000 dockes (61cd7c267dec) * src/common/rclconfig.cpp, src/qtgui/advsearch.ui.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/idfile.cpp, src/utils/idfile.h: implemented filtering on file subtree 2005-10-19 10:21 +0000 dockes (598116a30bfb) * src/common/textsplit.cpp, src/common/textsplit.h, src/filters/rcldoc, src/filters/rclpdf, src/filters/rclps, src/filters/rclsoff, src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/main.cpp, src/qtgui/plaintorich.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: most of adv search working. Still need subtree/filename filters 2005-10-17 13:36 +0000 dockes (6ce40ecb81f6) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/utils/Makefile: implemented dialog/glue for advanced search 2005-10-15 12:18 +0000 dockes (b57626e188f9) * src/index/indexer.cpp, src/internfile/mh_mail.cpp, src/utils/mimeparse.cpp, src/utils/mimeparse.h: decode encoded mail headers, plus use message date instead of file mtime 2005-10-10 13:25 +0000 dockes (3797f12a0832) * src/common/textsplit.h: comments 2005-10-10 13:24 +0000 dockes (a339c123dcb9) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: ckpt 2005-10-10 12:29 +0000 dockes (e88bad1f996b) * src/qtgui/advsearch.ui, src/qtgui/main.cpp, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: ckpt 2005-09-27 06:20 +0000 dockes (8b147a42b660) * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: new file. * src/qtgui/preview/preview.pro, src/qtgui/preview/preview.ui, src/qtgui/preview/preview.ui.h, src/qtgui/preview/pvmain.cpp: *** empty log message *** 2005-09-26 16:17 +0000 dockes (783900fcd3e7) * src/qtgui/recoll.pro: *** empty log message *** 2005-09-22 16:22 +0000 dockes (1e6ccf2c2fdc) * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: new file. * src/qtgui/plaintorich.cpp, src/qtgui/plaintorich.h: *** empty log message *** 2005-09-22 15:00 +0000 dockes (db2d876f2a2b) * src/qtgui/recollmain.ui.h: *** empty log message *** 2005-09-22 14:09 +0000 dockes (4455c0eeffd4) * src/common/textsplit.cpp: adjust start/end of word when trimming 2005-09-22 11:10 +0000 dockes (3b9d4fc5b507) * src/common/textsplit.cpp: fix problems with word followed by . 2005-05-18 08:42 +0000 dockes (03bc1f1290cd) * src/qtgui/recoll.pro: *** empty log message *** 2005-05-17 11:46 +0000 dockes (cff6e901fde8) * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h: new file. * src/qtgui/advsearch.ui, src/qtgui/advsearch.ui.h, src/qtgui/recoll.pro: *** empty log message *** 2005-05-17 06:30 +0000 dockes (9a44703bd049 [RECOLL-0_7]) * src/README: *** empty log message *** 2005-05-17 06:30 +0000 dockes (d2265051082d) * src/qtgui/recollmain.ui.h: escape < to < in rich text 2005-04-08 07:32 +0000 dockes (3917ab1cc937) * src/README: *** empty log message *** 2005-04-08 07:32 +0000 dockes (2f2439c9590a) * src/mk/SunOS: new file. * src/Makefile, src/mk/SunOS, src/utils/Makefile: works on solaris8 2005-04-07 09:05 +0000 dockes (0264f1839b92) * src/utils/idfile.cpp, src/utils/idfile.h: new file. * src/index/mimetype.cpp, src/lib/Makefile, src/sampleconf/mimemap, src/utils/Makefile, src/utils/idfile.cpp, src/utils/idfile.h: replaced /usr/bin/file exec with internal code 2005-04-06 10:20 +0000 dockes (ba9162debe5a) * src/bincimapmime/AUTHORS, src/bincimapmime/COPYING: new file. * src/INSTALL, src/VERSION, src/bincimapmime/AUTHORS, src/bincimapmime/COPYING, src/bincimapmime/mime-inputsource.h, src/index/indexer.cpp, src/internfile/mh_mail.cpp, src/makesrcdist.sh, src/mk/FreeBSD, src/mk/Linux, src/qtgui/main.cpp, src/rcldb/rcldb.cpp, src/sampleconf/recoll.conf, src/utils/smallut.h, src/utils/wipedir.cpp: re-port to linux 2005-04-06 09:18 +0000 dockes (d8add828aa6b) * src/README: *** empty log message *** 2005-04-06 09:13 +0000 dockes (7d5759a43255) * src/README: *** empty log message *** 2005-04-05 09:35 +0000 dockes (6232ca052972) * src/common/rclinit.cpp, src/common/rclinit.h: new file. * src/common/rclinit.cpp, src/common/rclinit.h, src/index/mimetype.cpp, src/index/recollindex.cpp, src/internfile/internfile.cpp, src/internfile/mh_mail.cpp, src/lib/Makefile, src/qtgui/main.cpp, src/rcldb/rcldb.cpp, src/sampleconf/mimemap: *** empty log message *** 2005-04-04 13:18 +0000 dockes (e69c810eb5b1) * src/index/indexer.cpp, src/index/mimetype.cpp, src/internfile/mh_html.cpp, src/internfile/mh_mail.cpp, src/rcldb/rcldb.cpp, src/sampleconf/mimeconf, src/utils/fstreewalk.cpp, src/utils/fstreewalk.h: *** empty log message *** 2005-03-31 10:04 +0000 dockes (9428bb11ff77) * src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime.h, src/bincimapmime/trbinc.cc, src/common/rclconfig.cpp, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/rcldb/rcldb.cpp: mail handling 1st working version 2005-03-25 09:40 +0000 dockes (408a2650e963 [RECOLL-0_6]) * src/bincimapmime/00README.recoll, src/bincimapmime/trbinc.cc, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h: new file. * src/bincimapmime/00README.recoll, src/bincimapmime/mime- printbody.cc, src/bincimapmime/mime.h, src/bincimapmime/trbinc.cc, src/common/Makefile, src/index/Makefile, src/index/indexer.cpp, src/index/mimetype.cpp, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mh_mail.cpp, src/internfile/mh_mail.h, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/internfile/myhtmlparse.cpp, src/lib/Makefile, src/mk/FreeBSD, src/qtgui/recoll.pro, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.h, src/sampleconf/mimeconf, src/utils/mimeparse.cpp, src/utils/mimeparse.h: mail ckpt 2005-03-17 15:35 +0000 dockes (55a0c15039bf) * src/index/indexer.cpp, src/index/indexer.h, src/internfile/internfile.cpp, src/internfile/mh_html.h: only comments. Before multidoc files 2005-03-17 14:02 +0000 dockes (b1f57902f3c1) * src/bincimapmime/Makefile, src/bincimapmime/iodevice.cc, src/index/indexer.cpp, src/qtgui/recollmain.ui.h, src/sampleconf/mimeconf, src/utils/execmd.cpp, src/utils/execmd.h, src/utils/mimeparse.cpp, src/utils/smallut.cpp, src/utils/smallut.h, src/utils/utf8iter.h: checkpoint after long pause 2005-03-16 07:35 +0000 dockes (4d4d71cd89ea) * src/bincimapmime/Makefile, src/bincimapmime/address.cc, src/bincimapmime/address.h, src/bincimapmime/config.h, src/bincimapmime/convert.cc, src/bincimapmime/convert.h, src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.cc, src/bincimapmime/iofactory.h, src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/mime.h, src/bincimapmime/session.h: new file. * src/bincimapmime/Makefile, src/bincimapmime/address.cc, src/bincimapmime/address.h, src/bincimapmime/config.h, src/bincimapmime/convert.cc, src/bincimapmime/convert.h, src/bincimapmime/depot.h, src/bincimapmime/iodevice.cc, src/bincimapmime/iodevice.h, src/bincimapmime/iofactory.cc, src/bincimapmime/iofactory.h, src/bincimapmime/mime-getpart.cc, src/bincimapmime/mime-inputsource.h, src/bincimapmime/mime- parsefull.cc, src/bincimapmime/mime-parseonlyheader.cc, src/bincimapmime/mime-printbody.cc, src/bincimapmime/mime- printdoc.cc, src/bincimapmime/mime-printheader.cc, src/bincimapmime /mime-utils.h, src/bincimapmime/mime.cc, src/bincimapmime/mime.h, src/bincimapmime/session.h: initial import from bincimap-1.3.3 2005-02-11 11:48 +0000 dockes (7b2bdc5c6ed9) * src/README, src/makesrcdist.sh: *** empty log message *** 2005-02-11 11:48 +0000 dockes (ffca521040c2) * src/README: *** empty log message *** 2005-02-11 11:20 +0000 dockes (7c54c58f0fd1) * src/common/uproplist.h, src/utils/utf8testin.txt: new file. * src/common/textsplit.cpp, src/common/uproplist.h, src/utils/Makefile, src/utils/utf8iter.cpp, src/utils/utf8iter.h, src/utils/utf8testin.txt: improved word extraction a bit (unicode punctuation) 2005-02-10 19:52 +0000 dockes (ba4dd19f41c4) * src/utils/utf8iter.cpp, src/utils/utf8iter.h: new file. * src/common/textsplit.cpp, src/utils/Makefile, src/utils/utf8iter.cpp, src/utils/utf8iter.h: *** empty log message *** 2005-02-10 15:21 +0000 dockes (44892bfc8d49) * src/index/indexer.cpp, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/execmd.cpp, src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, src/utils/smallut.cpp, src/utils/smallut.h: implemented stem databases 2005-02-09 13:34 +0000 dockes (7517469a76b5) * src/index/Makefile, src/index/mimetype.cpp: *** empty log message *** 2005-02-09 12:07 +0000 dockes (e5d0612227af) * src/filters/rcldoc, src/filters/rclsoff, src/utils/wipedir.cpp, src/utils/wipedir.h: new file. * src/VERSION, src/filters/rcldoc, src/filters/rclsoff, src/index/indexer.cpp, src/index/mimetype.cpp, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/myhtmlparse.cpp, src/lib/Makefile, src/qtgui/main.cpp, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/sampleconf/mimeconf, src/sampleconf/mimemap, src/utils/Makefile, src/utils/smallut.cpp, src/utils/smallut.h, src/utils/wipedir.cpp, src/utils/wipedir.h: added support for openoffice and word + optimized decomp temp dir usage 2005-02-08 17:35 +0000 dockes (e5a6d4a27e1f) * src/INSTALL, src/README: *** empty log message *** 2005-02-08 15:08 +0000 dockes (f89783d5d828) * src/excludefile, src/makesrcdist.sh: new file. * src/README, src/excludefile, src/makesrcdist.sh: *** empty log message *** 2005-02-08 15:03 +0000 dockes (4ec10decb898) * src/README: *** empty log message *** 2005-02-08 14:55 +0000 dockes (07541712859f) * src/README: *** empty log message *** 2005-02-08 14:54 +0000 dockes (fa3ad0590138 [RECOLL-0_5]) * src/Makefile, src/README, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/sampleconf/recoll.conf: *** empty log message *** 2005-02-08 14:45 +0000 dockes (d04d78bb1af4) * src/INSTALL, src/internfile/myhtmlparse.cpp, src/qtgui/recoll.pro: *** empty log message *** 2005-02-08 11:59 +0000 dockes (b5f33d8a83cb) * src/common/textsplit.cpp, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: fixed next/prev screen pb + pb with accents when matching in preview 2005-02-08 10:56 +0000 dockes (ea8c32a3b71e) * src/common/textsplit.cpp, src/common/textsplit.h, src/rcldb/rcldb.cpp: phrases ok except for preview position 2005-02-08 09:34 +0000 dockes (8f72bd8ca147) * src/common/textsplit.cpp, src/common/textsplit.h, src/qtgui/recoll.pro, src/qtgui/recollmain.ui.h, src/query/xadump.cpp, src/rcldb/rcldb.cpp, src/utils/execmd.cpp: fixes in textsplit 2005-02-07 13:17 +0000 dockes (3e10d31a55a9) * src/common/textsplit.cpp, src/common/textsplit.h, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: simple term highlighting in query preview 2005-02-04 14:21 +0000 dockes (77a59732f8aa) * src/COPYING, src/INSTALL, src/README, src/VERSION, src/filters/rcluncomp, src/internfile/internfile.cpp, src/internfile/internfile.h, src/mk/Linux, src/qtgui/images/editcopy, src/qtgui/images/editcut, src/qtgui/images/editpaste, src/qtgui/images/filenew, src/qtgui/images/fileopen, src/qtgui/images/filesave, src/qtgui/images/print, src/qtgui/images/redo, src/qtgui/images/searchfind, src/qtgui/images/undo: new file. * src/COPYING, src/INSTALL, src/Makefile, src/README, src/VERSION, src/common/Makefile, src/common/unacpp.cpp, src/filters/rcluncomp, src/index/Makefile, src/index/csguess.cpp, src/index/indexer.cpp, src/internfile/internfile.cpp, src/internfile/internfile.h, src/internfile/mimehandler.cpp, src/lib/Makefile, src/mk/FreeBSD, src/mk/Linux, src/qtgui/idxthread.cpp, src/qtgui/images/editcopy, src/qtgui/images/editcut, src/qtgui/images/editpaste, src/qtgui/images/filenew, src/qtgui/images/fileopen, src/qtgui/images/filesave, src/qtgui/images/print, src/qtgui/images/redo, src/qtgui/images/searchfind, src/qtgui/images/undo, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/Makefile, src/rcldb/rcldb.cpp, src/utils/Makefile, src/utils/pathut.cpp, src/utils/transcode.cpp: uncompression+linux port 2005-02-04 09:39 +0000 dockes (482687ce34da) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/index/indexer.cpp, src/internfile/mh_html.cpp, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/lib/Makefile, src/qtgui/recollmain.ui.h, src/utils/smallut.cpp, src/utils/smallut.h: *** empty log message *** 2005-02-04 09:30 +0000 dockes (5fac5dd8a1c4) * src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/recoll.conf: *** empty log message *** 2005-02-04 09:21 +0000 dockes (2ad004ec5fd7) * src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/recoll.conf: new file. * src/sampleconf/mimeconf, src/sampleconf/mimemap, src/sampleconf/recoll.conf: *** empty log message *** 2005-02-02 17:57 +0000 dockes (4819b0b410e7) * src/filters/rclps: new file. * src/filters/rclps: *** empty log message *** 2005-02-01 17:52 +0000 dockes (023ac2c1c87f) * src/internfile/mimehandler.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp: *** empty log message *** 2005-02-01 17:20 +0000 dockes (4eb8337baa03) * src/filters/rclpdf, src/internfile/mh_html.h, src/mk/FreeBSD, src/qtgui/idxthread.h, src/qtgui/recoll.h: new file. * src/filters/rclpdf, src/index/indexer.cpp, src/internfile/mh_html.cpp, src/internfile/mh_html.h, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/lib/Makefile, src/mk/FreeBSD, src/qtgui/idxthread.h, src/qtgui/recoll.h, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/utils/Makefile, src/utils/execmd.cpp: added external filters and pdf handling 2005-02-01 08:42 +0000 dockes (b82908e25c6b) * src/common/Makefile, src/index/Makefile, src/index/recollindex.cpp, src/lib/Makefile, src/qtgui/idxthread.cpp, src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/Makefile, src/rcldb/rcldb.cpp, src/utils/Makefile: *** empty log message *** 2005-01-31 14:31 +0000 dockes (c8a32d0e0056) * src/index/indexer.cpp, src/qtgui/idxthread.cpp, src/utils/smallut.cpp, src/utils/smallut.h: new file. * src/common/rclconfig.cpp, src/index/indexer.cpp, src/index/indexer.h, src/index/recollindex.cpp, src/lib/Makefile, src/qtgui/idxthread.cpp, src/qtgui/main.cpp, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/qtry.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile, src/utils/pathut.cpp, src/utils/pathut.h, src/utils/smallut.cpp, src/utils/smallut.h: first incarnation of indexing thread 2005-01-29 15:41 +0000 dockes (3dd05c65d8ed) * src/index/recollindex.cpp, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/lib/Makefile, src/qtgui/main.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile: external viewer+ deleted doc purging 2005-01-28 15:25 +0000 dockes (8c6b04552a34) * src/Makefile, src/internfile/indextext.h: new file. * src/Makefile, src/internfile/indextext.h, src/internfile/myhtmlparse.cpp, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: ckpt 2005-01-28 09:37 +0000 dockes (bf2c00ad72d0) * src/internfile/mh_html.cpp, src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h, src/lib/Makefile, src/rcldb/rcldb.cpp: merged modifs from xapian/omega 0.8.5 2005-01-28 08:56 +0000 dockes (a5e2a08ce1b8) * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: import from xapian 0.8.5 2005-01-28 08:50 +0000 dockes (73f5b0ed50d8) * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: Initial recoll modifs for utf8 2005-01-28 08:46 +0000 dockes (04f0053d01e4) * src/internfile/mh_html.cpp, src/rcldb/rcldb.cpp: xapian 0.8.3 2005-01-28 08:45 +0000 dockes (ec7863976555) * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: new file. * src/internfile/myhtmlparse.cpp, src/internfile/myhtmlparse.h: *** empty log message *** 2005-01-28 08:41 +0000 dockes (c5c570040571) * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: new file. * src/internfile/htmlparse.cpp, src/internfile/htmlparse.h: xapian 0.8.3 2005-01-26 13:03 +0000 dockes (5a37e2aa9a53) * src/index/recollindex.cpp, src/internfile/mh_html.cpp, src/internfile/mimehandler.cpp, src/rcldb/rcldb.cpp: sort of indexes html 2005-01-26 11:47 +0000 dockes (eec829a74f2d) * src/internfile/mh_html.cpp: new file. * src/internfile/mh_html.cpp, src/internfile/mimehandler.cpp, src/internfile/mimehandler.h, src/lib/Makefile, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/qtry.cpp, src/rcldb/rcldb.cpp, src/utils/Makefile: ckpt 2005-01-26 11:45 +0000 dockes (1c17d5d56a6b) * src/utils/mimeparse.cpp, src/utils/mimeparse.h: new file. * src/utils/mimeparse.cpp, src/utils/mimeparse.h: mime header parsing embryo 2005-01-25 14:37 +0000 dockes (1d5b47c225bf) * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h: new file. * src/internfile/mimehandler.cpp, src/internfile/mimehandler.h: *** empty log message *** 2005-01-25 14:37 +0000 dockes (46d42849ee3a) * src/lib/Makefile, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h: new file. * src/common/Makefile, src/common/rclconfig.cpp, src/index/Makefile, src/index/indexer.h, src/index/recollindex.cpp, src/lib/Makefile, src/qtgui/main.cpp, src/qtgui/recoll.pro, src/qtgui/recollmain.ui, src/qtgui/recollmain.ui.h, src/query/Makefile, src/query/qtry.cpp, src/query/xadump.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile, src/utils/transcode.h: gui connected to rcldb (init) 2005-01-24 13:17 +0000 dockes (e0104075bdd3) * src/common/Makefile, src/index/Makefile, src/qtgui/form1.ui, src/qtgui/form1.ui.h, src/qtgui/main.cpp, src/query/qtry.cpp, src/query/qxtry.cpp, src/utils/Makefile: new file. * src/common/Makefile, src/common/rclconfig.cpp, src/common/textsplit.h, src/common/unacpp.cpp, src/index/Makefile, src/qtgui/form1.ui, src/qtgui/form1.ui.h, src/qtgui/main.cpp, src/query/Makefile, src/query/qtry.cpp, src/query/qxtry.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/Makefile: *** empty log message *** 2004-12-17 15:50 +0000 dockes (4f7a0a26f6d7) * src/query/xadump.cpp, src/rcldb/rcldb.cpp: very basic indexing working 2004-12-17 15:36 +0000 dockes (325aea11f893) * src/common/unacpp.cpp, src/common/unacpp.h: new file. * src/common/unacpp.cpp, src/common/unacpp.h, src/rcldb/rcldb.cpp: *** empty log message *** 2004-12-17 15:04 +0000 dockes (930a5f50b45e) * src/unac/AUTHORS, src/unac/COPYING, src/unac/README, src/unac/README.recoll, src/unac/unac.c, src/unac/unac.h: new file. * src/unac/AUTHORS, src/unac/COPYING, src/unac/README, src/unac/README.recoll, src/unac/unac.c, src/unac/unac.h: unac 1.7.0 2004-12-17 13:01 +0000 dockes (70ded59ba246) * src/query/Makefile, src/query/xadump.cpp: new file. * src/common/rclconfig.h, src/common/textsplit.cpp, src/common/textsplit.h, src/index/recollindex.cpp, src/query/Makefile, src/query/xadump.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h: *** empty log message *** 2004-12-15 15:00 +0000 dockes (1e3483587b45) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/textsplit.cpp, src/index/csguess.cpp, src/index/csguess.h, src/index/indexer.h, src/index/mimetype.cpp, src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/transcode.cpp: warnings cleanup 2004-12-15 09:43 +0000 dockes (502752de59d5) * src/utils/transcode.cpp, src/utils/transcode.h: new file. * src/utils/transcode.cpp, src/utils/transcode.h: *** empty log message *** 2004-12-15 08:21 +0000 dockes (520f5e294f10) * src/index/csguess.cpp, src/index/csguess.h: new file. * src/index/csguess.cpp, src/index/csguess.h: just converted (indent+comments) from estraier 2004-12-14 17:54 +0000 dockes (12a23501eee8) * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/textsplit.h, src/index/indexer.h, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/readfile.cpp, src/utils/readfile.h: new file. * src/common/rclconfig.cpp, src/common/rclconfig.h, src/common/textsplit.cpp, src/common/textsplit.h, src/index/indexer.h, src/index/mimetype.cpp, src/index/mimetype.h, src/index/recollindex.cpp, src/rcldb/rcldb.cpp, src/rcldb/rcldb.h, src/utils/execmd.cpp, src/utils/pathut.cpp, src/utils/pathut.h, src/utils/readfile.cpp, src/utils/readfile.h: *** empty log message *** 2004-12-13 15:42 +0000 dockes (8c1fce132f19) * src/common/textsplit.cpp, src/index/mimetype.cpp, src/index/mimetype.h, src/index/recollindex.cpp: new file. * src/common/textsplit.cpp, src/index/mimetype.cpp, src/index/mimetype.h, src/index/recollindex.cpp: *** empty log message *** 2004-12-12 08:58 +0000 dockes (17a132340425) * src/utils/execmd.cpp, src/utils/execmd.h: new file. * src/utils/execmd.cpp, src/utils/execmd.h, src/utils/fstreewalk.cpp: *** empty log message *** 2004-12-10 18:13 +0000 dockes (1de12131e4a4) * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, src/utils/pathut.cpp, src/utils/pathut.h: new file. * src/utils/fstreewalk.cpp, src/utils/fstreewalk.h, src/utils/pathut.cpp, src/utils/pathut.h: *** empty log message *** 2004-12-10 18:13 +0000 unknown (318176766db7) * Standard project directories initialized by cvs2svn. recoll-1.23.7/common/0000755000175000017500000000000013224670234011360 500000000000000recoll-1.23.7/common/rclinit.cpp0000644000175000017500000002744313224431017013454 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #ifdef _WIN32 #include "safewindows.h" #endif #include #include #include #if !defined(PUTENV_ARG_CONST) #include #endif #include #include "log.h" #include "rclconfig.h" #include "rclinit.h" #include "pathut.h" #include "rclutil.h" #include "unac.h" #include "smallut.h" #include "execmd.h" std::thread::id mainthread_id; // Signal etc. processing. We want to be able to properly close the // index if we are currently writing to it. // // This is active if the sigcleanup parameter to recollinit is set, // which only recollindex does. We arrange for the handler to be // called when process termination is requested either by the system // or a user keyboard intr. // // The recollindex handler just sets a global termination flag (plus // the cancelcheck thing), which are tested in all timeout loops // etc. When the flag is seen, the main thread processing returns, and // recollindex calls exit(). // // The other parameter, to recollinit(), cleanup, is set as an // atexit() routine, it does the job of actually signalling the // workers to stop and tidy up. It's automagically called by exit(). #ifndef _WIN32 static void siglogreopen(int) { if (recoll_ismainthread()) Logger::getTheLog("")->reopen(""); } // We would like to block SIGCHLD globally, but we can't because // QT uses it. Have to block it inside execmd.cpp static const int catchedSigs[] = {SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2}; void initAsyncSigs(void (*sigcleanup)(int)) { // We ignore SIGPIPE always. All pieces of code which can write to a pipe // must check write() return values. signal(SIGPIPE, SIG_IGN); // Install app signal handler if (sigcleanup) { struct sigaction action; action.sa_handler = sigcleanup; action.sa_flags = 0; sigemptyset(&action.sa_mask); for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) { if (sigaction(catchedSigs[i], &action, 0) < 0) { perror("Sigaction failed"); } } } // Install log rotate sig handler { struct sigaction action; action.sa_handler = siglogreopen; action.sa_flags = 0; sigemptyset(&action.sa_mask); if (signal(SIGHUP, SIG_IGN) != SIG_IGN) { if (sigaction(SIGHUP, &action, 0) < 0) { perror("Sigaction failed"); } } } } void recoll_exitready() { } #else // _WIN32 -> // Windows signals etc. // // ^C can be caught by the signal() emulation, but not ^Break // apparently, which is why we use the native approach too // // When a keyboard interrupt occurs, windows creates a thread inside // the process and calls the handler. The process exits when the // handler returns or after at most 10S // // This should also work, with different signals (CTRL_LOGOFF_EVENT, // CTRL_SHUTDOWN_EVENT) when the user exits or the system shuts down). // // Unfortunately, this is not the end of the story. It seems that in // recent Windows version "some kinds" of apps will not reliably // receive the signals. "Some kind" is variably defined, for example a // simple test program works when built with vs 2015, but not // mingw. See the following discussion thread for tentative // explanations, it seems that importing or not from user32.dll is the // determining factor. // https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/abf09824-4e4c-4f2c-ae1e-5981f06c9c6e/windows-7-console-application-has-no-way-of-trapping-logoffshutdown-event?forum=windowscompatibility // In any case, it appears that the only reliable way to be advised of // system shutdown or user exit is to create an "invisible window" and // process window messages, which we now do. static void (*l_sigcleanup)(int); static HANDLE eWorkFinished = INVALID_HANDLE_VALUE; static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType) { LOGDEB("CtrlHandler\n" ); if (l_sigcleanup == 0) return FALSE; switch(fdwCtrlType) { case CTRL_C_EVENT: case CTRL_CLOSE_EVENT: case CTRL_BREAK_EVENT: case CTRL_LOGOFF_EVENT: case CTRL_SHUTDOWN_EVENT: { l_sigcleanup(SIGINT); LOGDEB0("CtrlHandler: waiting for exit ready\n" ); DWORD res = WaitForSingleObject(eWorkFinished, INFINITE); if (res != WAIT_OBJECT_0) { LOGERR("CtrlHandler: exit ack wait failed\n" ); } LOGDEB0("CtrlHandler: got exit ready event, exiting\n" ); return TRUE; } default: return FALSE; } } LRESULT CALLBACK MainWndProc(HWND hwnd , UINT msg , WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_QUERYENDSESSION: case WM_ENDSESSION: case WM_DESTROY: case WM_CLOSE: { l_sigcleanup(SIGINT); LOGDEB("MainWndProc: got end message, waiting for work finished\n" ); DWORD res = WaitForSingleObject(eWorkFinished, INFINITE); if (res != WAIT_OBJECT_0) { LOGERR("MainWndProc: exit ack wait failed\n" ); } LOGDEB("MainWindowProc: got exit ready event, exiting\n" ); return TRUE; } default: return DefWindowProc(hwnd, msg, wParam, lParam); } return TRUE; } bool CreateInvisibleWindow() { HWND hwnd; WNDCLASS wc = {0}; wc.lpfnWndProc = (WNDPROC)MainWndProc; wc.hInstance = GetModuleHandle(NULL); wc.hIcon = LoadIcon(GetModuleHandle(NULL), "TestWClass"); wc.lpszClassName = "TestWClass"; RegisterClass(&wc); hwnd = CreateWindowEx(0, "TestWClass", "TestWClass", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, (HWND) NULL, (HMENU) NULL, GetModuleHandle(NULL), (LPVOID) NULL); if (!hwnd) { return FALSE; } return TRUE; } DWORD WINAPI RunInvisibleWindowThread(LPVOID lpParam) { MSG msg; CreateInvisibleWindow(); while (GetMessage(&msg, (HWND) NULL , 0 , 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; } static const int catchedSigs[] = {SIGINT, SIGTERM}; void initAsyncSigs(void (*sigcleanup)(int)) { DWORD tid; // Install app signal handler if (sigcleanup) { l_sigcleanup = sigcleanup; for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) { if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) { signal(catchedSigs[i], sigcleanup); } } } HANDLE hInvisiblethread = CreateThread(NULL, 0, RunInvisibleWindowThread, NULL, 0, &tid); SetConsoleCtrlHandler((PHANDLER_ROUTINE)CtrlHandler, TRUE); eWorkFinished = CreateEvent(NULL, TRUE, FALSE, NULL); if (eWorkFinished == INVALID_HANDLE_VALUE) { LOGERR("initAsyncSigs: error creating exitready event\n" ); } } void recoll_exitready() { LOGDEB("recoll_exitready()\n" ); if (!SetEvent(eWorkFinished)) { LOGERR("recoll_exitready: SetEvent failed\n" ); } } #endif RclConfig *recollinit(RclInitFlags flags, void (*cleanup)(void), void (*sigcleanup)(int), string &reason, const string *argcnf) { if (cleanup) atexit(cleanup); // Make sure the locale is set. This is only for converting file names // to utf8 for indexing. setlocale(LC_CTYPE, ""); Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); initAsyncSigs(sigcleanup); RclConfig *config = new RclConfig(argcnf); if (!config || !config->ok()) { reason = "Configuration could not be built:\n"; if (config) reason += config->getReason(); else reason += "Out of memory ?"; return 0; } // Retrieve the log file name and level. Daemon and batch indexing // processes may use specific values, else fall back on common // ones. string logfilename, loglevel; if (flags & RCLINIT_DAEMON) { config->getConfParam(string("daemlogfilename"), logfilename); config->getConfParam(string("daemloglevel"), loglevel); } if ((flags & RCLINIT_IDX) && logfilename.empty()) config->getConfParam(string("idxlogfilename"), logfilename); if ((flags & RCLINIT_IDX) && loglevel.empty()) config->getConfParam(string("idxloglevel"), loglevel); if (logfilename.empty()) config->getConfParam(string("logfilename"), logfilename); if (loglevel.empty()) config->getConfParam(string("loglevel"), loglevel); // Initialize logging if (!logfilename.empty()) { logfilename = path_tildexpand(logfilename); // If not an absolute path or , compute relative to config dir if (!path_isabsolute(logfilename) && logfilename.compare("stderr")) { logfilename = path_cat(config->getConfDir(), logfilename); } Logger::getTheLog("")->reopen(logfilename); } if (!loglevel.empty()) { int lev = atoi(loglevel.c_str()); Logger::getTheLog("")->setLogLevel(Logger::LogLevel(lev)); } LOGINF("Configuration directory: " << config->getConfDir() << std::endl); // Make sure the locale charset is initialized (so that multiple // threads don't try to do it at once). config->getDefCharset(); mainthread_id = std::this_thread::get_id(); // Init smallut and pathut static values pathut_init_mt(); smallut_init_mt(); rclutil_init_mt(); // Init execmd.h static PATH and PATHELT splitting {string bogus; ExecCmd::which("nosuchcmd", bogus); } // Init Unac translation exceptions string unacex; if (config->getConfParam("unac_except_trans", unacex) && !unacex.empty()) unac_set_except_translations(unacex.c_str()); #ifndef IDX_THREADS ExecCmd::useVfork(true); #else // Keep threads init behind log init, but make sure it's done before // we do the vfork choice ! The latter is not used any more actually, // we always use vfork except if forbidden by config. if ((flags & RCLINIT_IDX)) { config->initThrConf(); } bool novfork; config->getConfParam("novfork", &novfork); if (novfork) { LOGDEB0("rclinit: will use fork() for starting commands\n" ); ExecCmd::useVfork(false); } else { LOGDEB0("rclinit: will use vfork() for starting commands\n" ); ExecCmd::useVfork(true); } #endif int flushmb; if (config->getConfParam("idxflushmb", &flushmb) && flushmb > 0) { LOGDEB1("rclinit: idxflushmb=" << (flushmb) << ", set XAPIAN_FLUSH_THRESHOLD to 10E6\n" ); static const char *cp = "XAPIAN_FLUSH_THRESHOLD=1000000"; #ifdef PUTENV_ARG_CONST ::putenv(cp); #else ::putenv(strdup(cp)); #endif } return config; } // Signals are handled by the main thread. All others should call this // routine to block possible signals void recoll_threadinit() { #ifndef _WIN32 sigset_t sset; sigemptyset(&sset); for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) sigaddset(&sset, catchedSigs[i]); sigaddset(&sset, SIGHUP); pthread_sigmask(SIG_BLOCK, &sset, 0); #else // Not sure that this is needed at all or correct under windows. for (unsigned int i = 0; i < sizeof(catchedSigs) / sizeof(int); i++) { if (signal(catchedSigs[i], SIG_IGN) != SIG_IGN) { signal(catchedSigs[i], SIG_IGN); } } #endif } bool recoll_ismainthread() { return std::this_thread::get_id() == mainthread_id; } recoll-1.23.7/common/syngroups.h0000644000175000017500000000256113125527323013526 00000000000000/* Copyright (C) 2015 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SYNGROUPS_H_INCLUDED_ #define _SYNGROUPS_H_INCLUDED_ #include #include // Manage synonym groups. This is very different from stemming and // case/diac expansion because there is no reference form: all terms // in a group are equivalent. class SynGroups { public: SynGroups(); ~SynGroups(); bool setfile(const std::string& fname); std::vector getgroup(const std::string& term); bool ok(); private: class Internal; Internal *m; SynGroups(const SynGroups&); SynGroups& operator=(const SynGroups&); }; #endif /* _SYNGROUPS_H_INCLUDED_ */ recoll-1.23.7/common/cstr.cpp0000644000175000017500000000013213125527323012753 00000000000000 #include "cstr.h" #define RCLIN_CSTR_CPPFILE #undef _CSTR_H_INCLUDED_ #include "cstr.h" recoll-1.23.7/common/rclversion.h.in0000644000175000017500000000006313125527323014243 00000000000000static const char *rclversionstr = "@RCLVERSION@"; recoll-1.23.7/common/rclconfig.cpp0000644000175000017500000015054313224431525013760 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_RCLCONFIG #include "autoconfig.h" #include #include #ifndef _WIN32 #include #include #else #include "wincodepages.h" #endif #include #include "safesysstat.h" #include "safeunistd.h" #ifdef __FreeBSD__ #include #endif #include #include #include #include #include #include #include "cstr.h" #include "pathut.h" #include "rclutil.h" #include "rclconfig.h" #include "conftree.h" #include "log.h" #include "smallut.h" #include "textsplit.h" #include "readfile.h" #include "fstreewalk.h" #include "cpuconf.h" #include "execmd.h" using namespace std; // Static, logically const, RclConfig members are initialized once from the // first object build during process initialization. // We default to a case- and diacritics-less index for now bool o_index_stripchars = true; bool o_uptodate_test_use_mtime = false; string RclConfig::o_localecharset; string RclConfig::o_origcwd; // Compute the difference of 1st to 2nd sets and return as plus/minus // sets. Some args are std::set and some others stringToString() // strings for convenience void RclConfig::setPlusMinus(const string& sbase, const set& upd, string& splus, string& sminus) { set base; stringToStrings(sbase, base); vector diff; auto it = set_difference(base.begin(), base.end(), upd.begin(), upd.end(), std::inserter(diff, diff.begin())); sminus = stringsToString(diff); diff.clear(); it = set_difference(upd.begin(), upd.end(), base.begin(), base.end(), std::inserter(diff, diff.begin())); splus = stringsToString(diff); } /* Compute result of substracting strminus and adding strplus to base string. All string represent sets of values to be computed with stringToStrings() */ static void computeBasePlusMinus(set& res, const string& strbase, const string& strplus, const string& strminus) { set plus, minus; res.clear(); stringToStrings(strbase, res); stringToStrings(strplus, plus); stringToStrings(strminus, minus); for (auto& it : minus) { auto it1 = res.find(it); if (it1 != res.end()) { res.erase(it1); } } for (auto& it : plus) { res.insert(it); } } bool ParamStale::needrecompute() { LOGDEB1("ParamStale:: needrecompute. parent gen " << parent->m_keydirgen << " mine " << savedkeydirgen << "\n"); if (!conffile) { LOGDEB("ParamStale::needrecompute: conffile not set\n"); return false; } bool needrecomp = false; if (active && parent->m_keydirgen != savedkeydirgen) { savedkeydirgen = parent->m_keydirgen; for (unsigned int i = 0; i < paramnames.size(); i++) { string newvalue; conffile->get(paramnames[i], newvalue, parent->m_keydir); LOGDEB1("ParamStale::needrecompute: " << paramnames[i] << " -> " << newvalue << " keydir " << parent->m_keydir << endl); if (newvalue.compare(savedvalues[i])) { savedvalues[i] = newvalue; needrecomp = true; } } } return needrecomp; } const string& ParamStale::getvalue(unsigned int i) const { if (i < savedvalues.size()) { return savedvalues[i]; } else { static string nll; return nll; } } void ParamStale::init(ConfNull *cnf) { conffile = cnf; active = false; if (conffile) { for (auto& nm : paramnames) { if (conffile->hasNameAnywhere(nm)) { active = true; break; } } } savedkeydirgen = -1; } bool RclConfig::isDefaultConfig() const { string defaultconf = path_cat(path_homedata(), path_defaultrecollconfsubdir()); path_catslash(defaultconf); string specifiedconf = path_canon(m_confdir); path_catslash(specifiedconf); return !defaultconf.compare(specifiedconf); } RclConfig::RclConfig(const RclConfig &r) : m_oldstpsuffstate(this, "recoll_noindex"), m_stpsuffstate(this, {"noContentSuffixes", "noContentSuffixes+", "noContentSuffixes-"}), m_skpnstate(this, {"skippedNames", "skippedNames+", "skippedNames-"}), m_rmtstate(this, "indexedmimetypes"), m_xmtstate(this, "excludedmimetypes"), m_mdrstate(this, "metadatacmds") { initFrom(r); } RclConfig::RclConfig(const string *argcnf) : m_oldstpsuffstate(this, "recoll_noindex"), m_stpsuffstate(this, {"noContentSuffixes", "noContentSuffixes+", "noContentSuffixes-"}), m_skpnstate(this, {"skippedNames", "skippedNames+", "skippedNames-"}), m_rmtstate(this, "indexedmimetypes"), m_xmtstate(this, "excludedmimetypes"), m_mdrstate(this, "metadatacmds") { zeroMe(); if (o_origcwd.empty()) { char buf[MAXPATHLEN]; if (getcwd(buf, MAXPATHLEN)) { o_origcwd = string(buf); } else { fprintf(stderr, "recollxx: can't retrieve current working " "directory: relative path translations will fail\n"); } } // Compute our data dir name, typically /usr/local/share/recoll m_datadir = path_pkgdatadir(); // We only do the automatic configuration creation thing for the default // config dir, not if it was specified through -c or RECOLL_CONFDIR bool autoconfdir = false; // Command line config name overrides environment if (argcnf && !argcnf->empty()) { m_confdir = path_absolute(*argcnf); if (m_confdir.empty()) { m_reason = string("Cant turn [") + *argcnf + "] into absolute path"; return; } } else { const char *cp = getenv("RECOLL_CONFDIR"); if (cp) { m_confdir = path_canon(cp); } else { autoconfdir = true; m_confdir=path_cat(path_homedata(), path_defaultrecollconfsubdir()); } } // Note: autoconfdir and isDefaultConfig() are normally the same. We just // want to avoid the imperfect test in isDefaultConfig() if we actually know // this is the default conf if (!autoconfdir && !isDefaultConfig()) { if (!path_exists(m_confdir)) { m_reason = "Explicitly specified configuration " "directory must exist" " (won't be automatically created). Use mkdir first"; return; } } if (!path_exists(m_confdir)) { if (!initUserConfig()) return; } // This can't change once computed inside a process. It would be // nicer to move this to a static class initializer to avoid // possible threading issues but this doesn't work (tried) as // things would not be ready. In practise we make sure that this // is called from the main thread at once, by constructing a config // from recollinit if (o_localecharset.empty()) { #ifndef _WIN32 const char *cp; cp = nl_langinfo(CODESET); // We don't keep US-ASCII. It's better to use a superset // Ie: me have a C locale and some french file names, and I // can't imagine a version of iconv that couldn't translate // from iso8859? // The 646 thing is for solaris. if (cp && *cp && strcmp(cp, "US-ASCII") #ifdef sun && strcmp(cp, "646") #endif ) { o_localecharset = string(cp); } else { // Use cp1252 instead of iso-8859-1, it's a superset. o_localecharset = string(cstr_cp1252); } #else o_localecharset = winACPName(); #endif LOGDEB1("RclConfig::getDefCharset: localecharset [" << o_localecharset << "]\n"); } const char *cp; // Additional config directory, values override user ones if ((cp = getenv("RECOLL_CONFTOP"))) { m_cdirs.push_back(cp); } // User config m_cdirs.push_back(m_confdir); // Additional config directory, overrides system's, overridden by user's if ((cp = getenv("RECOLL_CONFMID"))) { m_cdirs.push_back(cp); } // Base/installation config m_cdirs.push_back(path_cat(m_datadir, "examples")); string cnferrloc; for (vector::const_iterator it = m_cdirs.begin(); it != m_cdirs.end(); it++) { if (it != m_cdirs.begin()) cnferrloc += string(" or "); cnferrloc += *it; } // Read and process "recoll.conf" if (!updateMainConfig()) return; // Other files mimemap = new ConfStack("mimemap", m_cdirs, true); if (mimemap == 0 || !mimemap->ok()) { m_reason = string("No or bad mimemap file in: ") + cnferrloc; return; } mimeconf = new ConfStack("mimeconf", m_cdirs, true); if (mimeconf == 0 || !mimeconf->ok()) { m_reason = string("No/bad mimeconf in: ") + cnferrloc; return; } mimeview = new ConfStack("mimeview", m_cdirs, false); if (mimeview == 0) mimeview = new ConfStack("mimeview", m_cdirs, true); if (mimeview == 0 || !mimeview->ok()) { m_reason = string("No/bad mimeview in: ") + cnferrloc; return; } if (!readFieldsConfig(cnferrloc)) return; // Default is no threading m_thrConf = {{-1, 0}, {-1, 0}, {-1, 0}}; m_ptrans = new ConfSimple(path_cat(m_confdir, "ptrans").c_str()); m_ok = true; setKeyDir(cstr_null); initParamStale(m_conf, mimemap); return; } bool RclConfig::updateMainConfig() { ConfStack *newconf = new ConfStack("recoll.conf", m_cdirs, true); if (newconf == 0 || !newconf->ok()) { if (m_conf) return false; string where; stringsToString(m_cdirs, where); m_reason = string("No/bad main configuration file in: ") + where; m_ok = false; initParamStale(0, 0); return false; } delete m_conf; m_conf = newconf; initParamStale(m_conf, mimemap); setKeyDir(cstr_null); bool bvalue = false; if (getConfParam("nocjk", &bvalue) && bvalue == true) { TextSplit::cjkProcessing(false); } else { int ngramlen; if (getConfParam("cjkngramlen", &ngramlen)) { TextSplit::cjkProcessing(true, (unsigned int)ngramlen); } else { TextSplit::cjkProcessing(true); } } bvalue = false; if (getConfParam("nonumbers", &bvalue) && bvalue == true) { TextSplit::noNumbers(); } bvalue = false; if (getConfParam("dehyphenate", &bvalue)) { TextSplit::deHyphenate(bvalue); } bvalue = true; if (getConfParam("skippedPathsFnmPathname", &bvalue) && bvalue == false) { FsTreeWalker::setNoFnmPathname(); } static int m_index_stripchars_init = 0; if (!m_index_stripchars_init) { getConfParam("indexStripChars", &o_index_stripchars); getConfParam("testmodifusemtime", &o_uptodate_test_use_mtime); m_index_stripchars_init = 1; } if (getConfParam("cachedir", m_cachedir)) { m_cachedir = path_canon(path_tildexpand(m_cachedir)); } return true; } ConfNull *RclConfig::cloneMainConfig() { ConfNull *conf = new ConfStack("recoll.conf", m_cdirs, false); if (conf == 0 || !conf->ok()) { m_reason = string("Can't read config"); return 0; } return conf; } // Remember what directory we're under (for further conf->get()s), and // prefetch a few common values. void RclConfig::setKeyDir(const string &dir) { if (!dir.compare(m_keydir)) return; m_keydirgen++; m_keydir = dir; if (m_conf == 0) return; if (!m_conf->get("defaultcharset", m_defcharset, m_keydir)) m_defcharset.erase(); } bool RclConfig::getConfParam(const string &name, int *ivp, bool shallow) const { string value; if (!getConfParam(name, value, shallow)) return false; errno = 0; long lval = strtol(value.c_str(), 0, 0); if (lval == 0 && errno) return 0; if (ivp) *ivp = int(lval); return true; } bool RclConfig::getConfParam(const string &name, bool *bvp, bool shallow) const { if (!bvp) return false; *bvp = false; string s; if (!getConfParam(name, s, shallow)) return false; *bvp = stringToBool(s); return true; } bool RclConfig::getConfParam(const string &name, vector *svvp, bool shallow) const { if (!svvp) return false; svvp->clear(); string s; if (!getConfParam(name, s, shallow)) return false; return stringToStrings(s, *svvp); } bool RclConfig::getConfParam(const string &name, unordered_set *out, bool shallow) const { vector v; if (!out || !getConfParam(name, &v, shallow)) { return false; } out->clear(); out->insert(v.begin(), v.end()); return true; } bool RclConfig::getConfParam(const string &name, vector *vip, bool shallow) const { if (!vip) return false; vip->clear(); vector vs; if (!getConfParam(name, &vs, shallow)) return false; vip->reserve(vs.size()); for (unsigned int i = 0; i < vs.size(); i++) { char *ep; vip->push_back(strtol(vs[i].c_str(), &ep, 0)); if (ep == vs[i].c_str()) { LOGDEB("RclConfig::getConfParam: bad int value in [" << name << "]\n"); return false; } } return true; } void RclConfig::initThrConf() { // Default is no threading m_thrConf = {{-1, 0}, {-1, 0}, {-1, 0}}; vector vq; vector vt; if (!getConfParam("thrQSizes", &vq)) { LOGINFO("RclConfig::initThrConf: no thread info (queues)\n"); goto out; } // If the first queue size is 0, autoconf is requested. if (vq.size() > 0 && vq[0] == 0) { CpuConf cpus; if (!getCpuConf(cpus) || cpus.ncpus < 1) { LOGERR("RclConfig::initThrConf: could not retrieve cpu conf\n"); cpus.ncpus = 1; } if (cpus.ncpus != 1) { LOGDEB("RclConfig::initThrConf: autoconf requested. " << cpus.ncpus << " concurrent threads available.\n"); } // Arbitrarily set threads config based on number of CPUS. This also // depends on the IO setup actually, so we're bound to be wrong... if (cpus.ncpus == 1) { // Somewhat counter-intuitively (because of possible IO//) // it seems that the best config here is no threading } else if (cpus.ncpus < 4) { // Untested so let's guess... m_thrConf = {{2, 2}, {2, 2}, {2, 1}}; } else if (cpus.ncpus < 6) { m_thrConf = {{2, 4}, {2, 2}, {2, 1}}; } else { m_thrConf = {{2, 5}, {2, 3}, {2, 1}}; } goto out; } else if (vq.size() > 0 && vq[0] < 0) { // threads disabled by config goto out; } if (!getConfParam("thrTCounts", &vt) ) { LOGINFO("RclConfig::initThrConf: no thread info (threads)\n"); goto out; } if (vq.size() != 3 || vt.size() != 3) { LOGINFO("RclConfig::initThrConf: bad thread info vector sizes\n"); goto out; } // Normal case: record info from config m_thrConf.clear(); for (unsigned int i = 0; i < 3; i++) { m_thrConf.push_back({vq[i], vt[i]}); } out: ostringstream sconf; for (unsigned int i = 0; i < 3; i++) { sconf << "(" << m_thrConf[i].first << ", " << m_thrConf[i].second << ") "; } LOGDEB("RclConfig::initThrConf: chosen config (ql,nt): " << sconf.str() << "\n"); } pair RclConfig::getThrConf(ThrStage who) const { if (m_thrConf.size() != 3) { LOGERR("RclConfig::getThrConf: bad data in rclconfig\n"); return pair(-1,-1); } return m_thrConf[who]; } vector RclConfig::getTopdirs() const { vector tdl; if (!getConfParam("topdirs", &tdl)) { LOGERR("RclConfig::getTopdirs: no top directories in config or " "bad list format\n"); return tdl; } for (vector::iterator it = tdl.begin(); it != tdl.end(); it++) { *it = path_tildexpand(*it); *it = path_canon(*it); } return tdl; } const string& RclConfig::getLocaleCharset() { return o_localecharset; } // Get charset to be used for transcoding to utf-8 if unspecified by doc // For document contents: // If defcharset was set (from the config or a previous call, this // is done in setKeydir), use it. // Else, try to guess it from the locale // Use cp1252 (as a superset of iso8859-1) as ultimate default // // For filenames, same thing except that we do not use the config file value // (only the locale). const string& RclConfig::getDefCharset(bool filename) const { if (filename) { return o_localecharset; } else { return m_defcharset.empty() ? o_localecharset : m_defcharset; } } // Get all known document mime values. We get them from the mimeconf // 'index' submap. // It's quite possible that there are other mime types in the index // (defined in mimemap and not mimeconf, or output by "file -i"). We // just ignore them, because there may be myriads, and their contents // are not indexed. // // This unfortunately means that searches by file names and mime type // filtering don't work well together. vector RclConfig::getAllMimeTypes() const { return mimeconf ? mimeconf->getNames("index") : vector(); } // Things for suffix comparison. We define a string class and string // comparison with suffix-only sensitivity class SfString { public: SfString(const string& s) : m_str(s) {} bool operator==(const SfString& s2) { string::const_reverse_iterator r1 = m_str.rbegin(), re1 = m_str.rend(), r2 = s2.m_str.rbegin(), re2 = s2.m_str.rend(); while (r1 != re1 && r2 != re2) { if (*r1 != *r2) { return 0; } ++r1; ++r2; } return 1; } string m_str; }; class SuffCmp { public: int operator()(const SfString& s1, const SfString& s2) { //cout << "Comparing " << s1.m_str << " and " << s2.m_str << endl; string::const_reverse_iterator r1 = s1.m_str.rbegin(), re1 = s1.m_str.rend(), r2 = s2.m_str.rbegin(), re2 = s2.m_str.rend(); while (r1 != re1 && r2 != re2) { if (*r1 != *r2) { return *r1 < *r2 ? 1 : 0; } ++r1; ++r2; } return 0; } }; typedef multiset SuffixStore; #define STOPSUFFIXES ((SuffixStore *)m_stopsuffixes) vector& RclConfig::getStopSuffixes() { bool needrecompute = m_stpsuffstate.needrecompute(); needrecompute = m_oldstpsuffstate.needrecompute() || needrecompute; if (needrecompute || m_stopsuffixes == 0) { // Need to initialize the suffixes // Let the old customisation have priority: if recoll_noindex from // mimemap is set, it the user's (the default value is gone). Else // use the new variable if (!m_oldstpsuffstate.getvalue(0).empty()) { stringToStrings(m_oldstpsuffstate.getvalue(0), m_stopsuffvec); } else { std::set ss; computeBasePlusMinus(ss, m_stpsuffstate.getvalue(0), m_stpsuffstate.getvalue(1), m_stpsuffstate.getvalue(2)); m_stopsuffvec = vector(ss.begin(), ss.end()); } // Compute the special suffixes store delete STOPSUFFIXES; if ((m_stopsuffixes = new SuffixStore) == 0) { LOGERR("RclConfig::inStopSuffixes: out of memory\n"); return m_stopsuffvec; } m_maxsufflen = 0; for (const auto& entry : m_stopsuffvec) { STOPSUFFIXES->insert(SfString(stringtolower(entry))); if (m_maxsufflen < entry.length()) m_maxsufflen = int(entry.length()); } } LOGDEB1("RclConfig::getStopSuffixes: ->" << stringsToString(m_stopsuffvec) << endl); return m_stopsuffvec; } bool RclConfig::inStopSuffixes(const string& fni) { LOGDEB2("RclConfig::inStopSuffixes(" << fni << ")\n"); // Call getStopSuffixes() to possibly update state, ignore result getStopSuffixes(); // Only need a tail as long as the longest suffix. int pos = MAX(0, int(fni.length() - m_maxsufflen)); string fn(fni, pos); stringtolower(fn); SuffixStore::const_iterator it = STOPSUFFIXES->find(fn); if (it != STOPSUFFIXES->end()) { LOGDEB2("RclConfig::inStopSuffixes: Found (" << fni << ") [" << ((*it).m_str) << "]\n"); return true; } else { LOGDEB2("RclConfig::inStopSuffixes: not found [" << fni << "]\n"); return false; } } string RclConfig::getMimeTypeFromSuffix(const string& suff) const { string mtype; mimemap->get(suff, mtype, m_keydir); return mtype; } string RclConfig::getSuffixFromMimeType(const string &mt) const { string suffix; vectorsfs = mimemap->getNames(cstr_null); string mt1; for (vector::const_iterator it = sfs.begin(); it != sfs.end(); it++) { if (mimemap->get(*it, mt1, cstr_null)) if (!stringicmp(mt, mt1)) return *it; } return cstr_null; } /** Get list of file categories from mimeconf */ bool RclConfig::getMimeCategories(vector& cats) const { if (!mimeconf) return false; cats = mimeconf->getNames("categories"); return true; } bool RclConfig::isMimeCategory(string& cat) const { vectorcats; getMimeCategories(cats); for (vector::iterator it = cats.begin(); it != cats.end(); it++) { if (!stringicmp(*it,cat)) return true; } return false; } /** Get list of mime types for category from mimeconf */ bool RclConfig::getMimeCatTypes(const string& cat, vector& tps) const { tps.clear(); if (!mimeconf) return false; string slist; if (!mimeconf->get(cat, slist, "categories")) return false; stringToStrings(slist, tps); return true; } string RclConfig::getMimeHandlerDef(const string &mtype, bool filtertypes) { string hs; if (filtertypes) { if(m_rmtstate.needrecompute()) { m_restrictMTypes.clear(); stringToStrings(stringtolower((const string&)m_rmtstate.getvalue()), m_restrictMTypes); } if (m_xmtstate.needrecompute()) { m_excludeMTypes.clear(); stringToStrings(stringtolower((const string&)m_xmtstate.getvalue()), m_excludeMTypes); } if (!m_restrictMTypes.empty() && !m_restrictMTypes.count(stringtolower(mtype))) { LOGDEB2("RclConfig::getMimeHandlerDef: not in mime type list\n"); return hs; } if (!m_excludeMTypes.empty() && m_excludeMTypes.count(stringtolower(mtype))) { LOGDEB2("RclConfig::getMimeHandlerDef: in excluded mime list\n"); return hs; } } if (!mimeconf->get(mtype, hs, "index")) { LOGDEB1("getMimeHandlerDef: no handler for '" << mtype << "'\n"); } return hs; } const vector& RclConfig::getMDReapers() { string hs; if (m_mdrstate.needrecompute()) { m_mdreapers.clear(); // New value now stored in m_mdrstate.getvalue(0) const string& sreapers = m_mdrstate.getvalue(0); if (sreapers.empty()) return m_mdreapers; string value; ConfSimple attrs; valueSplitAttributes(sreapers, value, attrs); vector nmlst = attrs.getNames(cstr_null); for (vector::const_iterator it = nmlst.begin(); it != nmlst.end(); it++) { MDReaper reaper; reaper.fieldname = fieldCanon(*it); string s; attrs.get(*it, s); stringToStrings(s, reaper.cmdv); m_mdreapers.push_back(reaper); } } return m_mdreapers; } bool RclConfig::getGuiFilterNames(vector& cats) const { if (!mimeconf) return false; cats = mimeconf->getNamesShallow("guifilters"); return true; } bool RclConfig::getGuiFilter(const string& catfiltername, string& frag) const { frag.clear(); if (!mimeconf) return false; if (!mimeconf->get(catfiltername, frag, "guifilters")) return false; return true; } bool RclConfig::valueSplitAttributes(const string& whole, string& value, ConfSimple& attrs) { /* There is currently no way to escape a semi-colon */ string::size_type semicol0 = whole.find_first_of(";"); value = whole.substr(0, semicol0); trimstring(value); string attrstr; if (semicol0 != string::npos && semicol0 < whole.size() - 1) { attrstr = whole.substr(semicol0+1); } // Handle additional attributes. We substitute the semi-colons // with newlines and use a ConfSimple if (!attrstr.empty()) { for (string::size_type i = 0; i < attrstr.size(); i++) { if (attrstr[i] == ';') attrstr[i] = '\n'; } attrs.reparse(attrstr); } else { attrs.clear(); } return true; } bool RclConfig::getMissingHelperDesc(string& out) const { string fmiss = path_cat(getConfDir(), "missing"); out.clear(); if (!file_to_string(fmiss, out)) return false; return true; } void RclConfig::storeMissingHelperDesc(const string &s) { string fmiss = path_cat(getCacheDir(), "missing"); FILE *fp = fopen(fmiss.c_str(), "w"); if (fp) { if (s.size() > 0 && fwrite(s.c_str(), s.size(), 1, fp) != 1) { LOGERR("storeMissingHelperDesc: fwrite failed\n"); } fclose(fp); } } // Read definitions for field prefixes, aliases, and hierarchy and arrange // things for speed (theses are used a lot during indexing) bool RclConfig::readFieldsConfig(const string& cnferrloc) { LOGDEB2("RclConfig::readFieldsConfig\n"); m_fields = new ConfStack("fields", m_cdirs, true); if (m_fields == 0 || !m_fields->ok()) { m_reason = string("No/bad fields file in: ") + cnferrloc; return false; } // Build a direct map avoiding all indirections for field to // prefix translation // Add direct prefixes from the [prefixes] section vectortps = m_fields->getNames("prefixes"); for (vector::const_iterator it = tps.begin(); it != tps.end(); it++) { string val; m_fields->get(*it, val, "prefixes"); ConfSimple attrs; FieldTraits ft; if (!valueSplitAttributes(val, ft.pfx, attrs)) { LOGERR("readFieldsConfig: bad config line for [" << *it << "]: [" << val << "]\n"); return 0; } string tval; if (attrs.get("wdfinc", tval)) ft.wdfinc = atoi(tval.c_str()); if (attrs.get("boost", tval)) ft.boost = atof(tval.c_str()); if (attrs.get("pfxonly", tval)) ft.pfxonly = stringToBool(tval); if (attrs.get("noterms", tval)) ft.noterms = stringToBool(tval); m_fldtotraits[stringtolower(*it)] = ft; LOGDEB2("readFieldsConfig: [" << *it << "] -> [" << ft.pfx << "] " << ft.wdfinc << " " << ft.boost << "\n"); } // Add prefixes for aliases and build alias-to-canonic map while // we're at it. Having the aliases in the prefix map avoids an // additional indirection at index time. tps = m_fields->getNames("aliases"); for (vector::const_iterator it = tps.begin(); it != tps.end(); it++){ string canonic = stringtolower(*it); // canonic name FieldTraits ft; map::const_iterator pit = m_fldtotraits.find(canonic); if (pit != m_fldtotraits.end()) { ft = pit->second; } string aliases; m_fields->get(canonic, aliases, "aliases"); vector l; stringToStrings(aliases, l); for (vector::const_iterator ait = l.begin(); ait != l.end(); ait++) { if (pit != m_fldtotraits.end()) m_fldtotraits[stringtolower(*ait)] = ft; m_aliastocanon[stringtolower(*ait)] = canonic; } } // Query aliases map tps = m_fields->getNames("queryaliases"); for (vector::const_iterator it = tps.begin(); it != tps.end(); it++){ string canonic = stringtolower(*it); // canonic name string aliases; m_fields->get(canonic, aliases, "queryaliases"); vector l; stringToStrings(aliases, l); for (vector::const_iterator ait = l.begin(); ait != l.end(); ait++) { m_aliastoqcanon[stringtolower(*ait)] = canonic; } } #if 0 for (map::const_iterator it = m_fldtotraits.begin(); it != m_fldtotraits.end(); it++) { LOGDEB("readFieldsConfig: [" << *it << "] -> [" << it->second.pfx << "] " << it->second.wdfinc << " " << it->second.boost << "\n"); } #endif vector sl = m_fields->getNames("stored"); if (!sl.empty()) { for (vector::const_iterator it = sl.begin(); it != sl.end(); it++) { string fld = fieldCanon(stringtolower(*it)); m_storedFields.insert(fld); } } // Extended file attribute to field translations vectorxattrs = m_fields->getNames("xattrtofields"); for (vector::const_iterator it = xattrs.begin(); it != xattrs.end(); it++) { string val; m_fields->get(*it, val, "xattrtofields"); m_xattrtofld[*it] = val; } return true; } // Return specifics for field name: bool RclConfig::getFieldTraits(const string& _fld, const FieldTraits **ftpp, bool isquery) const { string fld = isquery ? fieldQCanon(_fld) : fieldCanon(_fld); map::const_iterator pit = m_fldtotraits.find(fld); if (pit != m_fldtotraits.end()) { *ftpp = &pit->second; LOGDEB1("RclConfig::getFieldTraits: [" << _fld << "]->[" << pit->second.pfx << "]\n"); return true; } else { LOGDEB1("RclConfig::getFieldTraits: no prefix for field [" << fld << "]\n"); *ftpp = 0; return false; } } set RclConfig::getIndexedFields() const { set flds; if (m_fields == 0) return flds; vector sl = m_fields->getNames("prefixes"); flds.insert(sl.begin(), sl.end()); return flds; } string RclConfig::fieldCanon(const string& f) const { string fld = stringtolower(f); map::const_iterator it = m_aliastocanon.find(fld); if (it != m_aliastocanon.end()) { LOGDEB1("RclConfig::fieldCanon: [" << f << "] -> [" << it->second << "]\n"); return it->second; } LOGDEB1("RclConfig::fieldCanon: [" << (f) << "] -> [" << (fld) << "]\n"); return fld; } string RclConfig::fieldQCanon(const string& f) const { string fld = stringtolower(f); map::const_iterator it = m_aliastoqcanon.find(fld); if (it != m_aliastoqcanon.end()) { LOGDEB1("RclConfig::fieldQCanon: [" << f << "] -> [" << it->second << "]\n"); return it->second; } return fieldCanon(f); } vector RclConfig::getFieldSectNames(const string &sk, const char* patrn) const { if (m_fields == 0) return vector(); return m_fields->getNames(sk, patrn); } bool RclConfig::getFieldConfParam(const string &name, const string &sk, string &value) const { if (m_fields == 0) return false; return m_fields->get(name, value, sk); } set RclConfig::getMimeViewerAllEx() const { set res; if (mimeview == 0) return res; string base, plus, minus; mimeview->get("xallexcepts", base, ""); LOGDEB1("RclConfig::getMimeViewerAllEx(): base: " << s << endl); mimeview->get("xallexcepts+", plus, ""); LOGDEB1("RclConfig::getMimeViewerAllEx(): plus: " << plus << endl); mimeview->get("xallexcepts-", minus, ""); LOGDEB1("RclConfig::getMimeViewerAllEx(): minus: " << minus << endl); computeBasePlusMinus(res, base, plus, minus); LOGDEB1("RclConfig::getMimeViewerAllEx(): res: " << stringsToString(res) << endl); return res; } bool RclConfig::setMimeViewerAllEx(const set& allex) { if (mimeview == 0) return false; string sbase; mimeview->get("xallexcepts", sbase, ""); string splus, sminus; setPlusMinus(sbase, allex, splus, sminus); if (!mimeview->set("xallexcepts-", sminus, "")) { m_reason = string("RclConfig:: cant set value. Readonly?"); return false; } if (!mimeview->set("xallexcepts+", splus, "")) { m_reason = string("RclConfig:: cant set value. Readonly?"); return false; } return true; } string RclConfig::getMimeViewerDef(const string &mtype, const string& apptag, bool useall) const { LOGDEB2("RclConfig::getMimeViewerDef: mtype [" << mtype << "] apptag [" << apptag << "]\n"); string hs; if (mimeview == 0) return hs; if (useall) { // Check for exception set allex = getMimeViewerAllEx(); bool isexcept = false; for (auto& it : allex) { vector mita; stringToTokens(it, mita, "|"); if ((mita.size() == 1 && apptag.empty() && mita[0] == mtype) || (mita.size() == 2 && mita[1] == apptag && mita[0] == mtype)) { // Exception to x-all isexcept = true; break; } } if (isexcept == false) { mimeview->get("application/x-all", hs, "view"); return hs; } // Fallthrough to normal case. } if (apptag.empty() || !mimeview->get(mtype + string("|") + apptag, hs, "view")) mimeview->get(mtype, hs, "view"); return hs; } bool RclConfig::getMimeViewerDefs(vector >& defs) const { if (mimeview == 0) return false; vectortps = mimeview->getNames("view"); for (vector::const_iterator it = tps.begin(); it != tps.end();it++) { defs.push_back(pair(*it, getMimeViewerDef(*it, "", 0))); } return true; } bool RclConfig::setMimeViewerDef(const string& mt, const string& def) { if (mimeview == 0) return false; bool status; if (!def.empty()) status = mimeview->set(mt, def, "view"); else status = mimeview->erase(mt, "view"); if (!status) { m_reason = string("RclConfig:: cant set value. Readonly?"); return false; } return true; } bool RclConfig::mimeViewerNeedsUncomp(const string &mimetype) const { string s; vector v; if (mimeview != 0 && mimeview->get("nouncompforviewmts", s, "") && stringToStrings(s, v) && find_if(v.begin(), v.end(), StringIcmpPred(mimetype)) != v.end()) return false; return true; } string RclConfig::getMimeIconPath(const string &mtype, const string &apptag) const { string iconname; if (!apptag.empty()) mimeconf->get(mtype + string("|") + apptag, iconname, "icons"); if (iconname.empty()) mimeconf->get(mtype, iconname, "icons"); if (iconname.empty()) iconname = "document"; string iconpath; #if defined (__FreeBSD__) && __FreeBSD_version < 500000 // gcc 2.95 dies if we call getConfParam here ?? if (m_conf) m_conf->get(string("iconsdir"), iconpath, m_keydir); #else getConfParam("iconsdir", iconpath); #endif if (iconpath.empty()) { iconpath = path_cat(m_datadir, "images"); } else { iconpath = path_tildexpand(iconpath); } return path_cat(iconpath, iconname) + ".png"; } // Return path defined by varname. May be absolute or relative to // confdir, with default in confdir string RclConfig::getConfdirPath(const char *varname, const char *dflt) const { string result; if (!getConfParam(varname, result)) { result = path_cat(getConfDir(), dflt); } else { result = path_tildexpand(result); // If not an absolute path, compute relative to config dir if (!path_isabsolute(result)) { result = path_cat(getConfDir(), result); } } return path_canon(result); } string RclConfig::getCacheDir() const { return m_cachedir.empty() ? getConfDir() : m_cachedir; } // Return path defined by varname. May be absolute or relative to // confdir, with default in confdir string RclConfig::getCachedirPath(const char *varname, const char *dflt) const { string result; if (!getConfParam(varname, result)) { result = path_cat(getCacheDir(), dflt); } else { result = path_tildexpand(result); // If not an absolute path, compute relative to cache dir if (!path_isabsolute(result)) { result = path_cat(getCacheDir(), result); } } return path_canon(result); } string RclConfig::getDbDir() const { return getCachedirPath("dbdir", "xapiandb"); } string RclConfig::getWebcacheDir() const { return getCachedirPath("webcachedir", "webcache"); } string RclConfig::getMboxcacheDir() const { return getCachedirPath("mboxcachedir", "mboxcache"); } string RclConfig::getAspellcacheDir() const { return getCachedirPath("aspellDicDir", ""); } string RclConfig::getStopfile() const { return getConfdirPath("stoplistfile", "stoplist.txt"); } string RclConfig::getSynGroupsFile() const { return getConfdirPath("syngroupsfile", "syngroups.txt"); } // The index status file is fast changing, so it's possible to put it outside // of the config directory (for ssds, not sure this is really useful). // To enable being quite xdg-correct we should add a getRundirPath() string RclConfig::getIdxStatusFile() const { return getCachedirPath("idxstatusfile", "idxstatus.txt"); } string RclConfig::getPidfile() const { return path_cat(getCacheDir(), "index.pid"); } void RclConfig::urlrewrite(const string& dbdir, string& url) const { LOGDEB2("RclConfig::urlrewrite: dbdir [" << dbdir << "] url [" << url << "]\n"); // Do path translations exist for this index ? if (m_ptrans == 0 || !m_ptrans->hasSubKey(dbdir)) { LOGDEB2("RclConfig::urlrewrite: no paths translations (m_ptrans " << m_ptrans << ")\n"); return; } string path = fileurltolocalpath(url); if (path.empty()) { LOGDEB2("RclConfig::urlrewrite: not file url\n"); return; } // For each translation check if the prefix matches the input path, // replace and return the result if it does. vector opaths = m_ptrans->getNames(dbdir); for (vector::const_iterator it = opaths.begin(); it != opaths.end(); it++) { if (it->size() <= path.size() && !path.compare(0, it->size(), *it)) { string npath; // This call always succeeds because the key comes from getNames() if (m_ptrans->get(*it, npath, dbdir)) { path = path.replace(0, it->size(), npath); url = path_pathtofileurl(path); } break; } } } bool RclConfig::sourceChanged() const { if (m_conf && m_conf->sourceChanged()) return true; if (mimemap && mimemap->sourceChanged()) return true; if (mimeconf && mimeconf->sourceChanged()) return true; if (mimeview && mimeview->sourceChanged()) return true; if (m_fields && m_fields->sourceChanged()) return true; if (m_ptrans && m_ptrans->sourceChanged()) return true; return false; } string RclConfig::getWebQueueDir() const { string webqueuedir; if (!getConfParam("webqueuedir", webqueuedir)) webqueuedir = "~/.recollweb/ToIndex/"; webqueuedir = path_tildexpand(webqueuedir); return webqueuedir; } vector& RclConfig::getSkippedNames() { if (m_skpnstate.needrecompute()) { set ss; computeBasePlusMinus(ss, m_skpnstate.getvalue(0), m_skpnstate.getvalue(1), m_skpnstate.getvalue(2)); m_skpnlist = vector(ss.begin(), ss.end()); } return m_skpnlist; } vector RclConfig::getSkippedPaths() const { vector skpl; getConfParam("skippedPaths", &skpl); // Always add the dbdir and confdir to the skipped paths. This is // especially important for the rt monitor which will go into a loop if we // don't do this. skpl.push_back(getDbDir()); skpl.push_back(getConfDir()); if (getCacheDir().compare(getConfDir())) { skpl.push_back(getCacheDir()); } // And the web queue dir skpl.push_back(getWebQueueDir()); for (vector::iterator it = skpl.begin(); it != skpl.end(); it++) { *it = path_tildexpand(*it); *it = path_canon(*it); } sort(skpl.begin(), skpl.end()); vector::iterator uit = unique(skpl.begin(), skpl.end()); skpl.resize(uit - skpl.begin()); return skpl; } vector RclConfig::getDaemSkippedPaths() const { vector dskpl; getConfParam("daemSkippedPaths", &dskpl); for (vector::iterator it = dskpl.begin(); it != dskpl.end(); it++) { *it = path_tildexpand(*it); *it = path_canon(*it); } vector skpl1 = getSkippedPaths(); vector skpl; if (dskpl.empty()) { skpl = skpl1; } else { sort(dskpl.begin(), dskpl.end()); merge(dskpl.begin(), dskpl.end(), skpl1.begin(), skpl1.end(), skpl.begin()); vector::iterator uit = unique(skpl.begin(), skpl.end()); skpl.resize(uit - skpl.begin()); } return skpl; } // Look up an executable filter. We add $RECOLL_FILTERSDIR, // and filtersdir from the config file to the PATH, then use execmd::which() string RclConfig::findFilter(const string &icmd) const { // If the path is absolute, this is it if (path_isabsolute(icmd)) return icmd; const char *cp = getenv("PATH"); if (!cp) //?? cp = ""; string PATH(cp); // For historical reasons: check in personal config directory PATH = getConfDir() + path_PATHsep() + PATH; string temp; // Prepend $datadir/filters temp = path_cat(m_datadir, "filters"); PATH = temp + path_PATHsep() + PATH; // Prepend possible configuration parameter? if (getConfParam(string("filtersdir"), temp)) { temp = path_tildexpand(temp); PATH = temp + path_PATHsep() + PATH; } // Prepend possible environment variable if ((cp = getenv("RECOLL_FILTERSDIR"))) { PATH = string(cp) + path_PATHsep() + PATH; } string cmd; if (ExecCmd::which(icmd, cmd, PATH.c_str())) { return cmd; } else { // Let the shell try to find it... return icmd; } } /** * Return decompression command line for given mime type */ bool RclConfig::getUncompressor(const string &mtype, vector& cmd) const { string hs; mimeconf->get(mtype, hs, cstr_null); if (hs.empty()) return false; vector tokens; stringToStrings(hs, tokens); if (tokens.empty()) { LOGERR("getUncompressor: empty spec for mtype " << mtype << "\n"); return false; } vector::iterator it = tokens.begin(); if (tokens.size() < 2) return false; if (stringlowercmp("uncompress", *it++)) return false; cmd.clear(); cmd.push_back(findFilter(*it)); // Special-case python and perl on windows: we need to also locate the // first argument which is the script name "python somescript.py". // On Unix, thanks to #!, we usually just run "somescript.py", but need // the same change if we ever want to use the same cmdling as windows if (!stringlowercmp("python", *it) || !stringlowercmp("perl", *it)) { it++; if (tokens.size() < 3) { LOGERR("getUncpressor: python/perl cmd: no script?. [" << mtype << "]\n"); } else { *it = findFilter(*it); } } else { it++; } cmd.insert(cmd.end(), it, tokens.end()); return true; } static const char blurb0[] = "# The system-wide configuration files for recoll are located in:\n" "# %s\n" "# The default configuration files are commented, you should take a look\n" "# at them for an explanation of what can be set (you could also take a look\n" "# at the manual instead).\n" "# Values set in this file will override the system-wide values for the file\n" "# with the same name in the central directory. The syntax for setting\n" "# values is identical.\n" ; // Use uni2ascii -a K to generate these from the utf-8 strings // Swedish and Danish. static const char swedish_ex[] = "unac_except_trans = \303\244\303\244 \303\204\303\244 \303\266\303\266 \303\226\303\266 \303\274\303\274 \303\234\303\274 \303\237ss \305\223oe \305\222oe \303\246ae \303\206ae \357\254\201fi \357\254\202fl \303\245\303\245 \303\205\303\245"; // German: static const char german_ex[] = "unac_except_trans = \303\244\303\244 \303\204\303\244 \303\266\303\266 \303\226\303\266 \303\274\303\274 \303\234\303\274 \303\237ss \305\223oe \305\222oe \303\246ae \303\206ae \357\254\201fi \357\254\202fl"; // Create initial user config by creating commented empty files static const char *configfiles[] = {"recoll.conf", "mimemap", "mimeconf", "mimeview"}; static int ncffiles = sizeof(configfiles) / sizeof(char *); bool RclConfig::initUserConfig() { // Explanatory text const int bs = sizeof(blurb0)+PATH_MAX+1; char blurb[bs]; string exdir = path_cat(m_datadir, "examples"); snprintf(blurb, bs, blurb0, exdir.c_str()); // Use protective 700 mode to create the top configuration // directory: documents can be reconstructed from index data. if (!path_exists(m_confdir) && mkdir(m_confdir.c_str(), 0700) < 0) { m_reason += string("mkdir(") + m_confdir + ") failed: " + strerror(errno); return false; } string lang = localelang(); for (int i = 0; i < ncffiles; i++) { string dst = path_cat(m_confdir, string(configfiles[i])); if (!path_exists(dst)) { FILE *fp = fopen(dst.c_str(), "w"); if (fp) { fprintf(fp, "%s\n", blurb); if (!strcmp(configfiles[i], "recoll.conf")) { // Add improved unac_except_trans for some languages if (lang == "se" || lang == "dk" || lang == "no" || lang == "fi") { fprintf(fp, "%s\n", swedish_ex); } else if (lang == "de") { fprintf(fp, "%s\n", german_ex); } } fclose(fp); } else { m_reason += string("fopen ") + dst + ": " + strerror(errno); return false; } } } return true; } void RclConfig::zeroMe() { m_ok = false; m_keydirgen = 0; m_conf = 0; mimemap = 0; mimeconf = 0; mimeview = 0; m_fields = 0; m_ptrans = 0; m_stopsuffixes = 0; m_maxsufflen = 0; initParamStale(0, 0); } void RclConfig::freeAll() { delete m_conf; delete mimemap; delete mimeconf; delete mimeview; delete m_fields; delete m_ptrans; delete STOPSUFFIXES; // just in case zeroMe(); } void RclConfig::initFrom(const RclConfig& r) { zeroMe(); if (!(m_ok = r.m_ok)) return; // Copyable fields m_ok = r.m_ok; m_reason = r.m_reason; m_confdir = r.m_confdir; m_cachedir = r.m_cachedir; m_datadir = r.m_datadir; m_keydir = r.m_keydir; m_keydirgen = r.m_keydirgen; m_cdirs = r.m_cdirs; m_fldtotraits = r.m_fldtotraits; m_aliastocanon = r.m_aliastocanon; m_aliastoqcanon = r.m_aliastoqcanon; m_storedFields = r.m_storedFields; m_xattrtofld = r.m_xattrtofld; m_maxsufflen = r.m_maxsufflen; m_skpnlist = r.m_skpnlist; m_stopsuffixes = r.m_stopsuffixes; m_defcharset = r.m_defcharset; m_restrictMTypes = r.m_restrictMTypes; m_excludeMTypes = r.m_excludeMTypes; m_thrConf = r.m_thrConf; m_mdreapers = r.m_mdreapers; // Special treatment if (r.m_conf) m_conf = new ConfStack(*(r.m_conf)); if (r.mimemap) mimemap = new ConfStack(*(r.mimemap)); if (r.mimeconf) mimeconf = new ConfStack(*(r.mimeconf)); if (r.mimeview) mimeview = new ConfStack(*(r.mimeview)); if (r.m_fields) m_fields = new ConfStack(*(r.m_fields)); if (r.m_ptrans) m_ptrans = new ConfSimple(*(r.m_ptrans)); if (r.m_stopsuffixes) m_stopsuffixes = new SuffixStore(*((SuffixStore*)r.m_stopsuffixes)); initParamStale(m_conf, mimemap); } void RclConfig::initParamStale(ConfNull *cnf, ConfNull *mimemap) { m_oldstpsuffstate.init(mimemap); m_stpsuffstate.init(cnf); m_skpnstate.init(cnf); m_rmtstate.init(cnf); m_xmtstate.init(cnf); m_mdrstate.init(cnf); } #else // -> Test #include #include #include #include #include using namespace std; #include "log.h" #include "rclinit.h" #include "rclconfig.h" #include "cstr.h" static char *thisprog; static char usage [] = "\n" "-c: check a few things in the configuration files\n" "[-s subkey] -q param : query parameter value\n" "-f : print some field data\n" " : default: print parameters\n" ; static void Usage(void) { fprintf(stderr, "%s: usage: %s\n", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_s 0x2 #define OPT_q 0x4 #define OPT_c 0x8 #define OPT_f 0x10 int main(int argc, char **argv) { string pname, skey; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; break; case 'f': op_flags |= OPT_f; break; case 's': op_flags |= OPT_s; if (argc < 2) Usage(); skey = *(++argv); argc--; goto b1; case 'q': op_flags |= OPT_q; if (argc < 2) Usage(); pname = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); string reason; RclConfig *config = recollinit(0, 0, reason); if (config == 0 || !config->ok()) { cerr << "Configuration problem: " << reason << endl; exit(1); } if (op_flags & OPT_s) config->setKeyDir(skey); if (op_flags & OPT_q) { string value; if (!config->getConfParam(pname, value)) { fprintf(stderr, "getConfParam failed for [%s]\n", pname.c_str()); exit(1); } printf("[%s] -> [%s]\n", pname.c_str(), value.c_str()); } else if (op_flags & OPT_f) { set stored = config->getStoredFields(); set indexed = config->getIndexedFields(); cout << "Stored fields: "; for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { cout << "[" << *it << "] "; } cout << endl; cout << "Indexed fields: "; for (set::const_iterator it = indexed.begin(); it != indexed.end(); it++) { const FieldTraits *ftp; config->getFieldTraits(*it, &ftp); if (ftp) cout << "[" << *it << "]" << " -> [" << ftp->pfx << "] "; else cout << "[" << *it << "]" << " -> [" << "(none)" << "] "; } cout << endl; } else if (op_flags & OPT_c) { // Checking the configuration consistency // Find and display category names vector catnames; config->getMimeCategories(catnames); cout << "Categories: "; for (vector::const_iterator it = catnames.begin(); it != catnames.end(); it++) { cout << *it << " "; } cout << endl; // Compute union of all types from each category. Check that there // are no duplicates while we are at it. set allmtsfromcats; for (vector::const_iterator it = catnames.begin(); it != catnames.end(); it++) { vector cts; config->getMimeCatTypes(*it, cts); for (vector::const_iterator it1 = cts.begin(); it1 != cts.end(); it1++) { // Already in map -> duplicate if (allmtsfromcats.find(*it1) != allmtsfromcats.end()) { cout << "Duplicate: [" << *it1 << "]" << endl; } allmtsfromcats.insert(*it1); } } // Retrieve complete list of mime types vector mtypes = config->getAllMimeTypes(); // And check that each mime type is found in exactly one category for (vector::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { if (allmtsfromcats.find(*it) == allmtsfromcats.end()) { cout << "Not found in catgs: [" << *it << "]" << endl; } } // List mime types not in mimeview for (vector::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { if (config->getMimeViewerDef(*it, "", false).empty()) { cout << "No viewer: [" << *it << "]" << endl; } } // Check that each mime type has an indexer for (vector::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { if (config->getMimeHandlerDef(*it, false).empty()) { cout << "No filter: [" << *it << "]" << endl; } } // Check that each mime type has a defined icon for (vector::const_iterator it = mtypes.begin(); it != mtypes.end(); it++) { if (config->getMimeIconPath(*it, "") == "document") { cout << "No or generic icon: [" << *it << "]" << endl; } } } else { config->setKeyDir(cstr_null); vector names = config->getConfNames(); for (vector::iterator it = names.begin(); it != names.end();it++) { string value; config->getConfParam(*it, value); cout << *it << " -> [" << value << "]" << endl; } } exit(0); } #endif // TEST_RCLCONFIG recoll-1.23.7/common/unacpp.cpp0000644000175000017500000001341013125637102013266 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_UNACPP #include #include #include #include #include "unacpp.h" #include "unac.h" #include "log.h" #include "utf8iter.h" bool unacmaybefold(const string &in, string &out, const char *encoding, UnacOp what) { char *cout = 0; size_t out_len; int status = -1; switch (what) { case UNACOP_UNAC: status = unac_string(encoding, in.c_str(), in.length(), &cout, &out_len); break; case UNACOP_UNACFOLD: status = unacfold_string(encoding, in.c_str(), in.length(), &cout, &out_len); break; case UNACOP_FOLD: status = fold_string(encoding, in.c_str(), in.length(), &cout, &out_len); break; } if (status < 0) { if (cout) free(cout); char cerrno[20]; sprintf(cerrno, "%d", errno); out = string("unac_string failed, errno : ") + cerrno; return false; } out.assign(cout, out_len); if (cout) free(cout); return true; } // Functions to determine upper-case or accented status could be implemented // hugely more efficiently inside the unac c code, but there only used for // testing user-entered terms, so we don't really care. bool unaciscapital(const string& in) { LOGDEB2("unaciscapital: [" << (in) << "]\n" ); if (in.empty()) return false; Utf8Iter it(in); string shorter; it.appendchartostring(shorter); string lower; if (!unacmaybefold(shorter, lower, "UTF-8", UNACOP_FOLD)) { LOGINFO("unaciscapital: unac/fold failed for [" << (in) << "]\n" ); return false; } Utf8Iter it1(lower); if (*it != *it1) return true; else return false; } bool unachasuppercase(const string& in) { LOGDEB2("unachasuppercase: [" << (in) << "]\n" ); if (in.empty()) return false; string lower; if (!unacmaybefold(in, lower, "UTF-8", UNACOP_FOLD)) { LOGINFO("unachasuppercase: unac/fold failed for [" << (in) << "]\n" ); return false; } if (lower != in) return true; else return false; } bool unachasaccents(const string& in) { LOGDEB2("unachasaccents: [" << (in) << "]\n" ); if (in.empty()) return false; string noac; if (!unacmaybefold(in, noac, "UTF-8", UNACOP_UNAC)) { LOGINFO("unachasaccents: unac/unac failed for [" << (in) << "]\n" ); return false; } if (noac != in) return true; else return false; } #else // not testing #include #include #include #include #include #include #include using namespace std; #include "unacpp.h" #include "readfile.h" #include "rclinit.h" static char *thisprog; static char usage [] = "\n" "[-c|-C] \n" " Default : unaccent\n" " -c : unaccent and casefold\n" " -C : casefold only\n" "-t test string as capitalized, upper-case anywhere, accents\n" " the parameter is supposedly utf-8 so this can only work in an utf-8\n" " locale\n" "\n"; ; static void Usage(void) { fprintf(stderr, "%s: usage: %s\n", thisprog, usage); exit(1); } static int op_flags; #define OPT_c 0x2 #define OPT_C 0x4 #define OPT_t 0x8 int main(int argc, char **argv) { UnacOp op = UNACOP_UNAC; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; break; case 'C': op_flags |= OPT_C; break; case 't': op_flags |= OPT_t; break; default: Usage(); break; } argc--; argv++; } if (op_flags & OPT_t) { if (argc != 1) Usage(); string in = *argv++;argc--; bool capital, upper, accent; capital = unaciscapital(in); upper = unachasuppercase(in); accent = unachasaccents(in); cout << "[" << in << "] : " << "capitalized: " << (capital ? "Yes. " : "No. ") << "has uppercase: " << (upper ? "Yes. " : "No. ") << "has accents: " << (accent ? "Yes. " : "No. ") << endl; return 0; } else { if (argc != 3) Usage(); if (op_flags & OPT_c) { op = UNACOP_UNACFOLD; } else if (op_flags & OPT_C) { op = UNACOP_FOLD; } const char *encoding = *argv++; argc--; string ifn = *argv++; argc--; if (!ifn.compare("stdin")) ifn.clear(); const char *ofn = *argv++; argc--; string reason; (void)recollinit(RCLINIT_NONE, 0, 0, reason, 0); string odata; if (!file_to_string(ifn, odata)) { cerr << "file_to_string " << ifn << " : " << odata << endl; return 1; } string ndata; if (!unacmaybefold(odata, ndata, encoding, op)) { cerr << "unac: " << ndata << endl; return 1; } int fd; if (strcmp(ofn, "stdout")) { fd = open(ofn, O_CREAT|O_EXCL|O_WRONLY, 0666); } else { fd = 1; } if (fd < 0) { cerr << "Open/Create " << ofn << " failed: " << strerror(errno) << endl; return 1; } if (write(fd, ndata.c_str(), ndata.length()) != (int)ndata.length()) { cerr << "Write(2) failed: " << strerror(errno) << endl; return 1; } close(fd); return 0; } } #endif recoll-1.23.7/common/utf8fn.h0000644000175000017500000000057513125637102012667 00000000000000#ifndef _UTF8FN_H_ #define _UTF8FN_H_ #include class RclConfig; // Translate file name/path to utf8 for indexing. // // @param simple If true we extract and process only the simple file name // (ignore the path) std::string compute_utf8fn(const RclConfig *config, const std::string& ifn, bool simple); #endif // _UTF8FN_H_ recoll-1.23.7/common/uproplist.h0000644000175000017500000001667313125527323013527 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PROPLIST_H_INCLUDED_ #define _PROPLIST_H_INCLUDED_ /** * A subset of Unicode chars that we consider word breaks when we * split text in words. * * This is used as a quick fix to the ascii-based code, and is not correct. * the correct way would be to do what http://www.unicode.org/reports/tr29/ * says. */ // Punctuation chararacters blocks array. Each block is defined by a // starting and ending code point (both included). MUST BE SORTED. static const unsigned unipuncblocks[] = { // Start of latin-1 supplement block, up to capital A grave 0x0080, 0x00BF, // General punctuation 0x2000, 0x206F, // Superscripts and subscripts 0x2070, 0x209F, // Currency symbols 0x20A0, 0x20CF, // Letterlike symbols 0x2100, 0x214f, // Number forms 0x2150, 0x218F, // Arrows 0x2190, 0x21FF, // Mathematical Operators 0x2200, 0x22FF, // Miscellaneous Technical 0x2300, 0x23FF, // Control Pictures 0x2400, 0x243F, // Optical Character Recognition 0x2440, 0x245F, // Enclosed Alphanumerics 0x2460, 0x24FF, // Box Drawing 0x2500, 0x257F, // Block Elements 0x2580, 0x259F, // Geometric Shapes 0x25A0, 0x25FF, // Miscellaneous Symbols 0x2600, 0x26FF, // Dingbats 0x2700, 0x27BF, // Miscellaneous Mathematical Symbols-A 0x27C0, 0x27EF, // Supplemental Arrows-A 0x27F0, 0x27FF, // Supplemental Arrows-B 0x2900, 0x297F, // Miscellaneous Mathematical Symbols-B 0x2980, 0x29FF, // Supplemental Mathematical Operators 0x2A00, 0x2AFF, // Miscellaneous Symbols and Arrows 0x2B00, 0x2BFF, }; // Other punctuation characters list. Not all punctuation is in a // separate block some is found in the middle of alphanumeric codes. static const unsigned int unipunc[] = { 0x00D7, /* MULTIPLICATION SIGN */ 0x00F7, /* DIVISION SIGN */ 0x037E, /* GREEK QUESTION MARK */ 0x0387, /* GREEK ANO TELEIA */ 0x055C, /* ARMENIAN EXCLAMATION MARK */ 0x055E, /* ARMENIAN QUESTION MARK */ 0x0589, /* ARMENIAN FULL STOP */ 0x058A, /* ARMENIAN HYPHEN */ 0x05C3, /* HEBREW PUNCTUATION SOF PASUQ */ 0x060C, /* ARABIC COMMA */ 0x061B, /* ARABIC SEMICOLON */ 0x061F, /* ARABIC QUESTION MARK */ 0x06D4, /* ARABIC FULL STOP */ 0x0964, /* DEVANAGARI DANDA */ 0x0965, /* DEVANAGARI DOUBLE DANDA */ 0x166E, /* CANADIAN SYLLABICS FULL STOP */ 0x1680, /* OGHAM SPACE MARK */ 0x16EB, /* RUNIC SINGLE PUNCTUATION */ 0x16EC, /* RUNIC MULTIPLE PUNCTUATION */ 0x16ED, /* RUNIC CROSS PUNCTUATION */ 0x1803, /* MONGOLIAN FULL STOP */ 0x1806, /* MONGOLIAN TODO SOFT HYPHEN */ 0x1809, /* MONGOLIAN MANCHU FULL STOP */ 0x180E, /* MONGOLIAN VOWEL SEPARATOR */ 0x2E2E, /* REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; */ 0x3000, /* IDEOGRAPHIC SPACE*/ 0x3002, /* IDEOGRAPHIC FULL STOP*/ 0x300C, /* LEFT CORNER BRACKET*/ 0x300D, /* RIGHT CORNER BRACKET*/ 0x300E, /* LEFT WHITE CORNER BRACKET*/ 0x300F, /* RIGHT WHITE CORNER BRACKET*/ 0x301C, /* WAVE DASH*/ 0x301D, /* REVERSED DOUBLE PRIME QUOTATION MARK*/ 0x301E, /* LOW DOUBLE PRIME QUOTATION MARK*/ 0x3030, /* WAVY DASH*/ 0x30FB, /* KATAKANA MIDDLE DOT*/ 0xC2B6, /* PILCROW SIGN;So;0;ON;;;;;N;PARAGRAPH SIGN;;;; */ 0xC3B7, /* DIVISION SIGN;Sm;0;ON;;;;;N;;;;; */ 0xFE31, /* PRESENTATION FORM FOR VERTICAL EM DASH*/ 0xFE32, /* PRESENTATION FORM FOR VERTICAL EN DASH*/ 0xFE41, /* PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET*/ 0xFE42, /* PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET*/ 0xFE43, /* PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET*/ 0xFE44, /* PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET*/ 0xFE50, /* [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE51, /* [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE52, /* STOP*/ 0xFE52, /* [3] SMALL COMMA..SMALL FULL STOP*/ 0xFE54, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE55, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE56, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE57, /* [4] SMALL SEMICOLON..SMALL EXCLAMATION MARK*/ 0xFE58, /* SMALL EM DASH */ 0xFE63, /* SMALL HYPHEN-MINUS */ 0xFF01, /* FULLWIDTH EXCLAMATION MARK */ 0xFF02, /* FULLWIDTH QUOTATION MARK */ 0xFF03, /* FULLWIDTH NUMBER SIGN */ 0xFF04, /* FULLWIDTH DOLLAR SIGN */ 0xFF05, /* FULLWIDTH PERCENT SIGN */ 0xFF06, /* FULLWIDTH AMPERSAND */ 0xFF07, /* FULLWIDTH APOSTROPHE */ 0xFF08, /* FULLWIDTH LEFT PARENTHESIS */ 0xFF09, /* FULLWIDTH RIGHT PARENTHESIS */ 0xFF0A, /* FULLWIDTH ASTERISK */ 0xFF0B, /* FULLWIDTH PLUS SIGN */ 0xFF0C, /* FULLWIDTH COMMA */ 0xFF0D, /* FULLWIDTH HYPHEN-MINUS */ 0xFF0E, /* FULLWIDTH FULL STOP */ 0xFF0F, /* FULLWIDTH SOLIDUS */ 0xFF1A, /* [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/ 0xFF1B, /* [2] FULLWIDTH COLON..FULLWIDTH SEMICOLON*/ 0xFF1F, /* FULLWIDTH QUESTION MARK*/ 0xFF61, /* HALFWIDTH IDEOGRAPHIC FULL STOP*/ 0xFF62, /* HALFWIDTH LEFT CORNER BRACKET*/ 0xFF63, /* HALFWIDTH RIGHT CORNER BRACKET*/ 0xFF64, /* HALFWIDTH IDEOGRAPHIC COMMA*/ 0xFF65, /* HALFWIDTH KATAKANA MIDDLE DOT*/ }; // Characters that should just be discarded. Some of these are in the // above blocks, but this array is tested first, so it's not worth // breaking the blocks static const unsigned int uniskip[] = { 0x00AD, /* SOFT HYPHEN */ 0x034F, /* COMBINING GRAPHEME JOINER */ 0x2027, /* HYPHENATION POINT */ 0x200C, /* ZERO WIDTH NON-JOINER */ 0x200D, /* ZERO WIDTH JOINER */ 0x2060, /* WORD JOINER . Actually this should not be ignored but used to * prevent a word break... */ }; /* Things that would visibly break a block of text, rendering obvious the need * of quotation if a phrase search is wanted */ static const unsigned int avsbwht[] = { 0x0009, /* CHARACTER TABULATION */ 0x000A, /* LINE FEED */ 0x000D, /* CARRIAGE RETURN */ 0x0020, /* SPACE;Zs;0;WS */ 0x00A0, /* NO-BREAK SPACE;Zs;0;CS */ 0x1680, /* OGHAM SPACE MARK;Zs;0;WS */ 0x180E, /* MONGOLIAN VOWEL SEPARATOR;Zs;0;WS */ 0x2000, /* EN QUAD;Zs;0;WS */ 0x2001, /* EM QUAD;Zs;0;WS */ 0x2002, /* EN SPACE;Zs;0;WS */ 0x2003, /* EM SPACE;Zs;0;WS */ 0x2004, /* THREE-PER-EM SPACE;Zs;0;WS */ 0x2005, /* FOUR-PER-EM SPACE;Zs;0;WS */ 0x2006, /* SIX-PER-EM SPACE;Zs;0;WS */ 0x2007, /* FIGURE SPACE;Zs;0;WS */ 0x2008, /* PUNCTUATION SPACE;Zs;0;WS */ 0x2009, /* THIN SPACE;Zs;0;WS */ 0x200A, /* HAIR SPACE;Zs;0;WS */ 0x202F, /* NARROW NO-BREAK SPACE;Zs;0;CS */ 0x205F, /* MEDIUM MATHEMATICAL SPACE;Zs;0;WS */ 0x3000, /* IDEOGRAPHIC SPACE;Zs;0;WS */ }; #endif // _PROPLIST_H_INCLUDED_ recoll-1.23.7/common/cstr.h0000644000175000017500000000606013224431017012420 00000000000000/* Copyright (C) 2011 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CSTR_H_INCLUDED_ #define _CSTR_H_INCLUDED_ // recoll mostly uses STL strings. In many places we had automatic // conversion from a C string to an STL one. This costs, and can // become significant if used often. // // This file and the associated .cpp file declares/defines constant // strings used in the program. Strings are candidates for a move here // when they are used in a fast loop or are shared. #include using std::string; // The following slightly hacky preprocessing directives and the // companion code in the cpp file looks complicated, but it just // ensures that we only have to write the strings once to get the // extern declaration and the definition. #ifdef RCLIN_CSTR_CPPFILE #undef DEF_CSTR #define DEF_CSTR(NM, STR) const string cstr_##NM(STR) #else #define DEF_CSTR(NM, STR) extern const string cstr_##NM #endif DEF_CSTR(caption, "caption"); DEF_CSTR(colon, ":"); DEF_CSTR(dmtime, "dmtime"); DEF_CSTR(dquote, "\""); DEF_CSTR(fbytes, "fbytes"); DEF_CSTR(fileu, "file://"); DEF_CSTR(fmtime, "fmtime"); DEF_CSTR(iso_8859_1, "ISO-8859-1"); DEF_CSTR(utf8, "UTF-8"); DEF_CSTR(cp1252, "CP1252"); DEF_CSTR(minwilds, "*?["); DEF_CSTR(newline, "\n"); DEF_CSTR(null, ""); DEF_CSTR(plus, "+"); DEF_CSTR(textplain, "text/plain"); DEF_CSTR(texthtml, "text/html"); DEF_CSTR(url, "url"); // Marker for HTML format fields DEF_CSTR(fldhtm, "\007"); // Characters that can -begin- a wildcard or regexp expression. DEF_CSTR(wildSpecStChars, "*?["); DEF_CSTR(regSpecStChars, "(.[{"); // Values used as keys inside Dijon::Filter::metaData[]. This structure is // used to store all data generated by format-translating filters. It is // different from Rcl::Doc for mostly historical reasons. The translation // from Filter to Doc occurs inside internfile.cpp DEF_CSTR(dj_keyds, "description"); DEF_CSTR(dj_keyfn, "filename"); DEF_CSTR(dj_keymd, "modificationdate"); DEF_CSTR(dj_keyorigcharset, "origcharset"); DEF_CSTR(dj_keytitle, "title"); DEF_CSTR(dj_keyrecipient, "recipient"); DEF_CSTR(dj_keymsgid, "msgid"); DEF_CSTR(dj_keyabstract, "abstract"); DEF_CSTR(dj_keyauthor, "author"); DEF_CSTR(dj_keycharset, "charset"); DEF_CSTR(dj_keycontent, "content"); DEF_CSTR(dj_keyipath, "ipath"); DEF_CSTR(dj_keymd5, "md5"); DEF_CSTR(dj_keymt, "mimetype"); DEF_CSTR(dj_keyanc, "rclanc"); #endif /* _CSTR_H_INCLUDED_ */ recoll-1.23.7/common/beaglequeuecache.h0000644000175000017500000000306613125527323014726 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _beaglequeuecache_h_included_ #define _beaglequeuecache_h_included_ #include using std::string; class RclConfig; namespace Rcl { class Db; class Doc; } class CirCache; /** * Manage the CirCache for the Beagle Queue indexer. Separated from the main * indexer code because it's also used for querying (getting the data for a * preview */ class BeagleQueueCache { public: BeagleQueueCache(RclConfig *config); ~BeagleQueueCache(); bool getFromCache(const string& udi, Rcl::Doc &doc, string& data, string *hittype = 0); // We could write proxies for all the circache ops, but why bother? CirCache *cc() {return m_cache;} private: CirCache *m_cache; }; extern const string cstr_bgc_mimetype; #endif /* _beaglequeuecache_h_included_ */ recoll-1.23.7/common/rclconfig.h0000644000175000017500000004126513224431525013425 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLCONFIG_H_INCLUDED_ #define _RCLCONFIG_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include #include #include using std::string; using std::vector; using std::pair; using std::set; using std::map; #include "conftree.h" #include "smallut.h" class RclConfig; // Cache parameter string values for params which need computation and // which can change with the keydir. Minimize work by using the // keydirgen and a saved string to avoid unneeded recomputations: // keydirgen is incremented in RclConfig with each setKeyDir(). We // compare our saved value with the current one. If it did not change // no get() is needed. If it did change, but the resulting param get() // string value is identical, no recomputation is needed. class ParamStale { public: ParamStale() {} ParamStale(RclConfig *rconf, const string& nm) : parent(rconf), paramnames(vector(1, nm)), savedvalues(1) { } ParamStale(RclConfig *rconf, const vector& nms) : parent(rconf), paramnames(nms), savedvalues(nms.size()) { } void init(ConfNull *cnf); bool needrecompute(); const string& getvalue(unsigned int i = 0) const; private: // The config we belong to. RclConfig *parent{0}; // The configuration file we search for values. This is a borrowed // pointer belonging to the parent, we do not manage it. ConfNull *conffile{0}; vector paramnames; vector savedvalues; // Check at init if the configuration defines our vars at all. No // further processing is needed if it does not. bool active{false}; int savedkeydirgen{-1}; }; // Hold the description for an external metadata-gathering command struct MDReaper { string fieldname; vector cmdv; }; // Data associated to a indexed field name: struct FieldTraits { string pfx; // indexing prefix, int wdfinc{1}; // Index time term frequency increment (default 1) double boost{1.0}; // Query time boost (default 1.0) bool pfxonly{false}; // Suppress prefix-less indexing bool noterms{false}; // Don't add term to highlight data (e.g.: rclbes) }; class RclConfig { public: // Constructor: we normally look for a configuration file, except // if this was specified on the command line and passed through // argcnf RclConfig(const string *argcnf = 0); RclConfig(const RclConfig &r); ~RclConfig() { freeAll(); } // Return a writable clone of the main config. This belongs to the // caller (must delete it when done) ConfNull *cloneMainConfig(); /** (re)Read recoll.conf */ bool updateMainConfig(); bool ok() const {return m_ok;} const string &getReason() const {return m_reason;} /** Return the directory where this configuration is stored. * This was possibly silently created by the rclconfig * constructor it it is the default one (~/.recoll) and it did * not exist yet. */ string getConfDir() const {return m_confdir;} string getCacheDir() const; /** Check if the config files were modified since we read them */ bool sourceChanged() const; /** Returns true if this is ~/.recoll */ bool isDefaultConfig() const; /** Get the local value for /usr/local/share/recoll/ */ const string& getDatadir() const {return m_datadir;} /** Set current directory reference, and fetch automatic parameters. */ void setKeyDir(const string &dir); string getKeyDir() const {return m_keydir;} /** Get generic configuration parameter according to current keydir */ bool getConfParam(const string &name, string &value, bool shallow=false) const { if (m_conf == 0) return false; return m_conf->get(name, value, m_keydir, shallow); } /** Variant with autoconversion to int */ bool getConfParam(const string &name, int *value, bool shallow=false) const; /** Variant with autoconversion to bool */ bool getConfParam(const string &name, bool *value, bool shallow=false) const; /** Variant with conversion to vector * (stringToStrings). Can fail if the string is malformed. */ bool getConfParam(const string &name, vector *value, bool shallow=false) const; /** Variant with conversion to unordered_set * (stringToStrings). Can fail if the string is malformed. */ bool getConfParam(const string &name, std::unordered_set *v, bool shallow=false) const; /** Variant with conversion to vector */ bool getConfParam(const string &name, vector *value, bool shallow=false) const; enum ThrStage {ThrIntern=0, ThrSplit=1, ThrDbWrite=2}; pair getThrConf(ThrStage who) const; /** * Get list of config names under current sk, with possible * wildcard filtering */ vector getConfNames(const char *pattern = 0) const { return m_conf->getNames(m_keydir, pattern); } /** Check if name exists anywhere in config */ bool hasNameAnywhere(const string& nm) const { return m_conf? m_conf->hasNameAnywhere(nm) : false; } /** Get default charset for current keydir (was set during setKeydir) * filenames are handled differently */ const string &getDefCharset(bool filename = false) const; /** Get list of top directories. This is needed from a number of places * and needs some cleaning-up code. An empty list is always an error, no * need for other status */ vector getTopdirs() const; string getConfdirPath(const char *varname, const char *dflt) const; string getCachedirPath(const char *varname, const char *dflt) const; /** Get database and other directories */ string getDbDir() const; string getWebcacheDir() const; string getMboxcacheDir() const; string getAspellcacheDir() const; /** Get stoplist file name */ string getStopfile() const; /** Get synonym groups file name */ string getSynGroupsFile() const; /** Get indexing pid file name */ string getPidfile() const; /** Get indexing status file name */ string getIdxStatusFile() const; /** Do path translation according to the ptrans table */ void urlrewrite(const string& dbdir, string& url) const; ConfSimple *getPTrans() { return m_ptrans; } /** Get Web Queue directory name */ string getWebQueueDir() const; /** Get list of skipped file names for current keydir */ vector& getSkippedNames(); /** Get list of skipped paths patterns. Doesn't depend on the keydir */ vector getSkippedPaths() const; /** Get list of skipped paths patterns, daemon version (may add some) Doesn't depend on the keydir */ vector getDaemSkippedPaths() const; /** Return list of no content suffixes. Used by confgui, indexing uses inStopSuffixes() for testing suffixes */ std::vector& getStopSuffixes(); /** * mimemap: Check if file name should be ignored because of suffix * * The list of ignored suffixes is initialized on first call, and * not changed for subsequent setKeydirs. */ bool inStopSuffixes(const string& fn); /** * Check in mimeconf if input mime type is a compressed one, and * return command to uncompress if it is. * * The returned command has substitutable places for input file name * and temp dir name, and will return output name */ bool getUncompressor(const string &mtpe, vector& cmd) const; /** mimemap: compute mimetype */ string getMimeTypeFromSuffix(const string &suffix) const; /** mimemap: get a list of all indexable mime types defined */ vector getAllMimeTypes() const; /** mimemap: Get appropriate suffix for mime type. This is inefficient */ string getSuffixFromMimeType(const string &mt) const; /** mimeconf: get input filter for mimetype */ string getMimeHandlerDef(const string &mimetype, bool filtertypes=false); /** For lines like: "name = some value; attr1 = value1; attr2 = val2" * Separate the value and store the attributes in a ConfSimple * @param whole the raw value. No way to escape a semi-colon in there. */ static bool valueSplitAttributes(const string& whole, string& value, ConfSimple& attrs) ; /** Compute difference between 'base' and 'changed', as elements to be * added and substracted from base. Input and output strings are in * stringToStrings() format. */ static void setPlusMinus( const std::string& base, const std::set& changed, std::string& plus, std::string& minus); /** Return the locale's character set */ static const std::string& getLocaleCharset(); /** Return icon path for mime type and tag */ string getMimeIconPath(const string &mt, const string& apptag) const; /** mimeconf: get list of file categories */ bool getMimeCategories(vector&) const; /** mimeconf: is parameter one of the categories ? */ bool isMimeCategory(string&) const; /** mimeconf: get list of mime types for category */ bool getMimeCatTypes(const string& cat, vector&) const; /** mimeconf: get list of gui filters (doc cats by default */ bool getGuiFilterNames(vector&) const; /** mimeconf: get query lang frag for named filter */ bool getGuiFilter(const string& filtername, string& frag) const; /** fields: get field prefix from field name. Use additional query aliases if isquery is set */ bool getFieldTraits(const string& fldname, const FieldTraits **, bool isquery = false) const; const set& getStoredFields() const {return m_storedFields;} set getIndexedFields() const; /** Get canonic name for possible alias */ string fieldCanon(const string& fld) const; /** Get canonic name for possible alias, including query-only aliases */ string fieldQCanon(const string& fld) const; /** Get xattr name to field names translations */ const map& getXattrToField() const {return m_xattrtofld;} /** Get value of a parameter inside the "fields" file. Only some filters * use this (ie: mh_mail). The information specific to a given filter * is typically stored in a separate section(ie: [mail]) */ vector getFieldSectNames(const string &sk, const char* = 0) const; bool getFieldConfParam(const string &name, const string &sk, string &value) const; /** mimeview: get/set external viewer exec string(s) for mimetype(s) */ string getMimeViewerDef(const string &mimetype, const string& apptag, bool useall) const; set getMimeViewerAllEx() const; bool setMimeViewerAllEx(const set& allex); bool getMimeViewerDefs(vector >&) const; bool setMimeViewerDef(const string& mimetype, const string& cmd); /** Check if mime type is designated as needing no uncompress before view * (if a file of this type is found compressed). Default is true, * exceptions are found in the nouncompforviewmts mimeview list */ bool mimeViewerNeedsUncomp(const string &mimetype) const; /** Retrieve extra metadata-gathering commands */ const vector& getMDReapers(); /** Store/retrieve missing helpers description string */ bool getMissingHelperDesc(string&) const; void storeMissingHelperDesc(const string &s); /** Find exec file for external filter. * * If the input is an absolute path, we just return it. Else We * look in $RECOLL_FILTERSDIR, "filtersdir" from the config file, * $RECOLL_CONFDIR/. If nothing is found, we return the input with * the assumption that this will be used with a PATH-searching * exec. * * @param cmd is normally the command name from the command string * returned by getMimeHandlerDef(), but this could be used for any * command. If cmd begins with a /, we return cmd without * further processing. */ string findFilter(const string& cmd) const; /** Thread config init is not done automatically because not all programs need it and it uses the debug log so that it's better to call it after primary init */ void initThrConf(); const string& getOrigCwd() { return o_origcwd; } RclConfig& operator=(const RclConfig &r) { if (this != &r) { freeAll(); initFrom(r); } return *this; } friend class ParamStale; private: int m_ok; string m_reason; // Explanation for bad state string m_confdir; // User directory where the customized files are stored // Normally same as confdir. Set to store all bulk data elsewhere. // Provides defaults top location for dbdir, webcachedir, // mboxcachedir, aspellDictDir, which can still be used to // override. string m_cachedir; string m_datadir; // Example: /usr/local/share/recoll string m_keydir; // Current directory used for parameter fetches. int m_keydirgen; // To help with knowing when to update computed data. vector m_cdirs; // directory stack for the confstacks map m_fldtotraits; // Field to field params map m_aliastocanon; map m_aliastoqcanon; set m_storedFields; map m_xattrtofld; unsigned int m_maxsufflen; ParamStale m_oldstpsuffstate; // Values from user mimemap, now obsolete ParamStale m_stpsuffstate; vector m_stopsuffvec; ParamStale m_skpnstate; vector m_skpnlist; // Original current working directory. Set once at init before we do any // chdir'ing and used for converting user args to absolute paths. static string o_origcwd; // Parameters auto-fetched on setkeydir string m_defcharset; static string o_localecharset; // Limiting set of mime types to be processed. Normally empty. ParamStale m_rmtstate; std::unordered_set m_restrictMTypes; // Exclusion set of mime types. Normally empty ParamStale m_xmtstate; std::unordered_set m_excludeMTypes; vector > m_thrConf; // Same idea with the metadata-gathering external commands, // (e.g. used to reap tagging info: "tmsu tags %f") ParamStale m_mdrstate; vector m_mdreapers; ////////////////// // Members needing explicit processing when copying void *m_stopsuffixes; ConfStack *m_conf; // Parsed configuration files ConfStack *mimemap; // The files don't change with keydir, ConfStack *mimeconf; // but their content may depend on it. ConfStack *mimeview; // ConfStack *m_fields; ConfSimple *m_ptrans; // Paths translations /////////////////// /** Create initial user configuration */ bool initUserConfig(); /** Init all ParamStale members */ void initParamStale(ConfNull *cnf, ConfNull *mimemap); /** Copy from other */ void initFrom(const RclConfig& r); /** Init pointers to 0 */ void zeroMe(); /** Free data then zero pointers */ void freeAll(); bool readFieldsConfig(const string& errloc); }; // This global variable defines if we are running with an index // stripped of accents and case or a raw one. Ideally, it should be // constant, but it needs to be initialized from the configuration, so // there is no way to do this. It never changes after initialization // of course. Changing the value on a given index imposes a // reset. When using multiple indexes, all must have the same value extern bool o_index_stripchars; // This global variable defines if we use mtime instead of ctime for // up-to-date tests. This is mostly incompatible with xattr indexing, // in addition to other issues. See recoll.conf comments. extern bool o_uptodate_test_use_mtime; #endif /* _RCLCONFIG_H_INCLUDED_ */ recoll-1.23.7/common/conf_post.h0000644000175000017500000000171413125637102013443 00000000000000 #ifdef _WIN32 #include "safewindows.h" #ifdef _MSC_VER // gmtime is supposedly thread-safe on windows #define gmtime_r(A, B) gmtime(A) #define localtime_r(A,B) localtime(A) typedef int mode_t; #define fseeko _fseeki64 #define ftello (off_t)_ftelli64 #define ftruncate _chsize_s #define PATH_MAX MAX_PATH #define RCL_ICONV_INBUF_CONST 1 #define HAVE_STRUCT_TIMESPEC #define strdup _strdup #define timegm _mkgmtime #else // End _MSC_VER -> Gminw #undef RCL_ICONV_INBUF_CONST #define timegm portable_timegm #endif // GMinw only typedef int pid_t; inline int readlink(const char *cp, void *buf, int cnt) { return -1; } #define MAXPATHLEN PATH_MAX typedef DWORD32 u_int32_t; typedef DWORD64 u_int64_t; typedef unsigned __int8 u_int8_t; typedef int ssize_t; #define strncasecmp _strnicmp #define strcasecmp _stricmp #define chdir _chdir #define R_OK 4 #define W_OK 2 #ifndef X_OK #define X_OK 4 #endif #define S_ISLNK(X) false #define lstat stat #endif // _WIN32 recoll-1.23.7/common/unacpp.h0000644000175000017500000000310513125527323012736 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UNACPP_H_INCLUDED_ #define _UNACPP_H_INCLUDED_ #include #ifndef NO_NAMESPACES using std::string; #endif /* NO_NAMESPACES */ // A small stringified wrapper for unac.c enum UnacOp {UNACOP_UNAC = 1, UNACOP_FOLD = 2, UNACOP_UNACFOLD = 3}; extern bool unacmaybefold(const string& in, string& out, const char *encoding, UnacOp what); // Utility function to determine if string begins with capital extern bool unaciscapital(const string& in); // Utility function to determine if string has upper-case anywhere extern bool unachasuppercase(const string& in); // Utility function to determine if any character is accented. This // approprialey ignores the characters from unac_except_chars which // are really separate letters extern bool unachasaccents(const string& in); #endif /* _UNACPP_H_INCLUDED_ */ recoll-1.23.7/common/textsplit.cpp0000644000175000017500000011461013125637102014044 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_TEXTSPLIT #include "autoconfig.h" #include #include #include #include #include #include #include #include "textsplit.h" #include "log.h" //#define UTF8ITER_CHECK #include "utf8iter.h" #include "uproplist.h" #include "smallut.h" // Decide if we treat katakana as western scripts, splitting into // words instead of n-grams. This is not absurd (katakana is a kind of // alphabet, albeit phonetic and syllabic and is mostly used to // transcribe western words), but it does not work well because // japanese uses separator-less compound katakana words, and because // the plural terminaisons are irregular and would need a specialized // stemmer. So we for now process katakana as the rest of cjk, using // ngrams #undef KATAKANA_AS_WORDS using namespace std; /** * Splitting a text into words. The code in this file works with utf-8 * in a semi-clean way (see uproplist.h). Ascii still gets special * treatment in the sense that many special characters can only be * ascii (e.g. @, _,...). However, this compromise works quite well * while being much more light-weight than a full-blown Unicode * approach (ICU...) */ // Ascii character classes: we have three main groups, and then some chars // are their own class because they want special handling. // // We have an array with 256 slots where we keep the character types. // The array could be fully static, but we use a small function to fill it // once. // The array is actually a remnant of the original version which did no utf8. // Only the lower 127 slots are now used, but keep it at 256 // because it makes some tests in the code simpler. const unsigned int charclasses_size = 256; enum CharClass {LETTER=256, SPACE=257, DIGIT=258, WILD=259, A_ULETTER=260, A_LLETTER=261, SKIP=262}; static int charclasses[charclasses_size]; // Non-ascii UTF-8 characters are handled with sets holding all // characters with interesting properties. This is far from full-blown // management of Unicode properties, but seems to do the job well // enough in most common cases static vector vpuncblocks; static std::unordered_set spunc; static std::unordered_set visiblewhite; static std::unordered_set sskip; class CharClassInit { public: CharClassInit() { unsigned int i; // Set default value for all: SPACE for (i = 0 ; i < 256 ; i ++) charclasses[i] = SPACE; char digits[] = "0123456789"; for (i = 0; i < strlen(digits); i++) charclasses[int(digits[i])] = DIGIT; char upper[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (i = 0; i < strlen(upper); i++) charclasses[int(upper[i])] = A_ULETTER; char lower[] = "abcdefghijklmnopqrstuvwxyz"; for (i = 0; i < strlen(lower); i++) charclasses[int(lower[i])] = A_LLETTER; char wild[] = "*?[]"; for (i = 0; i < strlen(wild); i++) charclasses[int(wild[i])] = WILD; // Characters with special treatment: // // The first ones are mostly span-constructing "glue" // characters, for example those typically allowing us to // search for an email address as a whole (bob@isp.org instead // of as a phrase "bob isp org" // // The case of the minus sign is a complicated one. It went // from glue to non-glue to glue along Recoll versions. // See minus-hyphen-dash.txt in doc/notes char special[] = ".@+-#'_\n\r\f"; for (i = 0; i < strlen(special); i++) charclasses[int(special[i])] = special[i]; for (i = 0; i < sizeof(unipunc) / sizeof(int); i++) { spunc.insert(unipunc[i]); } spunc.insert((unsigned int)-1); for (i = 0; i < sizeof(unipuncblocks) / sizeof(int); i++) { vpuncblocks.push_back(unipuncblocks[i]); } assert((vpuncblocks.size() % 2) == 0); for (i = 0; i < sizeof(avsbwht) / sizeof(int); i++) { visiblewhite.insert(avsbwht[i]); } for (i = 0; i < sizeof(uniskip) / sizeof(int); i++) { sskip.insert(uniskip[i]); } } }; static const CharClassInit charClassInitInstance; static inline int whatcc(unsigned int c) { if (c <= 127) { return charclasses[c]; } else { if (c == 0x2010) { // Special treatment for hyphen: handle as ascii minus. See // doc/notes/minus-hyphen-dash.txt return 0x2010; } else if (sskip.find(c) != sskip.end()) { return SKIP; } else if (spunc.find(c) != spunc.end()) { return SPACE; } else { vector::iterator it = lower_bound(vpuncblocks.begin(), vpuncblocks.end(), c); if (it == vpuncblocks.end()) return LETTER; if (c == *it) return SPACE; if ((it - vpuncblocks.begin()) % 2 == 1) { return SPACE; } else { return LETTER; } } } } // testing whatcc... #if 0 unsigned int testvalues[] = {'a', '0', 0x80, 0xbf, 0xc0, 0x05c3, 0x1000, 0x2000, 0x2001, 0x206e, 0x206f, 0x20d0, 0x2399, 0x2400, 0x2401, 0x243f, 0x2440, 0xff65}; int ntest = sizeof(testvalues) / sizeof(int); for (int i = 0; i < ntest; i++) { int ret = whatcc(testvalues[i]); printf("Tested value 0x%x, returned value %d %s\n", testvalues[i], ret, ret == LETTER ? "LETTER" : ret == SPACE ? "SPACE" : "OTHER"); } #endif // CJK Unicode character detection: // // 2E80..2EFF; CJK Radicals Supplement // 3000..303F; CJK Symbols and Punctuation // 3040..309F; Hiragana // 30A0..30FF; Katakana // 3100..312F; Bopomofo // 3130..318F; Hangul Compatibility Jamo // 3190..319F; Kanbun // 31A0..31BF; Bopomofo Extended // 31C0..31EF; CJK Strokes // 31F0..31FF; Katakana Phonetic Extensions // 3200..32FF; Enclosed CJK Letters and Months // 3300..33FF; CJK Compatibility // 3400..4DBF; CJK Unified Ideographs Extension A // 4DC0..4DFF; Yijing Hexagram Symbols // 4E00..9FFF; CJK Unified Ideographs // A700..A71F; Modifier Tone Letters // AC00..D7AF; Hangul Syllables // F900..FAFF; CJK Compatibility Ideographs // FE30..FE4F; CJK Compatibility Forms // FF00..FFEF; Halfwidth and Fullwidth Forms // 20000..2A6DF; CJK Unified Ideographs Extension B // 2F800..2FA1F; CJK Compatibility Ideographs Supplement #define UNICODE_IS_CJK(p) \ (((p) >= 0x2E80 && (p) <= 0x2EFF) || \ ((p) >= 0x3000 && (p) <= 0x9FFF) || \ ((p) >= 0xA700 && (p) <= 0xA71F) || \ ((p) >= 0xAC00 && (p) <= 0xD7AF) || \ ((p) >= 0xF900 && (p) <= 0xFAFF) || \ ((p) >= 0xFE30 && (p) <= 0xFE4F) || \ ((p) >= 0xFF00 && (p) <= 0xFFEF) || \ ((p) >= 0x20000 && (p) <= 0x2A6DF) || \ ((p) >= 0x2F800 && (p) <= 0x2FA1F)) // We should probably map 'fullwidth ascii variants' and 'halfwidth // katakana variants' to something else. Look up "Kuromoji" Lucene // filter, KuromojiNormalizeFilter.java // 309F is Hiragana. #ifdef KATAKANA_AS_WORDS #define UNICODE_IS_KATAKANA(p) \ ((p) != 0x309F && \ (((p) >= 0x3099 && (p) <= 0x30FF) || \ ((p) >= 0x31F0 && (p) <= 0x31FF))) #else #define UNICODE_IS_KATAKANA(p) false #endif bool TextSplit::isCJK(int c) { return UNICODE_IS_CJK(c) && !UNICODE_IS_KATAKANA(c); } bool TextSplit::isKATAKANA(int c) { return UNICODE_IS_KATAKANA(c); } // This is used to detect katakana/other transitions, which must // trigger a word split (there is not always a separator, and katakana // is otherwise treated like other, in the same routine, unless cjk // which has its span reader causing a word break) enum CharSpanClass {CSC_CJK, CSC_KATAKANA, CSC_OTHER}; bool TextSplit::o_processCJK = true; unsigned int TextSplit::o_CJKNgramLen = 2; bool TextSplit::o_noNumbers = false; bool TextSplit::o_deHyphenate = false; // Final term checkpoint: do some checking (the kind which is simpler // to do here than in the main loop), then send term to our client. inline bool TextSplit::emitterm(bool isspan, string &w, int pos, size_t btstart, size_t btend) { LOGDEB2("TextSplit::emitterm: [" << w << "] pos " << pos << "\n"); int l = int(w.length()); #ifdef TEXTSPLIT_STATS // Update word length statistics. Do this before we filter out // long words because stats are used to detect bad text if (!isspan || m_wordLen == m_span.length()) m_stats.newsamp(m_wordChars); #endif if (l > 0 && l < m_maxWordLength) { // 1 byte word: we index single ascii letters and digits, but // nothing else. We might want to turn this into a test for a // single utf8 character instead ? if (l == 1) { unsigned int c = ((unsigned int)w[0]) & 0xff; if (charclasses[c] != A_ULETTER && charclasses[c] != A_LLETTER && charclasses[c] != DIGIT && (!(m_flags & TXTS_KEEPWILD) || charclasses[c] != WILD) ) { //cerr << "ERASING single letter term " << c << endl; return true; } } if (pos != m_prevpos || l != m_prevlen) { bool ret = takeword(w, pos, int(btstart), int(btend)); m_prevpos = pos; m_prevlen = int(w.length()); return ret; } LOGDEB2("TextSplit::emitterm:dup: [" << w << "] pos " << pos << "\n"); } return true; } // Check for an acronym/abbreviation ie I.B.M. This only works with // ascii (no non-ascii utf-8 acronym are possible) bool TextSplit::span_is_acronym(string *acronym) { bool acron = false; if (m_wordLen != m_span.length() && m_span.length() > 2 && m_span.length() <= 20) { acron = true; // Check odd chars are '.' for (unsigned int i = 1 ; i < m_span.length(); i += 2) { if (m_span[i] != '.') { acron = false; break; } } if (acron) { // Check that even chars are letters for (unsigned int i = 0 ; i < m_span.length(); i += 2) { int c = m_span[i]; if (!((c >= 'a' && c <= 'z')||(c >= 'A' && c <= 'Z'))) { acron = false; break; } } } } if (acron) { for (unsigned int i = 0; i < m_span.length(); i += 2) { *acronym += m_span[i]; } } return acron; } // Generate terms from span. Have to take into account the // flags: ONLYSPANS, NOSPANS, noNumbers bool TextSplit::words_from_span(size_t bp) { #if 0 cerr << "Span: [" << m_span << "] " << " w_i_s size: " << m_words_in_span.size() << " : "; for (unsigned int i = 0; i < m_words_in_span.size(); i++) { cerr << " [" << m_words_in_span[i].first << " " << m_words_in_span[i].second << "] "; } cerr << endl; #endif int spanwords = int(m_words_in_span.size()); int pos = m_spanpos; // Byte position of the span start size_t spboffs = bp - m_span.size(); if (o_deHyphenate && spanwords == 2 && m_span[m_words_in_span[0].second] == '-') { unsigned int s0 = m_words_in_span[0].first; unsigned int l0 = m_words_in_span[0].second - m_words_in_span[0].first; unsigned int s1 = m_words_in_span[1].first; unsigned int l1 = m_words_in_span[1].second - m_words_in_span[1].first; string word = m_span.substr(s0, l0) + m_span.substr(s1, l1); if (l0 && l1) emitterm(false, word, m_spanpos, spboffs, spboffs + m_words_in_span[1].second); } for (int i = 0; i < ((m_flags&TXTS_ONLYSPANS) ? 1 : spanwords); i++) { int deb = m_words_in_span[i].first; bool noposinc = m_words_in_span[i].second == deb; for (int j = ((m_flags&TXTS_ONLYSPANS) ? spanwords-1 : i); j < ((m_flags&TXTS_NOSPANS) ? i+1 : spanwords); j++) { int fin = m_words_in_span[j].second; //cerr << "i " << i << " j " << j << " deb " << deb << //" fin " << fin << endl; if (fin - deb > int(m_span.size())) break; string word(m_span.substr(deb, fin-deb)); if (!emitterm(j != i+1, word, pos, spboffs+deb, spboffs+fin)) return false; } if (!noposinc) ++pos; } return true; } /** * A method called at word boundaries (different places in * text_to_words()), to adjust the current state of the parser, and * possibly generate term(s). While inside a span (words linked by * glue characters), we just keep track of the word boundaries. Once * actual white-space is reached, we get called with spanerase set to * true, and we process the span, calling the emitterm() routine for * each generated term. * * The object flags can modify our behaviour, deciding if we only emit * single words (bill, recoll, org), only spans (bill@recoll.org), or * words and spans (bill@recoll.org, recoll.org, jf, recoll...) * * @return true if ok, false for error. Splitting should stop in this case. * @param spanerase Set if the current span is at its end. Process it. * @param bp The current BYTE position in the stream */ inline bool TextSplit::doemit(bool spanerase, size_t _bp) { int bp = int(_bp); LOGDEB2("TextSplit::doemit: sper " << spanerase << " bp " << bp << " spp " << m_spanpos << " spanwords " << m_words_in_span.size() << " wS " << m_wordStart << " wL " << m_wordLen << " inn " << m_inNumber << " span [" << m_span << "]\n"); if (m_wordLen) { // We have a current word. Remember it // Limit max span word count if (m_words_in_span.size() >= 6) { spanerase = true; } m_words_in_span.push_back(pair(m_wordStart, m_wordStart + m_wordLen)); m_wordpos++; m_wordLen = m_wordChars = 0; } if (spanerase) { // We encountered a span-terminating character. Produce terms. string acronym; if (span_is_acronym(&acronym)) { if (!emitterm(false, acronym, m_spanpos, bp - m_span.length(), bp)) return false; } // Maybe trim at end. These are chars that we might keep // inside a span, but not at the end. while (m_span.length() > 0) { switch (*(m_span.rbegin())) { case '.': case '-': case ',': case '@': case '_': case '\'': m_span.resize(m_span.length()-1); if (m_words_in_span.size() && m_words_in_span.back().second > int(m_span.size())) m_words_in_span.back().second = int(m_span.size()); if (--bp < 0) bp = 0; break; default: goto breaktrimloop; } } breaktrimloop: if (!words_from_span(bp)) { return false; } discardspan(); } else { m_wordStart = int(m_span.length()); } return true; } void TextSplit::discardspan() { m_span.clear(); m_words_in_span.clear(); m_spanpos = m_wordpos; m_wordStart = 0; m_wordLen = m_wordChars = 0; } static inline bool isalphanum(int what, unsigned int flgs) { return what == A_LLETTER || what == A_ULETTER || what == DIGIT || what == LETTER || ((flgs & TextSplit::TXTS_KEEPWILD) && what == WILD); } static inline bool isdigit(int what, unsigned int flgs) { return what == DIGIT || ((flgs & TextSplit::TXTS_KEEPWILD) && what == WILD); } #ifdef TEXTSPLIT_STATS #define STATS_INC_WORDCHARS ++m_wordChars #else #define STATS_INC_WORDCHARS #endif vector splitFlags = { {TextSplit::TXTS_NOSPANS, "nospans"}, {TextSplit::TXTS_ONLYSPANS, "onlyspans"}, {TextSplit::TXTS_KEEPWILD, "keepwild"} }; /** * Splitting a text into terms to be indexed. * We basically emit a word every time we see a separator, but some chars are * handled specially so that special cases, ie, c++ and jfd@recoll.com etc, * are handled properly, */ bool TextSplit::text_to_words(const string &in) { LOGDEB1("TextSplit::text_to_words: docjk " << o_processCJK << "(" << o_CJKNgramLen << ") " << flagsToString(splitFlags, m_flags) << " [" << in.substr(0,50) << "]\n"); if (in.empty()) return true; // Reset the data members relative to splitting state clearsplitstate(); bool pagepending = false; bool softhyphenpending = false; // Running count of non-alphanum chars. Reset when we see one; int nonalnumcnt = 0; Utf8Iter it(in); int prev_csc = -1; for (; !it.eof(); it++) { unsigned int c = *it; nonalnumcnt++; if (c == (unsigned int)-1) { LOGERR("Textsplit: error occured while scanning UTF-8 string\n"); return false; } CharSpanClass csc; if (UNICODE_IS_KATAKANA(c)) { csc = CSC_KATAKANA; } else if (UNICODE_IS_CJK(c)) { csc = CSC_CJK; } else { csc = CSC_OTHER; } if (o_processCJK && csc == CSC_CJK) { // CJK excluding Katakana character hit. // Do like at EOF with the current non-cjk data. if (m_wordLen || m_span.length()) { if (!doemit(true, it.getBpos())) return false; } // Hand off situation to the cjk routine. if (!cjk_to_words(&it, &c)) { LOGERR("Textsplit: scan error in cjk handler\n"); return false; } // Check for eof, else c contains the first non-cjk // character after the cjk sequence, just go on. if (it.eof()) break; } #ifdef KATAKANA_AS_WORDS // Only needed if we have script transitions inside this // routine, else the call to cjk_to_words does the job. if (csc != prev_csc && (m_wordLen || m_span.length())) { LOGDEB("csc " << csc << " pcsc " << prev_csc << " wl " << m_wordLen << " spl " << m_span.length() << endl); if (!doemit(true, it.getBpos())) { return false; } } #endif prev_csc = csc; int cc = whatcc(c); switch (cc) { case SKIP: // Special-case soft-hyphen. To work, this depends on the // fact that only SKIP calls "continue" inside the // switch. All the others will do the softhyphenpending // reset after the switch if (c == 0xad) { softhyphenpending = true; } else { softhyphenpending = false; } // Skips the softhyphenpending reset continue; case DIGIT: nonalnumcnt = 0; if (m_wordLen == 0) m_inNumber = true; m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; case SPACE: nonalnumcnt = 0; SPACE: if (m_wordLen || m_span.length()) { if (!doemit(true, it.getBpos())) return false; m_inNumber = false; } if (pagepending) { pagepending = false; newpage(m_wordpos); } break; case WILD: if (m_flags & TXTS_KEEPWILD) goto NORMALCHAR; else goto SPACE; break; case '-': case '+': if (m_wordLen == 0) { // + or - don't start a term except if this looks like // it's going to be to be a number if (isdigit(whatcc(it[it.getCpos()+1]), m_flags)) { // -10 m_inNumber = true; m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } } else if (m_inNumber) { if ((m_span[m_span.length() - 1] == 'e' || m_span[m_span.length() - 1] == 'E')) { if (isdigit(whatcc(it[it.getCpos()+1]), m_flags)) { m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } } } else { if (cc == '+') { int nextc = it[it.getCpos()+1]; if (nextc == '+' || nextc == -1 || visiblewhite.find(nextc) != visiblewhite.end()) { // someword++[+...] ! m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } } else { // Treat '-' inside span as glue char if (!doemit(false, it.getBpos())) return false; m_inNumber = false; m_wordStart += it.appendchartostring(m_span); break; } } goto SPACE; break; case 0x2010: // Hyphen is replaced with ascii minus if (m_wordLen != 0) { // Treat '-' inside span as glue char if (!doemit(false, it.getBpos())) return false; m_inNumber = false; m_span += '-'; m_wordStart++; break; } goto SPACE; case '.': { // Need a little lookahead here. At worse this gets the end null int nextc = it[it.getCpos()+1]; int nextwhat = whatcc(nextc); if (m_inNumber) { if (!isdigit(nextwhat, m_flags)) goto SPACE; m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } else { // Found '.' while not in number // Only letters and digits make sense after if (!isalphanum(nextwhat, m_flags)) goto SPACE; // Keep an initial '.' for catching .net, and .34 (aka // 0.34) but this adds quite a few spurious terms ! if (m_span.length() == 0) { // Check for number like .1 if (isdigit(nextwhat, m_flags)) { m_inNumber = true; m_wordLen += it.appendchartostring(m_span); } else { m_words_in_span. push_back(pair(m_wordStart, m_wordStart)); m_wordStart += it.appendchartostring(m_span); } STATS_INC_WORDCHARS; break; } // '.' between words: span glue if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; m_wordStart += it.appendchartostring(m_span); } } } break; case '@': case '_': case '\'': // If in word, potential span: o'brien, jf@dockes.org, // else just ignore if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; m_inNumber = false; m_wordStart += it.appendchartostring(m_span); } break; case '#': { int w = whatcc(it[it.getCpos()+1]); // Keep it only at the beginning of a word (hashtag), if (m_wordLen == 0 && isalphanum(w, m_flags)) { m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } // or at the end (special case for c# ...) if (m_wordLen > 0) { if (w == SPACE || w == '\n' || w == '\r') { m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } } goto SPACE; } break; case '\n': case '\r': if (m_span.length() && *m_span.rbegin() == '-') { // if '-' is the last char before end of line, we // strip it. We have no way to know if this is added // because of the line split or if it was part of an // actual compound word (would need a dictionary to // check). As soft-hyphen *should* be used if the '-' // is not part of the text, it is better to properly // process a real compound word, and produce wrong // output from wrong text. The word-emitting routine // will strip the trailing '-'. goto SPACE; } else if (softhyphenpending) { // Don't reset soft-hyphen continue; } else { // Normal case: EOL is white space goto SPACE; } break; case '\f': pagepending = true; goto SPACE; break; #ifdef RCL_SPLIT_CAMELCASE // Camelcase handling. // If we get uppercase ascii after lowercase ascii, emit word. // This emits "camel" when hitting the 'C' of camelCase // Not enabled by defaults as this makes phrase searches quite // confusing. // ie "MySQL manual" is matched by "MySQL manual" and // "my sql manual" but not "mysql manual" // A possibility would be to emit both my and sql at the // same position. All non-phrase searches would work, and // both "MySQL manual" and "mysql manual" phrases would // match too. "my sql manual" would not match, but this is // not an issue. case A_ULETTER: if (m_span.length() && charclasses[(unsigned char)m_span[m_span.length() - 1]] == A_LLETTER) { if (m_wordLen) { if (!doemit(false, it.getBpos())) return false; } } goto NORMALCHAR; // CamelCase handling. // If we get lowercase after uppercase and the current // word length is bigger than one, it means we had a // string of several upper-case letters: an // acronym (readHTML) or a single letter article (ALittleHelp). // Emit the uppercase word before proceeding case A_LLETTER: if (m_span.length() && charclasses[(unsigned char)m_span[m_span.length() - 1]] == A_ULETTER && m_wordLen > 1) { // Multiple upper-case letters. Single letter word // or acronym which we want to emit now m_wordLen--; if (!doemit(false, it.getBpos())) return false; // m_wordstart could be 0 here if the span was reset // for excessive length if (m_wordStart) m_wordStart--; m_wordLen++; } goto NORMALCHAR; #endif /* CAMELCASE */ default: NORMALCHAR: nonalnumcnt = 0; if (m_inNumber && c != 'e' && c != 'E') { m_inNumber = false; } m_wordLen += it.appendchartostring(m_span); STATS_INC_WORDCHARS; break; } softhyphenpending = false; } if (m_wordLen || m_span.length()) { if (!doemit(true, it.getBpos())) return false; } return true; } // Using an utf8iter pointer just to avoid needing its definition in // textsplit.h // // We output ngrams for exemple for char input a b c and ngramlen== 2, // we generate: a ab b bc c as words // // This is very different from the normal behaviour, so we don't use // the doemit() and emitterm() routines // // The routine is sort of a mess and goes to show that we'd probably // be better off converting the whole buffer to utf32 on entry... bool TextSplit::cjk_to_words(Utf8Iter *itp, unsigned int *cp) { LOGDEB1("cjk_to_words: m_wordpos " << m_wordpos << "\n"); Utf8Iter &it = *itp; // We use an offset buffer to remember the starts of the utf-8 // characters which we still need to use. assert(o_CJKNgramLen < o_CJKMaxNgramLen); unsigned int boffs[o_CJKMaxNgramLen+1]; // Current number of valid offsets; unsigned int nchars = 0; unsigned int c = 0; for (; !it.eof(); it++) { c = *it; if (!UNICODE_IS_CJK(c)) { // Return to normal handler break; } if (whatcc(c) == SPACE) { // Flush the ngram buffer and go on nchars = 0; continue; } if (nchars == o_CJKNgramLen) { // Offset buffer full, shift it. Might be more efficient // to have a circular one, but things are complicated // enough already... for (unsigned int i = 0; i < nchars-1; i++) { boffs[i] = boffs[i+1]; } } else { nchars++; } // Take note of byte offset for this character. boffs[nchars-1] = int(it.getBpos()); // Output all new ngrams: they begin at each existing position // and end after the new character. onlyspans->only output // maximum words, nospans=> single chars if (!(m_flags & TXTS_ONLYSPANS) || nchars == o_CJKNgramLen) { int btend = int(it.getBpos() + it.getBlen()); int loopbeg = (m_flags & TXTS_NOSPANS) ? nchars-1 : 0; int loopend = (m_flags & TXTS_ONLYSPANS) ? 1 : nchars; for (int i = loopbeg; i < loopend; i++) { if (!takeword(it.buffer().substr(boffs[i], btend-boffs[i]), m_wordpos - (nchars-i-1), boffs[i], btend)) { return false; } } if ((m_flags & TXTS_ONLYSPANS)) { // Only spans: don't overlap: flush buffer nchars = 0; } } // Increase word position by one, other words are at an // existing position. This could be subject to discussion... m_wordpos++; } // If onlyspans is set, there may be things to flush in the buffer // first if ((m_flags & TXTS_ONLYSPANS) && nchars > 0 && nchars != o_CJKNgramLen) { int btend = int(it.getBpos()); // Current char is out if (!takeword(it.buffer().substr(boffs[0], btend-boffs[0]), m_wordpos - nchars, boffs[0], btend)) { return false; } } // Reset state, saving term position, and return the found non-cjk // unicode character value. The current input byte offset is kept // in the utf8Iter int pos = m_wordpos; clearsplitstate(); m_spanpos = m_wordpos = pos; *cp = c; return true; } // Specialization for countWords class TextSplitCW : public TextSplit { public: int wcnt; TextSplitCW(Flags flags) : TextSplit(flags), wcnt(0) {} bool takeword(const string &, int, int, int) { wcnt++; return true; } }; int TextSplit::countWords(const string& s, TextSplit::Flags flgs) { TextSplitCW splitter(flgs); splitter.text_to_words(s); return splitter.wcnt; } bool TextSplit::hasVisibleWhite(const string &in) { Utf8Iter it(in); for (; !it.eof(); it++) { unsigned int c = (unsigned char)*it; if (c == (unsigned int)-1) { LOGERR("hasVisibleWhite: error while scanning UTF-8 string\n"); return false; } if (visiblewhite.find(c) != visiblewhite.end()) return true; } return false; } template bool u8stringToStrings(const string &s, T &tokens) { Utf8Iter it(s); string current; tokens.clear(); enum states {SPACE, TOKEN, INQUOTE, ESCAPE}; states state = SPACE; for (; !it.eof(); it++) { unsigned int c = *it; if (visiblewhite.find(c) != visiblewhite.end()) c = ' '; if (c == (unsigned int)-1) { LOGERR("TextSplit::stringToStrings: error while scanning UTF-8 " "string\n"); return false; } switch (c) { case '"': switch(state) { case SPACE: state = INQUOTE; continue; case TOKEN: goto push_char; case ESCAPE: state = INQUOTE; goto push_char; case INQUOTE: tokens.push_back(current);current.clear(); state = SPACE; continue; } break; case '\\': switch(state) { case SPACE: case TOKEN: state=TOKEN; goto push_char; case INQUOTE: state = ESCAPE; continue; case ESCAPE: state = INQUOTE; goto push_char; } break; case ' ': case '\t': case '\n': case '\r': switch(state) { case SPACE: continue; case TOKEN: tokens.push_back(current); current.clear(); state = SPACE; continue; case INQUOTE: case ESCAPE: goto push_char; } break; default: switch(state) { case ESCAPE: state = INQUOTE; break; case SPACE: state = TOKEN; break; case TOKEN: case INQUOTE: break; } push_char: it.appendchartostring(current); } } // End of string. Process residue, and possible error (unfinished quote) switch(state) { case SPACE: break; case TOKEN: tokens.push_back(current); break; case INQUOTE: case ESCAPE: return false; } return true; } bool TextSplit::stringToStrings(const string &s, vector &tokens) { return u8stringToStrings >(s, tokens); } #else // TEST driver -> #include #include #include #include #include #include #include #include #include "textsplit.h" #include "readfile.h" #include "log.h" #include "transcode.h" #include "unacpp.h" #include "termproc.h" using namespace std; class myTermProc : public Rcl::TermProc { int first; bool nooutput; public: myTermProc() : TermProc(0), first(1), nooutput(false) {} void setNoOut(bool val) {nooutput = val;} virtual bool takeword(const string &term, int pos, int bs, int be) { if (nooutput) return true; FILE *fp = stdout; if (first) { fprintf(fp, "%3s %-20s %4s %4s\n", "pos", "Term", "bs", "be"); first = 0; } fprintf(fp, "%3d %-20s %4d %4d\n", pos, term.c_str(), bs, be); return true; } }; #define OPT_s 0x1 #define OPT_w 0x2 #define OPT_q 0x4 #define OPT_c 0x8 #define OPT_k 0x10 #define OPT_C 0x20 #define OPT_n 0x40 #define OPT_S 0x80 #define OPT_u 0x100 #define OPT_p 0x200 bool dosplit(const string& data, TextSplit::Flags flags, int op_flags) { myTermProc printproc; Rcl::TermProc *nxt = &printproc; // Rcl::TermProcCommongrams commonproc(nxt, stoplist); // if (op_flags & OPT_S) // nxt = &commonproc; Rcl::TermProcPrep preproc(nxt); if (op_flags & OPT_u) nxt = &preproc; Rcl::TextSplitP splitter(nxt, flags); if (op_flags & OPT_q) printproc.setNoOut(true); splitter.text_to_words(data); #ifdef TEXTSPLIT_STATS TextSplit::Stats::Values v = splitter.getStats(); cout << "Average length: " << v.avglen << " Standard deviation: " << v.sigma << " Coef of variation " << v.sigma / v.avglen << endl; #endif return true; } static const char *teststrings[] = { "Un bout de texte \nnormal. 2eme phrase.3eme;quatrieme.\n", "\"Jean-Francois Dockes\" \n", "n@d @net .net net@ t@v@c c# c++ o'brien 'o'brien'", "_network_ some_span", "data123\n", "134 +134 -14 0.1 .1 2. -1.5 +1.5 1,2 1.54e10 1,2e30 .1e10 1.e-8\n", "@^#$(#$(*)\n", "192.168.4.1 one\n\rtwo\r", "[olala][ululu] (valeur) (23)\n", "utf-8 ucs-4© \\nodef\n", "A b C 2 . +", "','this\n", " ,able,test-domain", " -wl,--export-dynamic", " ~/.xsession-errors", "this_very_long_span_this_very_long_span_this_very_long_span", "soft\xc2\xadhyphen", "soft\xc2\xad\nhyphen", "soft\xc2\xad\n\rhyphen", "real\xe2\x80\x90hyphen", "real\xe2\x80\x90\nhyphen", "hyphen-\nminus", }; const int teststrings_cnt = sizeof(teststrings)/sizeof(char *); static string teststring1 = " nouvel-an "; static string thisprog; static string usage = " textsplit [opts] [filename]\n" " -q : no output\n" " -s : only spans\n" " -w : only words\n" " -n : no numbers\n" " -k : preserve wildcards (?*)\n" " -c : just count words\n" " -u : use unac\n" " -C [charset] : input charset\n" " -S [stopfile] : stopfile to use for commongrams\n" " if filename is 'stdin', will read stdin for data (end with ^D)\n\n" " textplit -p somephrase : display results from stringToStrings()\n" " \n" ; static void Usage(void) { cerr << thisprog << ": usage:\n" << usage; exit(1); } static int op_flags; int main(int argc, char **argv) { string charset, stopfile; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; break; case 'C': op_flags |= OPT_C; if (argc < 2) Usage(); charset = *(++argv); argc--; goto b1; case 'k': op_flags |= OPT_k; break; case 'n': op_flags |= OPT_n; break; case 'p': op_flags |= OPT_p; break; case 'q': op_flags |= OPT_q; break; case 's': op_flags |= OPT_s; break; case 'S': op_flags |= OPT_S; if (argc < 2) Usage(); stopfile = *(++argv); argc--; goto b1; case 'u': op_flags |= OPT_u; break; case 'w': op_flags |= OPT_w; break; default: Usage(); break; } b1: argc--; argv++; } TextSplit::Flags flags = TextSplit::TXTS_NONE; if (op_flags&OPT_s) flags = TextSplit::TXTS_ONLYSPANS; else if (op_flags&OPT_w) flags = TextSplit::TXTS_NOSPANS; if (op_flags & OPT_k) flags = (TextSplit::Flags)(flags | TextSplit::TXTS_KEEPWILD); if (op_flags & OPT_n) TextSplit::noNumbers(); Rcl::StopList stoplist; if (op_flags & OPT_S) { if (!stoplist.setFile(stopfile)) { cerr << "Can't read stopfile: " << stopfile << endl; exit(1); } } string odata, reason; if (argc == 1) { const char *filename = *argv++; argc--; if (op_flags& OPT_p) { vector tokens; TextSplit::stringToStrings(filename, tokens); for (vector::const_iterator it = tokens.begin(); it != tokens.end(); it++) { cout << "[" << *it << "] "; } cout << endl; exit(0); } if (!strcmp(filename, "stdin")) { char buf[1024]; int nread; while ((nread = read(0, buf, 1024)) > 0) { odata.append(buf, nread); } } else if (!file_to_string(filename, odata, &reason)) { cerr << "Failed: file_to_string(" << filename << ") failed: " << reason << endl; exit(1); } } else { if (op_flags & OPT_p) Usage(); for (int i = 0; i < teststrings_cnt; i++) { cout << endl << teststrings[i] << endl; dosplit(teststrings[i], flags, op_flags); } exit(0); } string& data = odata; string ndata; if ((op_flags & OPT_C)) { if (!transcode(odata, ndata, charset, "UTF-8")) { cerr << "Failed: transcode error" << endl; exit(1); } else { data = ndata; } } if (op_flags & OPT_c) { int n = TextSplit::countWords(data, flags); cout << n << " words" << endl; } else { dosplit(data, flags, op_flags); } } #endif // TEST recoll-1.23.7/common/textsplit.h0000644000175000017500000001645013125637102013514 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _TEXTSPLIT_H_INCLUDED_ #define _TEXTSPLIT_H_INCLUDED_ #include #include #include class Utf8Iter; /** * Split text into words. * See comments at top of .cpp for more explanations. * This uses a callback function. It could be done with an iterator instead, * but 'ts much simpler this way... */ class TextSplit { public: // Should we activate special processing of Chinese characters ? This // needs a little more cpu, so it can be turned off globally. This is set // by rclconfig, changing it means reindexing static bool o_processCJK; static unsigned int o_CJKNgramLen; static const unsigned int o_CJKMaxNgramLen = 5; static void cjkProcessing(bool onoff, unsigned int ngramlen = 2) { o_processCJK = onoff; o_CJKNgramLen = ngramlen <= o_CJKMaxNgramLen ? ngramlen : o_CJKMaxNgramLen; } // Are we indexing numbers ? Set by rclconfig. Change needs reindex static bool o_noNumbers; static void noNumbers() { o_noNumbers = true; } // Given [co-worker] as input, do we also generate [coworker] ? // Set by rclconfig static bool o_deHyphenate; static void deHyphenate(bool on) { o_deHyphenate = on; } enum Flags { // Default: will return spans and words (a_b, a, b) TXTS_NONE = 0, // Only return maximum spans (a@b.com, not a, b, or com) TXTS_ONLYSPANS = 1, // Special: Only return atomic words (a, b, com). This is not // used for indexing, but for position computation during // abstract generation, TXTS_NOSPANS = 2, // Handle wildcards as letters. This is used with ONLYSPANS // for parsing a user query (never alone). TXTS_KEEPWILD = 4 }; TextSplit(Flags flags = Flags(TXTS_NONE)) : m_flags(flags), m_maxWordLength(40), m_prevpos(-1) { } virtual ~TextSplit() {} /** Split text, emit words and positions. */ virtual bool text_to_words(const std::string &in); /** Process one output word: to be implemented by the actual user class */ virtual bool takeword(const std::string& term, int pos, // term pos int bts, // byte offset of first char in term int bte // byte offset of first char after term ) = 0; /** Called when we encounter formfeed \f 0x0c. Override to use the event. * Mostly or exclusively used with pdftoxx output. Other filters mostly * just don't know about pages. */ virtual void newpage(int /*pos*/) { } // Static utility functions: /** Count words in string, as the splitter would generate them */ static int countWords(const std::string &in, Flags flgs = TXTS_ONLYSPANS); /** Check if this is visibly not a single block of text */ static bool hasVisibleWhite(const std::string &in); /** Split text span into strings, at white space, allowing for substrings * quoted with " . Escaping with \ works as usual inside the quoted areas. * This has to be kept separate from smallut.cpp's stringsToStrings, which * basically works only if whitespace is ascii, and which processes * non-utf-8 input (iso-8859 config files work ok). This hopefully * handles all Unicode whitespace, but needs correct utf-8 input */ static bool stringToStrings(const std::string &s, std::vector &tokens); /** Is char CJK ? (excluding Katakana) */ static bool isCJK(int c); static bool isKATAKANA(int c); /** Statistics about word length (average and dispersion) can * detect bad data like undecoded base64 or other mis-identified * pieces of data taken as text. In practise, this keeps some junk out * of the index, but does not decrease the index size much, and is * probably not worth the trouble in general. Code kept because it * probably can be useful in special cases. Base64 data does has * word separators in it (+/) and is characterised by high average * word length (>10, often close to 20) and high word length * dispersion (avg/sigma > 0.8). In my tests, most natural * language text has average word lengths around 5-8 and avg/sigma * < 0.7 */ #ifdef TEXTSPLIT_STATS class Stats { public: Stats() { reset(); } void reset() { count = 0; totlen = 0; sigma_acc = 0; } void newsamp(unsigned int len) { ++count; totlen += len; double avglen = double(totlen) / double(count); sigma_acc += (avglen - len) * (avglen - len); } struct Values { int count; double avglen; double sigma; }; Values get() { Values v; v.count = count; v.avglen = double(totlen) / double(count); v.sigma = sqrt(sigma_acc / count); return v; } private: int count; int totlen; double sigma_acc; }; Stats::Values getStats() { return m_stats.get(); } void resetStats() { m_stats.reset(); } #endif // TEXTSPLIT_STATS private: Flags m_flags; int m_maxWordLength; // Current span. Might be jf.dockes@wanadoo.f std::string m_span; std::vector > m_words_in_span; // Current word: no punctuation at all in there. Byte offset // relative to the current span and byte length int m_wordStart; unsigned int m_wordLen; // Currently inside number bool m_inNumber; // Term position of current word and span int m_wordpos; int m_spanpos; // It may happen that our cleanup would result in emitting the // same term twice. We try to avoid this int m_prevpos; int m_prevlen; #ifdef TEXTSPLIT_STATS // Stats counters. These are processed in TextSplit rather than by a // TermProc so that we can take very long words (not emitted) into // account. Stats m_stats; #endif // Word length in characters. Declared but not updated if !TEXTSPLIT_STATS unsigned int m_wordChars; void clearsplitstate() { m_span.clear(); m_words_in_span.clear(); m_inNumber = false; m_wordStart = m_wordLen = m_wordpos = m_spanpos = m_prevpos = m_prevlen = m_wordChars = 0; } // This processes cjk text: bool cjk_to_words(Utf8Iter *it, unsigned int *cp); bool emitterm(bool isspan, std::string &term, int pos, size_t bs,size_t be); bool doemit(bool spanerase, size_t bp); void discardspan(); bool span_is_acronym(std::string *acronym); bool words_from_span(size_t bp); }; #endif /* _TEXTSPLIT_H_INCLUDED_ */ recoll-1.23.7/common/rclinit.h0000644000175000017500000000534113125527323013120 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLINIT_H_INCLUDED_ #define _RCLINIT_H_INCLUDED_ #include class RclConfig; /** * Initialize by reading configuration, opening log file, etc. * * This must be called from the main thread before starting any others. It sets * up the global signal handling. other threads must call recoll_threadinit() * when starting. * * @param flags misc modifiers. These are currently only used to customize * the log file and verbosity. * @param cleanup function to call before exiting (atexit) * @param sigcleanup function to call on terminal signal (INT/HUP...) This * should typically set a flag which tells the program (recoll, * recollindex etc.. to exit as soon as possible (after closing the db, * etc.). cleanup will then be called by exit(). * @param reason in case of error: output string explaining things * @param argcnf Configuration directory name from the command line (overriding * default and environment * @return the parsed configuration. */ enum RclInitFlags {RCLINIT_NONE = 0, RCLINIT_DAEMON = 1, RCLINIT_IDX = 2}; extern RclConfig *recollinit(RclInitFlags flags, void (*cleanup)(void), void (*sigcleanup)(int), std::string& reason, const string *argcnf = 0); inline RclConfig *recollinit(void (*cleanup)(void), void (*sigcleanup)(int), std::string& reason, const std::string *argcnf = 0) { return recollinit(RCLINIT_NONE, cleanup, sigcleanup, reason, argcnf); } // Threads need to call this to block signals. // The main thread handles all signals. extern void recoll_threadinit(); // Check if main thread extern bool recoll_ismainthread(); // Should be called while exiting asap when critical cleanup (db // close) has been performed. Only useful for the indexer (writes to // the db), and only actually does something on Windows. extern void recoll_exitready(); #endif /* _RCLINIT_H_INCLUDED_ */ recoll-1.23.7/common/syngroups.cpp0000644000175000017500000001360113125637102014053 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_SYNGROUPS #include "autoconfig.h" #include "syngroups.h" #include "log.h" #include "smallut.h" #include #include #include #include #include using namespace std; // Note that we are storing each term twice. I don't think that the // size could possibly be a serious issue, but if it was, we could // reduce the storage a bit by storing (short hash)-> vector // correspondances in the direct map, and then checking all the // resulting groups for the input word. // // As it is, a word can only index one group (the last it is found // in). It can be part of several groups though (appear in // expansions). I really don't know what we should do with multiple // groups anyway class SynGroups::Internal { public: Internal() : ok(false) { } bool ok; // Term to group num std::unordered_map terms; // Group num to group vector > groups; }; bool SynGroups::ok() { return m && m->ok; } SynGroups::~SynGroups() { delete m; } SynGroups::SynGroups() : m(new Internal) { } bool SynGroups::setfile(const string& fn) { LOGDEB("SynGroups::setfile(" << (fn) << ")\n" ); if (!m) { m = new Internal; if (!m) { LOGERR("SynGroups:setfile:: new Internal failed: no mem ?\n" ); return false; } } if (fn.empty()) { delete m; m = 0; return true; } ifstream input; input.open(fn.c_str(), ios::in); if (!input.is_open()) { LOGERR("SynGroups:setfile:: could not open " << (fn) << " errno " << (errno) << "\n" ); return false; } string cline; bool appending = false; string line; bool eof = false; int lnum = 0; for (;;) { cline.clear(); getline(input, cline); if (!input.good()) { if (input.bad()) { LOGERR("Syngroup::setfile(" << (fn) << "):Parse: input.bad()\n" ); return false; } // Must be eof ? But maybe we have a partial line which // must be processed. This happens if the last line before // eof ends with a backslash, or there is no final \n eof = true; } lnum++; { string::size_type pos = cline.find_last_not_of("\n\r"); if (pos == string::npos) { cline.clear(); } else if (pos != cline.length()-1) { cline.erase(pos+1); } } if (appending) line += cline; else line = cline; // Note that we trim whitespace before checking for backslash-eol // This avoids invisible whitespace problems. trimstring(line); if (line.empty() || line.at(0) == '#') { if (eof) break; continue; } if (line[line.length() - 1] == '\\') { line.erase(line.length() - 1); appending = true; continue; } appending = false; vector words; if (!stringToStrings(line, words)) { LOGERR("SynGroups:setfile: " << (fn) << ": bad line " << (lnum) << ": " << (line) << "\n" ); continue; } if (words.empty()) continue; if (words.size() == 1) { LOGERR("Syngroup::setfile(" << (fn) << "):single term group at line " << (lnum) << " ??\n" ); continue; } m->groups.push_back(words); for (vector::const_iterator it = words.begin(); it != words.end(); it++) { m->terms[*it] = m->groups.size()-1; } LOGDEB1("SynGroups::setfile: group: [" << (stringsToString(m->groups.back())) << "]\n" ); } m->ok = true; return true; } vector SynGroups::getgroup(const string& term) { vector ret; if (!ok()) return ret; std::unordered_map::const_iterator it1 = m->terms.find(term); if (it1 == m->terms.end()) { LOGDEB1("SynGroups::getgroup: [" << (term) << "] not found in direct map\n" ); return ret; } unsigned int idx = it1->second; if (idx >= m->groups.size()) { LOGERR("SynGroups::getgroup: line index higher than line count !\n" ); return ret; } return m->groups[idx]; } #else #include "syngroups.h" #include "log.h" #include #include #include #include #include using namespace std; static char *thisprog; static char usage [] = "syngroups \n" " \n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_s 0x2 #define OPT_b 0x4 int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 2) { Usage(); } string fn = *argv++;argc--; string word = *argv++;argc--; DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); SynGroups syns; syns.setfile(fn); if (!syns.ok()) { cerr << "Initialization failed\n"; return 1; } vector group = syns.getgroup(word); cout << group.size() << " terms in group\n"; for (vector::const_iterator it = group.begin(); it != group.end(); it++) { cout << "[" << *it << "] "; } cout << endl; return 0; } #endif recoll-1.23.7/common/beaglequeuecache.cpp0000644000175000017500000000517713125637102015263 00000000000000/* Copyright (C) 2011 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "cstr.h" #include "beaglequeuecache.h" #include "circache.h" #include "log.h" #include "rclconfig.h" #include "pathut.h" #include "rcldoc.h" const string cstr_bgc_mimetype("mimetype"); BeagleQueueCache::BeagleQueueCache(RclConfig *cnf) { string ccdir = cnf->getWebcacheDir(); int maxmbs = 40; cnf->getConfParam("webcachemaxmbs", &maxmbs); if ((m_cache = new CirCache(ccdir)) == 0) { LOGERR("BeagleQueueCache: cant create CirCache object\n" ); return; } if (!m_cache->create(int64_t(maxmbs)*1000*1024, CirCache::CC_CRUNIQUE)) { LOGERR("BeagleQueueCache: cache file creation failed: " << (m_cache->getReason()) << "\n" ); delete m_cache; m_cache = 0; return; } } BeagleQueueCache::~BeagleQueueCache() { delete m_cache; } // Read document from cache. Return the metadata as an Rcl::Doc // @param htt Beagle Hit Type bool BeagleQueueCache::getFromCache(const string& udi, Rcl::Doc &dotdoc, string& data, string *htt) { string dict; if (m_cache == 0) { LOGERR("BeagleQueueCache::getFromCache: cache is null\n" ); return false; } if (!m_cache->get(udi, dict, &data)) { LOGDEB("BeagleQueueCache::getFromCache: get failed\n" ); return false; } ConfSimple cf(dict, 1); if (htt) cf.get(Rcl::Doc::keybght, *htt, cstr_null); // Build a doc from saved metadata cf.get(cstr_url, dotdoc.url, cstr_null); cf.get(cstr_bgc_mimetype, dotdoc.mimetype, cstr_null); cf.get(cstr_fmtime, dotdoc.fmtime, cstr_null); cf.get(cstr_fbytes, dotdoc.pcbytes, cstr_null); dotdoc.sig.clear(); vector names = cf.getNames(cstr_null); for (vector::const_iterator it = names.begin(); it != names.end(); it++) { cf.get(*it, dotdoc.meta[*it], cstr_null); } dotdoc.meta[Rcl::Doc::keyudi] = udi; return true; } recoll-1.23.7/common/utf8fn.cpp0000644000175000017500000000152613125637102013217 00000000000000#include "utf8fn.h" #include "rclconfig.h" #include "transcode.h" #include "log.h" using namespace std; string compute_utf8fn(const RclConfig *config, const string& ifn, bool simple) { string charset = config->getDefCharset(true); string utf8fn; int ercnt; string lfn(simple ? path_getsimple(ifn) : ifn); if (!transcode(lfn, utf8fn, charset, "UTF-8", &ercnt)) { LOGERR("compute_utf8fn: fn transcode failure from [" << charset << "] to UTF-8 for: [" << lfn << "]\n"); } else if (ercnt) { LOGDEB("compute_utf8fn: " << ercnt << " transcode errors from [" << charset << "] to UTF-8 for: [" << lfn << "]\n"); } LOGDEB1("compute_utf8fn: transcoded from [" << lfn << "] to [" << utf8fn << "] (" << charset << "->" << "UTF-8)\n"); return utf8fn; } recoll-1.23.7/common/autoconfig.h.in0000644000175000017500000001104013224432231014201 00000000000000/* common/autoconfig.h.in. Generated from configure.ac by autoheader. */ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD /* Path to the aspell api include file */ #undef ASPELL_INCLUDE /* Path to the aspell program */ #undef ASPELL_PROG /* No X11 session monitoring support */ #undef DISABLE_X11MON /* Path to the fam api include file */ #undef FAM_INCLUDE /* Path to the file program */ #undef FILE_PROG /* "Have C++0x" */ #undef HAVE_CXX0X_UNORDERED /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H /* Define if you have the iconv() function and it works. */ #undef HAVE_ICONV /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H /* Define to 1 if you have the `kqueue' function. */ #undef HAVE_KQUEUE /* Define to 1 if you have the `dl' library (-ldl). */ #undef HAVE_LIBDL /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD /* Define to 1 if you have the `z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* Define to 1 if you have the `mkdtemp' function. */ #undef HAVE_MKDTEMP /* Define to 1 if you have the `posix_spawn' function. */ #undef HAVE_POSIX_SPAWN /* Define to 1 if you have the `setrlimit' function. */ #undef HAVE_SETRLIMIT /* Has std::shared_ptr */ #undef HAVE_SHARED_PTR_STD /* Has std::tr1::shared_ptr */ #undef HAVE_SHARED_PTR_TR1 /* Define to 1 if you have the header file. */ #undef HAVE_SPAWN_H /* Define to 1 if you have the header file. */ #undef HAVE_STDINT_H /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H /* Define to 1 if you have the header file. */ #undef HAVE_STRINGS_H /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_MOUNT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H_ /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STATVFS_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_VFS_H /* "Have tr1" */ #undef HAVE_TR1_UNORDERED /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define as const if the declaration of iconv() needs const. */ #undef ICONV_CONST /* Use multiple threads for indexing */ #undef IDX_THREADS /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR /* Define to the address where bug reports for this package should be sent. */ #undef PACKAGE_BUGREPORT /* Define to the full name of this package. */ #undef PACKAGE_NAME /* Define to the full name and version of this package. */ #undef PACKAGE_STRING /* Define to the one symbol short name of this package. */ #undef PACKAGE_TARNAME /* Define to the home page for this package. */ #undef PACKAGE_URL /* Define to the version of this package. */ #undef PACKAGE_VERSION /* putenv parameter is const */ #undef PUTENV_ARG_CONST /* Real time monitoring option */ #undef RCL_MONITOR /* Split camelCase words */ #undef RCL_SPLIT_CAMELCASE /* Compile the aspell interface */ #undef RCL_USE_ASPELL /* Compile the fam interface */ #undef RCL_USE_FAM /* Compile the inotify interface */ #undef RCL_USE_INOTIFY /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS /* Use posix_spawn() */ #undef USE_POSIX_SPAWN /* Enable using the system's 'file' command to id mime if we fail internally */ #undef USE_SYSTEM_FILE_COMMAND /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel). */ #if defined AC_APPLE_UNIVERSAL_BUILD # if defined __BIG_ENDIAN__ # define WORDS_BIGENDIAN 1 # endif #else # ifndef WORDS_BIGENDIAN # undef WORDS_BIGENDIAN # endif #endif /* Define to 1 if the X Window System is missing or not being used. */ #undef X_DISPLAY_MISSING /* Enable large inode numbers on Mac OS X 10.5. */ #ifndef _DARWIN_USE_64_BIT_INODE # define _DARWIN_USE_64_BIT_INODE 1 #endif /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS /* Define for large files, on AIX-style hosts. */ #undef _LARGE_FILES #include "conf_post.h" recoll-1.23.7/xaposix/0000755000175000017500000000000013224670235011564 500000000000000recoll-1.23.7/xaposix/safesyswait.h0000644000175000017500000000244513125527323014223 00000000000000/** @file safesyswait.h * @brief #include , with portability stuff. */ /* Copyright (C) 2010 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #ifndef XAPIAN_INCLUDED_SAFESYSWAIT_H #define XAPIAN_INCLUDED_SAFESYSWAIT_H #ifndef __WIN32__ # include #else // We don't try to replace waitpid(), etc - they're only useful for us when // we can fork(). But it's handy to be able to use WIFEXITED() and // WEXITSTATUS(). # ifndef WIFEXITED # define WIFEXITED(STATUS) (STATUS != -1) # endif # ifndef WEXITSTATUS # define WEXITSTATUS(STATUS) (STATUS) # endif #endif #endif /* XAPIAN_INCLUDED_SAFESYSWAIT_H */ recoll-1.23.7/xaposix/safesysstat.h0000644000175000017500000000567513125527323014242 00000000000000/* safesysstat.h: #include , but enabling large file support. * * Copyright (C) 2007,2012 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #ifndef XAPIAN_INCLUDED_SAFESYSSTAT_H #define XAPIAN_INCLUDED_SAFESYSSTAT_H #include // For most platforms, AC_SYS_LARGEFILE enables support for large files at // configure time, but MSVC doesn't use configure so we have to put the // magic somewhere else - i.e. here! #ifdef _MSC_VER // MSVC needs to call _stati64() instead of stat() and the struct which holds // the information is "struct _stati64" instead of "struct stat" so we just // use #define to replace both in one go. We also want to use _fstati64() // instead of fstat() but in this case we can use a function-like macro. // // This hack is a problem is we ever want a method called "stat", or one called // fstat which takes 2 parameters, but we can probably live with these // limitations. #ifdef stat # undef stat #endif #ifdef fstat # undef fstat #endif // NB: _stati64 not _stat64 (the latter just returns a 64 bit timestamp). #define stat _stati64 #define fstat(FD, BUF) _fstati64(FD,BUF) #endif #ifdef __WIN32__ // MSVC lacks these POSIX macros and other compilers may too: #ifndef S_ISDIR # define S_ISDIR(ST_MODE) (((ST_MODE) & _S_IFMT) == _S_IFDIR) #endif #ifndef S_ISREG # define S_ISREG(ST_MODE) (((ST_MODE) & _S_IFMT) == _S_IFREG) #endif // On UNIX, mkdir() is prototyped in but on Windows it's in // , so just include that from here to avoid build failures on // MSVC just because of some new use of mkdir(). This also reduces the // number of conditionalised #include statements we need in the sources. #include // Add overloaded version of mkdir which takes an (ignored) mode argument // to allow source code to just specify a mode argument unconditionally. // // The () around mkdir are in case it's defined as a macro. inline int (mkdir)(const char *pathname, mode_t /*mode*/) { return _mkdir(pathname); } #else // These were specified by POSIX.1-1996, so most platforms should have // these by now: #ifndef S_ISDIR # define S_ISDIR(ST_MODE) (((ST_MODE) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG # define S_ISREG(ST_MODE) (((ST_MODE) & S_IFMT) == S_IFREG) #endif #endif #endif /* XAPIAN_INCLUDED_SAFESYSSTAT_H */ recoll-1.23.7/xaposix/safefcntl.h0000644000175000017500000000427313125527323013627 00000000000000/* safefcntl.h: #include , but working around broken platforms. * * Copyright (C) 2006,2007 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #ifndef XAPIAN_INCLUDED_SAFEFCNTL_H #define XAPIAN_INCLUDED_SAFEFCNTL_H #include #if defined __cplusplus && defined open // On some versions of Solaris, fcntl.h pollutes the namespace by #define-ing // "open" to "open64" when largefile support is enabled. This causes problems // if you have a method called "open" (other symbols are also #define-d // e.g. "creat" to "creat64", but only "open" is a problem for Xapian so // that's the only one we currently fix). #ifdef _MSC_VER // MSVC #define-s open but also defines a function called open, so just undef // the macro. # undef open #else inline int fcntl_open_(const char *filename, int flags, mode_t mode) { return open(filename, flags, mode); } inline int fcntl_open_(const char *filename, int flags) { return open(filename, flags); } #undef open inline int open(const char *filename, int flags, mode_t mode) { return fcntl_open_(filename, flags, mode); } inline int open(const char *filename, int flags) { return fcntl_open_(filename, flags); } #endif #endif // O_BINARY is only useful for platforms like Windows which distinguish between // text and binary files, but it's cleaner to define it to 0 here for other // platforms so we can avoid #ifdef where we need to use it in the code. #ifndef __WIN32__ # ifndef O_BINARY # define O_BINARY 0 # endif #endif #endif /* XAPIAN_INCLUDED_SAFEFCNTL_H */ recoll-1.23.7/xaposix/safeunistd.h0000644000175000017500000000465513125527323014033 00000000000000/* safeunistd.h: , but with compat. and large file support for MSVC. * * Copyright (C) 2007 Olly Betts * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ #ifndef XAPIAN_INCLUDED_SAFEUNISTD_H #define XAPIAN_INCLUDED_SAFEUNISTD_H #ifndef _MSC_VER # include #else // sys/types.h has a typedef for off_t so make sure we've seen that before // we hide it behind a #define. # include // MSVC doesn't even HAVE unistd.h - io.h seems the nearest equivalent. // We also need to do some renaming of functions to get versions which // work on large files. # include # ifdef lseek # undef lseek # endif # ifdef off_t # undef off_t # endif # define lseek(FD, OFF, WHENCE) _lseeki64(FD, OFF, WHENCE) # define off_t __int64 // process.h is needed for getpid(). # include #endif #ifdef __WIN32__ #ifdef _MSC_VER /* Recent MinGW versions define this */ inline unsigned int sleep(unsigned int seconds) { // Use our own little helper function to avoid pulling in . extern void xapian_sleep_milliseconds(unsigned int millisecs); // Sleep takes a time interval in milliseconds, whereas POSIX sleep takes // a time interval in seconds, so we need to multiply 'seconds' by 1000. // // But make sure the multiplication won't overflow! 4294967 seconds is // nearly 50 days, so just sleep for that long and return the number of // seconds left to sleep for. The common case of sleep(CONSTANT) should // optimise to just xapian_sleep_milliseconds(CONSTANT). if (seconds > 4294967u) { xapian_sleep_milliseconds(4294967000u); return seconds - 4294967u; } xapian_sleep_milliseconds(seconds * 1000u); return 0; } #endif /* _MSC_VER*/ #endif /* __WIN32__ */ #endif /* XAPIAN_INCLUDED_SAFEUNISTD_H */ recoll-1.23.7/utils/0000755000175000017500000000000013224670235011231 500000000000000recoll-1.23.7/utils/workqueue.h0000644000175000017500000002635013125637102013353 00000000000000/* Copyright (C) 2006-2016 J.F.Dockes * * This library 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 (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _WORKQUEUE_H_INCLUDED_ #define _WORKQUEUE_H_INCLUDED_ #include #if HAVE_STD_FUTURE #include #endif #include #include #include #include #include #include "log.h" /** * A WorkQueue manages the synchronisation around a queue of work items, * where a number of client threads queue tasks and a number of worker * threads take and execute them. The goal is to introduce some level * of parallelism between the successive steps of a previously single * threaded pipeline. For example data extraction / data preparation / index * update, but this could have other uses. * * There is no individual task status return. In case of fatal error, * the client or worker sets an end condition on the queue. A second * queue could conceivably be used for returning individual task * status. * * The strange thread functions argument and return values * comes from compatibility with an earlier pthread-based * implementation. */ template class WorkQueue { public: /** Create a WorkQueue * @param name for message printing * @param hi number of tasks on queue before clients blocks. Default 0 * meaning no limit. hi == -1 means that the queue is disabled. * @param lo minimum count of tasks before worker starts. Default 1. */ WorkQueue(const std::string& name, size_t hi = 0, size_t lo = 1) : m_name(name), m_high(hi), m_low(lo), m_workers_exited(0), m_ok(true), m_clients_waiting(0), m_workers_waiting(0), m_tottasks(0), m_nowake(0), m_workersleeps(0), m_clientsleeps(0) { } ~WorkQueue() { if (!m_worker_threads.empty()) { setTerminateAndWait(); } } /** Start the worker threads. * * @param nworkers number of threads copies to start. * @param start_routine thread function. It should loop * taking (QueueWorker::take()) and executing tasks. * @param arg initial parameter to thread function. * @return true if ok. */ bool start(int nworkers, void *(workproc)(void *), void *arg) { std::unique_lock lock(m_mutex); for (int i = 0; i < nworkers; i++) { Worker w; #if HAVE_STD_FUTURE std::packaged_task task(workproc); w.res = task.get_future(); w.thr = std::thread(std::move(task), arg); #else w.thr = std::thread(workproc, arg); #endif m_worker_threads.push_back(std::move(w)); } return true; } /** Add item to work queue, called from client. * * Sleeps if there are already too many. */ bool put(T t, bool flushprevious = false) { std::unique_lock lock(m_mutex); if (!ok()) { LOGERR("WorkQueue::put:" << m_name << ": !ok\n"); return false; } while (ok() && m_high > 0 && m_queue.size() >= m_high) { m_clientsleeps++; // Keep the order: we test ok() AFTER the sleep... m_clients_waiting++; m_ccond.wait(lock); if (!ok()) { m_clients_waiting--; return false; } m_clients_waiting--; } if (flushprevious) { while (!m_queue.empty()) { m_queue.pop(); } } m_queue.push(t); if (m_workers_waiting > 0) { // Just wake one worker, there is only one new task. m_wcond.notify_one(); } else { m_nowake++; } return true; } /** Wait until the queue is inactive. Called from client. * * Waits until the task queue is empty and the workers are all * back sleeping. Used by the client to wait for all current work * to be completed, when it needs to perform work that couldn't be * done in parallel with the worker's tasks, or before shutting * down. Work can be resumed after calling this. Note that the * only thread which can call it safely is the client just above * (which can control the task flow), else there could be * tasks in the intermediate queues. * To rephrase: there is no warranty on return that the queue is actually * idle EXCEPT if the caller knows that no jobs are still being created. * It would be possible to transform this into a safe call if some kind * of suspend condition was set on the queue by waitIdle(), to be reset by * some kind of "resume" call. Not currently the case. */ bool waitIdle() { std::unique_lock lock(m_mutex); if (!ok()) { LOGERR("WorkQueue::waitIdle:" << m_name << ": not ok\n"); return false; } // We're done when the queue is empty AND all workers are back // waiting for a task. while (ok() && (m_queue.size() > 0 || m_workers_waiting != m_worker_threads.size())) { m_clients_waiting++; m_ccond.wait(lock); m_clients_waiting--; } return ok(); } /** Tell the workers to exit, and wait for them. * * Does not bother about tasks possibly remaining on the queue, so * should be called after waitIdle() for an orderly shutdown. */ void *setTerminateAndWait() { std::unique_lock lock(m_mutex); LOGDEB("setTerminateAndWait:" << m_name << "\n"); if (m_worker_threads.empty()) { // Already called ? return (void*)0; } // Wait for all worker threads to have called workerExit() m_ok = false; while (m_workers_exited < m_worker_threads.size()) { m_wcond.notify_all(); m_clients_waiting++; m_ccond.wait(lock); m_clients_waiting--; } LOGINFO("" << m_name << ": tasks " << m_tottasks << " nowakes " << m_nowake << " wsleeps " << m_workersleeps << " csleeps " << m_clientsleeps << "\n"); // Perform the thread joins and compute overall status // Workers return (void*)1 if ok void *statusall = (void*)1; while (!m_worker_threads.empty()) { #if HAVE_STD_FUTURE void *status = m_worker_threads.front().res.get(); #else void *status = (void*) 1; #endif m_worker_threads.front().thr.join(); if (status == (void *)0) { statusall = status; } m_worker_threads.pop_front(); } // Reset to start state. m_workers_exited = m_clients_waiting = m_workers_waiting = m_tottasks = m_nowake = m_workersleeps = m_clientsleeps = 0; m_ok = true; LOGDEB("setTerminateAndWait:" << m_name << " done\n"); return statusall; } /** Take task from queue. Called from worker. * * Sleeps if there are not enough. Signal if we go to sleep on empty * queue: client may be waiting for our going idle. */ bool take(T* tp, size_t *szp = 0) { std::unique_lock lock(m_mutex); if (!ok()) { LOGDEB("WorkQueue::take:" << m_name << ": not ok\n"); return false; } while (ok() && m_queue.size() < m_low) { m_workersleeps++; m_workers_waiting++; if (m_queue.empty()) { m_ccond.notify_all(); } m_wcond.wait(lock); if (!ok()) { // !ok is a normal condition when shutting down m_workers_waiting--; return false; } m_workers_waiting--; } m_tottasks++; *tp = m_queue.front(); if (szp) { *szp = m_queue.size(); } m_queue.pop(); if (m_clients_waiting > 0) { // No reason to wake up more than one client thread m_ccond.notify_one(); } else { m_nowake++; } return true; } bool waitminsz(size_t sz) { std::unique_lock lock(m_mutex); if (!ok()) { return false; } while (ok() && m_queue.size() < sz) { m_workersleeps++; m_workers_waiting++; if (m_queue.empty()) { m_ccond.notify_all(); } m_wcond.wait(lock); if (!ok()) { m_workers_waiting--; return false; } m_workers_waiting--; } return true; } /** Advertise exit and abort queue. Called from worker * * This would happen after an unrecoverable error, or when * the queue is terminated by the client. Workers never exit normally, * except when the queue is shut down (at which point m_ok is set to * false by the shutdown code anyway). The thread must return/exit * immediately after calling this. */ void workerExit() { LOGDEB("workerExit:" << m_name << "\n"); std::unique_lock lock(m_mutex); m_workers_exited++; m_ok = false; m_ccond.notify_all(); } size_t qsize() { std::unique_lock lock(m_mutex); return m_queue.size(); } private: bool ok() { bool isok = m_ok && m_workers_exited == 0 && !m_worker_threads.empty(); if (!isok) { LOGDEB("WorkQueue:ok:" << m_name << ": not ok m_ok " << m_ok << " m_workers_exited " << m_workers_exited << " m_worker_threads size " << m_worker_threads.size() << "\n"); } return isok; } struct Worker { std::thread thr; #if HAVE_STD_FUTURE std::future res; #endif }; // Configuration std::string m_name; size_t m_high; size_t m_low; // Worker threads having called exit. Used to decide when we're done unsigned int m_workers_exited; // Status bool m_ok; // Our threads. std::list m_worker_threads; // Jobs input queue std::queue m_queue; // Synchronization std::condition_variable m_ccond; std::condition_variable m_wcond; std::mutex m_mutex; // Client/Worker threads currently waiting for a job unsigned int m_clients_waiting; unsigned int m_workers_waiting; // Statistics unsigned int m_tottasks; unsigned int m_nowake; unsigned int m_workersleeps; unsigned int m_clientsleeps; }; #endif /* _WORKQUEUE_H_INCLUDED_ */ recoll-1.23.7/utils/wipedir.h0000644000175000017500000000211213125527323012760 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FILEUT_H_INCLUDED_ #define _FILEUT_H_INCLUDED_ /* Copyright (C) 2004 J.F.Dockes */ #include /** * Remove all files inside directory. * @return 0 if ok, count of remaining entries (ie: subdirs), or -1 for error */ int wipedir(const std::string& dirname, bool topalso = 0, bool recurse = 0); #endif /* _FILEUT_H_INCLUDED_ */ recoll-1.23.7/utils/chrono.h0000644000175000017500000000373213125527323012616 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CHRONO_H_INCLUDED_ #define _CHRONO_H_INCLUDED_ #include /** Easy interface to measuring time intervals */ class Chrono { public: /** Initialize, setting the origin time */ Chrono(); /** Re-store current time and return mS since init or last call */ long restart(); /** Re-store current time and return uS since init or last call */ long urestart(); /** Snapshot current time to static storage */ static void refnow(); /** Return interval value in various units. * * If frozen is set this gives the time since the last refnow call * (this is to allow for using one actual system call to get values from many chrono objects, like when examining timeouts in a queue */ long long nanos(bool frozen = false); long micros(bool frozen = false); long millis(bool frozen = false); float secs(bool frozen = false); /** Return the absolute value of the current origin */ long long amicros() const; struct TimeSpec { time_t tv_sec; /* Time in seconds */ long tv_nsec; /* And nanoseconds (< 10E9) */ }; private: TimeSpec m_orig; static TimeSpec o_now; }; #endif /* _CHRONO_H_INCLUDED_ */ recoll-1.23.7/utils/conftree.cpp0000644000175000017500000005236113224431020013454 00000000000000/* Copyright (C) 2003-2016 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include "conftree.h" #include #include #ifdef _WIN32 #include "safesysstat.h" #else #include #include #include #include #endif #include #include #include #include #include #include #include "pathut.h" #include "smallut.h" #include "log.h" using namespace std; #undef DEBUG_CONFTREE #ifdef DEBUG_CONFTREE #define CONFDEB LOGDEB #else #define CONFDEB LOGDEB2 #endif static const SimpleRegexp varcomment_rx("[ \t]*#[ \t]*([a-zA-Z0-9]+)[ \t]*=", 0, 1); void ConfSimple::parseinput(istream& input) { string submapkey; string cline; bool appending = false; string line; bool eof = false; for (;;) { cline.clear(); std::getline(input, cline); CONFDEB("Parse:line: [" << cline << "] status " << status << "\n"); if (!input.good()) { if (input.bad()) { CONFDEB("Parse: input.bad()\n"); status = STATUS_ERROR; return; } CONFDEB("Parse: eof\n"); // Must be eof ? But maybe we have a partial line which // must be processed. This happens if the last line before // eof ends with a backslash, or there is no final \n eof = true; } { string::size_type pos = cline.find_last_not_of("\n\r"); if (pos == string::npos) { cline.clear(); } else if (pos != cline.length() - 1) { cline.erase(pos + 1); } } if (appending) { line += cline; } else { line = cline; } // Note that we trim whitespace before checking for backslash-eol // This avoids invisible whitespace problems. if (trimvalues) { trimstring(line); } else { ltrimstring(line); } if (line.empty() || line.at(0) == '#') { if (eof) { break; } if (varcomment_rx.simpleMatch(line)) { m_order.push_back(ConfLine(ConfLine::CFL_VARCOMMENT, line, varcomment_rx.getMatch(line, 1))); } else { m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); } continue; } if (line[line.length() - 1] == '\\') { line.erase(line.length() - 1); appending = true; continue; } appending = false; if (line[0] == '[') { trimstring(line, "[] \t"); if (dotildexpand) { submapkey = path_tildexpand(line); } else { submapkey = line; } m_subkeys_unsorted.push_back(submapkey); m_order.push_back(ConfLine(ConfLine::CFL_SK, submapkey)); continue; } // Look for first equal sign string::size_type eqpos = line.find("="); if (eqpos == string::npos) { m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); continue; } // Compute name and value, trim white space string nm, val; nm = line.substr(0, eqpos); trimstring(nm); val = line.substr(eqpos + 1, string::npos); if (trimvalues) { trimstring(val); } if (nm.length() == 0) { m_order.push_back(ConfLine(ConfLine::CFL_COMMENT, line)); continue; } i_set(nm, val, submapkey, true); if (eof) { break; } } } ConfSimple::ConfSimple(int readonly, bool tildexp, bool trimv) : dotildexpand(tildexp), trimvalues(trimv), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; } void ConfSimple::reparse(const string& d) { clear(); stringstream input(d, ios::in); parseinput(input); } ConfSimple::ConfSimple(const string& d, int readonly, bool tildexp, bool trimv) : dotildexpand(tildexp), trimvalues(trimv), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; stringstream input(d, ios::in); parseinput(input); } ConfSimple::ConfSimple(const char *fname, int readonly, bool tildexp, bool trimv) : dotildexpand(tildexp), trimvalues(trimv), m_filename(fname), m_fmtime(0), m_holdWrites(false) { status = readonly ? STATUS_RO : STATUS_RW; ifstream input; if (readonly) { input.open(fname, ios::in); } else { ios::openmode mode = ios::in | ios::out; // It seems that there is no separate 'create if not exists' // open flag. Have to truncate to create, but dont want to do // this to an existing file ! if (!path_exists(fname)) { mode |= ios::trunc; } input.open(fname, mode); if (input.is_open()) { status = STATUS_RW; } else { input.clear(); input.open(fname, ios::in); if (input.is_open()) { status = STATUS_RO; } } } if (!input.is_open()) { status = STATUS_ERROR; return; } parseinput(input); i_changed(true); } ConfSimple::StatusCode ConfSimple::getStatus() const { switch (status) { case STATUS_RO: return STATUS_RO; case STATUS_RW: return STATUS_RW; default: return STATUS_ERROR; } } bool ConfSimple::sourceChanged() const { if (!m_filename.empty()) { struct stat st; if (stat(m_filename.c_str(), &st) == 0) { if (m_fmtime != st.st_mtime) { return true; } } } return false; } bool ConfSimple::i_changed(bool upd) { if (!m_filename.empty()) { struct stat st; if (stat(m_filename.c_str(), &st) == 0) { if (m_fmtime != st.st_mtime) { if (upd) { m_fmtime = st.st_mtime; } return true; } } } return false; } int ConfSimple::get(const string& nm, string& value, const string& sk) const { if (!ok()) { return 0; } // Find submap map >::const_iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) { return 0; } // Find named value map::const_iterator s; if ((s = ss->second.find(nm)) == ss->second.end()) { return 0; } value = s->second; return 1; } int ConfSimple::get(const string& nm, int *value, const string& sk) const { string sval; if (!get(nm, sval, sk)) { return 0; } *value = atoi(sval.c_str()); return 1; } // Appropriately output a subkey (nm=="") or variable line. // We can't make any assumption about the data except that it does not // contain line breaks. // Avoid long lines if possible (for hand-editing) // We used to break at arbitrary places, but this was ennoying for // files with pure UTF-8 encoding (some files can be binary anyway), // because it made later editing difficult, as the file would no // longer have a valid encoding. // Any ASCII byte would be a safe break point for utf-8, but could // break some other encoding with, e.g. escape sequences? So break at // whitespace (is this safe with all encodings?). // Note that the choice of break point does not affect the validity of // the file data (when read back by conftree), only its ease of // editing with a normal editor. static ConfSimple::WalkerCode varprinter(void *f, const string& nm, const string& value) { ostream& output = *((ostream *)f); if (nm.empty()) { output << "\n[" << value << "]\n"; } else { output << nm << " = "; if (nm.length() + value.length() < 75) { output << value; } else { string::size_type ll = 0; for (string::size_type pos = 0; pos < value.length(); pos++) { string::value_type c = value[pos]; output << c; ll++; // Break at whitespace if line too long and "a lot" of // remaining data if (ll > 50 && (value.length() - pos) > 10 && (c == ' ' || c == '\t')) { ll = 0; output << "\\\n"; } } } output << "\n"; } return ConfSimple::WALK_CONTINUE; } // Set variable and rewrite data int ConfSimple::set(const std::string& nm, const std::string& value, const string& sk) { if (status != STATUS_RW) { return 0; } CONFDEB("ConfSimple::set ["< [" << value << "]\n"); if (!i_set(nm, value, sk)) { return 0; } return write(); } int ConfSimple::set(const string& nm, long long val, const string& sk) { return this->set(nm, lltodecstr(val), sk); } // Internal set variable: no rw checking or file rewriting. If init is // set, we're doing initial parsing, else we are changing a parsed // tree (changes the way we update the order data) int ConfSimple::i_set(const std::string& nm, const std::string& value, const string& sk, bool init) { CONFDEB("ConfSimple::i_set: nm[" << nm << "] val[" << value << "] key[" << sk << "], init " << init << "\n"); // Values must not have embedded newlines if (value.find_first_of("\n\r") != string::npos) { CONFDEB("ConfSimple::i_set: LF in value\n"); return 0; } bool existing = false; map >::iterator ss; // Test if submap already exists, else create it, and insert variable: if ((ss = m_submaps.find(sk)) == m_submaps.end()) { CONFDEB("ConfSimple::i_set: new submap\n"); map submap; submap[nm] = value; m_submaps[sk] = submap; // Maybe add sk entry to m_order data, if not already there. if (!sk.empty()) { ConfLine nl(ConfLine::CFL_SK, sk); // Append SK entry only if it's not already there (erase // does not remove entries from the order data, and it may // be being recreated after deletion) if (find(m_order.begin(), m_order.end(), nl) == m_order.end()) { m_order.push_back(nl); } } } else { // Insert or update variable in existing map. map::iterator it; it = ss->second.find(nm); if (it == ss->second.end()) { ss->second.insert(pair(nm, value)); } else { it->second = value; existing = true; } } // If the variable already existed, no need to change the m_order data if (existing) { CONFDEB("ConfSimple::i_set: existing var: no order update\n"); return 1; } // Add the new variable at the end of its submap in the order data. if (init) { // During the initial construction, just append: CONFDEB("ConfSimple::i_set: init true: append\n"); m_order.push_back(ConfLine(ConfLine::CFL_VAR, nm)); return 1; } // Look for the start and end of the subkey zone. Start is either // at begin() for a null subkey, or just behind the subkey // entry. End is either the next subkey entry, or the end of // list. We insert the new entry just before end. vector::iterator start, fin; if (sk.empty()) { start = m_order.begin(); CONFDEB("ConfSimple::i_set: null sk, start at top of order\n"); } else { start = find(m_order.begin(), m_order.end(), ConfLine(ConfLine::CFL_SK, sk)); if (start == m_order.end()) { // This is not logically possible. The subkey must // exist. We're doomed std::cerr << "Logical failure during configuration variable " "insertion" << endl; abort(); } } fin = m_order.end(); if (start != m_order.end()) { // The null subkey has no entry (maybe it should) if (!sk.empty()) { start++; } for (vector::iterator it = start; it != m_order.end(); it++) { if (it->m_kind == ConfLine::CFL_SK) { fin = it; break; } } } // It may happen that the order entry already exists because erase doesnt // update m_order if (find(start, fin, ConfLine(ConfLine::CFL_VAR, nm)) == fin) { // Look for a varcomment line, insert the value right after if // it's there. bool inserted(false); vector::iterator it; for (it = start; it != fin; it++) { if (it->m_kind == ConfLine::CFL_VARCOMMENT && it->m_aux == nm) { it++; m_order.insert(it, ConfLine(ConfLine::CFL_VAR, nm)); inserted = true; break; } } if (!inserted) { m_order.insert(fin, ConfLine(ConfLine::CFL_VAR, nm)); } } return 1; } int ConfSimple::erase(const string& nm, const string& sk) { if (status != STATUS_RW) { return 0; } map >::iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) { return 0; } ss->second.erase(nm); if (ss->second.empty()) { m_submaps.erase(ss); } return write(); } int ConfSimple::eraseKey(const string& sk) { vector nms = getNames(sk); for (vector::iterator it = nms.begin(); it != nms.end(); it++) { erase(*it, sk); } return write(); } // Walk the tree, calling user function at each node ConfSimple::WalkerCode ConfSimple::sortwalk(WalkerCode(*walker)(void *, const string&, const string&), void *clidata) const { if (!ok()) { return WALK_STOP; } // For all submaps: for (map >::const_iterator sit = m_submaps.begin(); sit != m_submaps.end(); sit++) { // Possibly emit submap name: if (!sit->first.empty() && walker(clidata, string(), sit->first.c_str()) == WALK_STOP) { return WALK_STOP; } // Walk submap const map& sm = sit->second; for (map::const_iterator it = sm.begin(); it != sm.end(); it++) { if (walker(clidata, it->first, it->second) == WALK_STOP) { return WALK_STOP; } } } return WALK_CONTINUE; } // Write to default output. This currently only does something if output is // a file bool ConfSimple::write() { if (!ok()) { return false; } if (m_holdWrites) { return true; } if (m_filename.length()) { ofstream output(m_filename.c_str(), ios::out | ios::trunc); if (!output.is_open()) { return 0; } return write(output); } else { // No backing store, no writing. Maybe one day we'll need it with // some kind of output string. This can't be the original string which // is currently readonly. //ostringstream output(m_ostring, ios::out | ios::trunc); return 1; } } // Write out the tree in configuration file format: // This does not check holdWrites, this is done by write(void), which // lets ie: showall work even when holdWrites is set bool ConfSimple::write(ostream& out) const { if (!ok()) { return false; } string sk; for (vector::const_iterator it = m_order.begin(); it != m_order.end(); it++) { switch (it->m_kind) { case ConfLine::CFL_COMMENT: case ConfLine::CFL_VARCOMMENT: out << it->m_data << endl; if (!out.good()) { return false; } break; case ConfLine::CFL_SK: sk = it->m_data; CONFDEB("ConfSimple::write: SK [" << sk << "]\n"); // Check that the submap still exists, and only output it if it // does if (m_submaps.find(sk) != m_submaps.end()) { out << "[" << it->m_data << "]" << endl; if (!out.good()) { return false; } } break; case ConfLine::CFL_VAR: string nm = it->m_data; CONFDEB("ConfSimple::write: VAR [" << nm << "], sk [" < ConfSimple::getNames(const string& sk, const char *pattern) const { vector mylist; if (!ok()) { return mylist; } map >::const_iterator ss; if ((ss = m_submaps.find(sk)) == m_submaps.end()) { return mylist; } mylist.reserve(ss->second.size()); map::const_iterator it; for (it = ss->second.begin(); it != ss->second.end(); it++) { if (pattern && 0 != fnmatch(pattern, it->first.c_str(), 0)) { continue; } mylist.push_back(it->first); } return mylist; } vector ConfSimple::getSubKeys() const { vector mylist; if (!ok()) { return mylist; } mylist.reserve(m_submaps.size()); map >::const_iterator ss; for (ss = m_submaps.begin(); ss != m_submaps.end(); ss++) { mylist.push_back(ss->first); } return mylist; } bool ConfSimple::hasNameAnywhere(const string& nm) const { vectorkeys = getSubKeys(); for (vector::const_iterator it = keys.begin(); it != keys.end(); it++) { string val; if (get(nm, val, *it)) { return true; } } return false; } bool ConfSimple::commentsAsXML(ostream& out) { const vector& lines = getlines(); out << "\n"; string sk; for (vector::const_iterator it = lines.begin(); it != lines.end(); it++) { switch (it->m_kind) { case ConfLine::CFL_COMMENT: case ConfLine::CFL_VARCOMMENT: { string::size_type pos = it->m_data.find_first_not_of("# "); if (pos != string::npos) { out << it->m_data.substr(pos) << endl; } break; } default: break; } } out << "\n"; return true; } // ////////////////////////////////////////////////////////////////////////// // ConfTree Methods: conftree interpret keys like a hierarchical file tree // ////////////////////////////////////////////////////////////////////////// int ConfTree::get(const std::string& name, string& value, const string& sk) const { if (sk.empty() || !path_isabsolute(sk)) { LOGDEB2("ConfTree::get: looking in global space for [" << sk << "]\n"); return ConfSimple::get(name, value, sk); } // Get writable copy of subkey path string msk = sk; // Handle the case where the config file path has an ending / and not // the input sk path_catslash(msk); // Look in subkey and up its parents until root ('') for (;;) { LOGDEB2("ConfTree::get: looking for [" << name << "] in [" << msk << "]\n"); if (ConfSimple::get(name, value, msk)) { return 1; } string::size_type pos = msk.rfind("/"); if (pos != string::npos) { msk.replace(pos, string::npos, string()); } else { #ifdef _WIN32 if (msk.size() == 2 && isalpha(msk[0]) && msk[1] == ':') { msk.clear(); } else #endif break; } } return 0; } recoll-1.23.7/utils/log.h0000644000175000017500000001471113125637102012103 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Copyright (C) 2006-2016 J.F.Dockes * * This library 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 (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _LOG_H_X_INCLUDED_ #define _LOG_H_X_INCLUDED_ #include #include #include #include #ifndef LOGGER_THREADSAFE #define LOGGER_THREADSAFE 1 #endif #if LOGGER_THREADSAFE #include #endif // Can't use the symbolic Logger::LLXX names in preproc. 6 is LLDEB1 #ifndef LOGGER_STATICVERBOSITY #define LOGGER_STATICVERBOSITY 5 #endif class Logger { public: /** Initialize logging to file name. Use "stderr" for stderr output. Creates the singleton logger object */ static Logger *getTheLog(const std::string& fn); bool reopen(const std::string& fn); std::ostream& getstream() { return m_tocerr ? std::cerr : m_stream; } enum LogLevel {LLNON=0, LLFAT=1, LLERR=2, LLINF=3, LLDEB=4, LLDEB0=5, LLDEB1=6, LLDEB2=7}; void setLogLevel(LogLevel level) { m_loglevel = level; } int getloglevel() { return m_loglevel; } #if LOGGER_THREADSAFE std::recursive_mutex& getmutex() { return m_mutex; } #endif private: bool m_tocerr; int m_loglevel; std::string m_fn; std::ofstream m_stream; #if LOGGER_THREADSAFE std::recursive_mutex m_mutex; #endif Logger(const std::string& fn); Logger(const Logger &); Logger& operator=(const Logger &); }; #define LOGGER_PRT (Logger::getTheLog("")->getstream()) #if LOGGER_THREADSAFE #define LOGGER_LOCK \ std::unique_lock lock(Logger::getTheLog("")->getmutex()) #else #define LOGGER_LOCK #endif #ifndef LOGGER_LOCAL_LOGINC #define LOGGER_LOCAL_LOGINC 0 #endif #define LOGGER_LEVEL (Logger::getTheLog("")->getloglevel() + \ LOGGER_LOCAL_LOGINC) #define LOGGER_DOLOG(L,X) LOGGER_PRT << ":" << L << ":" << \ __FILE__ << ":" << __LINE__ << "::" << X \ << std::flush #if LOGGER_STATICVERBOSITY >= 7 #define LOGDEB2(X) { \ if (LOGGER_LEVEL >= Logger::LLDEB2) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLDEB2, X); \ } \ } #else #define LOGDEB2(X) #endif #if LOGGER_STATICVERBOSITY >= 6 #define LOGDEB1(X) { \ if (LOGGER_LEVEL >= Logger::LLDEB1) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLDEB1, X); \ } \ } #else #define LOGDEB1(X) #endif #if LOGGER_STATICVERBOSITY >= 5 #define LOGDEB0(X) { \ if (LOGGER_LEVEL >= Logger::LLDEB0) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLDEB0, X); \ } \ } #else #define LOGDEB0(X) #endif #if LOGGER_STATICVERBOSITY >= 4 #define LOGDEB(X) { \ if (LOGGER_LEVEL >= Logger::LLDEB) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLDEB, X); \ } \ } #else #define LOGDEB(X) #endif #if LOGGER_STATICVERBOSITY >= 3 #define LOGINF(X) { \ if (LOGGER_LEVEL >= Logger::LLINF) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLINF, X); \ } \ } #else #define LOGINF(X) #endif #define LOGINFO LOGINF #if LOGGER_STATICVERBOSITY >= 2 #define LOGERR(X) { \ if (LOGGER_LEVEL >= Logger::LLERR) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLERR, X); \ } \ } #else #define LOGERR(X) #endif #if LOGGER_STATICVERBOSITY >= 1 #define LOGFAT(X) { \ if (LOGGER_LEVEL >= Logger::LLFAT) { \ LOGGER_LOCK; \ LOGGER_DOLOG(Logger::LLFAT, X); \ } \ } #else #define LOGFAT(X) #endif #define LOGFATAL LOGFAT #endif /* _LOG_H_X_INCLUDED_ */ recoll-1.23.7/utils/circache.cpp0000644000175000017500000014730213224431525013422 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_CIRCACHE #include "autoconfig.h" #include #include #include #include "safefcntl.h" #include #include "safesysstat.h" #include "safeunistd.h" #include #include #include #include "chrono.h" #include #ifndef _WIN32 #include #define O_BINARY 0 #else struct iovec { void *iov_base; size_t iov_len; }; static ssize_t writev(int fd, const struct iovec *iov, int iovcnt) { ssize_t tot = 0; for (int i = 0; i < iovcnt; i++) { ssize_t ret = ::write(fd, iov[i].iov_base, iov[i].iov_len); if (ret > 0) { tot += ret; } if (ret != (ssize_t)iov[i].iov_len) { return ret == -1 ? -1 : tot; } } return tot; } #endif #include #include #include #include "cstr.h" #include "circache.h" #include "conftree.h" #include "log.h" #include "smallut.h" #include "md5.h" using namespace std; typedef unsigned char UCHAR; typedef unsigned int UINT; typedef unsigned long ULONG; /** Temp buffer with automatic deallocation */ struct TempBuf { TempBuf() : m_buf(0) { } TempBuf(int n) { m_buf = (char *)malloc(n); } ~TempBuf() { if (m_buf) { free(m_buf); } } char *setsize(int n) { return (m_buf = (char *)realloc(m_buf, n)); } char *buf() { return m_buf; } char *m_buf; }; static bool inflateToDynBuf(void *inp, UINT inlen, void **outpp, UINT *outlenp); /* * File structure: * - Starts with a 1-KB header block, with a param dictionary. * - Stored items follow. Each item has a header and 2 segments for * the metadata and the data. * The segment sizes are stored in the ascii header/marker: * circacheSizes = xxx yyy zzz * xxx bytes of metadata * yyy bytes of data * zzz bytes of padding up to next object (only one entry has non zero) * * There is a write position, which can be at eof while * the file is growing, or inside the file if we are recycling. This is stored * in the header (oheadoffs), together with the maximum size * * If we are recycling, we have to take care to compute the size of the * possible remaining area from the last object invalidated by the write, * pad it with neutral data and store the size in the new header. To help with * this, the address for the last object written is also kept in the header * (nheadoffs, npadsize) * */ // First block size #define CIRCACHE_FIRSTBLOCK_SIZE 1024 // Entry header. // 3 x 32 bits sizes as hex integers + 1 x 16 bits flag + at least 1 zero // 15 + 3x(9) + 3 + 1 = 46 static const char *headerformat = "circacheSizes = %x %x %x %hx"; #define CIRCACHE_HEADER_SIZE 64 class EntryHeaderData { public: EntryHeaderData() : dicsize(0), datasize(0), padsize(0), flags(0) {} UINT dicsize; UINT datasize; UINT padsize; unsigned short flags; }; enum EntryFlags {EFNone = 0, EFDataCompressed = 1}; // A callback class for the header-hopping function. class CCScanHook { public: virtual ~CCScanHook() {} enum status {Stop, Continue, Error, Eof}; virtual status takeone(int64_t offs, const string& udi, const EntryHeaderData& d) = 0; }; // We have an auxiliary in-memory multimap of hashed-udi -> offset to // speed things up. This is created the first time the file is scanned // (on the first get), and not saved to disk. // The map key: hashed udi. As a very short hash seems sufficient, // maybe we could find something faster/simpler than md5? #define UDIHLEN 4 class UdiH { public: UCHAR h[UDIHLEN]; UdiH(const string& udi) { MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const UCHAR*)udi.c_str(), udi.length()); UCHAR md[16]; MD5Final(md, &ctx); memcpy(h, md, UDIHLEN); } string asHexString() const { static const char hex[] = "0123456789abcdef"; string out; for (int i = 0; i < UDIHLEN; i++) { out.append(1, hex[h[i] >> 4]); out.append(1, hex[h[i] & 0x0f]); } return out; } bool operator==(const UdiH& r) const { for (int i = 0; i < UDIHLEN; i++) if (h[i] != r.h[i]) { return false; } return true; } bool operator<(const UdiH& r) const { for (int i = 0; i < UDIHLEN; i++) { if (h[i] < r.h[i]) { return true; } if (h[i] > r.h[i]) { return false; } } return false; } }; typedef multimap kh_type; typedef multimap::value_type kh_value_type; class CirCacheInternal { public: int m_fd; ////// These are cache persistent state and written to the first block: // Maximum file size, after which we begin reusing old space int64_t m_maxsize; // Offset of the oldest header, or max file offset (file size) // while the file is growing. This is the next write position. int64_t m_oheadoffs; // Offset of last write (newest header) int64_t m_nheadoffs; // Pad size for newest entry. int64_t m_npadsize; // Keep history or only last entry bool m_uniquentries; ///////////////////// End header entries // A place to hold data when reading char *m_buffer; size_t m_bufsiz; // Error messages ostringstream m_reason; // State for rewind/next/getcurrent operation. This could/should // be moved to a separate iterator. int64_t m_itoffs; EntryHeaderData m_ithd; // Offset cache kh_type m_ofskh; bool m_ofskhcplt; // Has cache been fully read since open? // Add udi->offset translation to map bool khEnter(const string& udi, int64_t ofs) { UdiH h(udi); LOGDEB2("Circache::khEnter: h " << (h.asHexString()) << " offs " << ((ULONG)ofs) << " udi [" << (udi) << "]\n" ); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && p.first->first == h) { for (kh_type::iterator it = p.first; it != p.second; it++) { LOGDEB2("Circache::khEnter: col h " << (it->first.asHexString()) << ", ofs " << ((ULONG)it->second) << "\n" ); if (it->second == ofs) { // (h,offs) already there. Happens LOGDEB2("Circache::khEnter: already there\n" ); return true; } } } m_ofskh.insert(kh_value_type(h, ofs)); LOGDEB2("Circache::khEnter: inserted\n" ); return true; } void khDump() { for (kh_type::const_iterator it = m_ofskh.begin(); it != m_ofskh.end(); it++) { LOGDEB("Circache::KHDUMP: " << (it->first.asHexString()) << " " << ((ULONG)it->second) << "\n" ); } } // Return vector of candidate offsets for udi (possibly several // because there may be hash collisions, and also multiple // instances). bool khFind(const string& udi, vector& ofss) { ofss.clear(); UdiH h(udi); LOGDEB2("Circache::khFind: h " << (h.asHexString()) << " udi [" << (udi) << "]\n" ); pair p = m_ofskh.equal_range(h); #if 0 if (p.first == m_ofskh.end()) { LOGDEB("KHFIND: FIRST END()\n" ); } if (p.second == m_ofskh.end()) { LOGDEB("KHFIND: SECOND END()\n" ); } if (!(p.first->first == h)) LOGDEB("KHFIND: NOKEY: " << (p.first->first.asHexString()) << " " << (p.second->first.asHexString()) << "\n" ); #endif if (p.first == m_ofskh.end() || !(p.first->first == h)) { return false; } for (kh_type::iterator it = p.first; it != p.second; it++) { ofss.push_back(it->second); } return true; } // Clear entry for udi/offs bool khClear(const pair& ref) { UdiH h(ref.first); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && (p.first->first == h)) { for (kh_type::iterator it = p.first; it != p.second;) { kh_type::iterator tmp = it++; if (tmp->second == ref.second) { m_ofskh.erase(tmp); } } } return true; } // Clear entries for vector of udi/offs bool khClear(const vector >& udis) { for (vector >::const_iterator it = udis.begin(); it != udis.end(); it++) { khClear(*it); } return true; } // Clear all entries for udi bool khClear(const string& udi) { UdiH h(udi); pair p = m_ofskh.equal_range(h); if (p.first != m_ofskh.end() && (p.first->first == h)) { for (kh_type::iterator it = p.first; it != p.second;) { kh_type::iterator tmp = it++; m_ofskh.erase(tmp); } } return true; } CirCacheInternal() : m_fd(-1), m_maxsize(-1), m_oheadoffs(-1), m_nheadoffs(0), m_npadsize(0), m_uniquentries(false), m_buffer(0), m_bufsiz(0), m_ofskhcplt(false) { } ~CirCacheInternal() { if (m_fd >= 0) { close(m_fd); } if (m_buffer) { free(m_buffer); } } char *buf(size_t sz) { if (m_bufsiz >= sz) { return m_buffer; } if ((m_buffer = (char *)realloc(m_buffer, sz))) { m_bufsiz = sz; } else { m_reason << "CirCache:: realloc(" << sz << ") failed"; m_bufsiz = 0; } return m_buffer; } // Name for the cache file string datafn(const string& d) { return path_cat(d, "circache.crch"); } bool writefirstblock() { if (m_fd < 0) { m_reason << "writefirstblock: not open "; return false; } ostringstream s; s << "maxsize = " << m_maxsize << "\n" << "oheadoffs = " << m_oheadoffs << "\n" << "nheadoffs = " << m_nheadoffs << "\n" << "npadsize = " << m_npadsize << "\n" << "unient = " << m_uniquentries << "\n" << " " << " " << " " << "\0"; int sz = int(s.str().size()); assert(sz < CIRCACHE_FIRSTBLOCK_SIZE); lseek(m_fd, 0, 0); if (write(m_fd, s.str().c_str(), sz) != sz) { m_reason << "writefirstblock: write() failed: errno " << errno; return false; } return true; } bool readfirstblock() { if (m_fd < 0) { m_reason << "readfirstblock: not open "; return false; } char bf[CIRCACHE_FIRSTBLOCK_SIZE]; lseek(m_fd, 0, 0); if (read(m_fd, bf, CIRCACHE_FIRSTBLOCK_SIZE) != CIRCACHE_FIRSTBLOCK_SIZE) { m_reason << "readfirstblock: read() failed: errno " << errno; return false; } string s(bf, CIRCACHE_FIRSTBLOCK_SIZE); ConfSimple conf(s, 1); string value; if (!conf.get("maxsize", value, cstr_null)) { m_reason << "readfirstblock: conf get maxsize failed"; return false; } m_maxsize = atoll(value.c_str()); if (!conf.get("oheadoffs", value, cstr_null)) { m_reason << "readfirstblock: conf get oheadoffs failed"; return false; } m_oheadoffs = atoll(value.c_str()); if (!conf.get("nheadoffs", value, cstr_null)) { m_reason << "readfirstblock: conf get nheadoffs failed"; return false; } m_nheadoffs = atoll(value.c_str()); if (!conf.get("npadsize", value, cstr_null)) { m_reason << "readfirstblock: conf get npadsize failed"; return false; } m_npadsize = atoll(value.c_str()); if (!conf.get("unient", value, cstr_null)) { m_uniquentries = false; } else { m_uniquentries = stringToBool(value); } return true; } bool writeEntryHeader(int64_t offset, const EntryHeaderData& d, bool eraseData = false) { if (m_fd < 0) { m_reason << "writeEntryHeader: not open "; return false; } char bf[CIRCACHE_HEADER_SIZE]; memset(bf, 0, CIRCACHE_HEADER_SIZE); snprintf(bf, CIRCACHE_HEADER_SIZE, headerformat, d.dicsize, d.datasize, d.padsize, d.flags); if (lseek(m_fd, offset, 0) != offset) { m_reason << "CirCache::weh: lseek(" << offset << ") failed: errno " << errno; return false; } if (write(m_fd, bf, CIRCACHE_HEADER_SIZE) != CIRCACHE_HEADER_SIZE) { m_reason << "CirCache::weh: write failed. errno " << errno; return false; } if (eraseData == true) { if (d.dicsize || d.datasize) { m_reason << "CirCache::weh: erase requested but not empty"; return false; } string buf(d.padsize, ' '); if (write(m_fd, buf.c_str(), d.padsize) != (ssize_t)d.padsize) { m_reason << "CirCache::weh: write failed. errno " << errno; return false; } } return true; } CCScanHook::status readEntryHeader(int64_t offset, EntryHeaderData& d) { if (m_fd < 0) { m_reason << "readEntryHeader: not open "; return CCScanHook::Error; } if (lseek(m_fd, offset, 0) != offset) { m_reason << "readEntryHeader: lseek(" << offset << ") failed: errno " << errno; return CCScanHook::Error; } char bf[CIRCACHE_HEADER_SIZE]; int ret = read(m_fd, bf, CIRCACHE_HEADER_SIZE); if (ret == 0) { // Eof m_reason << " Eof "; return CCScanHook::Eof; } if (ret != CIRCACHE_HEADER_SIZE) { m_reason << " readheader: read failed errno " << errno; return CCScanHook::Error; } if (sscanf(bf, headerformat, &d.dicsize, &d.datasize, &d.padsize, &d.flags) != 4) { m_reason << " readEntryHeader: bad header at " << offset << " [" << bf << "]"; return CCScanHook::Error; } LOGDEB2("Circache:readEntryHeader: dcsz " << (d.dicsize) << " dtsz " << (d.datasize) << " pdsz " << (d.padsize) << " flgs " << (d.flags) << "\n" ); return CCScanHook::Continue; } CCScanHook::status scan(int64_t startoffset, CCScanHook *user, bool fold = false) { if (m_fd < 0) { m_reason << "scan: not open "; return CCScanHook::Error; } int64_t so0 = startoffset; bool already_folded = false; while (true) { if (already_folded && startoffset == so0) { m_ofskhcplt = true; return CCScanHook::Eof; } EntryHeaderData d; CCScanHook::status st; switch ((st = readEntryHeader(startoffset, d))) { case CCScanHook::Continue: break; case CCScanHook::Eof: if (fold && !already_folded) { already_folded = true; startoffset = CIRCACHE_FIRSTBLOCK_SIZE; continue; } /* FALLTHROUGH */ default: return st; } string udi; if (d.dicsize) { // d.dicsize is 0 for erased entries char *bf; if ((bf = buf(d.dicsize + 1)) == 0) { return CCScanHook::Error; } bf[d.dicsize] = 0; if (read(m_fd, bf, d.dicsize) != int(d.dicsize)) { m_reason << "scan: read failed errno " << errno; return CCScanHook::Error; } string b(bf, d.dicsize); ConfSimple conf(b, 1); if (!conf.get("udi", udi, cstr_null)) { m_reason << "scan: no udi in dic"; return CCScanHook::Error; } khEnter(udi, startoffset); } // Call callback CCScanHook::status a = user->takeone(startoffset, udi, d); switch (a) { case CCScanHook::Continue: break; default: return a; } startoffset += CIRCACHE_HEADER_SIZE + d.dicsize + d.datasize + d.padsize; } } bool readHUdi(int64_t hoffs, EntryHeaderData& d, string& udi) { if (readEntryHeader(hoffs, d) != CCScanHook::Continue) { return false; } string dic; if (!readDicData(hoffs, d, dic, 0)) { return false; } if (d.dicsize == 0) { // This is an erased entry udi.erase(); return true; } ConfSimple conf(dic); if (!conf.get("udi", udi)) { m_reason << "Bad file: no udi in dic"; return false; } return true; } bool readDicData(int64_t hoffs, EntryHeaderData& hd, string& dic, string* data) { int64_t offs = hoffs + CIRCACHE_HEADER_SIZE; // This syscall could be avoided in some cases if we saved the offset // at each seek. In most cases, we just read the header and we are // at the right position if (lseek(m_fd, offs, 0) != offs) { m_reason << "CirCache::get: lseek(" << offs << ") failed: " << errno; return false; } char *bf = 0; if (hd.dicsize) { bf = buf(hd.dicsize); if (bf == 0) { return false; } if (read(m_fd, bf, hd.dicsize) != int(hd.dicsize)) { m_reason << "CirCache::get: read() failed: errno " << errno; return false; } dic.assign(bf, hd.dicsize); } else { dic.erase(); } if (data == 0) { return true; } if (hd.datasize) { bf = buf(hd.datasize); if (bf == 0) { return false; } if (read(m_fd, bf, hd.datasize) != int(hd.datasize)) { m_reason << "CirCache::get: read() failed: errno " << errno; return false; } if (hd.flags & EFDataCompressed) { LOGDEB1("Circache:readdicdata: data compressed\n" ); void *uncomp; unsigned int uncompsize; if (!inflateToDynBuf(bf, hd.datasize, &uncomp, &uncompsize)) { m_reason << "CirCache: decompression failed "; return false; } data->assign((char *)uncomp, uncompsize); free(uncomp); } else { LOGDEB1("Circache:readdicdata: data NOT compressed\n" ); data->assign(bf, hd.datasize); } } else { data->erase(); } return true; } }; CirCache::CirCache(const string& dir) : m_dir(dir) { m_d = new CirCacheInternal; LOGDEB0("CirCache: [" << (m_dir) << "]\n" ); } CirCache::~CirCache() { delete m_d; m_d = 0; } string CirCache::getReason() { return m_d ? m_d->m_reason.str() : "Not initialized"; } // A scan callback which just records the last header offset and // padsize seen. This is used with a scan(nofold) to find the last // physical record in the file class CCScanHookRecord : public CCScanHook { public: int64_t headoffs; int64_t padsize; CCScanHookRecord() : headoffs(0), padsize(0) { } virtual status takeone(int64_t offs, const string& udi, const EntryHeaderData& d) { headoffs = offs; padsize = d.padsize; LOGDEB2("CCScanHookRecord::takeone: offs " << (lltodecstr(headoffs)) << " padsize " << (lltodecstr(padsize)) << "\n" ); return Continue; } }; string CirCache::getpath() { return m_d->datafn(m_dir); } bool CirCache::create(int64_t maxsize, int flags) { LOGDEB("CirCache::create: [" << (m_dir) << "] maxsz " << (lltodecstr((long long)maxsize)) << " flags 0x" << (flags) << "\n" ); if (m_d == 0) { LOGERR("CirCache::create: null data\n" ); return false; } struct stat st; if (stat(m_dir.c_str(), &st) < 0) { // Directory does not exist, create it if (mkdir(m_dir.c_str(), 0777) < 0) { m_d->m_reason << "CirCache::create: mkdir(" << m_dir << ") failed" << " errno " << errno; return false; } } else { // If the file exists too, and truncate is not set, switch // to open-mode. Still may need to update header params. if (access(m_d->datafn(m_dir).c_str(), 0) >= 0 && !(flags & CC_CRTRUNCATE)) { if (!open(CC_OPWRITE)) { return false; } if (maxsize == m_d->m_maxsize && ((flags & CC_CRUNIQUE) != 0) == m_d->m_uniquentries) { LOGDEB("Header unchanged, no rewrite\n" ); return true; } // If the new maxsize is bigger than current size, we need // to stop recycling if this is what we are doing. if (maxsize > m_d->m_maxsize && maxsize > st.st_size) { // Scan the file to find the last physical record. The // ohead is set at physical eof, and nhead is the last // scanned record CCScanHookRecord rec; m_d->scan(CIRCACHE_FIRSTBLOCK_SIZE, &rec, false); m_d->m_oheadoffs = lseek(m_d->m_fd, 0, SEEK_END); m_d->m_nheadoffs = rec.headoffs; m_d->m_npadsize = rec.padsize; } m_d->m_maxsize = maxsize; m_d->m_uniquentries = ((flags & CC_CRUNIQUE) != 0); LOGDEB2("CirCache::create: rewriting header with maxsize " << (lltodecstr(m_d->m_maxsize)) << " oheadoffs " << (lltodecstr(m_d->m_oheadoffs)) << " nheadoffs " << (lltodecstr(m_d->m_nheadoffs)) << " npadsize " << (m_d->m_npadsize) << " unient " << (int(m_d->m_uniquentries)) << "\n" ); return m_d->writefirstblock(); } // Else fallthrough to create file } if ((m_d->m_fd = ::open(m_d->datafn(m_dir).c_str(), O_CREAT | O_RDWR | O_TRUNC | O_BINARY, 0666)) < 0) { m_d->m_reason << "CirCache::create: open/creat(" << m_d->datafn(m_dir) << ") failed " << "errno " << errno; return false; } m_d->m_maxsize = maxsize; m_d->m_oheadoffs = CIRCACHE_FIRSTBLOCK_SIZE; m_d->m_uniquentries = ((flags & CC_CRUNIQUE) != 0); char buf[CIRCACHE_FIRSTBLOCK_SIZE]; memset(buf, 0, CIRCACHE_FIRSTBLOCK_SIZE); if (::write(m_d->m_fd, buf, CIRCACHE_FIRSTBLOCK_SIZE) != CIRCACHE_FIRSTBLOCK_SIZE) { m_d->m_reason << "CirCache::create: write header failed, errno " << errno; return false; } return m_d->writefirstblock(); } bool CirCache::open(OpMode mode) { if (m_d == 0) { LOGERR("CirCache::open: null data\n" ); return false; } if (m_d->m_fd >= 0) { ::close(m_d->m_fd); } if ((m_d->m_fd = ::open(m_d->datafn(m_dir).c_str(), mode == CC_OPREAD ? O_RDONLY | O_BINARY : O_RDWR | O_BINARY)) < 0) { m_d->m_reason << "CirCache::open: open(" << m_d->datafn(m_dir) << ") failed " << "errno " << errno; return false; } return m_d->readfirstblock(); } class CCScanHookDump : public CCScanHook { public: virtual status takeone(int64_t offs, const string& udi, const EntryHeaderData& d) { cout << "Scan: offs " << offs << " dicsize " << d.dicsize << " datasize " << d.datasize << " padsize " << d.padsize << " flags " << d.flags << " udi [" << udi << "]" << endl; return Continue; } }; bool CirCache::dump() { CCScanHookDump dumper; // Start at oldest header. This is eof while the file is growing, scan will // fold to bot at once. int64_t start = m_d->m_oheadoffs; switch (m_d->scan(start, &dumper, true)) { case CCScanHook::Stop: cout << "Scan returns Stop??" << endl; return false; case CCScanHook::Continue: cout << "Scan returns Continue ?? " << CCScanHook::Continue << " " << getReason() << endl; return false; case CCScanHook::Error: cout << "Scan returns Error: " << getReason() << endl; return false; case CCScanHook::Eof: cout << "Scan returns Eof (ok)" << endl; return true; default: cout << "Scan returns Unknown ??" << endl; return false; } } class CCScanHookGetter : public CCScanHook { public: string m_udi; int m_targinstance; int m_instance; int64_t m_offs; EntryHeaderData m_hd; CCScanHookGetter(const string& udi, int ti) : m_udi(udi), m_targinstance(ti), m_instance(0), m_offs(0) {} virtual status takeone(int64_t offs, const string& udi, const EntryHeaderData& d) { LOGDEB2("Circache:Scan: off " << (long(offs)) << " udi [" << (udi) << "] dcsz " << ((UINT)d.dicsize) << " dtsz " << ((UINT)d.datasize) << " pdsz " << ((UINT)d.padsize) << " flgs " << (d.flags) << "\n" ); if (!m_udi.compare(udi)) { m_instance++; m_offs = offs; m_hd = d; if (m_instance == m_targinstance) { return Stop; } } return Continue; } }; // instance == -1 means get latest. Otherwise specify from 1+ bool CirCache::get(const string& udi, string& dic, string *data, int instance) { Chrono chron; if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::get: no data or not open"; return false; } LOGDEB0("CirCache::get: udi [" << (udi) << "], instance " << (instance) << "\n" ); // If memory map is up to date, use it: if (m_d->m_ofskhcplt) { LOGDEB1("CirCache::get: using ofskh\n" ); //m_d->khDump(); vector ofss; if (m_d->khFind(udi, ofss)) { LOGDEB1("Circache::get: h found, colls " << (ofss.size()) << "\n" ); int finst = 1; EntryHeaderData d_good; int64_t o_good = 0; for (vector::iterator it = ofss.begin(); it != ofss.end(); it++) { LOGDEB1("Circache::get: trying offs " << ((ULONG)*it) << "\n" ); EntryHeaderData d; string fudi; if (!m_d->readHUdi(*it, d, fudi)) { return false; } if (!fudi.compare(udi)) { // Found one, memorize offset. Done if instance // matches, else go on. If instance is -1 need to // go to the end anyway d_good = d; o_good = *it; if (finst == instance) { break; } else { finst++; } } } // Did we read an appropriate entry ? if (o_good != 0 && (instance == -1 || instance == finst)) { bool ret = m_d->readDicData(o_good, d_good, dic, data); LOGDEB0("Circache::get: hfound, " << (chron.millis()) << " mS\n" ); return ret; } // Else try to scan anyway. } } CCScanHookGetter getter(udi, instance); int64_t start = m_d->m_oheadoffs; CCScanHook::status ret = m_d->scan(start, &getter, true); if (ret == CCScanHook::Eof) { if (getter.m_instance == 0) { return false; } } else if (ret != CCScanHook::Stop) { return false; } bool bret = m_d->readDicData(getter.m_offs, getter.m_hd, dic, data); LOGDEB0("Circache::get: scanfound, " << (chron.millis()) << " mS\n" ); return bret; } bool CirCache::erase(const string& udi, bool reallyclear) { if (m_d == 0) { LOGERR("CirCache::erase: null data\n" ); return false; } if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::erase: no data or not open"; return false; } LOGDEB0("CirCache::erase: udi [" << (udi) << "]\n" ); // If the mem cache is not up to date, update it, we're too lazy // to do a scan if (!m_d->m_ofskhcplt) { string dic; get("nosuchudi probably exists", dic); if (!m_d->m_ofskhcplt) { LOGERR("CirCache::erase : cache not updated after get\n" ); return false; } } vector ofss; if (!m_d->khFind(udi, ofss)) { // Udi not in there, erase ok LOGDEB("CirCache::erase: khFind returns none\n" ); return true; } for (vector::iterator it = ofss.begin(); it != ofss.end(); it++) { LOGDEB2("CirCache::erase: reading at " << ((unsigned long)*it) << "\n" ); EntryHeaderData d; string fudi; if (!m_d->readHUdi(*it, d, fudi)) { return false; } LOGDEB2("CirCache::erase: found fudi [" << (fudi) << "]\n" ); if (!fudi.compare(udi)) { EntryHeaderData nd; nd.padsize = d.dicsize + d.datasize + d.padsize; LOGDEB2("CirCache::erase: rewrite at " << ((unsigned long)*it) << "\n" ); if (*it == m_d->m_nheadoffs) { m_d->m_npadsize = nd.padsize; } if (!m_d->writeEntryHeader(*it, nd, reallyclear)) { LOGERR("CirCache::erase: write header failed\n" ); return false; } } } m_d->khClear(udi); return true; } // Used to scan the file ahead until we accumulated enough space for the new // entry. class CCScanHookSpacer : public CCScanHook { public: int64_t sizewanted; int64_t sizeseen; vector > squashed_udis; CCScanHookSpacer(int64_t sz) : sizewanted(sz), sizeseen(0) { assert(sz > 0); } virtual status takeone(int64_t offs, const string& udi, const EntryHeaderData& d) { LOGDEB2("Circache:ScanSpacer:off " << ((UINT)offs) << " dcsz " << (d.dicsize) << " dtsz " << (d.datasize) << " pdsz " << (d.padsize) << " udi[" << (udi) << "]\n" ); sizeseen += CIRCACHE_HEADER_SIZE + d.dicsize + d.datasize + d.padsize; squashed_udis.push_back(make_pair(udi, offs)); if (sizeseen >= sizewanted) { return Stop; } return Continue; } }; bool CirCache::put(const string& udi, const ConfSimple *iconf, const string& data, unsigned int iflags) { if (m_d == 0) { LOGERR("CirCache::put: null data\n" ); return false; } if (m_d->m_fd < 0) { m_d->m_reason << "CirCache::put: no data or not open"; return false; } // We need the udi in input metadata string dic; if (!iconf || !iconf->get("udi", dic) || dic.empty() || dic.compare(udi)) { m_d->m_reason << "No/bad 'udi' entry in input dic"; LOGERR("Circache::put: no/bad udi: DIC:[" << (dic) << "] UDI [" << (udi) << "]\n" ); return false; } // Possibly erase older entries. Need to do this first because we may be // able to reuse the space if the same udi was last written if (m_d->m_uniquentries && !erase(udi)) { LOGERR("CirCache::put: can't erase older entries\n" ); return false; } ostringstream s; iconf->write(s); dic = s.str(); // Data compression ? const char *datap = data.c_str(); size_t datalen = data.size(); unsigned short flags = 0; TempBuf compbuf; if (!(iflags & NoCompHint)) { uLong len = compressBound(static_cast(data.size())); char *bf = compbuf.setsize(len); if (bf != 0 && compress((Bytef*)bf, &len, (Bytef*)data.c_str(), static_cast(data.size())) == Z_OK) { if (float(len) < 0.9 * float(data.size())) { // bf is local but it's our static buffer address datap = bf; datalen = len; flags |= EFDataCompressed; } } } struct stat st; if (fstat(m_d->m_fd, &st) < 0) { m_d->m_reason << "CirCache::put: fstat failed. errno " << errno; return false; } // Characteristics for the new entry. int64_t nsize = CIRCACHE_HEADER_SIZE + dic.size() + datalen; int64_t nwriteoffs = m_d->m_oheadoffs; int64_t npadsize = 0; bool extending = false; LOGDEB("CirCache::put: nsz " << (nsize) << " oheadoffs " << (m_d->m_oheadoffs) << "\n" ); // Check if we can recover some pad space from the (physically) previous // entry. int64_t recovpadsize = m_d->m_oheadoffs == CIRCACHE_FIRSTBLOCK_SIZE ? 0 : m_d->m_npadsize; if (recovpadsize != 0) { // Need to read the latest entry's header, to rewrite it with a // zero pad size EntryHeaderData pd; if (m_d->readEntryHeader(m_d->m_nheadoffs, pd) != CCScanHook::Continue) { return false; } if (int(pd.padsize) != m_d->m_npadsize) { m_d->m_reason << "CirCache::put: logic error: bad padsize "; return false; } if (pd.dicsize == 0) { // erased entry. Also recover the header space, no need to rewrite // the header, we're going to write on it. recovpadsize += CIRCACHE_HEADER_SIZE; } else { LOGDEB("CirCache::put: recov. prev. padsize " << (pd.padsize) << "\n" ); pd.padsize = 0; if (!m_d->writeEntryHeader(m_d->m_nheadoffs, pd)) { return false; } // If we fail between here and the end, the file is broken. } nwriteoffs = m_d->m_oheadoffs - recovpadsize; } if (nsize <= recovpadsize) { // If the new entry fits entirely in the pad area from the // latest one, no need to recycle stuff LOGDEB("CirCache::put: new fits in old padsize " << (recovpadsize) << "\n" ); npadsize = recovpadsize - nsize; } else if (st.st_size < m_d->m_maxsize) { // Still growing the file. npadsize = 0; extending = true; } else { // Scan the file until we have enough space for the new entry, // and determine the pad size up to the 1st preserved entry int64_t scansize = nsize - recovpadsize; LOGDEB("CirCache::put: scanning for size " << (scansize) << " from offs " << ((UINT)m_d->m_oheadoffs) << "\n" ); CCScanHookSpacer spacer(scansize); switch (m_d->scan(m_d->m_oheadoffs, &spacer)) { case CCScanHook::Stop: LOGDEB("CirCache::put: Scan ok, sizeseen " << (spacer.sizeseen) << "\n" ); npadsize = spacer.sizeseen - scansize; break; case CCScanHook::Eof: npadsize = 0; extending = true; break; case CCScanHook::Continue: case CCScanHook::Error: return false; } // Take the recycled entries off the multimap m_d->khClear(spacer.squashed_udis); } LOGDEB("CirCache::put: writing " << (nsize) << " at " << (nwriteoffs) << " padsize " << (npadsize) << "\n" ); if (lseek(m_d->m_fd, nwriteoffs, 0) != nwriteoffs) { m_d->m_reason << "CirCache::put: lseek failed: " << errno; return false; } char head[CIRCACHE_HEADER_SIZE]; memset(head, 0, CIRCACHE_HEADER_SIZE); snprintf(head, CIRCACHE_HEADER_SIZE, headerformat, dic.size(), datalen, npadsize, flags); struct iovec vecs[3]; vecs[0].iov_base = head; vecs[0].iov_len = CIRCACHE_HEADER_SIZE; vecs[1].iov_base = (void *)dic.c_str(); vecs[1].iov_len = dic.size(); vecs[2].iov_base = (void *)datap; vecs[2].iov_len = datalen; if (writev(m_d->m_fd, vecs, 3) != nsize) { m_d->m_reason << "put: write failed. errno " << errno; if (extending) if (ftruncate(m_d->m_fd, m_d->m_oheadoffs) == -1) { m_d->m_reason << "put: ftruncate failed. errno " << errno; } return false; } m_d->khEnter(udi, nwriteoffs); // Update first block information m_d->m_nheadoffs = nwriteoffs; m_d->m_npadsize = npadsize; // New oldest header is the one just after the one we just wrote. m_d->m_oheadoffs = nwriteoffs + nsize + npadsize; if (nwriteoffs + nsize >= m_d->m_maxsize) { // Max size or top of file reached, next write at BOT. m_d->m_oheadoffs = CIRCACHE_FIRSTBLOCK_SIZE; } return m_d->writefirstblock(); } bool CirCache::rewind(bool& eof) { if (m_d == 0) { LOGERR("CirCache::rewind: null data\n" ); return false; } eof = false; int64_t fsize = lseek(m_d->m_fd, 0, SEEK_END); if (fsize == (int64_t) - 1) { LOGERR("CirCache::rewind: seek to EOF failed\n" ); return false; } // Read oldest header. This is either at the position pointed to // by oheadoffs, or after the first block if the file is still // growing. if (m_d->m_oheadoffs == fsize) { m_d->m_itoffs = CIRCACHE_FIRSTBLOCK_SIZE; } else { m_d->m_itoffs = m_d->m_oheadoffs; } CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); switch (st) { case CCScanHook::Eof: eof = true; return false; case CCScanHook::Continue: return true; default: return false; } } bool CirCache::next(bool& eof) { if (m_d == 0) { LOGERR("CirCache::next: null data\n" ); return false; } eof = false; // Skip to next header, using values stored from previous one m_d->m_itoffs += CIRCACHE_HEADER_SIZE + m_d->m_ithd.dicsize + m_d->m_ithd.datasize + m_d->m_ithd.padsize; // Looped back ? if (m_d->m_itoffs == m_d->m_oheadoffs) { eof = true; return false; } // Read. If we hit physical eof, fold. CCScanHook::status st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); if (st == CCScanHook::Eof) { m_d->m_itoffs = CIRCACHE_FIRSTBLOCK_SIZE; if (m_d->m_itoffs == m_d->m_oheadoffs) { // Then the file is not folded yet (still growing) eof = true; return false; } st = m_d->readEntryHeader(m_d->m_itoffs, m_d->m_ithd); } if (st == CCScanHook::Continue) { return true; } return false; } bool CirCache::getCurrentUdi(string& udi) { if (m_d == 0) { LOGERR("CirCache::getCurrentUdi: null data\n" ); return false; } if (!m_d->readHUdi(m_d->m_itoffs, m_d->m_ithd, udi)) { return false; } return true; } bool CirCache::getCurrent(string& udi, string& dic, string *data) { if (m_d == 0) { LOGERR("CirCache::getCurrent: null data\n" ); return false; } if (!m_d->readDicData(m_d->m_itoffs, m_d->m_ithd, dic, data)) { return false; } ConfSimple conf(dic, 1); conf.get("udi", udi, cstr_null); return true; } static void *allocmem( void *cp, /* The array to grow. may be NULL */ int sz, /* Unit size in bytes */ int *np, /* Pointer to current allocation number */ int min, /* Number to allocate the first time */ int maxinc) /* Maximum increment */ { if (cp == 0) { cp = malloc(min * sz); *np = cp ? min : 0; return cp; } int inc = (*np > maxinc) ? maxinc : *np; if ((cp = realloc(cp, (*np + inc) * sz)) != 0) { *np += inc; } return cp; } static bool inflateToDynBuf(void* inp, UINT inlen, void **outpp, UINT *outlenp) { z_stream d_stream; /* decompression stream */ LOGDEB0("inflateToDynBuf: inlen " << (inlen) << "\n" ); d_stream.zalloc = (alloc_func)0; d_stream.zfree = (free_func)0; d_stream.opaque = (voidpf)0; // Compression works well on html files, 4-6 is quite common, Otoh we // maybe passed a big, little if at all compressed image or pdf file, // So we set the initial allocation at 3 times the input size const int imul = 3; const int mxinc = 20; char *outp = 0; int alloc = 0; d_stream.next_in = (Bytef*)inp; d_stream.avail_in = inlen; d_stream.next_out = 0; d_stream.avail_out = 0; int err; if ((err = inflateInit(&d_stream)) != Z_OK) { LOGERR("Inflate: inflateInit: err " << (err) << " msg " << (d_stream.msg) << "\n" ); free(outp); return false; } for (;;) { LOGDEB2("InflateToDynBuf: avail_in " << (d_stream.avail_in) << " total_in " << (d_stream.total_in) << " avail_out " << (d_stream.avail_out) << " total_out " << (d_stream.total_out) << "\n" ); if (d_stream.avail_out == 0) { if ((outp = (char*)allocmem(outp, inlen, &alloc, imul, mxinc)) == 0) { LOGERR("Inflate: out of memory, current alloc " << (alloc * inlen) << "\n" ); inflateEnd(&d_stream); return false; } else { LOGDEB2("inflateToDynBuf: realloc(" << (alloc * inlen) << ") ok\n" ); } d_stream.avail_out = alloc * inlen - d_stream.total_out; d_stream.next_out = (Bytef*)(outp + d_stream.total_out); } err = inflate(&d_stream, Z_NO_FLUSH); if (err == Z_STREAM_END) { break; } if (err != Z_OK) { LOGERR("Inflate: error " << (err) << " msg " << (d_stream.msg) << "\n" ); inflateEnd(&d_stream); free(outp); return false; } } *outlenp = d_stream.total_out; *outpp = (Bytef *)outp; if ((err = inflateEnd(&d_stream)) != Z_OK) { LOGERR("Inflate: inflateEnd error " << (err) << " msg " << (d_stream.msg) << "\n" ); return false; } LOGDEB0("inflateToDynBuf: ok, output size " << (d_stream.total_out) << "\n" ); return true; } // Copy all entries from occ to ncc. Both are already open. static bool copyall(std::shared_ptr occ, std::shared_ptr ncc, int& nentries, ostringstream& msg) { bool eof = false; if (!occ->rewind(eof)) { if (!eof) { msg << "Initial rewind failed" << endl; return false; } } nentries = 0; while (!eof) { string udi, sdic, data; if (!occ->getCurrent(udi, sdic, &data)) { msg << "getCurrent failed: " << occ->getReason() << endl; return false; } // Shouldn't getcurrent deal with this ? if (sdic.size() == 0) { //cerr << "Skip empty entry" << endl; occ->next(eof); continue; } ConfSimple dic(sdic); if (!dic.ok()) { msg << "Could not parse entry attributes dic" << endl; return false; } //cerr << "UDI: " << udi << endl; if (!ncc->put(udi, &dic, data)) { msg << "put failed: " << ncc->getReason() << " sdic [" << sdic << "]" << endl; return false; } nentries++; occ->next(eof); } return true; } // Append all entries from sdir to ddir int CirCache::append(const string ddir, const string& sdir, string *reason) { ostringstream msg; // Open source file std::shared_ptr occ(new CirCache(sdir)); if (!occ->open(CirCache::CC_OPREAD)) { if (reason) { msg << "Open failed in " << sdir << " : " << occ->getReason() << endl; *reason = msg.str(); } return -1; } // Open dest file std::shared_ptr ncc(new CirCache(ddir)); if (!ncc->open(CirCache::CC_OPWRITE)) { if (reason) { msg << "Open failed in " << ddir << " : " << ncc->getReason() << endl; *reason = msg.str(); } return -1; } int nentries; if (!copyall(occ, ncc, nentries, msg)) { if (reason) { *reason = msg.str(); } return -1; } return nentries; } #else // TEST -> #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include "circache.h" #include "fileudi.h" #include "conftree.h" #include "readfile.h" #include "log.h" #include "smallut.h" using namespace std; static char *thisprog; static char usage [] = " -c [-u] : create\n" " -p [apath ...] : put files\n" " -d : dump\n" " -g [-i instance] [-D] : get\n" " -D: also dump data\n" " -e : erase\n" " -a
[ ...]: append old content to target\n" " The target should be first resized to hold all the data, else only\n" " as many entries as capacity permit will be retained\n" ; static void Usage(FILE *fp = stderr) { fprintf(fp, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_c 0x2 #define OPT_p 0x8 #define OPT_g 0x10 #define OPT_d 0x20 #define OPT_i 0x40 #define OPT_D 0x80 #define OPT_u 0x100 #define OPT_e 0x200 #define OPT_a 0x800 int main(int argc, char **argv) { int instance = -1; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ { Usage(); } while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'c': op_flags |= OPT_c; break; case 'D': op_flags |= OPT_D; break; case 'd': op_flags |= OPT_d; break; case 'e': op_flags |= OPT_e; break; case 'g': op_flags |= OPT_g; break; case 'i': op_flags |= OPT_i; if (argc < 2) { Usage(); } if ((sscanf(*(++argv), "%d", &instance)) != 1) { Usage(); } argc--; goto b1; case 'p': op_flags |= OPT_p; break; case 'u': op_flags |= OPT_u; break; default: Usage(); break; } b1: argc--; argv++; } Logger::getTheLog("")->setLogLevel(Logger::LLDEB1); if (argc < 1) { Usage(); } string dir = *argv++; argc--; CirCache cc(dir); if (op_flags & OPT_c) { if (argc != 1) { Usage(); } int64_t sizekb = atoi(*argv++); argc--; int flags = 0; if (op_flags & OPT_u) { flags |= CirCache::CC_CRUNIQUE; } if (!cc.create(sizekb * 1024, flags)) { cerr << "Create failed:" << cc.getReason() << endl; exit(1); } } else if (op_flags & OPT_a) { if (argc < 1) { Usage(); } while (argc) { string reason; if (CirCache::append(dir, *argv++, &reason) < 0) { cerr << reason << endl; return 1; } argc--; } } else if (op_flags & OPT_p) { if (argc < 1) { Usage(); } if (!cc.open(CirCache::CC_OPWRITE)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string fn = *argv++; argc--; char dic[1000]; string data, reason; if (!file_to_string(fn, data, &reason)) { cerr << "File_to_string: " << reason << endl; exit(1); } string udi; make_udi(fn, "", udi); string cmd("xdg-mime query filetype "); // Should do more quoting here... cmd += "'" + fn + "'"; FILE *fp = popen(cmd.c_str(), "r"); char* buf=0; size_t sz = 0; ::getline(&buf, &sz, fp); pclose(fp); string mimetype(buf); free(buf); trimstring(mimetype, "\n\r"); cout << "Got [" << mimetype << "]\n"; string s; ConfSimple conf(s); conf.set("udi", udi); conf.set("mimetype", mimetype); //ostringstream str; conf.write(str); cout << str.str() << endl; if (!cc.put(udi, &conf, data, 0)) { cerr << "Put failed: " << cc.getReason() << endl; cerr << "conf: ["; conf.write(cerr); cerr << "]" << endl; exit(1); } } cc.open(CirCache::CC_OPREAD); } else if (op_flags & OPT_g) { if (!cc.open(CirCache::CC_OPREAD)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string udi = *argv++; argc--; string dic, data; if (!cc.get(udi, dic, &data, instance)) { cerr << "Get failed: " << cc.getReason() << endl; exit(1); } cout << "Dict: [" << dic << "]" << endl; if (op_flags & OPT_D) { cout << "Data: [" << data << "]" << endl; } } } else if (op_flags & OPT_e) { if (!cc.open(CirCache::CC_OPWRITE)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } while (argc) { string udi = *argv++; argc--; string dic, data; if (!cc.erase(udi)) { cerr << "Erase failed: " << cc.getReason() << endl; exit(1); } } } else if (op_flags & OPT_d) { if (!cc.open(CirCache::CC_OPREAD)) { cerr << "Open failed: " << cc.getReason() << endl; exit(1); } cc.dump(); } else { Usage(); } exit(0); } #endif recoll-1.23.7/utils/fstreewalk.h0000644000175000017500000001123113125527323013466 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FSTREEWALK_H_INCLUDED_ #define _FSTREEWALK_H_INCLUDED_ #include #include #ifndef NO_NAMESPACES using std::string; using std::vector; #endif class FsTreeWalkerCB; struct stat; /** * Class implementing a unix directory recursive walk. * * A user-defined function object is called for every file or * directory. Patterns to be ignored can be set before starting the * walk. Options control whether we follow symlinks and whether we recurse * on subdirectories. */ class FsTreeWalker { public: // Global option to use FNM_PATHNAME when matching paths (for // skippedPaths). // We initially used FNM_PATHNAME, and we can't change it now // (because of all the config files around). So add global option // to not use the flag, which can be set from rclconfig by adding // a value to the config file (skippedPathsNoFnmPathname) static bool o_useFnmPathname; static void setNoFnmPathname() { o_useFnmPathname = false; } // Flags for call to processone(). FtwDirEnter is used when // entering a directory. FtwDirReturn is used when returning to it // after processing a subdirectory. enum CbFlag {FtwRegular, FtwDirEnter, FtwDirReturn}; enum Status {FtwOk=0, FtwError=1, FtwStop=2, FtwStatAll = FtwError|FtwStop}; enum Options {FtwOptNone = 0, FtwNoRecurse = 1, FtwFollow = 2, FtwNoCanon = 4, FtwSkipDotFiles = 8, // Tree walking options. Natural is close to depth first: process // directory entries as we see them, recursing into subdirectories at // once // Breadth means we process all files and dirs at a given directory level // before going deeper. // // FilesThenDirs is close to Natural, except that we process all files in a // given directory before going deeper: allows keeping only a single // directory open // We don't do pure depth first (process subdirs before files), this does // not appear to make any sense. FtwTravNatural = 0x10000, FtwTravBreadth = 0x20000, FtwTravFilesThenDirs = 0x40000, FtwTravBreadthThenDepth = 0x80000 }; static const int FtwTravMask; FsTreeWalker(int opts = FtwTravNatural); ~FsTreeWalker(); void setOpts(int opts); int getOpts(); void setDepthSwitch(int); void setMaxDepth(int); /** * Begin file system walk. * @param dir is not checked against the ignored patterns (this is * a feature and must not change. * @param cb the function object that will be called back for every * file-system object (called both at entry and exit for directories). */ Status walk(const string &dir, FsTreeWalkerCB& cb); /** Get explanation for error */ string getReason(); int getErrCnt(); /** * Add a pattern (file or dir) to be ignored (ie: #* , *~) */ bool addSkippedName(const string &pattern); /** Set the ignored patterns set */ bool setSkippedNames(const vector &patterns); /** Same for skipped paths: this are paths, not names, under which we do not descend (ie: /home/me/.recoll) */ bool addSkippedPath(const string &path); /** Set the ignored paths list */ bool setSkippedPaths(const vector &patterns); /** Test if path/name should be skipped. This can be used independantly of * an actual tree walk */ bool inSkippedPaths(const string& path, bool ckparents = false); bool inSkippedNames(const string& name); private: Status iwalk(const string &dir, struct stat *stp, FsTreeWalkerCB& cb); class Internal; Internal *data; }; class FsTreeWalkerCB { public: virtual ~FsTreeWalkerCB() {} // Only st_mtime, st_ctime, st_size, st_mode (filetype bits: dir/reg/lnk), virtual FsTreeWalker::Status processone(const string &, const struct stat *, FsTreeWalker::CbFlag) = 0; }; #endif /* _FSTREEWALK_H_INCLUDED_ */ recoll-1.23.7/utils/smallut.h0000644000175000017500000002167113224431020012775 00000000000000/* Copyright (C) 2006-2016 J.F.Dockes * * This library 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 (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #ifndef _SMALLUT_H_INCLUDED_ #define _SMALLUT_H_INCLUDED_ #include #include #include #include #include #include // Miscellaneous mostly string-oriented small utilities // Note that none of the following code knows about utf-8. // Call this before going multithread. void smallut_init_mt(); #ifndef SMALLUT_DISABLE_MACROS #ifndef MIN #define MIN(A,B) (((A)<(B)) ? (A) : (B)) #endif #ifndef MAX #define MAX(A,B) (((A)>(B)) ? (A) : (B)) #endif #ifndef deleteZ #define deleteZ(X) {delete X;X = 0;} #endif #endif /* SMALLUT_DISABLE_MACROS */ // Case-insensitive compare. ASCII ONLY ! extern int stringicmp(const std::string& s1, const std::string& s2); // For find_if etc. struct StringIcmpPred { StringIcmpPred(const std::string& s1) : m_s1(s1) { } bool operator()(const std::string& s2) { return stringicmp(m_s1, s2) == 0; } const std::string& m_s1; }; extern int stringlowercmp(const std::string& alreadylower, const std::string& s2); extern int stringuppercmp(const std::string& alreadyupper, const std::string& s2); extern void stringtolower(std::string& io); extern std::string stringtolower(const std::string& io); extern void stringtoupper(std::string& io); extern std::string stringtoupper(const std::string& io); extern bool beginswith(const std::string& big, const std::string& small); // Is one string the end part of the other ? extern int stringisuffcmp(const std::string& s1, const std::string& s2); // Divine language from locale extern std::string localelang(); // Divine 8bit charset from language extern std::string langtocode(const std::string& lang); // Compare charset names, removing the more common spelling variations extern bool samecharset(const std::string& cs1, const std::string& cs2); // Parse date interval specifier into pair of y,m,d dates. The format // for the time interval is based on a subset of iso 8601 with // the addition of open intervals, and removal of all time indications. // 'P' is the Period indicator, it's followed by a length in // years/months/days (or any subset thereof) // Dates: YYYY-MM-DD YYYY-MM YYYY // Periods: P[nY][nM][nD] where n is an integer value. // At least one of YMD must be specified // The separator for the interval is /. Interval examples // YYYY/ (from YYYY) YYYY-MM-DD/P3Y (3 years after date) etc. // This returns a pair of y,m,d dates. struct DateInterval { int y1; int m1; int d1; int y2; int m2; int d2; }; extern bool parsedateinterval(const std::string& s, DateInterval *di); extern int monthdays(int mon, int year); /** * Parse input string into list of strings. * * Token delimiter is " \t\n" except inside dquotes. dquote inside * dquotes can be escaped with \ etc... * Input is handled a byte at a time, things will work as long as * space tab etc. have the ascii values and can't appear as part of a * multibyte char. utf-8 ok but so are the iso-8859-x and surely * others. addseps do have to be single-bytes */ template bool stringToStrings(const std::string& s, T& tokens, const std::string& addseps = ""); /** * Inverse operation: */ template void stringsToString(const T& tokens, std::string& s); template std::string stringsToString(const T& tokens); /** * Strings to CSV string. tokens containing the separator are quoted (") * " inside tokens is escaped as "" ([word "quote"] =>["word ""quote"""] */ template void stringsToCSV(const T& tokens, std::string& s, char sep = ','); /** * Split input string. No handling of quoting */ extern void stringToTokens(const std::string& s, std::vector& tokens, const std::string& delims = " \t", bool skipinit = true); /** Convert string to boolean */ extern bool stringToBool(const std::string& s); /** Remove instances of characters belonging to set (default {space, tab}) at beginning and end of input string */ extern void trimstring(std::string& s, const char *ws = " \t"); extern void rtrimstring(std::string& s, const char *ws = " \t"); extern void ltrimstring(std::string& s, const char *ws = " \t"); /** Escape things like < or & by turning them into entities */ extern std::string escapeHtml(const std::string& in); /** Double-quote and escape to produce C source code string (prog generation) */ extern std::string makeCString(const std::string& in); /** Replace some chars with spaces (ie: newline chars). */ extern std::string neutchars(const std::string& str, const std::string& chars); extern void neutchars(const std::string& str, std::string& out, const std::string& chars); /** Turn string into something that won't be expanded by a shell. In practise * quote with double-quotes and escape $`\ */ extern std::string escapeShell(const std::string& str); /** Truncate a string to a given maxlength, avoiding cutting off midword * if reasonably possible. */ extern std::string truncate_to_word(const std::string& input, std::string::size_type maxlen); void ulltodecstr(uint64_t val, std::string& buf); void lltodecstr(int64_t val, std::string& buf); std::string lltodecstr(int64_t val); std::string ulltodecstr(uint64_t val); /** Convert byte count into unit (KB/MB...) appropriate for display */ std::string displayableBytes(int64_t size); /** Break big string into lines */ std::string breakIntoLines(const std::string& in, unsigned int ll = 100, unsigned int maxlines = 50); /** Small utility to substitute printf-like percents cmds in a string */ bool pcSubst(const std::string& in, std::string& out, const std::map& subs); /** Substitute printf-like percents and also %(key) */ bool pcSubst(const std::string& in, std::string& out, const std::map& subs); /** Append system error message */ void catstrerror(std::string *reason, const char *what, int _errno); /** Portable timegm. MS C has _mkgmtime, but there is a bug in Gminw which * makes it inaccessible */ struct tm; time_t portable_timegm(struct tm *tm); inline void leftzeropad(std::string& s, unsigned len) { if (s.length() && s.length() < len) { s = s.insert(0, len - s.length(), '0'); } } // A class to solve platorm/compiler issues for simple regex // matches. Uses the appropriate native lib under the hood. // This always uses extended regexp syntax. class SimpleRegexp { public: enum Flags {SRE_NONE = 0, SRE_ICASE = 1, SRE_NOSUB = 2}; /// @param nmatch must be >= the number of parenthesed subexp in exp SimpleRegexp(const std::string& exp, int flags, int nmatch = 0); ~SimpleRegexp(); /// Match input against exp, return true if matches bool simpleMatch(const std::string& val) const; /// After simpleMatch success, get nth submatch, 0 is the whole /// match, 1 first parentheses, etc. std::string getMatch(const std::string& val, int matchidx) const; /// Calls simpleMatch() bool operator() (const std::string& val) const; /// Check after construction bool ok() const; class Internal; private: Internal *m; }; /// Utilities for printing names for defined values (Ex: O_RDONLY->"O_RDONLY") /// Entries for the descriptive table struct CharFlags { unsigned int value; // Flag or value const char *yesname;// String to print if flag set or equal const char *noname; // String to print if flag not set (unused for values) }; /// Helper macro for the common case where we want to print the /// flag/value defined name #define CHARFLAGENTRY(NM) {NM, #NM} /// Translate a bitfield into string description extern std::string flagsToString(const std::vector&, unsigned int flags); /// Translate a value into a name extern std::string valToString(const std::vector&, unsigned int val); /// Reverse operation: translate string into bitfield extern unsigned int stringToFlags(const std::vector&, const std::string& input, const char *sep = "|"); #endif /* _SMALLUT_H_INCLUDED_ */ recoll-1.23.7/utils/appformime.cpp0000644000175000017500000001400213125527323014010 00000000000000/* 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_APPFORMIME #include #include #include using namespace std; #include "pathut.h" #include "smallut.h" #include "appformime.h" static const string topappsdir("/usr/share/applications"); static const string desktopext("desktop"); static DesktopDb *theDb; class FstCb : public FsTreeWalkerCB { public: FstCb(DesktopDb::AppMap *appdefs) : m_appdefs(appdefs) { } virtual FsTreeWalker::Status processone(const string &, const struct stat *, FsTreeWalker::CbFlag); DesktopDb::AppMap *m_appdefs; }; FsTreeWalker::Status FstCb::processone(const string& fn, const struct stat *, FsTreeWalker::CbFlag flg) { if (flg != FsTreeWalker::FtwRegular) return FsTreeWalker::FtwOk; if (path_suffix(fn).compare(desktopext)) { //cerr << fn << " does not end with .desktop" << endl; return FsTreeWalker::FtwOk; } ConfSimple dt(fn.c_str(), true); if (!dt.ok()) { cerr << fn << " cant parse" << endl; return FsTreeWalker::FtwOk; } string tp, nm, cmd, mt; if (!dt.get("Type", tp, "Desktop Entry")) { //cerr << fn << " no Type" << endl; return FsTreeWalker::FtwOk; } if (tp.compare("Application")) { //cerr << fn << " wrong Type " << tp << endl; return FsTreeWalker::FtwOk; } if (!dt.get("Exec", cmd, "Desktop Entry")) { //cerr << fn << " no Exec" << endl; return FsTreeWalker::FtwOk; } if (!dt.get("Name", nm, "Desktop Entry")) { //cerr << fn << " no Name" << endl; nm = path_basename(fn, desktopext); } if (!dt.get("MimeType", mt, "Desktop Entry")) { //cerr << fn << " no MimeType" << endl; return FsTreeWalker::FtwOk; } DesktopDb::AppDef appdef(nm, cmd); // Breakup mime type list, and push app to mime entries vector mimes; stringToTokens(mt, mimes, ";"); for (vector::const_iterator it = mimes.begin(); it != mimes.end(); it++) { (*m_appdefs)[*it].push_back(appdef); } return FsTreeWalker::FtwOk; } DesktopDb* DesktopDb::getDb() { if (theDb == 0) { theDb = new DesktopDb(); } if (theDb && theDb->m_ok) return theDb; return 0; } void DesktopDb::build(const string& dir) { FstCb procapp(&m_appMap); FsTreeWalker walker; if (walker.walk(dir, procapp) != FsTreeWalker::FtwOk) { m_ok = false; m_reason = walker.getReason(); } m_ok = true; } DesktopDb::DesktopDb() { build(topappsdir); } DesktopDb::DesktopDb(const string& dir) { build(dir); } bool DesktopDb::appForMime(const string& mime, vector *apps, string *reason) { AppMap::const_iterator it = m_appMap.find(mime); if (it == m_appMap.end()) { if (reason) *reason = string("No application found for ") + mime; return false; } *apps = it->second; return true; } bool DesktopDb::allApps(vector *apps) { map allaps; for (AppMap::const_iterator it = m_appMap.begin(); it != m_appMap.end(); it++) { for (vector::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++) { allaps.insert(pair (it1->name, AppDef(it1->name, it1->command))); } } for (map::const_iterator it = allaps.begin(); it != allaps.end(); it++) { apps->push_back(it->second); } return true; } bool DesktopDb::appByName(const string& nm, AppDef& app) { for (AppMap::const_iterator it = m_appMap.begin(); it != m_appMap.end(); it++) { for (vector::const_iterator it1 = it->second.begin(); it1 != it->second.end(); it1++) { if (!nm.compare(it1->name)) { app.name = it1->name; app.command = it1->command; return true; } } } return false; } const string& DesktopDb::getReason() { return m_reason; } #else // TEST_APPFORMIME #include #include #include #include #include #include #include using namespace std; #include "appformime.h" static char *thisprog; static char usage [] = " appformime \n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 1) Usage(); string mime = *argv++;argc--; string reason; vector appdefs; DesktopDb *ddb = DesktopDb::getDb(); if (ddb == 0) { cerr << "Could not create desktop db\n"; exit(1); } if (!ddb->appForMime(mime, &appdefs, &reason)) { cerr << "appForMime failed: " << reason << endl; exit(1); } if (appdefs.empty()) { cerr << "No application found for [" << mime << "]" << endl; exit(1); } cout << mime << " -> "; for (vector::const_iterator it = appdefs.begin(); it != appdefs.end(); it++) { cout << "[" << it->name << ", " << it->command << "], "; } cout << endl; exit(0); } #endif //TEST_APPFORMIME recoll-1.23.7/utils/transcode.h0000644000175000017500000000256213125527323013310 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _TRANSCODE_H_INCLUDED_ #define _TRANSCODE_H_INCLUDED_ /** * */ #include /** * c++ized interface to iconv * * @param in input string * @param out output string * @param icode input encoding * @param ocode input encoding * @param ecnt (output) number of transcoding errors * @return true if transcoding succeeded, even with errors. False for global * errors like unknown charset names */ extern bool transcode(const std::string &in, std::string &out, const std::string &icode, const std::string &ocode, int *ecnt = 0); #endif /* _TRANSCODE_H_INCLUDED_ */ recoll-1.23.7/utils/mimeparse.cpp0000644000175000017500000006675213125527323013656 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_MIMEPARSE #include "autoconfig.h" #include #include #include #include #include #include #include #include #include "mimeparse.h" #include "base64.h" #include "transcode.h" #include "smallut.h" using namespace std; //#define DEBUG_MIMEPARSE #ifdef DEBUG_MIMEPARSE #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif // Parsing a header value. Only content-type and content-disposition // have parameters, but others are compatible with content-type // syntax, only, parameters are not used. So we can parse all like: // // headertype: value [; paramname=paramvalue] ... // // Value and paramvalues can be quoted strings, and there can be // comments too. Note that RFC2047 is explicitly forbidden for // parameter values (RFC2231 must be used), but I have seen it used // anyway (ie: thunderbird 1.0) // // Ref: RFC2045/6/7 (MIME) RFC2183/2231 (content-disposition and encodings) /** Decode a MIME parameter value encoded according to rfc2231 * * Example input withs input charset == "": * [iso-8859-1'french'RE%A0%3A_Smoke_Tests%20bla] * Or (if charset is set) : RE%A0%3A_Smoke_Tests%20bla * * @param in input string, ascii with rfc2231 markup * @param out output string * @param charset if empty: decode string like 'charset'lang'more%20stuff, * else just do the %XX part * @return out output string encoded in utf-8 */ bool rfc2231_decode(const string &in, string &out, string &charset) { string::size_type pos1, pos2=0; if (charset.empty()) { if ((pos1 = in.find("'")) == string::npos) return false; charset = in.substr(0, pos1); // fprintf(stderr, "Charset: [%s]\n", charset.c_str()); pos1++; if ((pos2 = in.find("'", pos1)) == string::npos) return false; // We have no use for lang for now // string lang = in.substr(pos1, pos2-pos1); // fprintf(stderr, "Lang: [%s]\n", lang.c_str()); pos2++; } string raw; qp_decode(in.substr(pos2), raw, '%'); // fprintf(stderr, "raw [%s]\n", raw.c_str()); if (!transcode(raw, out, charset, "UTF-8")) return false; return true; } ///////////////////////////////////////// /// Decoding of MIME fields values and parameters // The lexical token returned by find_next_token class Lexical { public: enum kind {none, token, separator}; kind what; string value; string error; char quote; Lexical() : what(none), quote(0) {} void reset() {what = none; value.erase(); error.erase();quote = 0;} }; // Skip mime comment. This must be called with in[start] == '(' static string::size_type skip_comment(const string &in, string::size_type start, Lexical &lex) { int commentlevel = 0; for (; start < in.size(); start++) { if (in[start] == '\\') { // Skip escaped char. if (start+1 < in.size()) { start++; continue; } else { lex.error.append("\\ at end of string "); return in.size(); } } if (in[start] == '(') commentlevel++; if (in[start] == ')') { if (--commentlevel == 0) break; } } if (start == in.size() && commentlevel != 0) { lex.error.append("Unclosed comment "); return in.size(); } return start; } // Skip initial whitespace and (possibly nested) comments. static string::size_type skip_whitespace_and_comment(const string &in, string::size_type start, Lexical &lex) { while (1) { if ((start = in.find_first_not_of(" \t\r\n", start)) == string::npos) return in.size(); if (in[start] == '(') { if ((start = skip_comment(in, start, lex)) == string::npos) return string::npos; } else { break; } } return start; } /// Find next token in mime header value string. /// @return the next starting position in string, string::npos for error /// @param in the input string /// @param start the starting position /// @param lex the returned token and its description /// @param delims separators we should look for static string::size_type find_next_token(const string &in, string::size_type start, Lexical &lex, string delims = ";=") { char oquot, cquot; start = skip_whitespace_and_comment(in, start, lex); if (start == string::npos || start == in.size()) return in.size(); // Begins with separator ? return it. string::size_type delimi = delims.find_first_of(in[start]); if (delimi != string::npos) { lex.what = Lexical::separator; lex.value = delims[delimi]; return start+1; } // Check for start of quoted string oquot = in[start]; switch (oquot) { case '<': cquot = '>';break; case '"': cquot = '"';break; default: cquot = 0; break; } if (cquot != 0) { // Quoted string parsing string::size_type end; start++; // Skip quote character for (end = start;end < in.size() && in[end] != cquot; end++) { if (in[end] == '\\') { // Skip escaped char. if (end+1 < in.size()) { end++; } else { // backslash at end of string: error lex.error.append("\\ at end of string "); return string::npos; } } } if (end == in.size()) { // Found end of string before closing quote character: error lex.error.append("Unclosed quoted string "); return string::npos; } lex.what = Lexical::token; lex.value = in.substr(start, end-start); lex.quote = oquot; return ++end; } else { string::size_type end = in.find_first_of(delims + "\r\n \t(", start); lex.what = Lexical::token; lex.quote = 0; if (end == string::npos) { end = in.size(); lex.value = in.substr(start); } else { lex.value = in.substr(start, end-start); } return end; } } // Classes for handling rfc2231 value continuations class Chunk { public: Chunk() : decode(false) {} bool decode; string value; }; class Chunks { public: vector chunks; }; void stringtolower(string &out, const string& in) { for (string::size_type i = 0; i < in.size(); i++) out.append(1, char(tolower(in[i]))); } // Parse MIME field value. Should look like: // somevalue ; param1=val1;param2=val2 bool parseMimeHeaderValue(const string& value, MimeHeaderValue& parsed) { parsed.value.erase(); parsed.params.clear(); Lexical lex; string::size_type start = 0; // Get the field value start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::token) return false; parsed.value = lex.value; map rawparams; // Look for parameters for (;;) { string paramname, paramvalue; lex.reset(); start = find_next_token(value, start, lex); if (start == value.size()) break; if (start == string::npos) { //fprintf(stderr, "Find_next_token error(1)\n"); return false; } if (lex.what == Lexical::separator && lex.value[0] == ';') continue; if (lex.what != Lexical::token) return false; stringtolower(paramname, lex.value); start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::separator || lex.value[0] != '=') { //fprintf(stderr, "Find_next_token error (2)\n"); return false; } start = find_next_token(value, start, lex); if (start == string::npos || lex.what != Lexical::token) { //fprintf(stderr, "Parameter has no value!"); return false; } paramvalue = lex.value; rawparams[paramname] = paramvalue; //fprintf(stderr, "RAW: name [%s], value [%s]\n", paramname.c_str(), // paramvalue.c_str()); } // fprintf(stderr, "Number of raw params %d\n", rawparams.size()); // RFC2231 handling: // - if a parameter name ends in * it must be decoded // - If a parameter name looks line name*ii[*] it is a // partial value, and must be concatenated with other such. map chunks; for (map::const_iterator it = rawparams.begin(); it != rawparams.end(); it++) { string nm = it->first; // fprintf(stderr, "NM: [%s]\n", nm.c_str()); if (nm.empty()) // ?? continue; Chunk chunk; if (nm[nm.length()-1] == '*') { nm.erase(nm.length() - 1); chunk.decode = true; } else chunk.decode = false; // fprintf(stderr, "NM1: [%s]\n", nm.c_str()); chunk.value = it->second; // Look for another asterisk in nm. If none, assign index 0 string::size_type aster; int idx = 0; if ((aster = nm.rfind("*")) != string::npos) { string num = nm.substr(aster+1); //fprintf(stderr, "NUM: [%s]\n", num.c_str()); nm.erase(aster); idx = atoi(num.c_str()); } Chunks empty; if (chunks.find(nm) == chunks.end()) chunks[nm] = empty; chunks[nm].chunks.resize(idx+1); chunks[nm].chunks[idx] = chunk; //fprintf(stderr, "CHNKS: nm [%s], idx %d, decode %d, value [%s]\n", // nm.c_str(), idx, int(chunk.decode), chunk.value.c_str()); } // For each parameter name, concatenate its chunks and possibly // decode Note that we pass the whole concatenated string to // decoding if the first chunk indicates that decoding is needed, // which is not right because there might be uncoded chunks // according to the rfc. for (map::const_iterator it = chunks.begin(); it != chunks.end(); it++) { if (it->second.chunks.empty()) continue; string nm = it->first; // Create the name entry if (parsed.params.find(nm) == parsed.params.end()) parsed.params[nm].clear(); // Concatenate all chunks and decode the whole if the first one needs // to. Yes, this is not quite right. string value; for (vector::const_iterator vi = it->second.chunks.begin(); vi != it->second.chunks.end(); vi++) { value += vi->value; } if (it->second.chunks[0].decode) { string charset; rfc2231_decode(value, parsed.params[nm], charset); } else { // rfc2047 MUST NOT but IS used by some agents rfc2047_decode(value, parsed.params[nm]); } //fprintf(stderr, "FINAL: nm [%s], value [%s]\n", //nm.c_str(), parsed.params[nm].c_str()); } return true; } // Decode a string encoded with quoted-printable encoding. // we reuse the code for rfc2231 % encoding, even if the eol // processing is not useful in this case bool qp_decode(const string& in, string &out, char esc) { out.reserve(in.length()); string::size_type ii; for (ii = 0; ii < in.length(); ii++) { if (in[ii] == esc) { ii++; // Skip '=' or '%' if(ii >= in.length() - 1) { // Need at least 2 more chars break; } else if (in[ii] == '\r' && in[ii+1] == '\n') { // Soft nl, skip ii++; } else if (in[ii] != '\n' && in[ii] != '\r') { // decode char c = in[ii]; char co; if(c >= 'A' && c <= 'F') { co = char((c - 'A' + 10) * 16); } else if (c >= 'a' && c <= 'f') { co = char((c - 'a' + 10) * 16); } else if (c >= '0' && c <= '9') { co = char((c - '0') * 16); } else { return false; } if(++ii >= in.length()) break; c = in[ii]; if (c >= 'A' && c <= 'F') { co += char(c - 'A' + 10); } else if (c >= 'a' && c <= 'f') { co += char(c - 'a' + 10); } else if (c >= '0' && c <= '9') { co += char(c - '0'); } else { return false; } out += co; } } else { out += in[ii]; } } return true; } // Decode an word encoded as quoted printable or base 64 static bool rfc2047_decodeParsed(const std::string& charset, const std::string& encoding, const std::string& value, std::string &utf8) { DPRINT((stderr, "DecodeParsed: charset [%s] enc [%s] val [%s]\n", charset.c_str(), encoding.c_str(), value.c_str())); utf8.clear(); string decoded; if (!stringlowercmp("b", encoding)) { if (!base64_decode(value, decoded)) return false; DPRINT((stderr, "FromB64: [%s]\n", decoded.c_str())); } else if (!stringlowercmp("q", encoding)) { if (!qp_decode(value, decoded)) return false; // Need to translate _ to ' ' here string temp; for (string::size_type pos = 0; pos < decoded.length(); pos++) if (decoded[pos] == '_') temp += ' '; else temp += decoded[pos]; decoded = temp; DPRINT((stderr, "FromQP: [%s]\n", decoded.c_str())); } else { DPRINT((stderr, "Bad encoding [%s]\n", encoding.c_str())); return false; } if (!transcode(decoded, utf8, charset, "UTF-8")) { DPRINT((stderr, "Transcode failed\n")); return false; } return true; } // Parse a mail header value encoded according to RFC2047. // This is not supposed to be used for MIME parameter values, but it // happens. // Bugs: // - We should turn off decoding while inside quoted strings // typedef enum {rfc2047ready, rfc2047open_eq, rfc2047charset, rfc2047encoding, rfc2047value, rfc2047close_q} Rfc2047States; bool rfc2047_decode(const std::string& in, std::string &out) { DPRINT((stderr, "rfc2047_decode: [%s]\n", in.c_str())); Rfc2047States state = rfc2047ready; string encoding, charset, value, utf8; out.clear(); for (string::size_type ii = 0; ii < in.length(); ii++) { char ch = in[ii]; switch (state) { case rfc2047ready: { DPRINT((stderr, "STATE: ready, ch %c\n", ch)); switch (ch) { // Whitespace: stay ready case ' ': case ' ': value += ch;break; // '=' -> forward to next state case '=': state = rfc2047open_eq; break; DPRINT((stderr, "STATE: open_eq\n")); // Other: go back to sleep default: value += ch; state = rfc2047ready; } } break; case rfc2047open_eq: { DPRINT((stderr, "STATE: open_eq, ch %c\n", ch)); switch (ch) { case '?': { // Transcode current (unencoded part) value: // we sometimes find 8-bit chars in // there. Interpret as Iso8859. if (value.length() > 0) { transcode(value, utf8, "ISO-8859-1", "UTF-8"); out += utf8; value.clear(); } state = rfc2047charset; } break; default: state = rfc2047ready; out += '='; out += ch;break; } } break; case rfc2047charset: { DPRINT((stderr, "STATE: charset, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047encoding; break; default: charset += ch; break; } } break; case rfc2047encoding: { DPRINT((stderr, "STATE: encoding, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047value; break; default: encoding += ch; break; } } break; case rfc2047value: { DPRINT((stderr, "STATE: value, ch %c\n", ch)); switch (ch) { case '?': state = rfc2047close_q; break; default: value += ch;break; } } break; case rfc2047close_q: { DPRINT((stderr, "STATE: close_q, ch %c\n", ch)); switch (ch) { case '=': { DPRINT((stderr, "End of encoded area. Charset %s, Encoding %s\n", charset.c_str(), encoding.c_str())); string utf8; state = rfc2047ready; if (!rfc2047_decodeParsed(charset, encoding, value, utf8)) { return false; } out += utf8; charset.clear(); encoding.clear(); value.clear(); } break; default: state = rfc2047value; value += '?';value += ch;break; } } break; default: // ?? DPRINT((stderr, "STATE: default ?? ch %c\n", ch)); return false; } } if (value.length() > 0) { transcode(value, utf8, "ISO-8859-1", "UTF-8"); out += utf8; value.clear(); } if (state != rfc2047ready) return false; return true; } #define DEBUGDATE 0 #if DEBUGDATE #define DATEDEB(X) fprintf X #else #define DATEDEB(X) #endif // Convert rfc822 date to unix time. A date string normally looks like: // Mon, 3 Jul 2006 09:51:58 +0200 // But there are many close common variations // And also hopeless things like: Fri Nov 3 13:13:33 2006 time_t rfc2822DateToUxTime(const string& dt) { // Strip everything up to first comma if any, we don't need weekday, // then break into tokens vector toks; string::size_type idx; if ((idx = dt.find_first_of(",")) != string::npos) { if (idx == dt.length() - 1) { DATEDEB((stderr, "Bad rfc822 date format (short1): [%s]\n", dt.c_str())); return (time_t)-1; } string date = dt.substr(idx+1); stringToTokens(date, toks, " \t:"); } else { // No comma. Enter strangeland stringToTokens(dt, toks, " \t:"); // Test for date like: Sun Nov 19 06:18:41 2006 // 0 1 2 3 4 5 6 // and change to: 19 Nov 2006 06:18:41 if (toks.size() == 7) { if (toks[0].length() == 3 && toks[0].find_first_of("0123456789") == string::npos) { swap(toks[0], toks[2]); swap(toks[6], toks[2]); toks.pop_back(); } } } #if DEBUGDATE for (list::iterator it = toks.begin(); it != toks.end(); it++) { DATEDEB((stderr, "[%s] ", it->c_str())); } DATEDEB((stderr, "\n")); #endif if (toks.size() < 6) { DATEDEB((stderr, "Bad rfc822 date format (toks cnt): [%s]\n", dt.c_str())); return (time_t)-1; } if (toks.size() == 6) { // Probably no timezone, sometimes happens toks.push_back("+0000"); } struct tm tm; memset(&tm, 0, sizeof(tm)); // Load struct tm with appropriate tokens, possibly converting // when needed vector::iterator it = toks.begin(); // Day of month: no conversion needed tm.tm_mday = atoi(it->c_str()); it++; // Month. Only Jan-Dec are legal. January, February do happen // though. Convert to 0-11 if (*it == "Jan" || *it == "January") tm.tm_mon = 0; else if (*it == "Feb" || *it == "February") tm.tm_mon = 1; else if (*it == "Mar" || *it == "March") tm.tm_mon = 2; else if (*it == "Apr" || *it == "April") tm.tm_mon = 3; else if (*it == "May") tm.tm_mon = 4; else if (*it == "Jun" || *it == "June") tm.tm_mon = 5; else if (*it == "Jul" || *it == "July") tm.tm_mon = 6; else if (*it == "Aug" || *it == "August") tm.tm_mon = 7; else if (*it == "Sep" || *it == "September") tm.tm_mon = 8; else if (*it == "Oct" || *it == "October") tm.tm_mon = 9; else if (*it == "Nov" || *it == "November") tm.tm_mon = 10; else if (*it == "Dec" || *it == "December") tm.tm_mon = 11; else { DATEDEB((stderr, "Bad rfc822 date format (month): [%s]\n", dt.c_str())); return (time_t)-1; } it++; // Year. Struct tm counts from 1900. 2 char years are quite rare // but do happen. I've seen 00 happen so count small values from 2000 tm.tm_year = atoi(it->c_str()); if (it->length() == 2) { if (tm.tm_year < 10) tm.tm_year += 2000; else tm.tm_year += 1900; } if (tm.tm_year > 1900) tm.tm_year -= 1900; it++; // Hour minute second need no adjustments tm.tm_hour = atoi(it->c_str()); it++; tm.tm_min = atoi(it->c_str()); it++; tm.tm_sec = atoi(it->c_str()); it++; // Timezone is supposed to be either +-XYZT or a zone name int zonesecs = 0; if (it->length() < 1) { DATEDEB((stderr, "Bad rfc822 date format (zlen): [%s]\n", dt.c_str())); return (time_t)-1; } if (it->at(0) == '-' || it->at(0) == '+') { // Note that +xy:zt (instead of +xyzt) sometimes happen, we // may want to process it one day if (it->length() < 5) { DATEDEB((stderr, "Bad rfc822 date format (zlen1): [%s]\n", dt.c_str())); goto nozone; } zonesecs = 3600*((it->at(1)-'0') * 10 + it->at(2)-'0')+ (it->at(3)-'0')*10 + it->at(4)-'0'; zonesecs = it->at(0) == '+' ? -1 * zonesecs : zonesecs; } else { int hours; if (*it == "A") hours= 1; else if (*it == "B") hours= 2; else if (*it == "C") hours= 3; else if (*it == "D") hours= 4; else if (*it == "E") hours= 5; else if (*it == "F") hours= 6; else if (*it == "G") hours= 7; else if (*it == "H") hours= 8; else if (*it == "I") hours= 9; else if (*it == "K") hours= 10; else if (*it == "L") hours= 11; else if (*it == "M") hours= 12; else if (*it == "N") hours= -1; else if (*it == "O") hours= -2; else if (*it == "P") hours= -3; else if (*it == "Q") hours= -4; else if (*it == "R") hours= -5; else if (*it == "S") hours= -6; else if (*it == "T") hours= -7; else if (*it == "U") hours= -8; else if (*it == "V") hours= -9; else if (*it == "W") hours= -10; else if (*it == "X") hours= -11; else if (*it == "Y") hours= -12; else if (*it == "Z") hours= 0; else if (*it == "UT") hours= 0; else if (*it == "GMT") hours= 0; else if (*it == "EST") hours= 5; else if (*it == "EDT") hours= 4; else if (*it == "CST") hours= 6; else if (*it == "CDT") hours= 5; else if (*it == "MST") hours= 7; else if (*it == "MDT") hours= 6; else if (*it == "PST") hours= 8; else if (*it == "PDT") hours= 7; // Non standard names // Standard Time (or Irish Summer Time?) is actually +5.5 else if (*it == "CET") hours= -1; else if (*it == "JST") hours= -9; else if (*it == "IST") hours= -5; else if (*it == "WET") hours= 0; else if (*it == "MET") hours= -1; else { DATEDEB((stderr, "Bad rfc822 date format (zname): [%s]\n", dt.c_str())); // Forget tz goto nozone; } zonesecs = 3600 * hours; } DATEDEB((stderr, "Tz: [%s] -> %d\n", it->c_str(), zonesecs)); nozone: // Compute the UTC Unix time value #ifndef sun time_t tim = timegm(&tm); #else // No timegm on Sun. Use mktime, then correct for local timezone time_t tim = mktime(&tm); // altzone and timezone hold the difference in seconds between UTC // and local. They are negative for places east of greenwich // // mktime takes our buffer to be local time, so it adds timezone // to the conversion result (if timezone is < 0 it's currently // earlier in greenwhich). // // We have to substract it back (hey! hopefully! maybe we have to // add it). Who can really know? tim -= timezone; #endif // And add in the correction from the email's Tz tim += zonesecs; DATEDEB((stderr, "Date: %s uxtime %ld \n", ctime(&tim), tim)); return tim; } #else #include #include #include #include #include #include "mimeparse.h" #include "readfile.h" using namespace std; extern bool rfc2231_decode(const string& in, string& out, string& charset); extern time_t rfc2822DateToUxTime(const string& date); static const char *thisprog; static char usage [] = "-p: header value and parameter test\n" "-q: qp decoding\n" "-b: base64\n" "-7: rfc2047\n" "-1: rfc2331\n" "-t: date time\n" " \n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_p 0x2 #define OPT_q 0x4 #define OPT_b 0x8 #define OPT_7 0x10 #define OPT_1 0x20 #define OPT_t 0x40 int main(int argc, const char **argv) { int count = 10; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'p': op_flags |= OPT_p; break; case 'q': op_flags |= OPT_q; break; case 'b': op_flags |= OPT_b; break; case '1': op_flags |= OPT_1; break; case '7': op_flags |= OPT_7; break; case 't': op_flags |= OPT_t; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); if (op_flags & OPT_p) { // Mime header value and parameters extraction const char *tr[] = { "text/html;charset = UTF-8 ; otherparam=garb; \n" "QUOTEDPARAM=\"quoted value\"", "text/plain; charset=ASCII\r\n name=\"809D3016_5691DPS_5.2.LIC\"", "application/x-stuff;" "title*0*=us-ascii'en'This%20is%20even%20more%20;" "title*1*=%2A%2A%2Afun%2A%2A%2A%20;" "title*2=\"isn't it!\"" }; for (unsigned int i = 0; i < sizeof(tr) / sizeof(char *); i++) { MimeHeaderValue parsed; if (!parseMimeHeaderValue(tr[i], parsed)) { fprintf(stderr, "PARSE ERROR for [%s]\n", tr[i]); } printf("Field value: [%s]\n", parsed.value.c_str()); map::iterator it; for (it = parsed.params.begin();it != parsed.params.end();it++) { if (it == parsed.params.begin()) printf("Parameters:\n"); printf(" [%s] = [%s]\n", it->first.c_str(), it->second.c_str()); } } } else if (op_flags & OPT_q) { // Quoted printable stuff const char *qp = "=41=68 =e0 boire=\r\n continue 1ere\ndeuxieme\n\r3eme " "agrave is: '=E0' probable skipped decode error: =\n" "Actual decode error =xx this wont show"; string out; if (!qp_decode(string(qp), out)) { fprintf(stderr, "qp_decode returned error\n"); } printf("Decoded: '%s'\n", out.c_str()); } else if (op_flags & OPT_b) { // Base64 //'C'est à boire qu'il nous faut éviter l'excès.' //'Deuxième ligne' //'Troisième ligne' //'Et la fin (pas de nl). ' const char *b64 = "Qydlc3Qg4CBib2lyZSBxdSdpbCBub3VzIGZhdXQg6XZpdGVyIGwnZXhj6HMuCkRldXhp6G1l\r\n" "IGxpZ25lClRyb2lzaehtZSBsaWduZQpFdCBsYSBmaW4gKHBhcyBkZSBubCkuIA==\r\n"; string out; if (!base64_decode(string(b64), out)) { fprintf(stderr, "base64_decode returned error\n"); exit(1); } printf("Decoded: [%s]\n", out.c_str()); #if 0 string coded, decoded; const char *fname = "/tmp/recoll_decodefail"; if (!file_to_string(fname, coded)) { fprintf(stderr, "Cant read %s\n", fname); exit(1); } if (!base64_decode(coded, decoded)) { fprintf(stderr, "base64_decode returned error\n"); exit(1); } printf("Decoded: [%s]\n", decoded.c_str()); #endif } else if (op_flags & (OPT_7|OPT_1)) { // rfc2047 char line [1024]; string out; bool res; while (fgets(line, 1023, stdin)) { int l = strlen(line); if (l == 0) continue; line[l-1] = 0; fprintf(stderr, "Line: [%s]\n", line); string charset; if (op_flags & OPT_7) { res = rfc2047_decode(line, out); } else { res = rfc2231_decode(line, out, charset); } if (res) fprintf(stderr, "Out: [%s] cs %s\n", out.c_str(), charset.c_str()); else fprintf(stderr, "Decoding failed\n"); } } else if (op_flags & OPT_t) { time_t t; const char *dates[] = { " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)", " Mon, 3 Jul 2006 09:51:58 +0200", " Wed, 13 Sep 2006 08:19:48 GMT-07:00", " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)", " Sat, 23 Dec 89 19:27:12 EST", " 13 Jan 90 08:23:29 GMT"}; for (unsigned int i = 0; i [%s]\n", dates[i], datebuf); } printf("Enter date:\n"); char line [1024]; while (fgets(line, 1023, stdin)) { int l = strlen(line); if (l == 0) continue; line[l-1] = 0; t = rfc2822DateToUxTime(line); struct tm *tm = localtime(&t); char datebuf[100]; strftime(datebuf, 99, " %Y-%m-%d %H:%M:%S %z", tm); printf("[%s] -> [%s]\n", line, datebuf); } } exit(0); } #endif // TEST_MIMEPARSE recoll-1.23.7/utils/ecrontab.h0000644000175000017500000000550313125527323013121 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ECRONTAB_H_INCLUDED_ #define _ECRONTAB_H_INCLUDED_ /** Utility function to manage lines inside a user crontab * * Lines managed by this routine are marked with a hopefuly unique marker * and discriminated by a selector, both environment variable settings. * Example: * 30 8 * * * RCLCRONTAB_RCLINDEX= RECOLL_CONFDIR=/path/to/dir recollindex ... * RCLCRONTAB_RCLINDEX is the line marker, and the RECOLL_CONFDIR value * allows selecting the affected line. * * This approach allows leaving alone lines which do have a * RECOLL_CONFDIR value but not managed by us. The marker and selector * values are chosen by the caller, which should apply some thought to * chosing sane values. */ #include #include using std::string; using std::vector; /** Add, replace or delete a command inside a crontab file * * @param marker selects lines managed by this module and should take the form * of a (possibly empty) environment variable assignement. * @param id selects the appropriate line to affect and will usually be an * actual variable assignment (see above) * @param sched is a standard cron schedule spec (ie: 30 8 * * *) * @param cmd is the command to execute (the last part of the line). * Set it to an empty string to delete the line from the crontab * @param reason error message * * "marker" and "id" should look like reasonable env variable assignements. * Only ascii capital letters, numbers and _ before the '=' */ bool editCrontab(const string& marker, const string& id, const string& sched, const string& cmd, string& reason ); /** * check crontab for unmanaged lines * @param marker same as above, typically RCLCRONTAB_RCLINDEX= * @param data string to look for on lines NOT marked, typically "recollindex" * @return true if unmanaged lines exist, false else. */ bool checkCrontabUnmanaged(const string& marker, const string& data); /** Retrieve the scheduling for a crontab entry */ bool getCrontabSched(const string& marker, const string& id, vector& sched); #endif /* _ECRONTAB_H_INCLUDED_ */ recoll-1.23.7/utils/closefrom.cpp0000644000175000017500000001740513224431020013640 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * Close all file descriptors above a given value. * * A Unix execXX() call used to execute another program does not close open * file descriptors by default. * * The only descriptors closed are those on which the FD_CLOEXEC flag was * set. FD_CLOEXEC is not easily usable on files opened by external * libraries. * * There are many reasons for closing file descriptors before * an exec (security, pipe control, the possibility that a bug will * trigger an unwanted write, etc.) * * A process has currently no POSIX way to determine the set of open file * descriptors or at least the highest value. Closing all files (except a few), * thus implies performing a close() system call on each entry up to the * maximum, which can be both relatively difficult to determine, and quite * high (ie: several thousands), incurring a non-negligible cost. * * A number of systems have non-portable support for mitigating or solving * this problem. * * This module supplies a portable interface to this functionality. * * The initial data on system interfaces was obtained from: * http://stackoverflow.com/questions/899038/\ * getting-the-highest-allocated-file-descriptor * * System interfaces: * FreeBSD/DragonFly: * - Have a closefrom() system call as of release 7.x around Sep 2009 * - Have a /dev/fd, directory which shows the current process' open * descriptors. Only descriptors 0, 1, 2 are shown except if * fdescfs is mounted which it is not by default * * Solaris: * - Solaris 10+ has closefrom, and can specify closefrom to posix_spawn() * * Linux: * - Has nothing. The method we initially used (listing /dev/fd) could * deadlock in multithread fork/exec context. We now use a close() * loop but there is no completely reliable way to determine the high limit. * glibc maintainers think that closefrom() is a bad idea * *especially* because it is implemented on *BSD and Solaris. Go * figure...: https://sourceware.org/bugzilla/show_bug.cgi?id=10353 * * Interface: * * int libclf_closefrom(fd) * @param fd All open file descriptors with equal or higher numeric * values will be closed. fd needs not be a valid descriptor. * @return 0 for success, -1 for error. */ #ifndef TEST_CLOSEFROM #include "closefrom.h" #include #include #include #include #include #include #include /* #define DEBUG_CLOSEFROM */ #ifdef DEBUG_CLOSEFROM #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif /* Note: sudo has a closefrom implementation, needs a lot of autoconfig, but * we could use it instead. It's quite close to this though */ /*************************************************************************/ /* closefrom() exists on Solaris, netbsd and openbsd, but someone will * have to provide me the appropriate macro to test */ #if ((defined(__FreeBSD__) && __FreeBSD_version >= 702104)) || \ defined(__DragonFly__) /* Use closefrom() system call */ int libclf_closefrom(int fd0) { DPRINT((stderr, "libclf_closefrom: using closefrom(2)\n")); closefrom(fd0); return 0; } /*************************************************************************/ #elif defined(F_CLOSEM) /* Use fcntl(fd, F_CLOSEM) */ int libclf_closefrom(int fd0) { DPRINT((stderr, "libclf_closefrom: using fcntl(F_CLOSEM)\n")); // We need a valid descriptor for this to work. Try to dup stdin, else // go wild if (fcntl(0, F_GETFL) != -1) { if (fd0 != 0) dup2(0, fd0); } else { int fd = open("/etc/group", 0); // yes i am a unix man if (fd >= 0 && fd != fd0) { dup2(fd, fd0); close(fd); } } return fcntl(fd0, F_CLOSEM, 0); } /*************************************************************************/ #elif 0 && (defined(linux) || defined(__linux)) /* We don't do this on linux anymore because opendir() may call malloc which is unsafe in the [fork-exec] interval for a multithreaded program. Linux does not have a good solution for implementing closefrom as far as I know */ /* Use /proc/self/fd directory */ #include #include int libclf_closefrom(int fd0) { DIR *dirp; struct dirent *ent; DPRINT((stderr, "libclf_closefrom: using /proc\n")); dirp = opendir("/proc/self/fd"); if (dirp == 0) return -1; while ((ent = readdir(dirp)) != 0) { int fd; if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; if (sscanf(ent->d_name, "%d", &fd) == 1 && fd >= fd0 && fd != dirfd(dirp)) { close(fd); } } closedir(dirp); return 0; } /*************************************************************************/ #else /* System has no native support for this functionality. * * Close all descriptors up to compiled/configured maximum. * The caller will usually have an idea of a reasonable maximum, else * we retrieve a value from the system. * * Note that there is actually no real guarantee that no open * descriptor higher than the reported limit can exist, as noted by * the Solaris man page for closefrom() */ static int closefrom_maxfd = -1; void libclf_setmaxfd(int max) { closefrom_maxfd = max; } #include #ifndef OPEN_MAX #define OPEN_MAX 1024 #endif int libclf_closefrom(int fd0) { int i, maxfd = closefrom_maxfd; if (maxfd < 0) { maxfd = libclf_maxfd(); } if (maxfd < 0) maxfd = OPEN_MAX; DPRINT((stderr, "libclf_closefrom: using loop to %d\n", maxfd)); for (i = fd0; i < maxfd; i++) { (void)close(i); } return 0; } #endif // Note that this will not work if the limit was lowered after a // higher fd was opened. But we don't call setrlimit() inside recoll // code, so we should be ok. It seems that sysconf(_SC_OPEN_MAX) // usually reports the soft limit, so it's redundant, but it could be // useful in case getrlimit() is not implemented (unlikely as they're // both POSIX.1-2001? int libclf_maxfd(int) { struct rlimit lim; getrlimit(RLIMIT_NOFILE, &lim); return int(lim.rlim_cur); } #else /* TEST_CLOSEFROM */ #include #include #include #include #include "closefrom.h" int main(int argc, char **argv) { int i; int fd0 = open("/etc/group", 0); if (fd0 < 0) { perror("open /etc/group"); exit(1); } if (dup2(fd0, 11) < 0) { perror("dup2->11"); exit(1); } if (dup2(fd0, 19) < 0) { perror("dup2->19"); exit(1); } if (dup2(fd0, 99)< 0) { perror("dup2->99 (ok)"); } if (dup2(fd0, 999) < 0) { perror("dup3->999 (ok)"); } libclf_closefrom(11); for (i = 0; i < 10000; i++) { if (fcntl(i, F_GETFL) != -1) { fprintf(stderr, "Descriptor %d is still open", i); if (i < 11) fprintf(stderr, " (OK)\n"); else fprintf(stderr, " (BAD)\n"); } } exit(0); } #endif recoll-1.23.7/utils/listmem.h0000644000175000017500000000054213125637102012771 00000000000000#ifndef _LISTMEM_H_INCLUDED_ #define _LISTMEM_H_INCLUDED_ #include enum ListmemOpts {LISTMEM_SWAP16 = 1, LISTMEM_SWAP32 = 2}; /// @param startadr starting value for offset listings on the right extern void listmem(std::ostream&, const void *ptr, int sz, int startadr = 0, int opts = 0); #endif /* _LISTMEM_H_INCLUDED_ */ recoll-1.23.7/utils/md5ut.h0000644000175000017500000000236413125527323012364 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _MD5UT_H_ #define _MD5UT_H_ #include #include "md5.h" /** md5 utility wrappers */ #include using std::string; extern void MD5Final(string& digest, MD5_CTX *); extern bool MD5File(const string& filename, string& digest, string *reason); extern string& MD5String(const string& data, string& digest); extern string& MD5HexPrint(const string& digest, string& xdigest); extern string& MD5HexScan(const string& xdigest, string& digest); #endif /* _MD5UT_H_ */ recoll-1.23.7/utils/readfile.h0000644000175000017500000000360513125637102013075 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _READFILE_H_INCLUDED_ #define _READFILE_H_INCLUDED_ #include #include /** * Read file in chunks, calling an accumulator for each chunk. Can be used * for reading in a file, computing an md5... */ class FileScanDo { public: virtual ~FileScanDo() {} virtual bool init(size_t size, std::string *reason) = 0; virtual bool data(const char *buf, int cnt, std::string* reason) = 0; }; bool file_scan(const std::string& filename, FileScanDo* doer, std::string *reason = 0); /* Same but only process count cnt from offset offs. Set cnt to size_t(-1) * for no limit */ bool file_scan(const std::string& fn, FileScanDo* doer, int64_t offs, size_t cnt, std::string *reason = 0); /** * Read file into string. * @return true for ok, false else */ bool file_to_string(const std::string& filename, std::string& data, std::string *reason = 0); /** Read file chunk into string. Set cnt to size_t(-1) for whole file */ bool file_to_string(const std::string& filename, std::string& data, int64_t offs, size_t cnt, std::string *reason = 0); #endif /* _READFILE_H_INCLUDED_ */ recoll-1.23.7/utils/md5ut.cpp0000644000175000017500000000714313125527323012717 00000000000000/* Copyright (C) 2015 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_MD5 #include "autoconfig.h" #include #include #include "md5ut.h" /* Convenience utilities */ void MD5Final(string &digest, MD5_CTX *context) { unsigned char d[16]; MD5Final (d, context); digest.assign((const char *)d, 16); } string& MD5String(const string& data, string& digest) { MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const unsigned char*)data.c_str(), data.length()); MD5Final(digest, &ctx); return digest; } string& MD5HexPrint(const string& digest, string &out) { out.erase(); out.reserve(33); static const char hex[]="0123456789abcdef"; const unsigned char *hash = (const unsigned char *)digest.c_str(); for (int i = 0; i < 16; i++) { out.append(1, hex[hash[i] >> 4]); out.append(1, hex[hash[i] & 0x0f]); } return out; } string& MD5HexScan(const string& xdigest, string& digest) { digest.erase(); if (xdigest.length() != 32) { return digest; } for (unsigned int i = 0; i < 16; i++) { unsigned int val; if (sscanf(xdigest.c_str() + 2*i, "%2x", &val) != 1) { digest.erase(); return digest; } digest.append(1, (unsigned char)val); } return digest; } #include "readfile.h" class FileScanMd5 : public FileScanDo { public: FileScanMd5(string& d) : digest(d) {} virtual bool init(size_t size, string *) { MD5Init(&ctx); return true; } virtual bool data(const char *buf, int cnt, string*) { MD5Update(&ctx, (const unsigned char*)buf, cnt); return true; } string &digest; MD5_CTX ctx; }; bool MD5File(const string& filename, string &digest, string *reason) { FileScanMd5 md5er(digest); if (!file_scan(filename, &md5er, reason)) return false; // We happen to know that digest and md5er.digest are the same object MD5Final(md5er.digest, &md5er.ctx); return true; } #else // TEST_MD5 // Test driver #include #include #include #include #include "md5ut.h" using namespace std; static const char *thisprog; static char usage [] = "trmd5 filename\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 1) Usage(); string filename = *argv++;argc--; string reason, digest; if (!MD5File(filename, digest, &reason)) { cerr << reason << endl; exit(1); } else { string hex; cout << "MD5 (" << filename << ") = " << MD5HexPrint(digest, hex) << endl; string digest1; MD5HexScan(hex, digest1); if (digest1.compare(digest)) { cout << "MD5HexScan Failure" << endl; cout << MD5HexPrint(digest, hex) << " " << digest.length() << " -> " << MD5HexPrint(digest1, hex) << " " << digest1.length() << endl; exit(1); } } exit(0); } #endif recoll-1.23.7/utils/refcntr.h0000644000175000017500000000367013125527323012772 00000000000000#ifndef _REFCNTR_H_ #define _REFCNTR_H_ /* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // See Stroustrup C++ 3rd ed, p. 783 // This is only used if std::shared_ptr is not available template class RefCntr { X *rep; int *pcount; public: RefCntr() : rep(0), pcount(0) {} explicit RefCntr(X *pp) : rep(pp), pcount(new int(1)) {} RefCntr(const RefCntr &r) : rep(r.rep), pcount(r.pcount) { if (pcount) (*pcount)++; } RefCntr& operator=(const RefCntr& r) { if (rep == r.rep) return *this; if (pcount && --(*pcount) == 0) { delete rep; delete pcount; } rep = r.rep; pcount = r.pcount; if (pcount) (*pcount)++; return *this; } void reset() { if (pcount && --(*pcount) == 0) { delete rep; delete pcount; } rep = 0; pcount = 0; } ~RefCntr() { reset(); } X *operator->() {return rep;} X *get() const {return rep;} int use_count() const {return pcount ? *pcount : 0;} operator bool() const {return rep != 0;} }; #endif /*_REFCNTR_H_ */ recoll-1.23.7/utils/x11mon.h0000644000175000017500000000165713125527323012455 00000000000000#ifndef _X11MON_H_INCLUDED_ #define _X11MON_H_INCLUDED_ /* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /** Poll X11 server status and connectivity */ extern bool x11IsAlive(); #endif /* _X11MON_H_INCLUDED_ */ recoll-1.23.7/utils/fileudi.cpp0000644000175000017500000000766713125527323013315 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_FILEUDI #include "autoconfig.h" #include #include #include "fileudi.h" #include "md5.h" #include "base64.h" using std::string; // Debug only #ifdef PATHHASH_HEX static void md5hexprint(const unsigned char hash[16], string &out) { out.erase(); out.reserve(33); static const char hex[]="0123456789abcdef"; for (int i = 0; i < 16; i++) { out.append(1, hex[hash[i] >> 4]); out.append(1, hex[hash[i] & 0x0f]); } } #endif // Size of the hashed result (base64 of 16 bytes of md5, minus 2 pad chars) #define HASHLEN 22 // Convert longish paths by truncating and appending hash of path // The full length of the base64-encoded (minus pad) of the md5 is 22 chars // We append this to the truncated path void pathHash(const std::string &path, std::string &phash, unsigned int maxlen) { if (maxlen < HASHLEN) { fprintf(stderr, "pathHash: internal error: requested len too small\n"); abort(); } if (path.length() <= maxlen) { phash = path; return; } // Compute the md5 unsigned char chash[16]; MD5_CTX ctx; MD5Init(&ctx); MD5Update(&ctx, (const unsigned char *)(path.c_str()+maxlen-HASHLEN), path.length() - (maxlen - HASHLEN)); MD5Final(chash, &ctx); #ifdef PATHHASH_HEX string hex; md5hexprint(chash, hex); printf("hex [%s]\n", hex.c_str()); #endif // Encode it to ascii. This shouldn't be strictly necessary as // xapian terms can be binary string hash; base64_encode(string((char *)chash, 16), hash); // We happen to know there will be 2 pad chars in there, that we // don't need as this won't ever be decoded. Resulting length is 22 hash.resize(hash.length() - 2); // Truncate path and append hash phash = path.substr(0, maxlen - HASHLEN) + hash; } // Maximum length for path/unique terms stored for each document. We truncate // longer paths and uniquize them by appending a hashed value. This // is done to avoid xapian max term length limitations, not // to gain space (we gain very little even with very short maxlens // like 30). The xapian max key length seems to be around 250. // The value for PATHHASHLEN includes the length of the hash part. #define PATHHASHLEN 150 // Compute the unique term used to link documents to their file-system source: // Hashed path + possible internal path void make_udi(const string& fn, const string& ipath, string &udi) { string s(fn); // Note that we append a "|" in all cases. Historical, could be removed s.append("|"); s.append(ipath); pathHash(s, udi, PATHHASHLEN); return; } #else // TEST_FILEUDI #include #include #include "fileudi.h" using namespace std; int main(int argc, char **argv) { string path="/usr/lib/toto.cpp"; string ipath = "1:2:3:4:5:10"; string udi; make_udi(path, ipath, udi); printf("udi [%s]\n", udi.c_str()); path = "/some/much/too/looooooooooooooong/path/bla/bla/bla" "/looooooooooooooong/path/bla/bla/bla/llllllllllllllllll" "/looooooooooooooong/path/bla/bla/bla/llllllllllllllllll"; ipath = "1:2:3:4:5:10" "1:2:3:4:5:10" "1:2:3:4:5:10"; make_udi(path, ipath, udi); printf("udi [%s]\n", udi.c_str()); } #endif // TEST_FILEUDI recoll-1.23.7/utils/execmd.h0000644000175000017500000002464013224431020012560 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _EXECMD_H_INCLUDED_ #define _EXECMD_H_INCLUDED_ #include #include #include #include /** * Callback function object to advise of new data arrival, or just periodic * heartbeat if cnt is 0. * * To interrupt the command, the code using ExecCmd should either * raise an exception inside newData() (and catch it in doexec's caller), or * call ExecCmd::setKill() * */ class ExecCmdAdvise { public: virtual ~ExecCmdAdvise() {} virtual void newData(int cnt) = 0; }; /** * Callback function object to get more input data. Data has to be provided * into the initial input string, set it to empty to signify eof. */ class ExecCmdProvide { public: virtual ~ExecCmdProvide() {} virtual void newData() = 0; }; /** * Execute command possibly taking both input and output (will do * asynchronous io as appropriate for things to work). * * Input to the command can be provided either once in a parameter to doexec * or provided in chunks by setting a callback which will be called to * request new data. In this case, the 'input' parameter to doexec may be * empty (but not null) * * Output from the command is normally returned in a single string, but a * callback can be set to be called whenever new data arrives, in which case * it is permissible to consume the data and erase the string. * * Note that SIGPIPE should be ignored and SIGCLD blocked when calling doexec, * else things might fail randomly. (This is not done inside the class because * of concerns with multithreaded programs). * */ class ExecCmd { public: // Use vfork instead of fork. Our vfork usage is multithread-compatible as // far as I can see, but just in case... static void useVfork(bool on); /** * Add/replace environment variable before executing command. This must * be called before doexec() to have an effect (possibly multiple * times for several variables). * @param envassign an environment assignment string ("name=value") */ void putenv(const std::string& envassign); void putenv(const std::string& name, const std::string& value); /** * Try to set a limit on child process vm size. This will use * setrlimit() and RLIMIT_AS/VMEM if available. Parameter is in * units of 2**10. Must be called before starting the command, default * is inherit from parent. */ void setrlimit_as(int mbytes); /** * Set function objects to call whenever new data is available or on * select timeout. The data itself is stored in the output string. * Must be set before calling doexec. */ void setAdvise(ExecCmdAdvise *adv); /* * Set function object to call whenever new data is needed. The * data should be stored in the input string. Must be set before * calling doexec() */ void setProvide(ExecCmdProvide *p); /** * Set select timeout in milliseconds. The default is 1 S. * This is NOT a time after which an error will occur, but the period of * the calls to the advise routine (which normally checks for cancellation). */ void setTimeout(int mS); /** * Set destination for stderr data. The default is to let it alone (will * usually go to the terminal or to wherever the desktop messages go). * There is currently no option to put stderr data into a program variable * If the parameter can't be opened for writing, the command's * stderr will be closed. */ void setStderr(const std::string& stderrFile); /** * Execute command. * * Both input and output can be specified, and asynchronous * io (select-based) is used to prevent blocking. This will not * work if input and output need to be synchronized (ie: Q/A), but * works ok for filtering. * The function is exception-safe. In case an exception occurs in the * advise callback, fds and pids will be cleaned-up properly. * * @param cmd the program to execute. This must be an absolute file name * or exist in the PATH. * @param args the argument vector (NOT including argv[0]). * @param input Input to send TO the command. * @param output Output FROM the command. * @return the exec output status (0 if ok), or -1 */ int doexec(const std::string& cmd, const std::vector& args, const std::string *input = 0, std::string *output = 0); /** Same as doexec but cmd and args in one vector */ int doexec1(const std::vector& args, const std::string *input = 0, std::string *output = 0) { if (args.empty()) { return -1; } return doexec(args[0], std::vector(args.begin() + 1, args.end()), input, output); } /* * The next four methods can be used when a Q/A dialog needs to be * performed with the command */ int startExec(const std::string& cmd, const std::vector& args, bool has_input, bool has_output); int send(const std::string& data); int receive(std::string& data, int cnt = -1); /** Read line. Will call back periodically to check for cancellation */ int getline(std::string& data); /** Read line. Timeout after timeosecs seconds */ int getline(std::string& data, int timeosecs); int wait(); /** Wait with WNOHANG set. @return true if process exited, false else. @param O: status, the wait(2) call's status value */ bool maybereap(int *status); pid_t getChildPid(); /** * Cancel/kill command. This can be called from another thread or * from the advise callback, which could also raise an exception * to accomplish the same thing. In the owner thread, any I/O loop * will exit at the next iteration, and the process will be waited for. */ void setKill(); /** * Get rid of current process (become ready for start). This will signal * politely the process to stop, wait a moment, then terminate it. This * is a blocking call. */ void zapChild(); /** * Request process termination (SIGTERM or equivalent). This returns * immediately */ bool requestChildExit(); enum ExFlags {EXF_NONE, // Only does anything on windows. Used when starting // a viewer. The default is to hide the window, // because it avoids windows appearing and // disappearing when executing stuff for previewing EXF_SHOWWINDOW = 1, // Windows only: show maximized EXF_MAXIMIZED = 2, }; ExecCmd(int flags = 0); ~ExecCmd(); /** * Utility routine: check if/where a command is found according to the * current PATH (or the specified one * @param cmd command name * @param exe on return, executable path name if found * @param path exec seach path to use instead of getenv(PATH) * @return true if found */ static bool which(const std::string& cmd, std::string& exe, const char* path = 0); /** * Execute command and return stdout output in a string * @param cmd input: command and args * @param out output: what the command printed * @return true if exec status was 0 */ static bool backtick(const std::vector cmd, std::string& out); class Internal; private: Internal *m; /* Copyconst and assignment are private and forbidden */ ExecCmd(const ExecCmd&) {} ExecCmd& operator=(const ExecCmd&) { return *this; }; }; /** * Rexecute self process with the same arguments. * * Note that there are some limitations: * - argv[0] has to be valid: an executable name which will be found in * the path when exec is called in the initial working directory. This is * by no means guaranteed. The shells do this, but argv[0] could be an * arbitrary string. * - The initial working directory must be found and remain valid. * - We don't try to do anything with fd 0,1,2. If they were changed by the * program, their initial meaning won't be the same as at the moment of the * initial invocation. * - We don't restore the signals. Signals set to be blocked * or ignored by the program will remain ignored even if this was not their * initial state. * - The environment is also not restored. * - Others system aspects ? * - Other program state: application-dependant. Any external cleanup * (temp files etc.) must be performed by the application. ReExec() * duplicates the atexit() function to make this easier, but the * ReExec().atexit() calls must be done explicitely, this is not automatic * * In short, this is usable in reasonably controlled situations and if there * are no security issues involved, but this does not perform miracles. */ class ReExec { public: ReExec() {} ReExec(int argc, char *argv[]); void init(int argc, char *argv[]); int atexit(void (*function)(void)) { m_atexitfuncs.push(function); return 0; } void reexec(); const std::string& getreason() { return m_reason; } // Insert new args into the initial argv. idx designates the place // before which the new args are inserted (the default of 1 // inserts after argv[0] which would probably be an appropriate // place for additional options) void insertArgs(const std::vector& args, int idx = 1); void removeArg(const std::string& arg); private: std::vector m_argv; std::string m_curdir; int m_cfd; std::string m_reason; std::stack m_atexitfuncs; }; #endif /* _EXECMD_H_INCLUDED_ */ recoll-1.23.7/utils/transcode.cpp0000644000175000017500000001256313224431020013631 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_TRANSCODE #include "autoconfig.h" #include #include #include using std::string; #include #include #include "transcode.h" #include "log.h" // We gain approximately 25% exec time for word at a time conversions by // caching the iconv_open thing. // // We may also lose some concurrency on multiproc because of the // necessary locking, but we only have one processing-intensive // possible thread for now (the indexing one), so this is probably not // an issue (and could be worked around with a slightly more // sohisticated approach). #define ICONV_CACHE_OPEN bool transcode(const string &in, string &out, const string &icode, const string &ocode, int *ecnt) { LOGDEB2("Transcode: " << (icode) << " -> " << (ocode) << "\n" ); #ifdef ICONV_CACHE_OPEN static iconv_t ic = (iconv_t)-1; static string cachedicode; static string cachedocode; static std::mutex o_cachediconv_mutex; std::unique_lock lock(o_cachediconv_mutex); #else iconv_t ic; #endif bool ret = false; const int OBSIZ = 8192; char obuf[OBSIZ], *op; bool icopen = false; int mecnt = 0; out.erase(); size_t isiz = in.length(); out.reserve(isiz); const char *ip = in.c_str(); #ifdef ICONV_CACHE_OPEN if (cachedicode.compare(icode) || cachedocode.compare(ocode)) { if (ic != (iconv_t)-1) { iconv_close(ic); ic = (iconv_t)-1; } #endif if((ic = iconv_open(ocode.c_str(), icode.c_str())) == (iconv_t)-1) { out = string("iconv_open failed for ") + icode + " -> " + ocode; #ifdef ICONV_CACHE_OPEN cachedicode.erase(); cachedocode.erase(); #endif goto error; } #ifdef ICONV_CACHE_OPEN cachedicode.assign(icode); cachedocode.assign(ocode); } #endif icopen = true; while (isiz > 0) { size_t osiz; op = obuf; osiz = OBSIZ; if(iconv(ic, (ICONV_CONST char **)&ip, &isiz, &op, &osiz) == (size_t)-1 && errno != E2BIG) { #if 0 out.erase(); out = string("iconv failed for ") + icode + " -> " + ocode + " : " + strerror(errno); #endif if (errno == EILSEQ) { LOGDEB1("transcode:iconv: bad input seq.: shift, retry\n" ); LOGDEB1(" Input consumed " << (ip - in) << " output produced " << (out.length() + OBSIZ - osiz) << "\n" ); out.append(obuf, OBSIZ - osiz); out += "?"; mecnt++; ip++;isiz--; continue; } // Normally only EINVAL is possible here: incomplete // multibyte sequence at the end. This is not fatal. Any // other is supposedly impossible, we return an error if (errno == EINVAL) goto out; else goto error; } out.append(obuf, OBSIZ - osiz); } #ifndef ICONV_CACHE_OPEN icopen = false; if(iconv_close(ic) == -1) { out.erase(); out = string("iconv_close failed for ") + icode + " -> " + ocode; goto error; } #endif out: ret = true; error: if (icopen) { #ifndef ICONV_CACHE_OPEN iconv_close(ic); #else // Just reset conversion iconv(ic, 0, 0, 0, 0); #endif } if (mecnt) LOGDEB("transcode: [" << (icode) << "]->[" << (ocode) << "] " << (mecnt) << " errors\n" ); if (ecnt) *ecnt = mecnt; return ret; } #else #include #include #include #include #include #include using namespace std; #include "readfile.h" #include "transcode.h" // Repeatedly transcode a small string for timing measurements static const string testword("\xc3\xa9\x6c\x69\x6d\x69\x6e\xc3\xa9\xc3\xa0"); // Without cache 10e6 reps on y -> 6.68 // With cache -> 4.73 // With cache and lock -> 4.9 void looptest() { cout << testword << endl; string out; for (int i = 0; i < 10*1000*1000; i++) { if (!transcode(testword, out, "UTF-8", "UTF-16BE")) { cerr << "Transcode failed" << endl; break; } } } int main(int argc, char **argv) { #if 0 looptest(); exit(0); #endif if (argc != 5) { cerr << "Usage: transcode ifilename icode ofilename ocode" << endl; exit(1); } const string ifilename = argv[1]; const string icode = argv[2]; const string ofilename = argv[3]; const string ocode = argv[4]; string text; if (!file_to_string(ifilename, text)) { cerr << "Couldnt read file, errno " << errno << endl; exit(1); } string out; if (!transcode(text, out, icode, ocode)) { cerr << out << endl; exit(1); } FILE *fp = fopen(ofilename.c_str(), "wb"); if (fp == 0) { perror("Open/create output"); exit(1); } if (fwrite(out.c_str(), 1, out.length(), fp) != (int)out.length()) { perror("fwrite"); exit(1); } fclose(fp); exit(0); } #endif recoll-1.23.7/utils/pathut.h0000644000175000017500000001343313224431020012616 00000000000000/* 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 _PATHUT_H_INCLUDED_ #define _PATHUT_H_INCLUDED_ #include #include #include // Must be called in main thread before starting other threads extern void pathut_init_mt(); /// Add a / at the end if none there yet. extern void path_catslash(std::string& s); /// Concatenate 2 paths extern std::string path_cat(const std::string& s1, const std::string& s2); /// Get the simple file name (get rid of any directory path prefix extern std::string path_getsimple(const std::string& s); /// Simple file name + optional suffix stripping extern std::string path_basename(const std::string& s, const std::string& suff = std::string()); /// Component after last '.' extern std::string path_suffix(const std::string& s); /// Get the father directory extern std::string path_getfather(const std::string& s); /// Get the current user's home directory extern std::string path_home(); /// Expand ~ at the beginning of std::string extern std::string path_tildexpand(const std::string& s); /// Use getcwd() to make absolute path if needed. Beware: ***this can fail*** /// we return an empty path in this case. extern std::string path_absolute(const std::string& s); /// Clean up path by removing duplicated / and resolving ../ + make it absolute extern std::string path_canon(const std::string& s, const std::string *cwd = 0); /// Use glob(3) to return the file names matching pattern inside dir extern std::vector path_dirglob(const std::string& dir, const std::string pattern); /// Encode according to rfc 1738 extern std::string url_encode(const std::string& url, std::string::size_type offs = 0); extern std::string url_decode(const std::string& encoded); //// Convert to file path if url is like file://. This modifies the //// input (and returns a copy for convenience) extern std::string fileurltolocalpath(std::string url); /// Test for file:/// url extern bool urlisfileurl(const std::string& url); /// extern std::string url_parentfolder(const std::string& url); /// Return the host+path part of an url. This is not a general /// routine, it does the right thing only in the recoll context extern std::string url_gpath(const std::string& url); /// Stat parameter and check if it's a directory extern bool path_isdir(const std::string& path); /// Retrieve file size extern long long path_filesize(const std::string& path); /// Retrieve essential file attributes. This is used rather than a /// bare stat() to ensure consistent use of the time fields (on /// windows, we set ctime=mtime as ctime is actually the creation /// time, for which we have no use). /// Only st_mtime, st_ctime, st_size, st_mode (file type bits) are set on /// all systems. st_dev and st_ino are set for special posix usage. /// The rest is zeroed. /// @ret 0 for success struct stat; extern int path_fileprops(const std::string path, struct stat *stp, bool follow = true); /// Check that path is traversable and last element exists /// Returns true if last elt could be checked to exist. False may mean that /// the file/dir does not exist or that an error occurred. extern bool path_exists(const std::string& path); /// Return separator for PATH environment variable extern std::string path_PATHsep(); /// Dump directory extern bool readdir(const std::string& dir, std::string& reason, std::set& entries); /** A small wrapper around statfs et al, to return percentage of disk occupation @param[output] pc percent occupied @param[output] avmbs Mbs available to non-superuser. Mb=1024*1024 */ bool fsocc(const std::string& path, int *pc, long long *avmbs = 0); /// mkdir -p extern bool path_makepath(const std::string& path, int mode); /// Where we create the user data subdirs extern std::string path_homedata(); /// Test if path is absolute extern bool path_isabsolute(const std::string& s); /// Test if path is root (x:/). root is defined by root/.. == root extern bool path_isroot(const std::string& p); /// Turn absolute path into file:// url extern std::string path_pathtofileurl(const std::string& path); #ifdef _WIN32 /// Convert \ separators to / void path_slashize(std::string& s); void path_backslashize(std::string& s); #endif /// Lock/pid file class. This is quite close to the pidfile_xxx /// utilities in FreeBSD with a bit more encapsulation. I'd have used /// the freebsd code if it was available elsewhere class Pidfile { public: Pidfile(const std::string& path) : m_path(path), m_fd(-1) {} ~Pidfile(); /// Open/create the pid file. /// @return 0 if ok, > 0 for pid of existing process, -1 for other error. pid_t open(); /// Write pid into the pid file /// @return 0 ok, -1 error int write_pid(); /// Close the pid file (unlocks) int close(); /// Delete the pid file int remove(); const std::string& getreason() { return m_reason; } private: std::string m_path; int m_fd; std::string m_reason; pid_t read_pid(); int flopen(); }; #endif /* _PATHUT_H_INCLUDED_ */ recoll-1.23.7/utils/smallut.cpp0000644000175000017500000010671013224431020013326 00000000000000/* Copyright (C) 2006-2016 J.F.Dockes * * This library 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 (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include #include #include #include #include #include #include #include // Older compilers don't support stdc++ regex, but Windows does not // have the Linux one. Have a simple class to solve the simple cases. #if defined(_WIN32) #define USE_STD_REGEX #include #else #define USE_LINUX_REGEX #include #endif #include #include #include #include #include #include "smallut.h" using namespace std; int stringicmp(const string& s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); string::size_type size1 = s1.length(), size2 = s2.length(); char c1, c2; if (size1 < size2) { while (it1 != s1.end()) { c1 = ::toupper(*it1); c2 = ::toupper(*it2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } else { while (it2 != s2.end()) { c1 = ::toupper(*it1); c2 = ::toupper(*it2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } } void stringtolower(string& io) { string::iterator it = io.begin(); string::iterator ite = io.end(); while (it != ite) { *it = ::tolower(*it); it++; } } string stringtolower(const string& i) { string o = i; stringtolower(o); return o; } void stringtoupper(string& io) { string::iterator it = io.begin(); string::iterator ite = io.end(); while (it != ite) { *it = ::toupper(*it); it++; } } string stringtoupper(const string& i) { string o = i; stringtoupper(o); return o; } extern int stringisuffcmp(const string& s1, const string& s2) { string::const_reverse_iterator r1 = s1.rbegin(), re1 = s1.rend(), r2 = s2.rbegin(), re2 = s2.rend(); while (r1 != re1 && r2 != re2) { char c1 = ::toupper(*r1); char c2 = ::toupper(*r2); if (c1 != c2) { return c1 > c2 ? 1 : -1; } ++r1; ++r2; } return 0; } // s1 is already lowercase int stringlowercmp(const string& s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); string::size_type size1 = s1.length(), size2 = s2.length(); char c2; if (size1 < size2) { while (it1 != s1.end()) { c2 = ::tolower(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } else { while (it2 != s2.end()) { c2 = ::tolower(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } } // s1 is already uppercase int stringuppercmp(const string& s1, const string& s2) { string::const_iterator it1 = s1.begin(); string::const_iterator it2 = s2.begin(); string::size_type size1 = s1.length(), size2 = s2.length(); char c2; if (size1 < size2) { while (it1 != s1.end()) { c2 = ::toupper(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : -1; } else { while (it2 != s2.end()) { c2 = ::toupper(*it2); if (*it1 != c2) { return *it1 > c2 ? 1 : -1; } ++it1; ++it2; } return size1 == size2 ? 0 : 1; } } bool beginswith(const std::string& big, const std::string& small) { if (big.compare(0, small.size(), small)) { return false; } return true; } // Compare charset names, removing the more common spelling variations bool samecharset(const string& cs1, const string& cs2) { string mcs1, mcs2; // Remove all - and _, turn to lowecase for (unsigned int i = 0; i < cs1.length(); i++) { if (cs1[i] != '_' && cs1[i] != '-') { mcs1 += ::tolower(cs1[i]); } } for (unsigned int i = 0; i < cs2.length(); i++) { if (cs2[i] != '_' && cs2[i] != '-') { mcs2 += ::tolower(cs2[i]); } } return mcs1 == mcs2; } template bool stringToStrings(const string& s, T& tokens, const string& addseps) { string current; tokens.clear(); enum states {SPACE, TOKEN, INQUOTE, ESCAPE}; states state = SPACE; for (unsigned int i = 0; i < s.length(); i++) { switch (s[i]) { case '"': switch (state) { case SPACE: state = INQUOTE; continue; case TOKEN: current += '"'; continue; case INQUOTE: tokens.insert(tokens.end(), current); current.clear(); state = SPACE; continue; case ESCAPE: current += '"'; state = INQUOTE; continue; } break; case '\\': switch (state) { case SPACE: case TOKEN: current += '\\'; state = TOKEN; continue; case INQUOTE: state = ESCAPE; continue; case ESCAPE: current += '\\'; state = INQUOTE; continue; } break; case ' ': case '\t': case '\n': case '\r': switch (state) { case SPACE: continue; case TOKEN: tokens.insert(tokens.end(), current); current.clear(); state = SPACE; continue; case INQUOTE: case ESCAPE: current += s[i]; continue; } break; default: if (!addseps.empty() && addseps.find(s[i]) != string::npos) { switch (state) { case ESCAPE: state = INQUOTE; break; case INQUOTE: break; case SPACE: tokens.insert(tokens.end(), string(1, s[i])); continue; case TOKEN: tokens.insert(tokens.end(), current); current.erase(); tokens.insert(tokens.end(), string(1, s[i])); state = SPACE; continue; } } else switch (state) { case ESCAPE: state = INQUOTE; break; case SPACE: state = TOKEN; break; case TOKEN: case INQUOTE: break; } current += s[i]; } } switch (state) { case SPACE: break; case TOKEN: tokens.insert(tokens.end(), current); break; case INQUOTE: case ESCAPE: return false; } return true; } template bool stringToStrings >(const string&, list&, const string&); template bool stringToStrings >(const string&, vector&, const string&); template bool stringToStrings >(const string&, set&, const string&); template bool stringToStrings > (const string&, std::unordered_set&, const string&); template void stringsToString(const T& tokens, string& s) { for (typename T::const_iterator it = tokens.begin(); it != tokens.end(); it++) { bool hasblanks = false; if (it->find_first_of(" \t\n") != string::npos) { hasblanks = true; } if (it != tokens.begin()) { s.append(1, ' '); } if (hasblanks) { s.append(1, '"'); } for (unsigned int i = 0; i < it->length(); i++) { char car = it->at(i); if (car == '"') { s.append(1, '\\'); s.append(1, car); } else { s.append(1, car); } } if (hasblanks) { s.append(1, '"'); } } } template void stringsToString >(const list&, string&); template void stringsToString >(const vector&, string&); template void stringsToString >(const set&, string&); template void stringsToString >(const unordered_set&, string&); template string stringsToString(const T& tokens) { string out; stringsToString(tokens, out); return out; } template string stringsToString >(const list&); template string stringsToString >(const vector&); template string stringsToString >(const set&); template string stringsToString >(const unordered_set&); template void stringsToCSV(const T& tokens, string& s, char sep) { s.erase(); for (typename T::const_iterator it = tokens.begin(); it != tokens.end(); it++) { bool needquotes = false; if (it->empty() || it->find_first_of(string(1, sep) + "\"\n") != string::npos) { needquotes = true; } if (it != tokens.begin()) { s.append(1, sep); } if (needquotes) { s.append(1, '"'); } for (unsigned int i = 0; i < it->length(); i++) { char car = it->at(i); if (car == '"') { s.append(2, '"'); } else { s.append(1, car); } } if (needquotes) { s.append(1, '"'); } } } template void stringsToCSV >(const list&, string&, char); template void stringsToCSV >(const vector&, string&, char); void stringToTokens(const string& str, vector& tokens, const string& delims, bool skipinit) { string::size_type startPos = 0, pos; // Skip initial delims, return empty if this eats all. if (skipinit && (startPos = str.find_first_not_of(delims, 0)) == string::npos) { return; } while (startPos < str.size()) { // Find next delimiter or end of string (end of token) pos = str.find_first_of(delims, startPos); // Add token to the vector and adjust start if (pos == string::npos) { tokens.push_back(str.substr(startPos)); break; } else if (pos == startPos) { // Dont' push empty tokens after first if (tokens.empty()) { tokens.push_back(string()); } startPos = ++pos; } else { tokens.push_back(str.substr(startPos, pos - startPos)); startPos = ++pos; } } } bool stringToBool(const string& s) { if (s.empty()) { return false; } if (isdigit(s[0])) { int val = atoi(s.c_str()); return val ? true : false; } if (s.find_first_of("yYtT") == 0) { return true; } return false; } void trimstring(string& s, const char *ws) { rtrimstring(s, ws); ltrimstring(s, ws); } void rtrimstring(string& s, const char *ws) { string::size_type pos = s.find_last_not_of(ws); if (pos != string::npos && pos != s.length() - 1) { s.replace(pos + 1, string::npos, string()); } } void ltrimstring(string& s, const char *ws) { string::size_type pos = s.find_first_not_of(ws); if (pos == string::npos) { s.clear(); return; } s.replace(0, pos, string()); } // Remove some chars and replace them with spaces string neutchars(const string& str, const string& chars) { string out; neutchars(str, out, chars); return out; } void neutchars(const string& str, string& out, const string& chars) { string::size_type startPos, pos; for (pos = 0;;) { // Skip initial chars, break if this eats all. if ((startPos = str.find_first_not_of(chars, pos)) == string::npos) { break; } // Find next delimiter or end of string (end of token) pos = str.find_first_of(chars, startPos); // Add token to the output. Note: token cant be empty here if (pos == string::npos) { out += str.substr(startPos); } else { out += str.substr(startPos, pos - startPos) + " "; } } } /* Truncate a string to a given maxlength, avoiding cutting off midword * if reasonably possible. Note: we could also use textsplit, stopping when * we have enough, this would be cleanly utf8-aware but would remove * punctuation */ static const string cstr_SEPAR = " \t\n\r-:.;,/[]{}"; string truncate_to_word(const string& input, string::size_type maxlen) { string output; if (input.length() <= maxlen) { output = input; } else { output = input.substr(0, maxlen); string::size_type space = output.find_last_of(cstr_SEPAR); // Original version only truncated at space if space was found after // maxlen/2. But we HAVE to truncate at space, else we'd need to do // utf8 stuff to avoid truncating at multibyte char. In any case, // not finding space means that the text probably has no value. // Except probably for Asian languages, so we may want to fix this // one day if (space == string::npos) { output.erase(); } else { output.erase(space); } } return output; } // Escape things that would look like markup string escapeHtml(const string& in) { string out; for (string::size_type pos = 0; pos < in.length(); pos++) { switch(in.at(pos)) { case '<': out += "<"; break; case '>': out += ">"; break; case '&': out += "&"; break; case '"': out += """; break; default: out += in.at(pos); break; } } return out; } string escapeShell(const string& in) { string out; out += "\""; for (string::size_type pos = 0; pos < in.length(); pos++) { switch (in.at(pos)) { case '$': out += "\\$"; break; case '`': out += "\\`"; break; case '"': out += "\\\""; break; case '\n': out += "\\\n"; break; case '\\': out += "\\\\"; break; default: out += in.at(pos); } } out += "\""; return out; } // Escape value to be suitable as C++ source double-quoted string (for // generating a c++ program string makeCString(const string& in) { string out; out += "\""; for (string::size_type pos = 0; pos < in.length(); pos++) { switch (in.at(pos)) { case '"': out += "\\\""; break; case '\n': out += "\\n"; break; case '\r': out += "\\r"; break; case '\\': out += "\\\\"; break; default: out += in.at(pos); } } out += "\""; return out; } // Substitute printf-like percent cmds inside a string bool pcSubst(const string& in, string& out, const map& subs) { string::const_iterator it; for (it = in.begin(); it != in.end(); it++) { if (*it == '%') { if (++it == in.end()) { out += '%'; break; } if (*it == '%') { out += '%'; continue; } map::const_iterator tr; if ((tr = subs.find(*it)) != subs.end()) { out += tr->second; } else { // We used to do "out += *it;" here but this does not make // sense } } else { out += *it; } } return true; } bool pcSubst(const string& in, string& out, const map& subs) { out.erase(); string::size_type i; for (i = 0; i < in.size(); i++) { if (in[i] == '%') { if (++i == in.size()) { out += '%'; break; } if (in[i] == '%') { out += '%'; continue; } string key = ""; if (in[i] == '(') { if (++i == in.size()) { out += string("%("); break; } string::size_type j = in.find_first_of(")", i); if (j == string::npos) { // ??concatenate remaining part and stop out += in.substr(i - 2); break; } key = in.substr(i, j - i); i = j; } else { key = in[i]; } map::const_iterator tr; if ((tr = subs.find(key)) != subs.end()) { out += tr->second; } else { // Substitute to nothing, that's the reasonable thing to do // instead of keeping the %(key) // out += key.size()==1? key : string("(") + key + string(")"); } } else { out += in[i]; } } return true; } inline static int ulltorbuf(uint64_t val, char *rbuf) { int idx; for (idx = 0; val; idx++) { rbuf[idx] = '0' + val % 10; val /= 10; } while (val); rbuf[idx] = 0; return idx; } inline static void ullcopyreverse(const char *rbuf, string& buf, int idx) { buf.reserve(idx + 1); for (int i = idx - 1; i >= 0; i--) { buf.push_back(rbuf[i]); } } void ulltodecstr(uint64_t val, string& buf) { buf.clear(); if (val == 0) { buf = "0"; return; } char rbuf[30]; int idx = ulltorbuf(val, rbuf); ullcopyreverse(rbuf, buf, idx); return; } void lltodecstr(int64_t val, string& buf) { buf.clear(); if (val == 0) { buf = "0"; return; } bool neg = val < 0; if (neg) { val = -val; } char rbuf[30]; int idx = ulltorbuf(val, rbuf); if (neg) { rbuf[idx++] = '-'; } rbuf[idx] = 0; ullcopyreverse(rbuf, buf, idx); return; } string lltodecstr(int64_t val) { string buf; lltodecstr(val, buf); return buf; } string ulltodecstr(uint64_t val) { string buf; ulltodecstr(val, buf); return buf; } // Convert byte count into unit (KB/MB...) appropriate for display string displayableBytes(int64_t size) { const char *unit; double roundable = 0; if (size < 1000) { unit = " B "; roundable = double(size); } else if (size < 1E6) { unit = " KB "; roundable = double(size) / 1E3; } else if (size < 1E9) { unit = " MB "; roundable = double(size) / 1E6; } else { unit = " GB "; roundable = double(size) / 1E9; } size = int64_t(round(roundable)); return lltodecstr(size).append(unit); } string breakIntoLines(const string& in, unsigned int ll, unsigned int maxlines) { string query = in; string oq; unsigned int nlines = 0; while (query.length() > 0) { string ss = query.substr(0, ll); if (ss.length() == ll) { string::size_type pos = ss.find_last_of(" "); if (pos == string::npos) { pos = query.find_first_of(" "); if (pos != string::npos) { ss = query.substr(0, pos + 1); } else { ss = query; } } else { ss = ss.substr(0, pos + 1); } } // This cant happen, but anyway. Be very sure to avoid an infinite loop if (ss.length() == 0) { oq = query; break; } oq += ss + "\n"; if (nlines++ >= maxlines) { oq += " ... \n"; break; } query = query.substr(ss.length()); } return oq; } // Date is Y[-M[-D]] static bool parsedate(vector::const_iterator& it, vector::const_iterator end, DateInterval *dip) { dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; if (it->length() > 4 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->y1) != 1) { return false; } if (it == end || *it == "/") { return true; } if (*it++ != "-") { return false; } if (it->length() > 2 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->m1) != 1) { return false; } if (it == end || *it == "/") { return true; } if (*it++ != "-") { return false; } if (it->length() > 2 || !it->length() || it->find_first_not_of("0123456789") != string::npos) { return false; } if (it == end || sscanf(it++->c_str(), "%d", &dip->d1) != 1) { return false; } return true; } // Called with the 'P' already processed. Period ends at end of string // or at '/'. We dont' do a lot effort at validation and will happily // accept 10Y1Y4Y (the last wins) static bool parseperiod(vector::const_iterator& it, vector::const_iterator end, DateInterval *dip) { dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; while (it != end) { int value; if (it->find_first_not_of("0123456789") != string::npos) { return false; } if (sscanf(it++->c_str(), "%d", &value) != 1) { return false; } if (it == end || it->empty()) { return false; } switch (it->at(0)) { case 'Y': case 'y': dip->y1 = value; break; case 'M': case 'm': dip->m1 = value; break; case 'D': case 'd': dip->d1 = value; break; default: return false; } it++; if (it == end) { return true; } if (*it == "/") { return true; } } return true; } #ifdef _WIN32 int setenv(const char *name, const char *value, int overwrite) { if (!overwrite) { const char *cp = getenv(name); if (cp) { return -1; } } return _putenv_s(name, value); } void unsetenv(const char *name) { _putenv_s(name, ""); } #endif time_t portable_timegm(struct tm *tm) { time_t ret; char *tz; tz = getenv("TZ"); setenv("TZ", "", 1); tzset(); ret = mktime(tm); if (tz) { setenv("TZ", tz, 1); } else { unsetenv("TZ"); } tzset(); return ret; } #if 0 static void cerrdip(const string& s, DateInterval *dip) { cerr << s << dip->y1 << "-" << dip->m1 << "-" << dip->d1 << "/" << dip->y2 << "-" << dip->m2 << "-" << dip->d2 << endl; } #endif // Compute date + period. Won't work out of the unix era. // or pre-1970 dates. Just convert everything to unixtime and // seconds (with average durations for months/years), add and convert // back static bool addperiod(DateInterval *dp, DateInterval *pp) { struct tm tm; // Create a struct tm with possibly non normalized fields and let // timegm sort it out memset(&tm, 0, sizeof(tm)); tm.tm_year = dp->y1 - 1900 + pp->y1; tm.tm_mon = dp->m1 + pp->m1 - 1; tm.tm_mday = dp->d1 + pp->d1; time_t tres = mktime(&tm); localtime_r(&tres, &tm); dp->y1 = tm.tm_year + 1900; dp->m1 = tm.tm_mon + 1; dp->d1 = tm.tm_mday; //cerrdip("Addperiod return", dp); return true; } int monthdays(int mon, int year) { switch (mon) { // We are returning a few too many 29 days februaries, no problem case 2: return (year % 4) == 0 ? 29 : 28; case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; default: return 30; } } bool parsedateinterval(const string& s, DateInterval *dip) { vector vs; dip->y1 = dip->m1 = dip->d1 = dip->y2 = dip->m2 = dip->d2 = 0; DateInterval p1, p2, d1, d2; p1 = p2 = d1 = d2 = *dip; bool hasp1 = false, hasp2 = false, hasd1 = false, hasd2 = false, hasslash = false; if (!stringToStrings(s, vs, "PYMDpymd-/")) { return false; } if (vs.empty()) { return false; } vector::const_iterator it = vs.begin(); if (*it == "P" || *it == "p") { it++; if (!parseperiod(it, vs.end(), &p1)) { return false; } hasp1 = true; //cerrdip("p1", &p1); p1.y1 = -p1.y1; p1.m1 = -p1.m1; p1.d1 = -p1.d1; } else if (*it == "/") { hasslash = true; goto secondelt; } else { if (!parsedate(it, vs.end(), &d1)) { return false; } hasd1 = true; } // Got one element and/or / secondelt: if (it != vs.end()) { if (*it != "/") { return false; } hasslash = true; it++; if (it == vs.end()) { // ok } else if (*it == "P" || *it == "p") { it++; if (!parseperiod(it, vs.end(), &p2)) { return false; } hasp2 = true; } else { if (!parsedate(it, vs.end(), &d2)) { return false; } hasd2 = true; } } // 2 periods dont' make sense if (hasp1 && hasp2) { return false; } // Nothing at all doesn't either if (!hasp1 && !hasd1 && !hasp2 && !hasd2) { return false; } // Empty part means today IF other part is period, else means // forever (stays at 0) time_t now = time(0); struct tm *tmnow = gmtime(&now); if ((!hasp1 && !hasd1) && hasp2) { d1.y1 = 1900 + tmnow->tm_year; d1.m1 = tmnow->tm_mon + 1; d1.d1 = tmnow->tm_mday; hasd1 = true; } else if ((!hasp2 && !hasd2) && hasp1) { d2.y1 = 1900 + tmnow->tm_year; d2.m1 = tmnow->tm_mon + 1; d2.d1 = tmnow->tm_mday; hasd2 = true; } // Incomplete dates have different meanings depending if there is // a period or not (actual or infinite indicated by a / + empty) // // If there is no explicit period, an incomplete date indicates a // period of the size of the uncompleted elements. Ex: 1999 // actually means 1999/P12M // // If there is a period, the incomplete date should be extended // to the beginning or end of the unspecified portion. Ex: 1999/ // means 1999-01-01/ and /1999 means /1999-12-31 if (hasd1) { if (!(hasslash || hasp2)) { if (d1.m1 == 0) { p2.m1 = 12; d1.m1 = 1; d1.d1 = 1; } else if (d1.d1 == 0) { d1.d1 = 1; p2.d1 = monthdays(d1.m1, d1.y1); } hasp2 = true; } else { if (d1.m1 == 0) { d1.m1 = 1; d1.d1 = 1; } else if (d1.d1 == 0) { d1.d1 = 1; } } } // if hasd2 is true we had a / if (hasd2) { if (d2.m1 == 0) { d2.m1 = 12; d2.d1 = 31; } else if (d2.d1 == 0) { d2.d1 = monthdays(d2.m1, d2.y1); } } if (hasp1) { // Compute d1 d1 = d2; if (!addperiod(&d1, &p1)) { return false; } } else if (hasp2) { // Compute d2 d2 = d1; if (!addperiod(&d2, &p2)) { return false; } } dip->y1 = d1.y1; dip->m1 = d1.m1; dip->d1 = d1.d1; dip->y2 = d2.y1; dip->m2 = d2.m1; dip->d2 = d2.d1; return true; } void catstrerror(string *reason, const char *what, int _errno) { if (!reason) { return; } if (what) { reason->append(what); } reason->append(": errno: "); char nbuf[20]; sprintf(nbuf, "%d", _errno); reason->append(nbuf); reason->append(" : "); #if defined(sun) || defined(_WIN32) // Note: sun strerror is noted mt-safe ?? reason->append(strerror(_errno)); #else #define ERRBUFSZ 200 char errbuf[ERRBUFSZ]; // There are 2 versions of strerror_r. // - The GNU one returns a pointer to the message (maybe // static storage or supplied buffer). // - The POSIX one always stores in supplied buffer and // returns 0 on success. As the possibility of error and // error code are not specified, we're basically doomed // cause we can't use a test on the 0 value to know if we // were returned a pointer... // Also couldn't find an easy way to disable the gnu version without // changing the cxxflags globally, so forget it. Recent gnu lib versions // normally default to the posix version. // At worse we get no message at all here. errbuf[0] = 0; // We don't use ret, it's there to silence a cc warning auto ret = strerror_r(_errno, errbuf, ERRBUFSZ); (void)ret; reason->append(errbuf); #endif } static const char *vlang_to_code[] = { "be", "cp1251", "bg", "cp1251", "cs", "iso-8859-2", "el", "iso-8859-7", "he", "iso-8859-8", "hr", "iso-8859-2", "hu", "iso-8859-2", "ja", "eucjp", "kk", "pt154", "ko", "euckr", "lt", "iso-8859-13", "lv", "iso-8859-13", "pl", "iso-8859-2", "rs", "iso-8859-2", "ro", "iso-8859-2", "ru", "koi8-r", "sk", "iso-8859-2", "sl", "iso-8859-2", "sr", "iso-8859-2", "th", "iso-8859-11", "tr", "iso-8859-9", "uk", "koi8-u", }; static const string cstr_cp1252("CP1252"); string langtocode(const string& lang) { static std::unordered_map lang_to_code; if (lang_to_code.empty()) { for (unsigned int i = 0; i < sizeof(vlang_to_code) / sizeof(char *); i += 2) { lang_to_code[vlang_to_code[i]] = vlang_to_code[i + 1]; } } std::unordered_map::const_iterator it = lang_to_code.find(lang); // Use cp1252 by default... if (it == lang_to_code.end()) { return cstr_cp1252; } return it->second; } string localelang() { const char *lang = getenv("LANG"); if (lang == 0 || *lang == 0 || !strcmp(lang, "C") || !strcmp(lang, "POSIX")) { return "en"; } string locale(lang); string::size_type under = locale.find_first_of("_"); if (under == string::npos) { return locale; } return locale.substr(0, under); } #ifdef USE_STD_REGEX class SimpleRegexp::Internal { public: Internal(const string& exp, int flags, int nm) : expr(exp, basic_regex::flag_type(regex_constants::extended | ((flags&SRE_ICASE) ? regex_constants::icase : 0) | ((flags&SRE_NOSUB) ? regex_constants::nosubs : 0) )), ok(true), nmatch(nm) { } std::regex expr; std::smatch res; bool ok; int nmatch; }; bool SimpleRegexp::simpleMatch(const string& val) const { if (!ok()) return false; return regex_match(val, m->res, m->expr); } string SimpleRegexp::getMatch(const string& val, int i) const { return m->res.str(i); } #else // -> !WIN32 class SimpleRegexp::Internal { public: Internal(const string& exp, int flags, int nm) : nmatch(nm) { if (regcomp(&expr, exp.c_str(), REG_EXTENDED | ((flags&SRE_ICASE) ? REG_ICASE : 0) | ((flags&SRE_NOSUB) ? REG_NOSUB : 0)) == 0) { ok = true; } else { ok = false; } matches.reserve(nmatch+1); } ~Internal() { regfree(&expr); } bool ok; regex_t expr; int nmatch; vector matches; }; bool SimpleRegexp::simpleMatch(const string& val) const { if (!ok()) return false; if (regexec(&m->expr, val.c_str(), m->nmatch+1, &m->matches[0], 0) == 0) { return true; } else { return false; } } string SimpleRegexp::getMatch(const string& val, int i) const { if (i > m->nmatch) { return string(); } return val.substr(m->matches[i].rm_so, m->matches[i].rm_eo - m->matches[i].rm_so); } #endif // win/notwinf SimpleRegexp::SimpleRegexp(const string& exp, int flags, int nmatch) : m(new Internal(exp, flags, nmatch)) { } SimpleRegexp::~SimpleRegexp() { delete m; } bool SimpleRegexp::ok() const { return m->ok; } bool SimpleRegexp::operator() (const string& val) const { return simpleMatch(val); } string flagsToString(const vector& flags, unsigned int val) { const char *s; string out; for (auto& flag : flags) { if ((val & flag.value) == flag.value) { s = flag.yesname; } else { s = flag.noname; } if (s && *s) { /* We have something to write */ if (out.length()) { // If not first, add '|' separator out.append("|"); } out.append(s); } } return out; } string valToString(const vector& flags, unsigned int val) { string out; for (auto& flag : flags) { if (flag.value == val) { out = flag.yesname; return out; } } { char mybuf[100]; sprintf(mybuf, "Unknown Value 0x%x", val); out = mybuf; } return out; } unsigned int stringToFlags(const vector& flags, const string& input, const char *sep) { unsigned int out = 0; vector toks; stringToTokens(input, toks, sep); for (auto& tok: toks) { trimstring(tok); for (auto& flag : flags) { if (!tok.compare(flag.yesname)) { /* Note: we don't break: the same name could conceivably set several flags. */ out |= flag.value; } } } return out; } // Initialization for static stuff to be called from main thread before going // multiple void smallut_init_mt() { // Init langtocode() static table langtocode(""); } recoll-1.23.7/utils/rclionice.h0000644000175000017500000000173113125527323013272 00000000000000/* Copyright (C) 2011 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLIONICE_H_INCLUDED_ #define _RCLIONICE_H_INCLUDED_ #include using std::string; extern bool rclionice(const string& clss, const string& classdata); #endif /* _RCLIONICE_H_INCLUDED_ */ recoll-1.23.7/utils/hldata.cpp0000644000175000017500000000543613224431525013117 00000000000000/* Copyright (C) 2016 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "hldata.h" using std::string; using std::map; void HighlightData::toString(string& out) { out.append("\nUser terms (orthograph): "); for (std::set::const_iterator it = uterms.begin(); it != uterms.end(); it++) { out.append(" [").append(*it).append("]"); } out.append("\nUser terms to Query terms:"); for (map::const_iterator it = terms.begin(); it != terms.end(); it++) { out.append("[").append(it->first).append("]->["); out.append(it->second).append("] "); } out.append("\nGroups: "); char cbuf[200]; sprintf(cbuf, "Groups size %d grpsugidx size %d ugroups size %d", int(groups.size()), int(grpsugidx.size()), int(ugroups.size())); out.append(cbuf); size_t ugidx = (size_t) - 1; for (unsigned int i = 0; i < groups.size(); i++) { if (ugidx != grpsugidx[i]) { ugidx = grpsugidx[i]; out.append("\n("); for (unsigned int j = 0; j < ugroups[ugidx].size(); j++) { out.append("[").append(ugroups[ugidx][j]).append("] "); } out.append(") ->"); } out.append(" {"); for (unsigned int j = 0; j < groups[i].size(); j++) { out.append("[").append(groups[i][j]).append("]"); } sprintf(cbuf, "%d", slacks[i]); out.append("}").append(cbuf); } out.append("\n"); } void HighlightData::append(const HighlightData& hl) { uterms.insert(hl.uterms.begin(), hl.uterms.end()); terms.insert(hl.terms.begin(), hl.terms.end()); size_t ugsz0 = ugroups.size(); ugroups.insert(ugroups.end(), hl.ugroups.begin(), hl.ugroups.end()); groups.insert(groups.end(), hl.groups.begin(), hl.groups.end()); slacks.insert(slacks.end(), hl.slacks.begin(), hl.slacks.end()); for (std::vector::const_iterator it = hl.grpsugidx.begin(); it != hl.grpsugidx.end(); it++) { grpsugidx.push_back(*it + ugsz0); } } recoll-1.23.7/utils/copyfile.cpp0000644000175000017500000001532113125637102013465 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_COPYFILE #include "autoconfig.h" #include #include #include "safefcntl.h" #include #include "safesysstat.h" #include "safeunistd.h" #ifndef _WIN32 #include #include #define O_BINARY 0 #endif #include #include "copyfile.h" #include "log.h" using namespace std; #define CPBSIZ 8192 bool copyfile(const char *src, const char *dst, string &reason, int flags) { int sfd = -1; int dfd = -1; bool ret = false; char buf[CPBSIZ]; int oflags = O_WRONLY|O_CREAT|O_TRUNC|O_BINARY; LOGDEB("copyfile: " << (src) << " to " << (dst) << "\n" ); if ((sfd = ::open(src, O_RDONLY, 0)) < 0) { reason += string("open ") + src + ": " + strerror(errno); goto out; } if (flags & COPYFILE_EXCL) { oflags |= O_EXCL; } if ((dfd = ::open(dst, oflags, 0644)) < 0) { reason += string("open/creat ") + dst + ": " + strerror(errno); // If we fail because of an open/truncate error, we do not // want to unlink the file, we might succeed... flags |= COPYFILE_NOERRUNLINK; goto out; } for (;;) { int didread; didread = ::read(sfd, buf, CPBSIZ); if (didread < 0) { reason += string("read src ") + src + ": " + strerror(errno); goto out; } if (didread == 0) break; if (::write(dfd, buf, didread) != didread) { reason += string("write dst ") + src + ": " + strerror(errno); goto out; } } ret = true; out: if (ret == false && !(flags©FILE_NOERRUNLINK)) ::unlink(dst); if (sfd >= 0) ::close(sfd); if (dfd >= 0) ::close(dfd); return ret; } bool stringtofile(const string& dt, const char *dst, string& reason, int flags) { LOGDEB("stringtofile:\n" ); int dfd = -1; bool ret = false; int oflags = O_WRONLY|O_CREAT|O_TRUNC|O_BINARY; LOGDEB("stringtofile: " << ((unsigned int)dt.size()) << " bytes to " << (dst) << "\n" ); if (flags & COPYFILE_EXCL) { oflags |= O_EXCL; } if ((dfd = ::open(dst, oflags, 0644)) < 0) { reason += string("open/creat ") + dst + ": " + strerror(errno); // If we fail because of an open/truncate error, we do not // want to unlink the file, we might succeed... flags |= COPYFILE_NOERRUNLINK; goto out; } if (::write(dfd, dt.c_str(), size_t(dt.size())) != ssize_t(dt.size())) { reason += string("write dst ") + ": " + strerror(errno); goto out; } ret = true; out: if (ret == false && !(flags©FILE_NOERRUNLINK)) ::unlink(dst); if (dfd >= 0) ::close(dfd); return ret; } bool renameormove(const char *src, const char *dst, string &reason) { // First try rename(2). If this succeeds we're done. If this fails // with EXDEV, try to copy. Unix really should have a library function // for this. if (rename(src, dst) == 0) { return true; } if (errno != EXDEV) { reason += string("rename(2) failed: ") + strerror(errno); return false; } struct stat st; if (stat(src, &st) < 0) { reason += string("Can't stat ") + src + " : " + strerror(errno); return false; } if (!copyfile(src, dst, reason)) return false; struct stat st1; if (stat(dst, &st1) < 0) { reason += string("Can't stat ") + dst + " : " + strerror(errno); return false; } #ifndef _WIN32 // Try to preserve modes, owner, times. This may fail for a number // of reasons if ((st1.st_mode & 0777) != (st.st_mode & 0777)) { if (chmod(dst, st.st_mode&0777) != 0) { reason += string("Chmod ") + dst + "Error : " + strerror(errno); } } if (st.st_uid != st1.st_uid || st.st_gid != st1.st_gid) { if (chown(dst, st.st_uid, st.st_gid) != 0) { reason += string("Chown ") + dst + "Error : " + strerror(errno); } } struct timeval times[2]; times[0].tv_sec = st.st_atime; times[0].tv_usec = 0; times[1].tv_sec = st.st_mtime; times[1].tv_usec = 0; utimes(dst, times); #endif // All ok, get rid of origin if (unlink(src) < 0) { reason += string("Can't unlink ") + src + "Error : " + strerror(errno); } return true; } #else #include #include #include #include #include #include "copyfile.h" using namespace std; static int op_flags; #define OPT_MOINS 0x1 #define OPT_m 0x2 #define OPT_e 0x4 static const char *thisprog; static char usage [] = "trcopyfile [-m] src dst\n" " -m : move instead of copying\n" " -e : fail if dest exists (only for copy)\n" "\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'm': op_flags |= OPT_m; break; case 'e': op_flags |= OPT_e; break; default: Usage(); break; } argc--; argv++; } if (argc != 2) Usage(); string src = *argv++;argc--; string dst = *argv++;argc--; bool ret; string reason; if (op_flags & OPT_m) { ret = renameormove(src.c_str(), dst.c_str(), reason); } else { int flags = 0; if (op_flags & OPT_e) { flags |= COPYFILE_EXCL; } ret = copyfile(src.c_str(), dst.c_str(), reason, flags); } if (!ret) { cerr << reason << endl; exit(1); } else { cout << "Succeeded" << endl; if (!reason.empty()) { cout << "Warnings: " << reason << endl; } exit(0); } } #endif recoll-1.23.7/utils/base64.h0000644000175000017500000000237313125527323012412 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _BASE64_H_INCLUDED_ #define _BASE64_H_INCLUDED_ #include void base64_encode(const std::string& in, std::string& out); bool base64_decode(const std::string& in, std::string& out); inline std::string base64_encode(const std::string& in) { std::string o; base64_encode(in, o); return o; } inline std::string base64_decode(const std::string& in) { std::string o; if (base64_decode(in, o)) return o; return std::string(); } #endif /* _BASE64_H_INCLUDED_ */ recoll-1.23.7/utils/fstreewalk.cpp0000644000175000017500000004435113125637102014027 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #ifndef TEST_FSTREEWALK #include #include #include #include #include "safesysstat.h" #include #include #include #include #include #include #include "cstr.h" #include "log.h" #include "pathut.h" #include "fstreewalk.h" using namespace std; bool FsTreeWalker::o_useFnmPathname = true; const int FsTreeWalker::FtwTravMask = FtwTravNatural| FtwTravBreadth|FtwTravFilesThenDirs|FtwTravBreadthThenDepth; #ifndef _WIN32 // dev/ino means nothing on Windows. It seems that FileId could replace it // but we only use this for cycle detection which we just disable. class DirId { public: dev_t dev; ino_t ino; DirId(dev_t d, ino_t i) : dev(d), ino(i) {} bool operator<(const DirId& r) const { return dev < r.dev || (dev == r.dev && ino < r.ino); } }; #endif class FsTreeWalker::Internal { public: Internal(int opts) : options(opts), depthswitch(4), maxdepth(-1), errors(0) { } int options; int depthswitch; int maxdepth; int basedepth; stringstream reason; vector skippedNames; vector skippedPaths; // When doing Breadth or FilesThenDirs traversal, we keep a list // of directory paths to be processed, and we do not recurse. deque dirs; int errors; #ifndef _WIN32 set donedirs; #endif void logsyserr(const char *call, const string ¶m) { errors++; reason << call << "(" << param << ") : " << errno << " : " << strerror(errno) << endl; } }; FsTreeWalker::FsTreeWalker(int opts) { data = new Internal(opts); } FsTreeWalker::~FsTreeWalker() { delete data; } void FsTreeWalker::setOpts(int opts) { if (data) { data->options = opts; } } int FsTreeWalker::getOpts() { if (data) { return data->options; } else { return 0; } } void FsTreeWalker::setDepthSwitch(int ds) { if (data) { data->depthswitch = ds; } } void FsTreeWalker::setMaxDepth(int md) { if (data) { data->maxdepth = md; } } string FsTreeWalker::getReason() { string reason = data->reason.str(); data->reason.str(string()); data->errors = 0; return reason; } int FsTreeWalker::getErrCnt() { return data->errors; } bool FsTreeWalker::addSkippedName(const string& pattern) { if (find(data->skippedNames.begin(), data->skippedNames.end(), pattern) == data->skippedNames.end()) data->skippedNames.push_back(pattern); return true; } bool FsTreeWalker::setSkippedNames(const vector &patterns) { data->skippedNames = patterns; return true; } bool FsTreeWalker::inSkippedNames(const string& name) { for (vector::const_iterator it = data->skippedNames.begin(); it != data->skippedNames.end(); it++) { if (fnmatch(it->c_str(), name.c_str(), 0) == 0) { return true; } } return false; } bool FsTreeWalker::addSkippedPath(const string& ipath) { string path = (data->options & FtwNoCanon) ? ipath : path_canon(ipath); if (find(data->skippedPaths.begin(), data->skippedPaths.end(), path) == data->skippedPaths.end()) data->skippedPaths.push_back(path); return true; } bool FsTreeWalker::setSkippedPaths(const vector &paths) { data->skippedPaths = paths; for (vector::iterator it = data->skippedPaths.begin(); it != data->skippedPaths.end(); it++) if (!(data->options & FtwNoCanon)) *it = path_canon(*it); return true; } bool FsTreeWalker::inSkippedPaths(const string& path, bool ckparents) { int fnmflags = o_useFnmPathname ? FNM_PATHNAME : 0; #ifdef FNM_LEADING_DIR if (ckparents) fnmflags |= FNM_LEADING_DIR; #endif for (vector::const_iterator it = data->skippedPaths.begin(); it != data->skippedPaths.end(); it++) { #ifndef FNM_LEADING_DIR if (ckparents) { string mpath = path; while (mpath.length() > 2) { if (fnmatch(it->c_str(), mpath.c_str(), fnmflags) == 0) return true; mpath = path_getfather(mpath); } } else #endif /* FNM_LEADING_DIR */ if (fnmatch(it->c_str(), path.c_str(), fnmflags) == 0) { return true; } } return false; } static inline int slashcount(const string& p) { int n = 0; for (unsigned int i = 0; i < p.size(); i++) if (p[i] == '/') n++; return n; } FsTreeWalker::Status FsTreeWalker::walk(const string& _top, FsTreeWalkerCB& cb) { string top = (data->options & FtwNoCanon) ? _top : path_canon(_top); if ((data->options & FtwTravMask) == 0) { data->options |= FtwTravNatural; } data->basedepth = slashcount(top); // Only used for breadthxx struct stat st; // We always follow symlinks at this point. Makes more sense. if (path_fileprops(top, &st) == -1) { // Note that we do not return an error if the stat call // fails. A temp file may have gone away. data->logsyserr("stat", top); return errno == ENOENT ? FtwOk : FtwError; } // Recursive version, using the call stack to store state. iwalk // will process files and recursively descend into subdirs in // physical order of the current directory. if ((data->options & FtwTravMask) == FtwTravNatural) { return iwalk(top, &st, cb); } // Breadth first of filesThenDirs semi-depth first order // Managing queues of directories to be visited later, in breadth or // depth order. Null marker are inserted in the queue to indicate // father directory changes (avoids computing parents all the time). data->dirs.push_back(top); Status status; while (!data->dirs.empty()) { string dir, nfather; if (data->options & (FtwTravBreadth|FtwTravBreadthThenDepth)) { // Breadth first, pop and process an older dir at the // front of the queue. This will add any child dirs at the // back dir = data->dirs.front(); data->dirs.pop_front(); if (dir.empty()) { // Father change marker. if (data->dirs.empty()) break; dir = data->dirs.front(); data->dirs.pop_front(); nfather = path_getfather(dir); if (data->options & FtwTravBreadthThenDepth) { // Check if new depth warrants switch to depth first // traversal (will happen on next loop iteration). int curdepth = slashcount(dir) - data->basedepth; if (curdepth >= data->depthswitch) { //fprintf(stderr, "SWITCHING TO DEPTH FIRST\n"); data->options &= ~FtwTravMask; data->options |= FtwTravFilesThenDirs; } } } } else { // Depth first, pop and process latest dir dir = data->dirs.back(); data->dirs.pop_back(); if (dir.empty()) { // Father change marker. if (data->dirs.empty()) break; dir = data->dirs.back(); data->dirs.pop_back(); nfather = path_getfather(dir); } } // If changing parent directory, advise our user. if (!nfather.empty()) { if (path_fileprops(nfather, &st) == -1) { data->logsyserr("stat", nfather); return errno == ENOENT ? FtwOk : FtwError; } if ((status = cb.processone(nfather, &st, FtwDirReturn)) & (FtwStop|FtwError)) { return status; } } if (path_fileprops(dir, &st) == -1) { data->logsyserr("stat", dir); return errno == ENOENT ? FtwOk : FtwError; } // iwalk will not recurse in this case, just process file entries // and append subdir entries to the queue. status = iwalk(dir, &st, cb); if (status != FtwOk) return status; } return FtwOk; } // Note that the 'norecurse' flag is handled as part of the directory read. // This means that we always go into the top 'walk()' parameter if it is a // directory, even if norecurse is set. Bug or Feature ? FsTreeWalker::Status FsTreeWalker::iwalk(const string &top, struct stat *stp, FsTreeWalkerCB& cb) { Status status = FtwOk; bool nullpush = false; // Tell user to process the top entry itself if (S_ISDIR(stp->st_mode)) { if ((status = cb.processone(top, stp, FtwDirEnter)) & (FtwStop|FtwError)) { return status; } } else if (S_ISREG(stp->st_mode)) { return cb.processone(top, stp, FtwRegular); } else { return status; } int curdepth = slashcount(top) - data->basedepth; if (data->maxdepth >= 0 && curdepth >= data->maxdepth) { LOGDEB1("FsTreeWalker::iwalk: Maxdepth reached: [" << (top) << "]\n" ); return status; } // This is a directory, read it and process entries: // Detect if directory already seen. This could just be several // symlinks pointing to the same place (if FtwFollow is set), it // could also be some other kind of cycle. In any case, there is // no point in entering again. // For now, we'll ignore the "other kind of cycle" part and only monitor // this is FtwFollow is set #ifndef _WIN32 if (data->options & FtwFollow) { DirId dirid(stp->st_dev, stp->st_ino); if (data->donedirs.find(dirid) != data->donedirs.end()) { LOGINFO("Not processing [" << (top) << "] (already seen as other path)\n" ); return status; } data->donedirs.insert(dirid); } #endif DIR *d = opendir(top.c_str()); if (d == 0) { data->logsyserr("opendir", top); switch (errno) { case EPERM: case EACCES: case ENOENT: #ifdef _WIN32 // We get this quite a lot, don't know why. To be checked. case EINVAL: #endif goto out; default: status = FtwError; goto out; } } struct dirent *ent; while ((ent = readdir(d)) != 0) { string fn; struct stat st; // Maybe skip dotfiles if ((data->options & FtwSkipDotFiles) && ent->d_name[0] == '.') continue; // Skip . and .. if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; // Skipped file names match ? if (!data->skippedNames.empty()) { if (inSkippedNames(ent->d_name)) continue; } fn = path_cat(top, ent->d_name); #ifdef _WIN32 // readdir gets the useful attrs, no inode indirection on windows, // spare the path_fileprops() call, but make sure we mimick it. memset(&st, 0, sizeof(st)); st.st_mtime = ent->d_mtime; st.st_size = ent->d_size; st.st_mode = ent->d_mode; // ctime is really creation time on Windows. Just use mtime // for all. We only use ctime on Unix to catch xattr changes // anyway. st.st_ctime = st.st_mtime; #else int statret = path_fileprops(fn.c_str(), &st, data->options&FtwFollow); if (statret == -1) { data->logsyserr("stat", fn); continue; } #endif if (!data->skippedPaths.empty()) { // We do not check the ancestors. This means that you can have // a topdirs member under a skippedPath, to index a portion of // an ignored area. This is the way it had always worked, but // this was broken by 1.13.00 and the systematic use of // FNM_LEADING_DIR if (inSkippedPaths(fn, false)) continue; } if (S_ISDIR(st.st_mode)) { if (data->options & FtwNoRecurse) { status = cb.processone(fn, &st, FtwDirEnter); } else { if (data->options & FtwTravNatural) { status = iwalk(fn, &st, cb); } else { // If first subdir, push marker to separate // from entries for other dir. This is to help // with generating DirReturn callbacks if (!nullpush) { if (!data->dirs.empty() && !data->dirs.back().empty()) data->dirs.push_back(cstr_null); nullpush = true; } data->dirs.push_back(fn); continue; } } // Note: only recursive case gets here. if (status & (FtwStop|FtwError)) goto out; if (!(data->options & FtwNoRecurse)) if ((status = cb.processone(top, &st, FtwDirReturn)) & (FtwStop|FtwError)) goto out; } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { if ((status = cb.processone(fn, &st, FtwRegular)) & (FtwStop|FtwError)) { goto out; } } // We ignore other file types (devices etc...) } // readdir loop out: if (d) closedir(d); return status; } #else // TEST_FSTREEWALK #include #include #include #include #include "rclinit.h" #include "rclconfig.h" #include "fstreewalk.h" using namespace std; static int op_flags; #define OPT_MOINS 0x1 #define OPT_p 0x2 #define OPT_P 0x4 #define OPT_r 0x8 #define OPT_c 0x10 #define OPT_b 0x20 #define OPT_d 0x40 #define OPT_m 0x80 #define OPT_L 0x100 #define OPT_w 0x200 #define OPT_M 0x400 #define OPT_D 0x800 class myCB : public FsTreeWalkerCB { public: FsTreeWalker::Status processone(const string &path, const struct stat *st, FsTreeWalker::CbFlag flg) { if (flg == FsTreeWalker::FtwDirEnter) { if (op_flags & OPT_r) cout << path << endl; else cout << "[Entering " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwDirReturn) { cout << "[Returning to " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwRegular) { cout << path << endl; } return FsTreeWalker::FtwOk; } }; static const char *thisprog; // Note that breadth first sorting is relatively expensive: less inode // locality, more disk usage (and also more user memory usage, does // not appear here). Some typical results on a real tree with 2.6 // million entries (220MB of name data) // Recoll 1.13 // time trfstreewalk / > /data/tmp/old // real 13m32.839s user 0m4.443s sys 0m31.128s // // Recoll 1.14 // time trfstreewalk / > /data/tmp/nat; // real 13m28.685s user 0m4.430s sys 0m31.083s // time trfstreewalk -d / > /data/tmp/depth; // real 13m30.051s user 0m4.140s sys 0m33.862s // time trfstreewalk -m / > /data/tmp/mixed; // real 14m53.245s user 0m4.244s sys 0m34.494s // time trfstreewalk -b / > /data/tmp/breadth; // real 17m10.585s user 0m4.532s sys 0m35.033s static char usage [] = "trfstreewalk [-p pattern] [-P ignpath] [-r] [-c] [-L] topdir\n" " -r : norecurse\n" " -c : no path canonification\n" " -L : follow symbolic links\n" " -b : use breadth first walk\n" " -d : use almost depth first (dir files, then subdirs)\n" " -m : use breadth up to 4 deep then switch to -d\n" " -w : unset default FNM_PATHNAME when using fnmatch() to match skipped paths\n" " -M : limit depth (works with -b/m/d)\n" " -D : skip dotfiles\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { vector patterns; vector paths; int maxdepth = -1; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'b': op_flags |= OPT_b; break; case 'c': op_flags |= OPT_c; break; case 'd': op_flags |= OPT_d; break; case 'D': op_flags |= OPT_D; break; case 'L': op_flags |= OPT_L; break; case 'm': op_flags |= OPT_m; break; case 'M': op_flags |= OPT_M; if (argc < 2) Usage(); maxdepth = atoi(*(++argv)); argc--; goto b1; case 'p': op_flags |= OPT_p; if (argc < 2) Usage(); patterns.push_back(*(++argv)); argc--; goto b1; case 'P': op_flags |= OPT_P; if (argc < 2) Usage(); paths.push_back(*(++argv)); argc--; goto b1; case 'r': op_flags |= OPT_r; break; case 'w': op_flags |= OPT_w; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string topdir = *argv++;argc--; int opt = 0; if (op_flags & OPT_r) opt |= FsTreeWalker::FtwNoRecurse; if (op_flags & OPT_c) opt |= FsTreeWalker::FtwNoCanon; if (op_flags & OPT_L) opt |= FsTreeWalker::FtwFollow; if (op_flags & OPT_D) opt |= FsTreeWalker::FtwSkipDotFiles; if (op_flags & OPT_b) opt |= FsTreeWalker::FtwTravBreadth; else if (op_flags & OPT_d) opt |= FsTreeWalker::FtwTravFilesThenDirs; else if (op_flags & OPT_m) opt |= FsTreeWalker::FtwTravBreadthThenDepth; string reason; if (!recollinit(0, 0, reason)) { fprintf(stderr, "Init failed: %s\n", reason.c_str()); exit(1); } if (op_flags & OPT_w) { FsTreeWalker::setNoFnmPathname(); } FsTreeWalker walker; walker.setOpts(opt); walker.setMaxDepth(maxdepth); walker.setSkippedNames(patterns); walker.setSkippedPaths(paths); myCB cb; walker.walk(topdir, cb); if (walker.getErrCnt() > 0) cout << walker.getReason(); } #endif // TEST_FSTREEWALK recoll-1.23.7/utils/x11mon.cpp0000644000175000017500000000332713125527323013004 00000000000000#ifndef TEST_X11MON /* Copyright (C) 2006 J.F.Dockes */ // Poll state of X11 connectibility (to detect end of user session). #include "autoconfig.h" #ifndef DISABLE_X11MON #include #include #include #include #define DODEBUG #ifdef DODEBUG #define DEBUG(X) fprintf X #else #define DEBUG(X) fprintf X #endif static Display *m_display; static bool m_ok; static jmp_buf env; static int errorHandler(Display *, XErrorEvent*) { DEBUG((stderr, "x11mon: error handler: Got X11 error\n")); m_ok = false; return 0; } static int ioErrorHandler(Display *) { DEBUG((stderr, "x11mon: error handler: Got X11 IO error\n")); m_ok = false; m_display = 0; longjmp(env, 1); } bool x11IsAlive() { // Xlib always exits on IO errors. Need a setjmp to avoid this (will jump // from IO error handler instead of returning). if (setjmp(env)) { DEBUG((stderr, "x11IsAlive: Long jump\n")); return false; } if (m_display == 0) { signal(SIGPIPE, SIG_IGN); XSetErrorHandler(errorHandler); XSetIOErrorHandler(ioErrorHandler); if ((m_display = XOpenDisplay(0)) == 0) { DEBUG((stderr, "x11IsAlive: cant connect\n")); m_ok = false; return false; } } m_ok = true; bool sync= XSynchronize(m_display, true); XNoOp(m_display); XSynchronize(m_display, sync); return m_ok; } #else bool x11IsAlive() { return true; } #endif /* DISABLE_X11MON */ #else // Test driver #include #include #include #include "x11mon.h" int main(int argc, char **argv) { for (;;) { if (!x11IsAlive()) { fprintf(stderr, "x11IsAlive failed\n"); } else { fprintf(stderr, "x11IsAlive Ok\n"); } sleep(1); } } #endif recoll-1.23.7/utils/pathut.cpp0000644000175000017500000004750613224431020013161 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include #include #include #ifdef _WIN32 #include "dirent.h" #include "safefcntl.h" #include "safeunistd.h" #include "safewindows.h" #include "safesysstat.h" #else // Not windows -> #include #include #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include #include "pathut.h" #include "smallut.h" using namespace std; #ifdef _WIN32 /// Convert \ separators to / void path_slashize(string& s) { for (string::size_type i = 0; i < s.size(); i++) { if (s[i] == '\\') { s[i] = '/'; } } } void path_backslashize(string& s) { for (string::size_type i = 0; i < s.size(); i++) { if (s[i] == '/') { s[i] = '\\'; } } } static bool path_strlookslikedrive(const string& s) { return s.size() == 2 && isalpha(s[0]) && s[1] == ':'; } static bool path_hasdrive(const string& s) { if (s.size() >= 2 && isalpha(s[0]) && s[1] == ':') { return true; } return false; } static bool path_isdriveabs(const string& s) { if (s.size() >= 3 && isalpha(s[0]) && s[1] == ':' && s[2] == '/') { return true; } return false; } #endif bool fsocc(const string& path, int *pc, long long *avmbs) { static const int FSOCC_MB = 1024 * 1024; #ifdef _WIN32 ULARGE_INTEGER freebytesavail; ULARGE_INTEGER totalbytes; if (!GetDiskFreeSpaceEx(path.c_str(), &freebytesavail, &totalbytes, NULL)) { return false; } if (pc) { *pc = int((100 * freebytesavail.QuadPart) / totalbytes.QuadPart); } if (avmbs) { *avmbs = int(totalbytes.QuadPart / FSOCC_MB); } return true; #else // not windows -> struct statvfs buf; if (statvfs(path.c_str(), &buf) != 0) { return false; } if (pc) { double fsocc_used = double(buf.f_blocks - buf.f_bfree); double fsocc_totavail = fsocc_used + double(buf.f_bavail); double fpc = 100.0; if (fsocc_totavail > 0) { fpc = 100.0 * fsocc_used / fsocc_totavail; } *pc = int(fpc); } if (avmbs) { *avmbs = 0; if (buf.f_bsize > 0) { int ratio = buf.f_frsize > FSOCC_MB ? buf.f_frsize / FSOCC_MB : FSOCC_MB / buf.f_frsize; *avmbs = buf.f_frsize > FSOCC_MB ? ((long long)buf.f_bavail) * ratio : ((long long)buf.f_bavail) / ratio; } } return true; #endif } string path_PATHsep() { static const string w(";"); static const string u(":"); #ifdef _WIN32 return w; #else return u; #endif } void path_catslash(string& s) { #ifdef _WIN32 path_slashize(s); #endif if (s.empty() || s[s.length() - 1] != '/') { s += '/'; } } string path_cat(const string& s1, const string& s2) { string res = s1; path_catslash(res); res += s2; return res; } string path_getfather(const string& s) { string father = s; #ifdef _WIN32 path_slashize(father); #endif // ?? if (father.empty()) { return "./"; } if (path_isroot(father)) { return father; } if (father[father.length() - 1] == '/') { // Input ends with /. Strip it, root special case was tested above father.erase(father.length() - 1); } string::size_type slp = father.rfind('/'); if (slp == string::npos) { return "./"; } father.erase(slp); path_catslash(father); return father; } string path_getsimple(const string& s) { string simple = s; #ifdef _WIN32 path_slashize(simple); #endif if (simple.empty()) { return simple; } string::size_type slp = simple.rfind('/'); if (slp == string::npos) { return simple; } simple.erase(0, slp + 1); return simple; } string path_basename(const string& s, const string& suff) { string simple = path_getsimple(s); string::size_type pos = string::npos; if (suff.length() && simple.length() > suff.length()) { pos = simple.rfind(suff); if (pos != string::npos && pos + suff.length() == simple.length()) { return simple.substr(0, pos); } } return simple; } string path_suffix(const string& s) { string::size_type dotp = s.rfind('.'); if (dotp == string::npos) { return string(); } return s.substr(dotp + 1); } string path_home() { #ifdef _WIN32 string dir; const char *cp = getenv("USERPROFILE"); if (cp != 0) { dir = cp; } if (dir.empty()) { cp = getenv("HOMEDRIVE"); if (cp != 0) { const char *cp1 = getenv("HOMEPATH"); if (cp1 != 0) { dir = string(cp) + string(cp1); } } } if (dir.empty()) { dir = "C:\\"; } dir = path_canon(dir); path_catslash(dir); return dir; #else uid_t uid = getuid(); struct passwd *entry = getpwuid(uid); if (entry == 0) { const char *cp = getenv("HOME"); if (cp) { return cp; } else { return "/"; } } string homedir = entry->pw_dir; path_catslash(homedir); return homedir; #endif } // The default place to store the default config and other stuff (e.g webqueue) string path_homedata() { #ifdef _WIN32 const char *cp = getenv("LOCALAPPDATA"); string dir; if (cp != 0) { dir = path_canon(cp); } if (dir.empty()) { dir = path_cat(path_home(), "AppData/Local/"); } return dir; #else // We should use an xdg-conforming location, but, history... return path_home(); #endif } string path_tildexpand(const string& s) { if (s.empty() || s[0] != '~') { return s; } string o = s; #ifdef _WIN32 path_slashize(o); #endif if (s.length() == 1) { o.replace(0, 1, path_home()); } else if (s[1] == '/') { o.replace(0, 2, path_home()); } else { string::size_type pos = s.find('/'); string::size_type l = (pos == string::npos) ? s.length() - 1 : pos - 1; #ifdef _WIN32 // Dont know what this means. Just replace with HOME o.replace(0, l + 1, path_home()); #else struct passwd *entry = getpwnam(s.substr(1, l).c_str()); if (entry) { o.replace(0, l + 1, entry->pw_dir); } #endif } return o; } bool path_isroot(const string& path) { if (path.size() == 1 && path[0] == '/') { return true; } #ifdef _WIN32 if (path.size() == 3 && isalpha(path[0]) && path[1] == ':' && (path[2] == '/' || path[2] == '\\')) { return true; } #endif return false; } bool path_isabsolute(const string& path) { if (!path.empty() && (path[0] == '/' #ifdef _WIN32 || path_isdriveabs(path) #endif )) { return true; } return false; } string path_absolute(const string& is) { if (is.length() == 0) { return is; } string s = is; #ifdef _WIN32 path_slashize(s); #endif if (!path_isabsolute(s)) { char buf[MAXPATHLEN]; if (!getcwd(buf, MAXPATHLEN)) { return string(); } s = path_cat(string(buf), s); #ifdef _WIN32 path_slashize(s); #endif } return s; } string path_canon(const string& is, const string* cwd) { if (is.length() == 0) { return is; } string s = is; #ifdef _WIN32 path_slashize(s); // fix possible path from file: absolute url if (s.size() && s[0] == '/' && path_hasdrive(s.substr(1))) { s = s.substr(1); } #endif if (!path_isabsolute(s)) { char buf[MAXPATHLEN]; const char *cwdp = buf; if (cwd) { cwdp = cwd->c_str(); } else { if (!getcwd(buf, MAXPATHLEN)) { return string(); } } s = path_cat(string(cwdp), s); } vector elems; stringToTokens(s, elems, "/"); vector cleaned; for (vector::const_iterator it = elems.begin(); it != elems.end(); it++) { if (*it == "..") { if (!cleaned.empty()) { cleaned.pop_back(); } } else if (it->empty() || *it == ".") { } else { cleaned.push_back(*it); } } string ret; if (!cleaned.empty()) { for (vector::const_iterator it = cleaned.begin(); it != cleaned.end(); it++) { ret += "/"; #ifdef _WIN32 if (it == cleaned.begin() && path_strlookslikedrive(*it)) { // Get rid of just added initial "/" ret.clear(); } #endif ret += *it; } } else { ret = "/"; } #ifdef _WIN32 // Raw drive needs a final / if (path_strlookslikedrive(ret)) { path_catslash(ret); } #endif return ret; } bool path_makepath(const string& ipath, int mode) { string path = path_canon(ipath); vector elems; stringToTokens(path, elems, "/"); path = "/"; for (vector::const_iterator it = elems.begin(); it != elems.end(); it++) { #ifdef _WIN32 if (it == elems.begin() && path_strlookslikedrive(*it)) { path = ""; } #endif path += *it; // Not using path_isdir() here, because this cant grok symlinks // If we hit an existing file, no worry, mkdir will just fail. if (access(path.c_str(), 0) != 0) { if (mkdir(path.c_str(), mode) != 0) { return false; } } path += "/"; } return true; } bool path_isdir(const string& path) { struct stat st; if (lstat(path.c_str(), &st) < 0) { return false; } if (S_ISDIR(st.st_mode)) { return true; } return false; } long long path_filesize(const string& path) { struct stat st; if (stat(path.c_str(), &st) < 0) { return -1; } return (long long)st.st_size; } int path_fileprops(const std::string path, struct stat *stp, bool follow) { if (!stp) { return -1; } memset(stp, 0, sizeof(struct stat)); struct stat mst; int ret = follow ? stat(path.c_str(), &mst) : lstat(path.c_str(), &mst); if (ret != 0) { return ret; } stp->st_size = mst.st_size; stp->st_mode = mst.st_mode; stp->st_mtime = mst.st_mtime; #ifdef _WIN32 stp->st_ctime = mst.st_mtime; #else stp->st_ino = mst.st_ino; stp->st_dev = mst.st_dev; stp->st_ctime = mst.st_ctime; #endif return 0; } bool path_exists(const string& path) { return access(path.c_str(), 0) == 0; } // Allowed punctuation in the path part of an URI according to RFC2396 // -_.!~*'():@&=+$, /* 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' 28 ( 29 ) 2A * 2B + 2C , 2D - 2E . 2F / 30 0 ... 39 9 3A : 3B ; 3C < 3D = 3E > 3F ? 40 @ 41 A ... 5A Z 5B [ 5C \ 5D ] 5E ^ 5F _ 60 ` 61 a ... 7A z 7B { 7C | 7D } 7E ~ 7F DEL */ string url_encode(const string& url, string::size_type offs) { string out = url.substr(0, offs); const char *cp = url.c_str(); for (string::size_type i = offs; i < url.size(); i++) { unsigned int c; const char *h = "0123456789ABCDEF"; c = cp[i]; if (c <= 0x20 || c >= 0x7f || c == '"' || c == '#' || c == '%' || c == ';' || c == '<' || c == '>' || c == '?' || c == '[' || c == '\\' || c == ']' || c == '^' || c == '`' || c == '{' || c == '|' || c == '}') { out += '%'; out += h[(c >> 4) & 0xf]; out += h[c & 0xf]; } else { out += char(c); } } return out; } static inline int h2d(int c) { if ('0' <= c && c <= '9') return c - '0'; else if ('A' <= c && c <= 'F') return 10 + c - 'A'; else return -1; } string url_decode(const string &in) { if (in.size() <= 2) return in; string out; out.reserve(in.size()); const char *cp = in.c_str(); string::size_type i = 0; for (; i < in.size() - 2; i++) { if (cp[i] == '%') { int d1 = h2d(cp[i+1]); int d2 = h2d(cp[i+2]); if (d1 != -1 && d2 != -1) { out += (d1 << 4) + d2; } else { out += '%'; out += cp[i+1]; out += cp[i+2]; } i += 2; } else { out += cp[i]; } } while (i < in.size()) { out += cp[i++]; } return out; } string url_gpath(const string& url) { // Remove the access schema part (or whatever it's called) string::size_type colon = url.find_first_of(":"); if (colon == string::npos || colon == url.size() - 1) { return url; } // If there are non-alphanum chars before the ':', then there // probably is no scheme. Whatever... for (string::size_type i = 0; i < colon; i++) { if (!isalnum(url.at(i))) { return url; } } // In addition we canonize the path to remove empty host parts // (for compatibility with older versions of recoll where file:// // was hardcoded, but the local path was used for doc // identification. return path_canon(url.substr(colon + 1)); } string url_parentfolder(const string& url) { // In general, the parent is the directory above the full path string parenturl = path_getfather(url_gpath(url)); // But if this is http, make sure to keep the host part. Recoll // only has file or http urls for now. bool isfileurl = urlisfileurl(url); if (!isfileurl && parenturl == "/") { parenturl = url_gpath(url); } return isfileurl ? string("file://") + parenturl : string("http://") + parenturl; } // Convert to file path if url is like file: // Note: this only works with our internal pseudo-urls which are not // encoded/escaped string fileurltolocalpath(string url) { if (url.find("file://") == 0) { url = url.substr(7, string::npos); } else { return string(); } #ifdef _WIN32 // Absolute file urls are like: file:///c:/mydir/... // Get rid of the initial '/' if (url.size() >= 3 && url[0] == '/' && isalpha(url[1]) && url[2] == ':') { url = url.substr(1); } #endif // Removing the fragment part. This is exclusively used when // executing a viewer for the recoll manual, and we only strip the // part after # if it is preceded by .html string::size_type pos; if ((pos = url.rfind(".html#")) != string::npos) { url.erase(pos + 5); } else if ((pos = url.rfind(".htm#")) != string::npos) { url.erase(pos + 4); } return url; } static const string cstr_fileu("file://"); string path_pathtofileurl(const string& path) { // We're supposed to receive a canonic absolute path, but on windows we // may need to add a '/' in front of the drive spec string url(cstr_fileu); if (path.empty() || path[0] != '/') { url.push_back('/'); } url += path; return url; } bool urlisfileurl(const string& url) { return url.find("file://") == 0; } bool readdir(const string& dir, string& reason, set& entries) { struct stat st; int statret; ostringstream msg; DIR *d = 0; statret = lstat(dir.c_str(), &st); if (statret == -1) { msg << "readdir: cant stat " << dir << " errno " << errno; goto out; } if (!S_ISDIR(st.st_mode)) { msg << "readdir: " << dir << " not a directory"; goto out; } if (access(dir.c_str(), R_OK) < 0) { msg << "readdir: no read access to " << dir; goto out; } d = opendir(dir.c_str()); if (d == 0) { msg << "readdir: cant opendir " << dir << ", errno " << errno; goto out; } struct dirent *ent; while ((ent = readdir(d)) != 0) { if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { continue; } entries.insert(ent->d_name); } out: if (d) { closedir(d); } reason = msg.str(); if (reason.empty()) { return true; } return false; } // We do not want to mess with the pidfile content in the destructor: // the lock might still be in use in a child process. In fact as much // as we'd like to reset the pid inside the file when we're done, it // would be very difficult to do it right and it's probably best left // alone. Pidfile::~Pidfile() { if (m_fd >= 0) { ::close(m_fd); } m_fd = -1; } pid_t Pidfile::read_pid() { int fd = ::open(m_path.c_str(), O_RDONLY); if (fd == -1) { return (pid_t) - 1; } char buf[16]; int i = read(fd, buf, sizeof(buf) - 1); ::close(fd); if (i <= 0) { return (pid_t) - 1; } buf[i] = '\0'; char *endptr; pid_t pid = strtol(buf, &endptr, 10); if (endptr != &buf[i]) { return (pid_t) - 1; } return pid; } int Pidfile::flopen() { const char *path = m_path.c_str(); if ((m_fd = ::open(path, O_RDWR | O_CREAT, 0644)) == -1) { m_reason = "Open failed: [" + m_path + "]: " + strerror(errno); return -1; } #ifdef sun struct flock lockdata; lockdata.l_start = 0; lockdata.l_len = 0; lockdata.l_type = F_WRLCK; lockdata.l_whence = SEEK_SET; if (fcntl(m_fd, F_SETLK, &lockdata) != 0) { int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "fcntl lock failed"; return -1; } #else #ifdef _WIN32 return 0; #else int operation = LOCK_EX | LOCK_NB; if (flock(m_fd, operation) == -1) { int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "flock failed"; return -1; } #endif // ! win32 #endif // ! sun if (ftruncate(m_fd, 0) != 0) { /* can't happen [tm] */ int serrno = errno; (void)::close(m_fd); errno = serrno; m_reason = "ftruncate failed"; return -1; } return 0; } pid_t Pidfile::open() { if (flopen() < 0) { return read_pid(); } return (pid_t)0; } int Pidfile::write_pid() { /* truncate to allow multiple calls */ if (ftruncate(m_fd, 0) == -1) { m_reason = "ftruncate failed"; return -1; } char pidstr[20]; sprintf(pidstr, "%u", int(getpid())); lseek(m_fd, 0, 0); if (::write(m_fd, pidstr, strlen(pidstr)) != (ssize_t)strlen(pidstr)) { m_reason = "write failed"; return -1; } return 0; } int Pidfile::close() { return ::close(m_fd); } int Pidfile::remove() { return unlink(m_path.c_str()); } // Call funcs that need static init (not initially reentrant) void pathut_init_mt() { path_home(); } recoll-1.23.7/utils/hldata.h0000644000175000017500000000441313224431525012556 00000000000000#ifndef _hldata_h_included_ #define _hldata_h_included_ #include #include #include #include /** Store data about user search terms and their expansions. This is used * mostly for highlighting result text and walking the matches, generating * spelling suggestions. */ struct HighlightData { /** The user terms, excluding those with wildcards. This list is * intended for orthographic suggestions so the terms are always * lowercased, unaccented or not depending on the type of index * (as the spelling dictionary is generated from the index terms). */ std::set uterms; /** The db query terms linked to the uterms entry they were expanded from. * This is used for aggregating term stats when generating snippets (for * choosing the best terms, allocating slots, etc. ) */ std::map terms; /** The original user terms-or-groups. This is for display * purposes: ie when creating a menu to look for a specific * matched group inside a preview window. We want to show the * user-entered data in the menu, not some transformation, so * these are always raw, diacritics and case preserved. */ std::vector > ugroups; /** Processed/expanded terms and groups. Used for looking for * regions to highlight. Terms are just groups with 1 entry. All * terms are transformed to be compatible with index content * (unaccented and lowercased as needed depending on * configuration), and the list may include values * expanded from the original terms by stem or wildcard expansion. */ std::vector > groups; /** Group slacks. Parallel to groups */ std::vector slacks; /** Index into ugroups for each group. Parallel to groups. As a * user term or group may generate many processed/expanded terms * or groups, this is how we relate an expansion to its source. */ std::vector grpsugidx; void clear() { uterms.clear(); ugroups.clear(); groups.clear(); slacks.clear(); grpsugidx.clear(); } void append(const HighlightData&); // Print (debug) void toString(std::string& out); }; #endif /* _hldata_h_included_ */ recoll-1.23.7/utils/copyfile.h0000644000175000017500000000317713125527323013143 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _COPYFILE_H_INCLUDED_ #define _COPYFILE_H_INCLUDED_ #include enum CopyfileFlags {COPYFILE_NONE = 0, COPYFILE_NOERRUNLINK = 1, COPYFILE_EXCL = 2, }; /** Copy src to dst. * * We destroy an existing dst except if COPYFILE_EXCL is set (or we if * have no permission...). * A partially copied dst is normally removed, except if COPYFILE_NOERRUNLINK * is set. */ extern bool copyfile(const char *src, const char *dst, std::string &reason, int flags = 0); /** Save c++ string to file */ extern bool stringtofile(const std::string& dt, const char *dst, std::string& reason, int flags = 0); /** Try to rename src. If this fails (different devices) copy then unlink src */ extern bool renameormove(const char *src, const char *dst, std::string &reason); #endif /* _COPYFILE_H_INCLUDED_ */ recoll-1.23.7/utils/cpuconf.h0000644000175000017500000000224613125527323012762 00000000000000/* Copyright (C) 2013 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 _CPUCONF_H_INCLUDED_ #define _CPUCONF_H_INCLUDED_ /** Guess how many CPUs there are on this machine, to help with configuring threads */ struct CpuConf { CpuConf() : ncpus(1) {} // Virtual ones, including hyperthreading, we only care about this for now int ncpus; // int ncores; // int nsockets; }; extern bool getCpuConf(CpuConf& conf); #endif /* _CPUCONF_H_INCLUDED_ */ recoll-1.23.7/utils/md5.h0000644000175000017500000000216413224431020011775 00000000000000/* $OpenBSD: md5.h,v 1.15 2004/05/03 17:30:14 millert Exp $ */ /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. */ #ifndef _MD5_H_ #define _MD5_H_ #include #include #define MD5_BLOCK_LENGTH 64 #define MD5_DIGEST_LENGTH 16 #define MD5_DIGEST_STRING_LENGTH (MD5_DIGEST_LENGTH * 2 + 1) typedef struct MD5Context { uint32_t state[4]; /* state */ uint64_t count; /* number of bits, mod 2^64 */ uint8_t buffer[MD5_BLOCK_LENGTH]; /* input buffer */ } MD5_CTX; void MD5Init(MD5_CTX *); void MD5Update(MD5_CTX *, const uint8_t *, size_t); void MD5Pad(MD5_CTX *); void MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *); void MD5Transform(uint32_t [4], const uint8_t [MD5_BLOCK_LENGTH]); #endif /* _MD5_H_ */ recoll-1.23.7/utils/strmatcher.h0000644000175000017500000000477213125527323013507 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _STRMATCHER_H_INCLUDED_ #define _STRMATCHER_H_INCLUDED_ #include // Encapsulating simple wildcard/regexp string matching. // Matcher class. Interface to either wildcard or regexp yes/no matcher class StrMatcher { public: StrMatcher(const std::string& exp) : m_sexp(exp) { } virtual ~StrMatcher() {}; virtual bool match(const std::string &val) const = 0; virtual std::string::size_type baseprefixlen() const = 0; virtual bool setExp(const std::string& newexp) { m_sexp = newexp; return true; } virtual bool ok() const { return true; } virtual const std::string& exp() { return m_sexp; } virtual StrMatcher *clone() = 0; const string& getreason() { return m_reason; } protected: std::string m_sexp; std::string m_reason; }; class StrWildMatcher : public StrMatcher { public: StrWildMatcher(const std::string& exp) : StrMatcher(exp) { } virtual ~StrWildMatcher() { } virtual bool match(const std::string& val) const; virtual std::string::size_type baseprefixlen() const; virtual StrWildMatcher *clone() { return new StrWildMatcher(m_sexp); } }; class StrRegexpMatcher : public StrMatcher { public: StrRegexpMatcher(const std::string& exp); virtual bool setExp(const std::string& newexp); virtual ~StrRegexpMatcher(); virtual bool match(const std::string& val) const; virtual std::string::size_type baseprefixlen() const; virtual bool ok() const; virtual StrRegexpMatcher *clone() { return new StrRegexpMatcher(m_sexp); } const string& getreason() { return m_reason; } private: void *m_compiled; bool m_errcode; }; #endif /* _STRMATCHER_H_INCLUDED_ */ recoll-1.23.7/utils/rclionice.cpp0000644000175000017500000000307613125637102013626 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include "rclionice.h" #include "execmd.h" #include "log.h" using namespace std; bool rclionice(const string& clss, const string& cdata) { string ionicexe; if (!ExecCmd::which("ionice", ionicexe)) { // ionice not found, bail out LOGDEB0("rclionice: ionice not found\n" ); return false; } vector args; args.push_back("-c"); args.push_back(clss); if (!cdata.empty()) { args.push_back("-n"); args.push_back(cdata); } char cpid[100]; sprintf(cpid, "%d", getpid()); args.push_back("-p"); args.push_back(cpid); ExecCmd cmd; int status = cmd.doexec(ionicexe, args); if (status) { LOGERR("rclionice: failed, status 0x" << (status) << "\n" ); return false; } return true; } recoll-1.23.7/utils/readfile.cpp0000644000175000017500000001732713125637102013436 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_READFILE #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include #include #ifdef _WIN32 #include "safefcntl.h" #include "safesysstat.h" #include "safeunistd.h" #else #define O_BINARY 0 #include #include #include #endif #include #include "readfile.h" #include "smallut.h" using std::string; class FileToString : public FileScanDo { public: FileToString(string& data) : m_data(data) {} string& m_data; bool init(size_t size, string *reason) { if (size > 0) { m_data.reserve(size); } return true; } bool data(const char *buf, int cnt, string *reason) { try { m_data.append(buf, cnt); } catch (...) { catstrerror(reason, "append", errno); return false; } return true; } }; bool file_to_string(const string& fn, string& data, string *reason) { return file_to_string(fn, data, 0, size_t(-1), reason); } bool file_to_string(const string& fn, string& data, int64_t offs, size_t cnt, string *reason) { FileToString accum(data); return file_scan(fn, &accum, offs, cnt, reason); } bool file_scan(const string& fn, FileScanDo* doer, string *reason) { return file_scan(fn, doer, 0, size_t(-1), reason); } const int RDBUFSZ = 8192; // Note: the fstat() + reserve() (in init()) calls divide cpu usage almost by 2 // on both linux i586 and macosx (compared to just append()) // Also tried a version with mmap, but it's actually slower on the mac and not // faster on linux. bool file_scan(const string& fn, FileScanDo* doer, int64_t startoffs, size_t cnttoread, string *reason) { if (startoffs < 0) { *reason += " file_scan: negative startoffs not allowed"; return false; } bool ret = false; bool noclosing = true; int fd = 0; struct stat st; // Initialize st_size: if fn.empty() , the fstat() call won't happen. st.st_size = 0; // If we have a file name, open it, else use stdin. if (!fn.empty()) { fd = open(fn.c_str(), O_RDONLY | O_BINARY); if (fd < 0 || fstat(fd, &st) < 0) { catstrerror(reason, "open/stat", errno); return false; } noclosing = false; } #if defined O_NOATIME && O_NOATIME != 0 if (fcntl(fd, F_SETFL, O_NOATIME) < 0) { // perror("fcntl"); } #endif if (cnttoread != (size_t) - 1 && cnttoread) { doer->init(cnttoread + 1, reason); } else if (st.st_size > 0) { doer->init(size_t(st.st_size + 1), reason); } else { doer->init(0, reason); } int64_t curoffs = 0; if (startoffs > 0 && !fn.empty()) { if (lseek(fd, startoffs, SEEK_SET) != startoffs) { catstrerror(reason, "lseek", errno); return false; } curoffs = startoffs; } char buf[RDBUFSZ]; size_t totread = 0; for (;;) { size_t toread = RDBUFSZ; if (startoffs > 0 && curoffs < startoffs) { toread = size_t(MIN(RDBUFSZ, startoffs - curoffs)); } if (cnttoread != size_t(-1)) { toread = MIN(toread, cnttoread - totread); } ssize_t n = static_cast(read(fd, buf, toread)); if (n < 0) { catstrerror(reason, "read", errno); goto out; } if (n == 0) { break; } curoffs += n; if (curoffs - n < startoffs) { continue; } if (!doer->data(buf, n, reason)) { goto out; } totread += n; if (cnttoread > 0 && totread >= cnttoread) { break; } } ret = true; out: if (fd >= 0 && !noclosing) { close(fd); } return ret; } #else // Test #include "autoconfig.h" #include #include #include "safesysstat.h" #include #include #include using namespace std; #include "readfile.h" #include "fstreewalk.h" using namespace std; class myCB : public FsTreeWalkerCB { public: FsTreeWalker::Status processone(const string& path, const struct stat *st, FsTreeWalker::CbFlag flg) { if (flg == FsTreeWalker::FtwDirEnter) { //cout << "[Entering " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwDirReturn) { //cout << "[Returning to " << path << "]" << endl; } else if (flg == FsTreeWalker::FtwRegular) { //cout << path << endl; string s, reason; if (!file_to_string(path, s, &reason)) { cerr << "Failed: " << reason << " : " << path << endl; } else { //cout << //"================================================" << endl; cout << path << endl; // cout << s; } reason.clear(); } return FsTreeWalker::FtwOk; } }; static int op_flags; #define OPT_MOINS 0x1 #define OPT_c 0x2 #define OPT_o 0x4 static const char *thisprog; static char usage [] = "trreadfile [-o offs] [-c cnt] topdirorfile\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { int64_t offs = 0; size_t cnt = size_t(-1); thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ { Usage(); } while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; if (argc < 2) { Usage(); } cnt = atoll(*(++argv)); argc--; goto b1; case 'o': op_flags |= OPT_o; if (argc < 2) { Usage(); } offs = strtoull(*(++argv), 0, 0); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) { Usage(); } string top = *argv++; argc--; cerr << "filename " << top << " offs " << offs << " cnt " << cnt << endl; struct stat st; if (!top.empty() && stat(top.c_str(), &st) < 0) { perror("stat"); exit(1); } if (!top.empty() && S_ISDIR(st.st_mode)) { FsTreeWalker walker; myCB cb; walker.walk(top, cb); if (walker.getErrCnt() > 0) { cout << walker.getReason(); } } else { string s, reason; if (!file_to_string(top, s, offs, cnt, &reason)) { cerr << reason << endl; exit(1); } else { cout << s; } } exit(0); } #endif //TEST_READFILE recoll-1.23.7/utils/pxattr.cpp0000644000175000017500000007111113224431020013163 00000000000000/* Copyright (c) 2009 Jean-Francois Dockes Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** \file pxattr.cpp \brief Portable External Attributes API */ // PXALINUX: platforms like kfreebsd which aren't linux but use the // same xattr interface #if defined(__gnu_linux__) || \ (defined(__FreeBSD_kernel__)&&defined(__GLIBC__)&&!defined(__FreeBSD__)) ||\ defined(__CYGWIN__) #define PXALINUX #endif // If the platform is not known yet, let this file be empty instead of // breaking the compile, this will let the build work if the rest of // the software is not actually calling us. If it does call us, this // will bring attention to the necessity of a port. // // If the platform is known not to support extattrs (e.g.__OpenBSD__), // just let the methods return errors (like they would on a non-xattr // fs on e.g. linux) #if defined(__DragonFly__) || defined(__OpenBSD__) #define HAS_NO_XATTR #endif #if defined(__FreeBSD__) || defined(PXALINUX) || defined(__APPLE__) \ || defined(HAS_NO_XATTR) #ifndef TEST_PXATTR #include #include #include #include #if defined(__FreeBSD__) #include #include #elif defined(PXALINUX) #include #elif defined(__APPLE__) #include #elif defined(HAS_NO_XATTR) #else #error "Unknown system can't compile" #endif #include "pxattr.h" namespace pxattr { class AutoBuf { public: char *buf; AutoBuf() : buf(0) {} ~AutoBuf() {if (buf) free(buf); buf = 0;} bool alloc(int n) { if (buf) { free(buf); buf = 0; } buf = (char *)malloc(n); return buf != 0; } }; static bool get(int fd, const string& path, const string& _name, string *value, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; ssize_t ret = -1; AutoBuf buf; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } else { ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } } else { ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } else { ret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } } else { ret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), buf.buf, ret); } #elif defined(PXALINUX) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lgetxattr(path.c_str(), name.c_str(), 0, 0); } else { ret = getxattr(path.c_str(), name.c_str(), 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lgetxattr(path.c_str(), name.c_str(), buf.buf, ret); } else { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret); } } else { ret = fgetxattr(fd, name.c_str(), buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, XATTR_NOFOLLOW); } else { ret = getxattr(path.c_str(), name.c_str(), 0, 0, 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), 0, 0, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, XATTR_NOFOLLOW); } else { ret = getxattr(path.c_str(), name.c_str(), buf.buf, ret, 0, 0); } } else { ret = fgetxattr(fd, name.c_str(), buf.buf, ret, 0, 0); } #else errno = ENOTSUP; #endif if (ret >= 0) value->assign(buf.buf, ret); return ret >= 0; } static bool set(int fd, const string& path, const string& _name, const string& value, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; ssize_t ret = -1; #if defined(__FreeBSD__) if (flags & (PXATTR_CREATE|PXATTR_REPLACE)) { // Need to test existence bool exists = false; ssize_t eret; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { eret = extattr_get_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } else { eret = extattr_get_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } } else { eret = extattr_get_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), 0, 0); } if (eret >= 0) exists = true; if (eret < 0 && errno != ENOATTR) return false; if ((flags & PXATTR_CREATE) && exists) { errno = EEXIST; return false; } if ((flags & PXATTR_REPLACE) && !exists) { errno = ENOATTR; return false; } } if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_set_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } else { ret = extattr_set_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } } else { ret = extattr_set_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str(), value.c_str(), value.length()); } #elif defined(PXALINUX) int opts = 0; if (flags & PXATTR_CREATE) opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) opts = XATTR_REPLACE; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lsetxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), opts); } else { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), opts); } } else { ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), opts); } #elif defined(__APPLE__) int opts = 0; if (flags & PXATTR_CREATE) opts = XATTR_CREATE; else if (flags & PXATTR_REPLACE) opts = XATTR_REPLACE; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), 0, XATTR_NOFOLLOW|opts); } else { ret = setxattr(path.c_str(), name.c_str(), value.c_str(), value.length(), 0, opts); } } else { ret = fsetxattr(fd, name.c_str(), value.c_str(), value.length(), 0, opts); } #else errno = ENOTSUP; #endif return ret >= 0; } static bool del(int fd, const string& path, const string& _name, flags flags, nspace dom) { string name; if (!sysname(dom, _name, &name)) return false; int ret = -1; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_delete_link(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str()); } else { ret = extattr_delete_file(path.c_str(), EXTATTR_NAMESPACE_USER, name.c_str()); } } else { ret = extattr_delete_fd(fd, EXTATTR_NAMESPACE_USER, name.c_str()); } #elif defined(PXALINUX) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = lremovexattr(path.c_str(), name.c_str()); } else { ret = removexattr(path.c_str(), name.c_str()); } } else { ret = fremovexattr(fd, name.c_str()); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = removexattr(path.c_str(), name.c_str(), XATTR_NOFOLLOW); } else { ret = removexattr(path.c_str(), name.c_str(), 0); } } else { ret = fremovexattr(fd, name.c_str(), 0); } #else errno = ENOTSUP; #endif return ret >= 0; } static bool list(int fd, const string& path, vector* names, flags flags, nspace dom) { ssize_t ret = -1; AutoBuf buf; #if defined(__FreeBSD__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); } else { ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, 0, 0); } } else { ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // NEEDED on FreeBSD (no ending null) return false; buf.buf[ret] = 0; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = extattr_list_link(path.c_str(), EXTATTR_NAMESPACE_USER, buf.buf, ret); } else { ret = extattr_list_file(path.c_str(), EXTATTR_NAMESPACE_USER, buf.buf, ret); } } else { ret = extattr_list_fd(fd, EXTATTR_NAMESPACE_USER, buf.buf, ret); } #elif defined(PXALINUX) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = llistxattr(path.c_str(), 0, 0); } else { ret = listxattr(path.c_str(), 0, 0); } } else { ret = flistxattr(fd, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = llistxattr(path.c_str(), buf.buf, ret); } else { ret = listxattr(path.c_str(), buf.buf, ret); } } else { ret = flistxattr(fd, buf.buf, ret); } #elif defined(__APPLE__) if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = listxattr(path.c_str(), 0, 0, XATTR_NOFOLLOW); } else { ret = listxattr(path.c_str(), 0, 0, 0); } } else { ret = flistxattr(fd, 0, 0, 0); } if (ret < 0) return false; if (!buf.alloc(ret+1)) // Don't want to deal with possible ret=0 return false; if (fd < 0) { if (flags & PXATTR_NOFOLLOW) { ret = listxattr(path.c_str(), buf.buf, ret, XATTR_NOFOLLOW); } else { ret = listxattr(path.c_str(), buf.buf, ret, 0); } } else { ret = flistxattr(fd, buf.buf, ret, 0); } #else errno = ENOTSUP; #endif if (ret < 0) return false; char *bufstart = buf.buf; // All systems return a 0-separated string list except FreeBSD // which has length, value pairs, length is a byte. #if defined(__FreeBSD__) char *cp = buf.buf; unsigned int len; while (cp < buf.buf + ret + 1) { len = *cp; *cp = 0; cp += len + 1; } bufstart = buf.buf + 1; *cp = 0; // don't forget, we allocated one more #endif if (ret > 0) { int pos = 0; while (pos < ret) { string n = string(bufstart + pos); string n1; if (pxname(PXATTR_USER, n, &n1)) { names->push_back(n1); } pos += n.length() + 1; } } return true; } static const string nullstring(""); bool get(const string& path, const string& _name, string *value, flags flags, nspace dom) { return get(-1, path, _name, value, flags, dom); } bool get(int fd, const string& _name, string *value, flags flags, nspace dom) { return get(fd, nullstring, _name, value, flags, dom); } bool set(const string& path, const string& _name, const string& value, flags flags, nspace dom) { return set(-1, path, _name, value, flags, dom); } bool set(int fd, const string& _name, const string& value, flags flags, nspace dom) { return set(fd, nullstring, _name, value, flags, dom); } bool del(const string& path, const string& _name, flags flags, nspace dom) { return del(-1, path, _name, flags, dom); } bool del(int fd, const string& _name, flags flags, nspace dom) { return del(fd, nullstring, _name, flags, dom); } bool list(const string& path, vector* names, flags flags, nspace dom) { return list(-1, path, names, flags, dom); } bool list(int fd, vector* names, flags flags, nspace dom) { return list(fd, nullstring, names, flags, dom); } #if defined(PXALINUX) || defined(COMPAT1) static const string userstring("user."); #else static const string userstring(""); #endif bool sysname(nspace dom, const string& pname, string* sname) { if (dom != PXATTR_USER) { errno = EINVAL; return false; } *sname = userstring + pname; return true; } bool pxname(nspace dom, const string& sname, string* pname) { if (!userstring.empty() && sname.find(userstring) != 0) { errno = EINVAL; return false; } *pname = sname.substr(userstring.length()); return true; } } // namespace pxattr #else // TEST_PXATTR Testing / driver -> #include "pxattr.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; static int antiverbose; static void printsyserr(const string& msg) { if (antiverbose >= 2) return; cerr << msg << " " << strerror(errno) << endl; } #define message(X) \ { \ if (antiverbose == 0) { \ cout << X; \ } \ } static void dotests(); // \-quote character c in input \ -> \\, nl -> \n cr -> \rc -> \c static void quote(const string& in, string& out, int c) { out.clear(); for (string::const_iterator it = in.begin(); it != in.end(); it++) { if (*it == '\\') { out += "\\\\"; } else if (*it == "\n"[0]) { out += "\\n"; } else if (*it == "\r"[0]) { out += "\\r"; } else if (*it == c) { out += "\\"; out += c; } else { out += *it; } } } // \-unquote input \n -> nl, \r -> cr, \c -> c static void unquote(const string& in, string& out) { out.clear(); for (unsigned int i = 0; i < in.size(); i++) { if (in[i] == '\\') { if (i == in.size() -1) { out += in[i]; } else { int c = in[++i]; switch (c) { case 'n': out += "\n";break; case 'r': out += "\r";break; default: out += c; } } } else { out += in[i]; } } } // Find first unquoted c in input: c preceded by odd number of backslashes string::size_type find_first_unquoted(const string& in, int c) { int q = 0; for (unsigned int i = 0;i < in.size(); i++) { if (in[i] == '\\') { q++; } else if (in[i] == c) { if (q&1) { // quoted q = 0; } else { return i; } } else { q = 0; } } return string::npos; } static const string PATH_START("Path: "); static bool listattrs(const string& path) { vector names; if (!pxattr::list(path, &names)) { if (errno == ENOENT) { return false; } printsyserr("pxattr::list"); exit(1); } if (names.empty()) { return true; } // Sorting the names would not be necessary but it makes easier comparing // backups sort(names.begin(), names.end()); string quoted; quote(path, quoted, 0); message(PATH_START << quoted << endl); for (vector::const_iterator it = names.begin(); it != names.end(); it++) { string value; if (!pxattr::get(path, *it, &value)) { if (errno == ENOENT) { return false; } printsyserr("pxattr::get"); exit(1); } quote(*it, quoted, '='); message(" " << quoted << "="); quote(value, quoted, 0); message(quoted << endl); } return true; } bool setxattr(const string& path, const string& name, const string& value) { if (!pxattr::set(path, name, value)) { printsyserr("pxattr::set"); return false; } return true; } bool printxattr(const string &path, const string& name) { string value; if (!pxattr::get(path, name, &value)) { if (errno == ENOENT) { return false; } printsyserr("pxattr::get"); return false; } message(PATH_START << path << endl); message(" " << name << " => " << value << endl); return true; } bool delxattr(const string &path, const string& name) { if (pxattr::del(path, name) < 0) { printsyserr("pxattr::del"); return false; } return true; } // Restore xattrs stored in file created by pxattr -lR output static void restore(const char *backupnm) { istream *input; ifstream fin; if (!strcmp(backupnm, "stdin")) { input = &cin; } else { fin.open(backupnm, ios::in); input = &fin; } bool done = false; int linenum = 0; string path; map attrs; while (!done) { string line; getline(*input, line); if (!input->good()) { if (input->bad()) { cerr << "Input I/O error" << endl; exit(1); } done = true; } else { linenum++; } // message("Got line " << linenum << " : [" << line << "] done " << // done << endl); if (line.find(PATH_START) == 0 || done) { if (!path.empty() && !attrs.empty()) { for (map::const_iterator it = attrs.begin(); it != attrs.end(); it++) { setxattr(path, it->first, it->second); } } if (!done) { line = line.substr(PATH_START.size(), string::npos); unquote(line, path); attrs.clear(); } } else if (line.empty()) { continue; } else { // Should be attribute line if (line[0] != ' ') { cerr << "Found bad line (no space) at " << linenum << endl; exit(1); } string::size_type pos = find_first_unquoted(line, '='); if (pos == string::npos || pos < 2 || pos >= line.size()) { cerr << "Found bad line at " << linenum << endl; exit(1); } string qname = line.substr(1, pos-1); pair entry; unquote(qname, entry.first); unquote(line.substr(pos+1), entry.second); attrs.insert(entry); } } } static char *thisprog; static char usage [] = "pxattr [-hs] -n name pathname [...] : show value for name\n" "pxattr [-hs] -n name -r regexp pathname [...] : test value against regexp\n" "pxattr [-hs] -n name -v value pathname [...] : add/replace attribute\n" "pxattr [-hs] -x name pathname [...] : delete attribute\n" "pxattr [-hs] [-l] [-R] pathname [...] : list attribute names and values\n" " For all the options above, if no pathname arguments are given, pxattr\n" " will read file names on stdin, one per line.\n" " [-h] : don't follow symbolic links (act on link itself)\n" " [-R] : recursive listing. Args should be directory(ies)\n" " [-s] : be silent. With one option stdout is suppressed, with 2 stderr too\n" "pxattr -S Restore xattrs from file created by pxattr -lR output\n" " if backupfile is 'stdin', reads from stdin\n" "pxattr -T: run tests on temp file in current directory" "\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_h 0x2 #define OPT_l 0x4 #define OPT_n 0x8 #define OPT_r 0x10 #define OPT_R 0x20 #define OPT_S 0x40 #define OPT_T 0x80 #define OPT_s 0x100 #define OPT_v 0x200 #define OPT_x 0x400 // Static values for ftw static string name, value; bool regex_test(const char *path, regex_t *preg) { string value; if (!pxattr::get(path, name, &value)) { if (errno == ENOENT) { return false; } printsyserr("pxattr::get"); return false; } int ret = regexec(preg, value.c_str(), 0, 0, 0); if (ret == 0) { message(path << endl); return true; } else if (ret == REG_NOMATCH) { return false; } else { char errmsg[200]; regerror(ret, preg, errmsg, 200); errno = 0; printsyserr("regexec"); return false; } } bool processfile(const char* fn, const struct stat *, int) { //message("processfile " << fn << " opflags " << op_flags << endl); if (op_flags & OPT_l) { return listattrs(fn); } else if (op_flags & OPT_n) { if (op_flags & OPT_v) { return setxattr(fn, name, value); } else { return printxattr(fn, name); } } else if (op_flags & OPT_x) { return delxattr(fn, name); } Usage(); } int ftwprocessfile(const char* fn, const struct stat *sb, int typeflag) { processfile(fn, sb, typeflag); return 0; } int main(int argc, char **argv) { const char *regexp_string; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'l': op_flags |= OPT_l; break; case 'n': op_flags |= OPT_n; if (argc < 2) Usage(); name = *(++argv); argc--; goto b1; case 'R': op_flags |= OPT_R; break; case 'r': op_flags |= OPT_r; if (argc < 2) Usage(); regexp_string = *(++argv); argc--; goto b1; case 's': antiverbose++; break; case 'S': op_flags |= OPT_S; break; case 'T': op_flags |= OPT_T; break; case 'v': op_flags |= OPT_v; if (argc < 2) Usage(); value = *(++argv); argc--; goto b1; case 'x': op_flags |= OPT_x; if (argc < 2) Usage(); name = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (op_flags & OPT_T) { if (argc > 0) Usage(); dotests(); exit(0); } if ((op_flags & OPT_r) && !(op_flags & OPT_n)) { Usage(); } if (op_flags & OPT_S) { if (argc != 1) Usage(); restore(argv[0]); exit(0); } regex_t regexp; if (op_flags & OPT_r) { int err = regcomp(®exp, regexp_string, REG_NOSUB|REG_EXTENDED); if (err) { char errmsg[200]; regerror(err, ®exp, errmsg, 200); cerr << "regcomp(" << regexp_string << ") error: " << errmsg << endl; exit(1); } } // Default option is 'list' if ((op_flags&(OPT_l|OPT_n|OPT_x)) == 0) op_flags |= OPT_l; bool readstdin = false; if (argc == 0) readstdin = true; int exitvalue = 0; for (;;) { const char *fn = 0; if (argc > 0) { fn = *argv++; argc--; } else if (readstdin) { static char filename[1025]; if (!fgets(filename, 1024, stdin)) break; filename[strlen(filename)-1] = 0; fn = filename; } else break; if (op_flags & OPT_R) { if (ftw(fn, ftwprocessfile, 20)) exit(1); } else if (op_flags & OPT_r) { if (!regex_test(fn, ®exp)) { exitvalue = 1; } } else { if (!processfile(fn, 0, 0)) { exitvalue = 1; } } } exit(exitvalue); } static void fatal(const string& s) { printsyserr(s.c_str()); exit(1); } static bool testbackups() { static const char *top = "ttop"; static const char *d1 = "d1"; static const char *d2 = "d2"; static const char *tfn1 = "tpxattr1.txt"; static const char *tfn2 = "tpxattr2.txt"; static const char *dump = "attrdump.txt"; static const char *NAMES[] = {"ORG.PXATTR.NAME1", "ORG=PXATTR\"=\\=\n", "=", "Name4"}; static const char *VALUES[] = {"VALUE1", "VALUE2", "VALUE3=VALUE3equal", "VALUE4\n is more like" " normal text\n with new lines and \"\\\" \\\" backslashes"}; static const int nattrs = sizeof(NAMES) / sizeof(char *); if (mkdir(top, 0777)) fatal("Cant mkdir ttop"); if (chdir(top)) fatal("cant chdir ttop"); if (mkdir(d1, 0777) || mkdir(d2, 0777)) fatal("Can't mkdir ttdop/dx\n"); if (chdir(d1)) fatal("chdir d1"); int fd; if ((fd = open(tfn1, O_RDWR|O_CREAT, 0755)) < 0) fatal("create d1/tpxattr1.txt"); /* Set attrs */ for (int i = 0; i < nattrs; i++) { if (!pxattr::set(fd, NAMES[i], VALUES[i])) fatal("pxattr::set"); } close(fd); if ((fd = open(tfn2, O_RDWR|O_CREAT, 0755)) < 0) fatal("create d1/tpxattr2.txt"); /* Set attrs */ for (int i = 0; i < nattrs; i++) { if (!pxattr::set(fd, NAMES[i], VALUES[i])) fatal("pxattr::set"); } close(fd); /* Create dump */ string cmd; cmd = string("pxattr -lR . > " ) + dump; if (system(cmd.c_str())) fatal(cmd + " in d1"); if (chdir("../d2")) fatal("chdir ../d2"); if (close(open(tfn1, O_RDWR|O_CREAT, 0755))) fatal("create d2/tpxattr.txt"); if (close(open(tfn2, O_RDWR|O_CREAT, 0755))) fatal("create d2/tpxattr.txt"); cmd = string("pxattr -S ../d1/" ) + dump; if (system(cmd.c_str())) fatal(cmd); cmd = string("pxattr -lR . > " ) + dump; if (system(cmd.c_str())) fatal(cmd + " in d2"); cmd = string("diff ../d1/") + dump + " " + dump; if (system(cmd.c_str())) fatal(cmd); cmd = string("cat ") + dump; system(cmd.c_str()); if (1) { unlink(dump); unlink(tfn1); unlink(tfn2); if (chdir("../d1")) fatal("chdir ../d1"); unlink(dump); unlink(tfn1); unlink(tfn2); if (chdir("../")) fatal("chdir .. 1"); if (rmdir(d1)) fatal("rmdir d1"); if (rmdir(d2)) fatal("rmdir d2"); if (chdir("../")) fatal("chdir .. 2"); if (rmdir(top)) fatal("rmdir ttop"); } return true; } static void dotests() { static const char *tfn = "pxattr_testtmp.xyz"; static const char *NAMES[] = {"ORG.PXATTR.NAME1", "ORG.PXATTR.N2", "ORG.PXATTR.LONGGGGGGGGisSSSHHHHHHHHHNAME3"}; static const char *VALUES[] = {"VALUE1", "VALUE2", "VALUE3"}; /* Create test file if it doesn't exist, remove all attributes */ int fd = open(tfn, O_RDWR|O_CREAT, 0755); if (fd < 0) { printsyserr("open/create"); exit(1); } if (!antiverbose) message("Cleanup old attrs\n"); vector names; if (!pxattr::list(tfn, &names)) { printsyserr("pxattr::list"); exit(1); } for (vector::const_iterator it = names.begin(); it != names.end(); it++) { string value; if (!pxattr::del(fd, *it)) { printsyserr("pxattr::del"); exit(1); } } /* Check that there are no attributes left */ names.clear(); if (!pxattr::list(tfn, &names)) { printsyserr("pxattr::list"); exit(1); } if (names.size() != 0) { errno=0;printsyserr("Attributes remain after initial cleanup !\n"); for (vector::const_iterator it = names.begin(); it != names.end(); it++) { if (antiverbose < 2) cerr << *it << endl; } exit(1); } /* Create attributes, check existence and value */ message("Creating extended attributes\n"); for (int i = 0; i < 3; i++) { if (!pxattr::set(fd, NAMES[i], VALUES[i])) { printsyserr("pxattr::set"); exit(1); } } message("Checking creation\n"); for (int i = 0; i < 3; i++) { string value; if (!pxattr::get(tfn, NAMES[i], &value)) { printsyserr("pxattr::get"); exit(1); } if (value.compare(VALUES[i])) { errno = 0; printsyserr("Wrong value after create !"); exit(1); } } /* Delete one, check list */ message("Delete one\n"); if (!pxattr::del(tfn, NAMES[1])) { printsyserr("pxattr::del one name"); exit(1); } message("Check list\n"); for (int i = 0; i < 3; i++) { string value; if (!pxattr::get(fd, NAMES[i], &value)) { if (i == 1) continue; printsyserr("pxattr::get"); exit(1); } else if (i == 1) { errno=0; printsyserr("Name at index 1 still exists after deletion\n"); exit(1); } if (value.compare(VALUES[i])) { errno = 0; printsyserr("Wrong value after delete 1 !"); exit(1); } } /* Test the CREATE/REPLACE flags */ // Set existing with flag CREATE should fail message("Testing CREATE/REPLACE flags use\n"); if (pxattr::set(tfn, NAMES[0], VALUES[0], pxattr::PXATTR_CREATE)) { errno=0;printsyserr("Create existing with flag CREATE succeeded !\n"); exit(1); } // Set new with flag REPLACE should fail if (pxattr::set(tfn, NAMES[1], VALUES[1], pxattr::PXATTR_REPLACE)) { errno=0;printsyserr("Create new with flag REPLACE succeeded !\n"); exit(1); } // Set new with flag CREATE should succeed if (!pxattr::set(fd, NAMES[1], VALUES[1], pxattr::PXATTR_CREATE)) { errno=0;printsyserr("Create new with flag CREATE failed !\n"); exit(1); } // Set existing with flag REPLACE should succeed if (!pxattr::set(fd, NAMES[0], VALUES[0], pxattr::PXATTR_REPLACE)) { errno=0;printsyserr("Create existing with flag REPLACE failed !\n"); exit(1); } close(fd); unlink(tfn); if (testbackups()) exit(0); exit(1); } #endif // Testing pxattr #endif // Supported systems. recoll-1.23.7/utils/strmatcher.cpp0000644000175000017500000000633313125637102014032 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #ifdef _WIN32 #include #else #include #endif #include #include #include "cstr.h" #include "log.h" #include "pathut.h" #include "strmatcher.h" using namespace std; bool StrWildMatcher::match(const string& val) const { LOGDEB2("StrWildMatcher::match: [" << (m_sexp) << "] against [" << (val) << "]\n" ); int ret = fnmatch(m_sexp.c_str(), val.c_str(), FNM_NOESCAPE); switch (ret) { case 0: return true; case FNM_NOMATCH: return false; default: LOGINFO("StrWildMatcher::match:err: e [" << (m_sexp) << "] s [" << (val) << "] (" << (url_encode(val)) << ") ret " << (ret) << "\n" ); return false; } } string::size_type StrWildMatcher::baseprefixlen() const { return m_sexp.find_first_of(cstr_wildSpecStChars); } StrRegexpMatcher::StrRegexpMatcher(const string& exp) : StrMatcher(exp), m_compiled(0), m_errcode(0) { setExp(exp); } bool StrRegexpMatcher::setExp(const string& exp) { if (m_compiled) { #ifdef _WIN32 delete (regex*)m_compiled; #else regfree((regex_t*)m_compiled); delete (regex_t*)m_compiled; #endif } m_compiled = 0; #ifdef _WIN32 try { m_compiled = new regex(exp, std::regex_constants::nosubs | std::regex_constants::extended); } catch (...) { m_reason = string("StrRegexpMatcher:regcomp failed for ") + exp + string("syntax error ?"); return false; } #else m_compiled = new regex_t; if ((m_errcode = regcomp((regex_t*)m_compiled, exp.c_str(), REG_EXTENDED|REG_NOSUB))) { char errbuf[200]; regerror(m_errcode, (regex_t*)m_compiled, errbuf, 199); m_reason = string("StrRegexpMatcher:regcomp failed for ") + exp + string(errbuf); return false; } #endif m_sexp = exp; return true; } StrRegexpMatcher::~StrRegexpMatcher() { if (m_compiled) { #ifdef _WIN32 delete (regex *)m_compiled; #else regfree((regex_t*)m_compiled); delete (regex_t*)m_compiled; #endif } } bool StrRegexpMatcher::match(const string& val) const { if (m_errcode) return false; #ifdef _WIN32 return regex_match(val, *((regex *)m_compiled)); #else return regexec((regex_t*)m_compiled, val.c_str(), 0, 0, 0) != REG_NOMATCH; #endif } string::size_type StrRegexpMatcher::baseprefixlen() const { return m_sexp.find_first_of(cstr_regSpecStChars); } bool StrRegexpMatcher::ok() const { return !m_errcode; } recoll-1.23.7/utils/netcon.h0000644000175000017500000003062413224431020012600 00000000000000#ifndef _NETCON_H_ #define _NETCON_H_ /* Copyright (C) 2002 Jean-Francois Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include #include #include /// A set of classes to manage client-server communication over a /// connection-oriented network, or a pipe. /// /// The listening/connection-accepting code currently only uses /// TCP. The classes include client-side and server-side (accepting) /// endpoints. Netcon also has server-side static code to handle a set /// of client connections in parallel. This should be moved to a /// friend class. /// /// The client data transfer class can also be used for /// timeout-protected/asynchronous io using a given fd (ie a pipe /// descriptor) /// Base class for all network endpoints: class Netcon; typedef std::shared_ptr NetconP; class SelectLoop; class Netcon { public: enum Event {NETCONPOLL_READ = 0x1, NETCONPOLL_WRITE = 0x2}; Netcon() : m_peer(0), m_fd(-1), m_ownfd(true), m_didtimo(0), m_wantedEvents(0), m_loop(0) { } virtual ~Netcon(); /// Remember whom we're talking to. We let external code do this because /// the application may have a non-dns method to find the peer name. virtual void setpeer(const char *hostname); /// Retrieve the peer's hostname. Only works if it was set before ! virtual const char *getpeer() { return m_peer ? (const char *)m_peer : "none"; } /// Set or reset the TCP_NODELAY option. virtual int settcpnodelay(int on = 1); /// Did the last receive() call time out ? Resets the flag. virtual int timedout() { int s = m_didtimo; m_didtimo = 0; return s; } /// Return string version of last syscall error virtual char *sterror(); /// Return the socket descriptor virtual int getfd() { return m_fd; } /// Close the current connection if it is open virtual void closeconn(); /// Set/reset the non-blocking flag on the underlying fd. Returns /// prev state The default is that sockets are blocking except /// when added to the selectloop, or, transparently, to handle /// connection timeout issues. virtual int set_nonblock(int onoff); /// Decide what events the connection will be looking for /// (NETCONPOLL_READ, NETCONPOLL_WRITE) int setselevents(int evs); /// Retrieve the connection's currently monitored set of events int getselevents() { return m_wantedEvents; } friend class SelectLoop; SelectLoop *getloop() { return m_loop; } /// Utility function for a simplified select() interface: check one fd /// for reading or writing, for a specified maximum number of seconds. static int select1(int fd, int secs, int writing = 0); protected: char *m_peer; // Name of the connected host int m_fd; bool m_ownfd; int m_didtimo; // Used when part of the selectloop. short m_wantedEvents; SelectLoop *m_loop; // Method called by the selectloop when something can be done with a netcon virtual int cando(Netcon::Event reason) = 0; // Called when added to loop virtual void setloop(SelectLoop *loop) { m_loop = loop; } }; /// The selectloop interface is used to implement parallel servers. // The select loop mechanism allows several netcons to be used for io // in a program without blocking as long as there is data to be read // or written. In a multithread program, if each thread needs // non-blocking IO it may make sense to have one SelectLoop active per // thread. class SelectLoop { public: SelectLoop(); SelectLoop(const SelectLoop&) = delete; SelectLoop& operator=(const SelectLoop&) = delete; ~SelectLoop(); /// Add a connection to be monitored (this will usually be called /// from the server's listen connection's accept callback) int addselcon(NetconP con, int events); /// Remove a connection from the monitored set. This is /// automatically called when EOF is detected on a connection. int remselcon(NetconP con); /// Set a function to be called periodically, or a time before return. /// @param handler the function to be called. /// - if it is 0, doLoop() will return after ms mS (and can be called /// again) /// - if it is not 0, it will be called at ms mS intervals. If its return /// value is <= 0, selectloop will return. /// @param clp client data to be passed to handler at every call. /// @param ms milliseconds interval between handler calls or /// before return. Set to 0 for no periodic handler. void setperiodichandler(int (*handler)(void *), void *clp, int ms); /// Loop waiting for events on the connections and call the /// cando() method on the object when something happens (this will in /// turn typically call the app callback set on the netcon). Possibly /// call the periodic handler (if set) at regular intervals. /// @return -1 for error. 0 if no descriptors left for i/o. 1 for periodic /// timeout (should call back in after processing) int doLoop(); /// Call from data handler: make doLoop() return @param value void loopReturn(int value); friend class Netcon; private: class Internal; Internal *m; }; /////////////////////// class NetconData; /// Class for the application callback routine (when in selectloop). /// /// This is set by the app on the NetconData by calling /// setcallback(). It is then called from the NetconData's cando() /// routine, itself called by selectloop. /// /// It would be nicer to override cando() in a subclass instead of /// setting a callback, but this can't be done conveniently because /// accept() always creates a base NetconData (another approach would /// be to pass a factory function to the listener, to create /// NetconData derived classes). class NetconWorker { public: virtual ~NetconWorker() {} virtual int data(NetconData *con, Netcon::Event reason) = 0; }; /// Base class for connections that actually transfer data. T class NetconData : public Netcon { public: NetconData(bool cancellable = false); virtual ~NetconData(); /// Write data to the connection. /// @param buf the data buffer /// @param cnt the number of bytes we should try to send /// @param expedited send data in as 'expedited' data. /// @return the count of bytes actually transferred, -1 if an /// error occurred. virtual int send(const char *buf, int cnt, int expedited = 0); /// Read from the connection /// @param buf the data buffer /// @param cnt the number of bytes we should try to read (but we return /// as soon as we get data) /// @param timeo maximum number of seconds we should be waiting for data. /// @return the count of bytes actually read (0 for EOF), or /// TimeoutOrError (-1) for timeout or error (call timedout() to /// discriminate and reset), Cancelled (-2) if cancelled. enum RcvReason {Eof = 0, TimeoutOrError = -1, Cancelled = -2}; virtual int receive(char *buf, int cnt, int timeo = -1); virtual void cancelReceive(); /// Loop on receive until cnt bytes are actually read or a timeout occurs virtual int doreceive(char *buf, int cnt, int timeo = -1); /// Read a line of text on an ascii connection. Returns -1 or byte count /// including final 0. \n is kept virtual int getline(char *buf, int cnt, int timeo = -1); /// Set handler to be called when the connection is placed in the /// selectloop and an event occurs. virtual void setcallback(std::shared_ptr user) { m_user = user; } private: char *m_buf; // Buffer. Only used when doing getline()s char *m_bufbase; // Pointer to current 1st byte of useful data int m_bufbytes; // Bytes of data. int m_bufsize; // Total buffer size int m_wkfds[2]; std::shared_ptr m_user; virtual int cando(Netcon::Event reason); // Selectloop slot }; /// Network endpoint, client side. class NetconCli : public NetconData { public: NetconCli(bool cancellable = false) : NetconData(cancellable), m_silentconnectfailure(false) { } /// Open connection to specified host and named service. Set host /// to an absolute path name for an AF_UNIX service. serv is /// ignored in this case. int openconn(const char *host, const char *serv, int timeo = -1); /// Open connection to specified host and numeric port. port is in /// HOST byte order. Set host to an absolute path name for an /// AF_UNIX service. serv is ignored in this case. int openconn(const char *host, unsigned int port, int timeo = -1); /// Reuse existing fd. /// We DONT take ownership of the fd, and do no closin' EVEN on an /// explicit closeconn() or setconn() (use getfd(), close, /// setconn(-1) if you need to really close the fd and have no /// other copy). int setconn(int fd); /// Do not log message if openconn() fails. void setSilentFail(bool onoff) { m_silentconnectfailure = onoff; } private: bool m_silentconnectfailure; // No logging of connection failures if set }; class NetconServCon; #ifdef NETCON_ACCESSCONTROL struct intarrayparam { int len; unsigned int *intarray; }; #endif /* NETCON_ACCESSCONTROL */ /// Server listening end point. /// /// if NETCON_ACCESSCONTROL is defined during compilation, /// NetconServLis has primitive access control features: okaddrs holds /// the host addresses for the hosts which we allow to connect to /// us. okmasks holds the masks to be used for comparison. okmasks /// can be shorter than okaddrs, in which case we use the last entry /// for all addrs beyond the masks array length. Both arrays are /// retrieved from the configuration file when we create the endpoint /// the key is either based on the service name (ex: cdpathdb_okaddrs, /// cdpathdb_okmasks), or "default" if the service name is not found /// (ex: default_okaddrs, default_okmasks) class NetconServLis : public Netcon { public: NetconServLis() { #ifdef NETCON_ACCESSCONTROL permsinit = 0; okaddrs.len = okmasks.len = 0; okaddrs.intarray = okmasks.intarray = 0; #endif /* NETCON_ACCESSCONTROL */ } ~NetconServLis(); /// Open named service. Used absolute pathname to create an /// AF_UNIX path-based socket instead of an IP one. int openservice(const char *serv, int backlog = 10); /// Open service by port number. int openservice(int port, int backlog = 10); /// Wait for incoming connection. Returned connected Netcon NetconServCon *accept(int timeo = -1); protected: /// This should be overriden in a derived class to handle incoming /// connections. It will usually call NetconServLis::accept(), and /// insert the new connection in the selectloop. virtual int cando(Netcon::Event reason); // Empty if port was numeric, else service name or socket path std::string m_serv; private: #ifdef NETCON_ACCESSCONTROL int permsinit; struct intarrayparam okaddrs; struct intarrayparam okmasks; int initperms(const char *servicename); int initperms(int port); int checkperms(void *cli, int clilen); #endif /* NETCON_ACCESSCONTROL */ }; /// Server-side accepted client connection. The only specific code /// allows closing the listening endpoint in the child process (in the /// case of a forking server) class NetconServCon : public NetconData { public: NetconServCon(int newfd, Netcon* lis = 0) { m_liscon = lis; m_fd = newfd; } /// This is for forked servers that want to get rid of the main socket void closeLisCon() { if (m_liscon) { m_liscon->closeconn(); } } private: Netcon* m_liscon; }; #endif /* _NETCON_H_ */ recoll-1.23.7/utils/log.cpp0000644000175000017500000000341213125637102012432 00000000000000/* Copyright (C) 2006-2016 J.F.Dockes * * This library 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 (at your option) any later version. * * This library 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 library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA */ #include "log.h" #include #include using namespace std; Logger::Logger(const std::string& fn) : m_tocerr(false), m_loglevel(LLDEB), m_fn(fn) { reopen(fn); } bool Logger::reopen(const std::string& fn) { #if LOGGER_THREADSAFE std::unique_lock lock(m_mutex); #endif if (!fn.empty()) { m_fn = fn; } if (!m_tocerr && m_stream.is_open()) { m_stream.close(); } if (!m_fn.empty() && m_fn.compare("stderr")) { m_stream.open(m_fn, std::fstream::out | std::ofstream::trunc); if (!m_stream.is_open()) { cerr << "Logger::Logger: log open failed: for [" << fn << "] errno " << errno << endl; m_tocerr = true; } else { m_tocerr = false; } } else { m_tocerr = true; } return true; } static Logger *theLog; Logger *Logger::getTheLog(const string& fn) { if (theLog == 0) theLog = new Logger(fn); return theLog; } recoll-1.23.7/utils/wipedir.cpp0000644000175000017500000000731413125637102013321 00000000000000/* Copyright (C) 2004 J.F.Dockes * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_WIPEDIR #include "autoconfig.h" #include #include "safefcntl.h" #include #include "safesysstat.h" #include "safeunistd.h" #include #include #include #include "log.h" #include "pathut.h" #include "wipedir.h" using namespace std; int wipedir(const string& dir, bool selfalso, bool recurse) { struct stat st; int statret; int ret = -1; statret = lstat(dir.c_str(), &st); if (statret == -1) { LOGERR("wipedir: cant stat " << (dir) << ", errno " << (errno) << "\n" ); return -1; } if (!S_ISDIR(st.st_mode)) { LOGERR("wipedir: " << (dir) << " not a directory\n" ); return -1; } if (access(dir.c_str(), R_OK|W_OK|X_OK) < 0) { LOGERR("wipedir: no write access to " << (dir) << "\n" ); return -1; } DIR *d = opendir(dir.c_str()); if (d == 0) { LOGERR("wipedir: cant opendir " << (dir) << ", errno " << (errno) << "\n" ); return -1; } int remaining = 0; struct dirent *ent; while ((ent = readdir(d)) != 0) { if (!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) continue; string fn = path_cat(dir, ent->d_name); struct stat st; int statret = lstat(fn.c_str(), &st); if (statret == -1) { LOGERR("wipedir: cant stat " << (fn) << ", errno " << (errno) << "\n" ); goto out; } if (S_ISDIR(st.st_mode)) { if (recurse) { int rr = wipedir(fn, true, true); if (rr == -1) goto out; else remaining += rr; } else { remaining++; } } else { if (unlink(fn.c_str()) < 0) { LOGERR("wipedir: cant unlink " << (fn) << ", errno " << (errno) << "\n" ); goto out; } } } ret = remaining; if (selfalso && ret == 0) { if (rmdir(dir.c_str()) < 0) { LOGERR("wipedir: rmdir(" << (dir) << ") failed, errno " << (errno) << "\n" ); ret = -1; } } out: if (d) closedir(d); return ret; } #else // FILEUT_TEST #include #include #include "wipedir.h" using namespace std; static const char *thisprog; static int op_flags; #define OPT_MOINS 0x1 #define OPT_r 0x2 #define OPT_s 0x4 static char usage [] = "wipedir [-r -s] topdir\n" " -r : recurse\n" " -s : also delete topdir\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } int main(int argc, const char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'r': op_flags |= OPT_r; break; case 's': op_flags |= OPT_s; break; default: Usage(); break; } b1: argc--; argv++; } if (argc != 1) Usage(); string dir = *argv++;argc--; bool topalso = ((op_flags&OPT_s) != 0); bool recurse = ((op_flags&OPT_r) != 0); int cnt = wipedir(dir, topalso, recurse); printf("wipedir returned %d\n", cnt); exit(0); } #endif recoll-1.23.7/utils/cancelcheck.h0000644000175000017500000000427613125527323013555 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CANCELCHECK_H_INCLUDED_ #define _CANCELCHECK_H_INCLUDED_ /** * Common cancel checking mechanism * * The CancelCheck class is used as a singleton objet (private constructor). * The single instance can be accessed as CancelCheck::instance. * It is used as follows, in an asynchronous program where there is an * interactive (or otherwise controlling) task and a long-working one: * - The control task calls setCancel(), usually as a result of user * interaction, if the worker takes too long. * - The worker task calls checkCancel() at regular intervals, possibly as * a side-effect of some other progress-reporting call. If cancellation has * been requested, this will raise an exception, to be catched and processed * wherever the worker was invoked. * The worker side must be exception-clean, but this otherwise avoids * having to set-up code to handle a special cancellation error along * the whole worker call stack. */ class CancelExcept {}; class CancelCheck { public: static CancelCheck& instance(); void setCancel(bool on = true) { cancelRequested = on; } void checkCancel() { if (cancelRequested) { throw CancelExcept(); } } bool cancelState() {return cancelRequested;} private: bool cancelRequested; CancelCheck() : cancelRequested(false) {} CancelCheck& operator=(CancelCheck&); CancelCheck(const CancelCheck&); }; #endif /* _CANCELCHECK_H_INCLUDED_ */ recoll-1.23.7/utils/base64.cpp0000644000175000017500000002450113125527323012742 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include using std::string; #undef DEBUG_BASE64 #ifdef DEBUG_BASE64 #define DPRINT(X) fprintf X #else #define DPRINT(X) #endif // This is adapted from FreeBSD's code, quite modified for performance. // Tests on a Mac pro 2.1G with a 166MB base64 file // // The original version used strchr to lookup the base64 value from // the input code: // real 0m13.053s user 0m12.574s sys 0m0.471s // Using a direct access, 256 entries table: // real 0m3.073s user 0m2.600s sys 0m0.439s // Using a variable to hold the array length (instead of in.length()): // real 0m2.972s user 0m2.527s sys 0m0.433s // Using values from the table instead of isspace() (final) // real 0m2.513s user 0m2.059s sys 0m0.439s // // The table has one entry per char value (0-256). Invalid base64 // chars take value 256, whitespace 255, Pad ('=') 254. // Valid char points contain their base64 value (0-63) static const int b64values[] = { /* 0 */ 256,/* 1 */ 256,/* 2 */ 256,/* 3 */ 256,/* 4 */ 256, /* 5 */ 256,/* 6 */ 256,/* 7 */ 256,/* 8 */ 256, /*9 ht */ 255,/* 10 nl */ 255,/* 11 vt */ 255,/* 12 np/ff*/ 255,/* 13 cr */ 255, /* 14 */ 256,/* 15 */ 256,/* 16 */ 256,/* 17 */ 256,/* 18 */ 256,/* 19 */ 256, /* 20 */ 256,/* 21 */ 256,/* 22 */ 256,/* 23 */ 256,/* 24 */ 256,/* 25 */ 256, /* 26 */ 256,/* 27 */ 256,/* 28 */ 256,/* 29 */ 256,/* 30 */ 256,/* 31 */ 256, /* 32 sp */ 255, /* ! */ 256,/* " */ 256,/* # */ 256,/* $ */ 256,/* % */ 256, /* & */ 256,/* ' */ 256,/* ( */ 256,/* ) */ 256,/* * */ 256, /* + */ 62, /* , */ 256,/* - */ 256,/* . */ 256, /* / */ 63, /* 0 */ 52,/* 1 */ 53,/* 2 */ 54,/* 3 */ 55,/* 4 */ 56,/* 5 */ 57,/* 6 */ 58, /* 7 */ 59,/* 8 */ 60,/* 9 */ 61, /* : */ 256,/* ; */ 256,/* < */ 256, /* = */ 254, /* > */ 256,/* ? */ 256,/* @ */ 256, /* A */ 0,/* B */ 1,/* C */ 2,/* D */ 3,/* E */ 4,/* F */ 5,/* G */ 6,/* H */ 7, /* I */ 8,/* J */ 9,/* K */ 10,/* L */ 11,/* M */ 12,/* N */ 13,/* O */ 14, /* P */ 15,/* Q */ 16,/* R */ 17,/* S */ 18,/* T */ 19,/* U */ 20,/* V */ 21, /* W */ 22,/* X */ 23,/* Y */ 24,/* Z */ 25, /* [ */ 256,/* \ */ 256,/* ] */ 256,/* ^ */ 256,/* _ */ 256,/* ` */ 256, /* a */ 26,/* b */ 27,/* c */ 28,/* d */ 29,/* e */ 30,/* f */ 31,/* g */ 32, /* h */ 33,/* i */ 34,/* j */ 35,/* k */ 36,/* l */ 37,/* m */ 38,/* n */ 39, /* o */ 40,/* p */ 41,/* q */ 42,/* r */ 43,/* s */ 44,/* t */ 45,/* u */ 46, /* v */ 47,/* w */ 48,/* x */ 49,/* y */ 50,/* z */ 51, /* { */ 256,/* | */ 256,/* } */ 256,/* ~ */ 256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256, 256,256,256,256,256,256,256,256, }; static const char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char Pad64 = '='; bool base64_decode(const string& in, string& out) { int io = 0, state = 0, ch = 0; unsigned int ii = 0; out.clear(); size_t ilen = in.length(); out.reserve(ilen); for (ii = 0; ii < ilen; ii++) { ch = (unsigned char)in[ii]; int value = b64values[ch]; if (value == 255) /* Skip whitespace anywhere. */ continue; if (ch == Pad64) break; if (value == 256) { /* A non-base64 character. */ DPRINT((stderr, "base64_dec: non-base64 char at pos %d\n", ii)); return false; } switch (state) { case 0: out += value << 2; state = 1; break; case 1: out[io] |= value >> 4; out += (value & 0x0f) << 4 ; io++; state = 2; break; case 2: out[io] |= value >> 2; out += (value & 0x03) << 6; io++; state = 3; break; case 3: out[io] |= value; io++; state = 0; break; default: fprintf(stderr, "base64_dec: internal!bad state!\n"); return false; } } /* * We are done decoding Base-64 chars. Let's see if we ended * on a byte boundary, and/or with erroneous trailing characters. */ if (ch == Pad64) { /* We got a pad char. */ ch = in[ii++]; /* Skip it, get next. */ switch (state) { case 0: /* Invalid = in first position */ case 1: /* Invalid = in second position */ DPRINT((stderr, "base64_dec: pad char in state 0/1\n")); return false; case 2: /* Valid, means one byte of info */ /* Skip any number of spaces. */ for (; ii < in.length(); ch = in[ii++]) if (!isspace((unsigned char)ch)) break; /* Make sure there is another trailing = sign. */ if (ch != Pad64) { DPRINT((stderr, "base64_dec: missing pad char!\n")); // Well, there are bad encoders out there. Let it pass // return false; } ch = in[ii++]; /* Skip the = */ /* Fall through to "single trailing =" case. */ /* FALLTHROUGH */ case 3: /* Valid, means two bytes of info */ /* * We know this char is an =. Is there anything but * whitespace after it? */ for (; ii < in.length(); ch = in[ii++]) if (!isspace((unsigned char)ch)) { DPRINT((stderr, "base64_dec: non-white at eod: 0x%x\n", (unsigned int)((unsigned char)ch))); // Well, there are bad encoders out there. Let it pass //return false; } /* * Now make sure for cases 2 and 3 that the "extra" * bits that slopped past the last full byte were * zeros. If we don't check them, they become a * subliminal channel. */ if (out[io] != 0) { DPRINT((stderr, "base64_dec: bad extra bits!\n")); // Well, there are bad encoders out there. Let it pass out[io] = 0; // return false; } // We've appended an extra 0. out.resize(io); } } else { /* * We ended by seeing the end of the string. Make sure we * have no partial bytes lying around. */ if (state != 0) { DPRINT((stderr, "base64_dec: bad final state\n")); return false; } } DPRINT((stderr, "base64_dec: ret ok, io %d sz %d len %d value [%s]\n", io, (int)out.size(), (int)out.length(), out.c_str())); return true; } #undef Assert #define Assert(X) void base64_encode(const string &in, string &out) { unsigned char input[3]; unsigned char output[4]; out.clear(); string::size_type srclength = in.length(); int sidx = 0; while (2 < srclength) { input[0] = in[sidx++]; input[1] = in[sidx++]; input[2] = in[sidx++]; srclength -= 3; output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); output[3] = input[2] & 0x3f; Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); Assert(output[3] < 64); out += Base64[output[0]]; out += Base64[output[1]]; out += Base64[output[2]]; out += Base64[output[3]]; } /* Now we worry about padding. */ if (0 != srclength) { /* Get what's left. */ input[0] = input[1] = input[2] = '\0'; for (string::size_type i = 0; i < srclength; i++) input[i] = in[sidx++]; output[0] = input[0] >> 2; output[1] = ((input[0] & 0x03) << 4) + (input[1] >> 4); output[2] = ((input[1] & 0x0f) << 2) + (input[2] >> 6); Assert(output[0] < 64); Assert(output[1] < 64); Assert(output[2] < 64); out += Base64[output[0]]; out += Base64[output[1]]; if (srclength == 1) out += Pad64; else out += Base64[output[2]]; out += Pad64; } return; } #ifdef TEST_BASE64 #include #include #include "readfile.h" const char *thisprog; static char usage [] = "testfile\n\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_i 0x2 #define OPT_P 0x4 int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'i': op_flags |= OPT_i; break; default: Usage(); break; } argc--; argv++; } if (op_flags & OPT_i) { const char *values[] = {"", "1", "12", "123", "1234", "12345", "123456"}; int nvalues = sizeof(values) / sizeof(char *); string in, out, back; int err = 0; for (int i = 0; i < nvalues; i++) { in = values[i]; base64_encode(in, out); base64_decode(out, back); if (in != back) { fprintf(stderr, "In [%s] %d != back [%s] %d (out [%s] %d\n", in.c_str(), int(in.length()), back.c_str(), int(back.length()), out.c_str(), int(out.length()) ); err++; } } in.erase(); in += char(0); in += char(0); in += char(0); in += char(0); base64_encode(in, out); base64_decode(out, back); if (in != back) { fprintf(stderr, "In [%s] %d != back [%s] %d (out [%s] %d\n", in.c_str(), int(in.length()), back.c_str(), int(back.length()), out.c_str(), int(out.length()) ); err++; } exit(!(err == 0)); } else { if (argc > 1) Usage(); string infile; if (argc == 1) infile = *argv++;argc--; string idata, reason; if (!file_to_string(infile, idata, &reason)) { fprintf(stderr, "Can't read file: %s\n", reason.c_str()); exit(1); } string odata; if (!base64_decode(idata, odata)) { fprintf(stderr, "Decoding failed\n"); exit(1); } fwrite(odata.c_str(), 1, odata.size() * sizeof(string::value_type), stdout); exit(0); } } #endif recoll-1.23.7/utils/idfile.cpp0000644000175000017500000001237013125637102013110 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_IDFILE #include "autoconfig.h" #include #include #include #include #include #include "idfile.h" #include "log.h" using namespace std; // Bogus code to avoid bogus valgrind mt warnings about the // initialization of treat_mbox_... which I can't even remember the // use of (it's not documented or ever set) static int treat_mbox_as_rfc822; class InitTMAR { public: InitTMAR() { treat_mbox_as_rfc822 = getenv("RECOLL_TREAT_MBOX_AS_RFC822") ? 1 : -1; } }; static InitTMAR initTM; /** * This code is currently ONLY used to identify mbox and mail message files * which are badly handled by standard mime type identifiers * There is a very old (circa 1990) mbox format using blocks of ^A (0x01) chars * to separate messages, that we don't recognize currently */ // Mail headers we compare to: static const char *mailhs[] = {"From: ", "Received: ", "Message-Id: ", "To: ", "Date: ", "Subject: ", "Status: ", "In-Reply-To: "}; static const int mailhsl[] = {6, 10, 12, 4, 6, 9, 8, 13}; static const int nmh = sizeof(mailhs) / sizeof(char *); const int wantnhead = 3; // fn is for message printing static string idFileInternal(istream& input, const char *fn) { bool line1HasFrom = false; bool gotnonempty = false; int lookslikemail = 0; // emacs VM sometimes inserts very long lines with continuations or // not (for folder information). This forces us to look at many // lines and long ones int lnum = 1; for (int loop = 1; loop < 200; loop++, lnum++) { #define LL 2*1024 char cline[LL+1]; cline[LL] = 0; input.getline(cline, LL-1); if (input.fail()) { if (input.bad()) { LOGERR("idfile: error while reading [" << (fn) << "]\n" ); return string(); } // Must be eof ? break; } // gcount includes the \n std::streamsize ll = input.gcount() - 1; if (ll > 0) gotnonempty = true; LOGDEB2("idfile: lnum " << (lnum) << " ll " << ((unsigned int)ll) << ": [" << (cline) << "]\n" ); // Check for a few things that can't be found in a mail file, // (optimization to get a quick negative) // Empty lines if (ll <= 0) { // Accept a few empty lines at the beginning of the file, // otherwise this is the end of headers if (gotnonempty || lnum > 10) { LOGDEB2("Got empty line\n" ); break; } else { // Don't increment the line counter for initial empty lines. lnum--; continue; } } // emacs vm can insert VERY long header lines. if (ll > LL - 20) { LOGDEB2("idFile: Line too long\n" ); return string(); } // Check for mbox 'From ' line if (lnum == 1 && !strncmp("From ", cline, 5)) { if (treat_mbox_as_rfc822 == -1) { line1HasFrom = true; LOGDEB2("idfile: line 1 has From_\n" ); } continue; } // Except for a possible first line with 'From ', lines must // begin with whitespace or have a colon // (hope no one comes up with a longer header name ! // Take care to convert to unsigned char because ms ctype does // like negative values if (!isspace((unsigned char)cline[0])) { char *cp = strchr(cline, ':'); if (cp == 0 || (cp - cline) > 70) { LOGDEB2("idfile: can't be mail header line: [" << (cline) << "]\n" ); break; } } // Compare to known headers for (int i = 0; i < nmh; i++) { if (!strncasecmp(mailhs[i], cline, mailhsl[i])) { //fprintf(stderr, "Got [%s]\n", mailhs[i]); lookslikemail++; break; } } if (lookslikemail >= wantnhead) break; } if (line1HasFrom) lookslikemail++; if (lookslikemail >= wantnhead) return line1HasFrom ? string("text/x-mail") : string("message/rfc822"); return string(); } string idFile(const char *fn) { ifstream input; input.open(fn, ios::in); if (!input.is_open()) { LOGERR("idFile: could not open [" << (fn) << "]\n" ); return string(); } return idFileInternal(input, fn); } string idFileMem(const string& data) { stringstream s(data, stringstream::in); return idFileInternal(s, ""); } #else #include #include #include #include #include using namespace std; #include "log.h" #include "idfile.h" int main(int argc, char **argv) { if (argc < 2) { cerr << "Usage: idfile filename" << endl; exit(1); } DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); for (int i = 1; i < argc; i++) { string mime = idFile(argv[i]); cout << argv[i] << " : " << mime << endl; } exit(0); } #endif recoll-1.23.7/utils/utf8iter.h0000644000175000017500000001672413125637102013102 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UTF8ITER_H_INCLUDED_ #define _UTF8ITER_H_INCLUDED_ #ifdef UTF8ITER_CHECK #include "assert.h" #endif #include /** * A small helper class to iterate over utf8 strings. This is not an * STL iterator and does not much error checking. It is designed purely * for recoll usage, where the utf-8 string comes out of iconv in most cases * and is assumed legal. We just try to catch cases where there would be * a risk of crash. */ class Utf8Iter { public: Utf8Iter(const std::string &in) : m_sp(&in), m_cl(0), m_pos(0), m_charpos(0) { update_cl(); } const std::string& buffer() const {return (*m_sp);} void rewind() { m_cl = 0; m_pos = 0; m_charpos = 0; update_cl(); } /** "Direct" access. Awfully inefficient as we skip from start or current * position at best. This can only be useful for a lookahead from the * current position */ unsigned int operator[](std::string::size_type charpos) const { std::string::size_type mypos = 0; unsigned int mycp = 0; if (charpos >= m_charpos) { mypos = m_pos; mycp = m_charpos; } int l; while (mypos < m_sp->length() && mycp != charpos) { l = get_cl(mypos); if (l <= 0 || !poslok(mypos, l) || !checkvalidat(mypos, l)) return (unsigned int)-1; mypos += l; ++mycp; } if (mypos < m_sp->length() && mycp == charpos) { l = get_cl(mypos); if (poslok(mypos, l) && checkvalidat(mypos, l)) return getvalueat(mypos, l); } return (unsigned int)-1; } /** Increment current position to next utf-8 char */ std::string::size_type operator++(int) { // Note: m_cl may be zero at eof if user's test not right // this shouldn't crash the program until actual data access #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif if (m_cl == 0) return std::string::npos; m_pos += m_cl; m_charpos++; update_cl(); return m_pos; } /** operator* returns the ucs4 value as a machine integer*/ unsigned int operator*() { #ifdef UTF8ITER_CHECK assert(m_cl > 0); #endif return m_cl == 0 ? (unsigned int)-1 : getvalueat(m_pos, m_cl); } /** Append current utf-8 possibly multi-byte character to string param. This needs to be fast. No error checking. */ unsigned int appendchartostring(std::string &out) const { #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif out.append(&(*m_sp)[m_pos], m_cl); return m_cl; } /** Return current character as string */ operator std::string() { #ifdef UTF8ITER_CHECK assert(m_cl != 0); #endif return m_cl > 0 ? m_sp->substr(m_pos, m_cl) : std::string(); } bool eof() const { return m_pos == m_sp->length(); } bool error() const { return m_cl == 0; } /** Return current byte offset in input string */ std::string::size_type getBpos() const { return m_pos; } /** Return current character length */ std::string::size_type getBlen() const { return m_cl; } /** Return current unicode character offset in input string */ std::string::size_type getCpos() const { return m_charpos; } private: // String we're working with const std::string* m_sp; // Character length at current position. A value of zero indicates // an error. unsigned int m_cl; // Current byte offset in string. std::string::size_type m_pos; // Current character position unsigned int m_charpos; // Check position and cl against string length bool poslok(std::string::size_type p, int l) const { #ifdef UTF8ITER_CHECK assert(p != std::string::npos && l > 0 && p + l <= m_sp->length()); #endif return p != std::string::npos && l > 0 && p + l <= m_sp->length(); } // Update current char length in object state, check // for errors inline void update_cl() { m_cl = 0; if (m_pos >= m_sp->length()) return; m_cl = get_cl(m_pos); if (!poslok(m_pos, m_cl)) { // Used to set eof here for safety, but this is bad because it // basically prevents the caller to discriminate error and eof. // m_pos = m_sp->length(); m_cl = 0; return; } if (!checkvalidat(m_pos, m_cl)) { m_cl = 0; } } inline bool checkvalidat(std::string::size_type p, int l) const { switch (l) { case 1: return (unsigned char)(*m_sp)[p] < 128; case 2: return (((unsigned char)(*m_sp)[p]) & 224) == 192 && (((unsigned char)(*m_sp)[p+1]) & 192) == 128; case 3: return (((unsigned char)(*m_sp)[p]) & 240) == 224 && (((unsigned char)(*m_sp)[p+1]) & 192) == 128 && (((unsigned char)(*m_sp)[p+2]) & 192) == 128 ; case 4: return (((unsigned char)(*m_sp)[p]) & 248) == 240 && (((unsigned char)(*m_sp)[p+1]) & 192) == 128 && (((unsigned char)(*m_sp)[p+2]) & 192) == 128 && (((unsigned char)(*m_sp)[p+3]) & 192) == 128 ; default: return false; } } // Get character byte length at specified position. Returns 0 for error. inline int get_cl(std::string::size_type p) const { unsigned int z = (unsigned char)(*m_sp)[p]; if (z <= 127) { return 1; } else if ((z & 224) == 192) { return 2; } else if ((z & 240) == 224) { return 3; } else if ((z & 248) == 240) { return 4; } #ifdef UTF8ITER_CHECK assert(z <= 127 || (z & 224) == 192 || (z & 240) == 224 || (z & 248) == 240); #endif return 0; } // Compute value at given position. No error checking. inline unsigned int getvalueat(std::string::size_type p, int l) const { switch (l) { case 1: #ifdef UTF8ITER_CHECK assert((unsigned char)(*m_sp)[p] < 128); #endif return (unsigned char)(*m_sp)[p]; case 2: #ifdef UTF8ITER_CHECK assert( ((unsigned char)(*m_sp)[p] & 224) == 192 && ((unsigned char)(*m_sp)[p+1] & 192) == 128 ); #endif return ((unsigned char)(*m_sp)[p] - 192) * 64 + (unsigned char)(*m_sp)[p+1] - 128 ; case 3: #ifdef UTF8ITER_CHECK assert( (((unsigned char)(*m_sp)[p]) & 240) == 224 && (((unsigned char)(*m_sp)[p+1]) & 192) == 128 && (((unsigned char)(*m_sp)[p+2]) & 192) == 128 ); #endif return ((unsigned char)(*m_sp)[p] - 224) * 4096 + ((unsigned char)(*m_sp)[p+1] - 128) * 64 + (unsigned char)(*m_sp)[p+2] - 128; case 4: #ifdef UTF8ITER_CHECK assert( (((unsigned char)(*m_sp)[p]) & 248) == 240 && (((unsigned char)(*m_sp)[p+1]) & 192) == 128 && (((unsigned char)(*m_sp)[p+2]) & 192) == 128 && (((unsigned char)(*m_sp)[p+3]) & 192) == 128 ); #endif return ((unsigned char)(*m_sp)[p]-240)*262144 + ((unsigned char)(*m_sp)[p+1]-128)*4096 + ((unsigned char)(*m_sp)[p+2]-128)*64 + (unsigned char)(*m_sp)[p+3]-128; default: #ifdef UTF8ITER_CHECK assert(l <= 4); #endif return (unsigned int)-1; } } }; #endif /* _UTF8ITER_H_INCLUDED_ */ recoll-1.23.7/utils/pxattr.h0000644000175000017500000001133213125527323012643 00000000000000#ifndef _pxattr_h_included_ #define _pxattr_h_included_ /* @(#$Id: pxattr.h,v 1.5 2009-01-20 13:48:34 dockes Exp $ (C) 2009 J.F.Dockes Copyright (c) 2009 Jean-Francois Dockes Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include using std::string; using std::vector; /** * Provide a uniform C++ API for extended file attributes on Linux/FreeBSD * and MacOSX. * * We only deal with user attributes. Other namespaces are very * system-specific and would be difficult to use in a portable way. * * Linux and FreeBSD treat differently the attributes name space * segmentation: Linux uses the first name segment ("user.", "system.", ...), * FreeBSD uses an enumeration. * * We handle this by using only domain-internal names in the interface: * that is, the caller specifies the names as, ie, 'org.myapp.somename' * not 'user.org.myapp.somename'. pxattr will deal with adding/removing * the 'user.' part as needed. * * MacOsX does not segment the attribute name space. * * In order to avoid conflicts, it is recommended that attributes * names be chosen in a "reverse dns" fashion, ie: * org.recoll.indexing.status * * The interface provided should work the same way on all 3 systems, * it papers over such differences as the "list" output format, * the existence of CREATE/UPDATE distinctions, etc. * * Diagnostics: all functions return false on error, and preserve the errno * value or set it as appropriate. * * For path-based interfaces, the PXATTR_NOFOLLOW flag can be set to decide if * symbolic links will be acted on or followed. */ namespace pxattr { /** nspace might be used in the future if we support multiple namespaces.*/ enum nspace { /** User name space */ PXATTR_USER }; /** Flags can modify the behaviour of some methods */ enum flags {PXATTR_NONE=0, /** Act on link instead of following it */ PXATTR_NOFOLLOW = 1, /** Fail if existing */ PXATTR_CREATE=2, /** Fail if new */ PXATTR_REPLACE=4 }; /** * Retrieve the named attribute from path. */ bool get(const string& path, const string& name, string* value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Retrieve the named attribute from open file. */ bool get(int fd, const string& name, string* value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Set the named attribute on path. */ bool set(const string& path, const string& name, const string& value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Set the named attribute on open file. */ bool set(int fd, const string& name, const string& value, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Delete the named attribute from path. */ bool del(const string& path, const string& name, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Delete the named attribute from open file. */ bool del(int fd, const string& name, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * List attribute names from path. */ bool list(const string& path, vector* names, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * List attribute names from open file. */ bool list(int fd, vector* names, flags flags = PXATTR_NONE, nspace dom = PXATTR_USER); /** * Compute actual/system attribute name from external name * (ie: myattr->user.myattr) */ bool sysname(nspace dom, const string& pname, string* sname); /** * Compute external name from actual/system name * (ie: user.myattr->myattr) */ bool pxname(nspace dom, const string& sname, string* pname); } #endif /* _pxattr_h_included_ */ recoll-1.23.7/utils/execmd.cpp0000644000175000017500000012702013224431020013107 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_EXECMD #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef HAVE_SPAWN_H #ifndef __USE_GNU #define __USE_GNU #define undef__USE_GNU #endif #include #ifdef undef__USE_GNU #undef __USE_GNU #endif #endif #include "execmd.h" #include "netcon.h" #include "closefrom.h" #include "smallut.h" #include "log.h" using namespace std; extern char **environ; class ExecCmd::Internal { public: Internal() { sigemptyset(&m_blkcld); } static bool o_useVfork; vector m_env; ExecCmdAdvise *m_advise{0}; ExecCmdProvide *m_provide{0}; bool m_killRequest{false}; int m_timeoutMs{1000}; int m_rlimit_as_mbytes{0}; string m_stderrFile; // Pipe for data going to the command int m_pipein[2]{-1,-1}; std::shared_ptr m_tocmd; // Pipe for data coming out int m_pipeout[2]{-1,-1}; std::shared_ptr m_fromcmd; // Subprocess id pid_t m_pid{-1}; // Saved sigmask sigset_t m_blkcld; // Reset internal state indicators. Any resources should have been // previously freed void reset() { m_killRequest = false; m_pipein[0] = m_pipein[1] = m_pipeout[0] = m_pipeout[1] = -1; m_pid = -1; sigemptyset(&m_blkcld); } // Child process code inline void dochild(const std::string& cmd, const char **argv, const char **envv, bool has_input, bool has_output); }; bool ExecCmd::Internal::o_useVfork{false}; ExecCmd::ExecCmd(int) { m = new Internal(); if (m) { m->reset(); } } void ExecCmd::setAdvise(ExecCmdAdvise *adv) { m->m_advise = adv; } void ExecCmd::setProvide(ExecCmdProvide *p) { m->m_provide = p; } void ExecCmd::setTimeout(int mS) { if (mS > 30) { m->m_timeoutMs = mS; } } void ExecCmd::setStderr(const std::string& stderrFile) { m->m_stderrFile = stderrFile; } pid_t ExecCmd::getChildPid() { return m->m_pid; } void ExecCmd::setKill() { m->m_killRequest = true; } void ExecCmd::zapChild() { setKill(); (void)wait(); } bool ExecCmd::requestChildExit() { if (m->m_pid > 0) { if (kill(m->m_pid, SIGTERM) == 0) { return true; } } return false; } /* From FreeBSD's which command */ static bool exec_is_there(const char *candidate) { struct stat fin; /* XXX work around access(2) false positives for superuser */ if (access(candidate, X_OK) == 0 && stat(candidate, &fin) == 0 && S_ISREG(fin.st_mode) && (getuid() != 0 || (fin.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) != 0)) { return true; } return false; } bool ExecCmd::which(const string& cmd, string& exepath, const char* path) { if (cmd.empty()) { return false; } if (cmd[0] == '/') { if (exec_is_there(cmd.c_str())) { exepath = cmd; return true; } else { return false; } } const char *pp; if (path) { pp = path; } else { pp = getenv("PATH"); } if (pp == 0) { return false; } vector pels; stringToTokens(pp, pels, ":"); for (vector::iterator it = pels.begin(); it != pels.end(); it++) { if (it->empty()) { *it = "."; } string candidate = (it->empty() ? string(".") : *it) + "/" + cmd; if (exec_is_there(candidate.c_str())) { exepath = candidate; return true; } } return false; } void ExecCmd::useVfork(bool on) { // Just in case: there are competent people who believe that the // dynamic linker can sometimes deadlock if execve() is resolved // inside the vfork/exec window. Make sure it's done now. If "/" is // an executable file, we have a problem. const char *argv[] = {"/", 0}; execve("/", (char *const *)argv, environ); Internal::o_useVfork = on; } void ExecCmd::putenv(const string& ea) { m->m_env.push_back(ea); } void ExecCmd::putenv(const string& name, const string& value) { string ea = name + "=" + value; putenv(ea); } static void msleep(int millis) { struct timespec spec; spec.tv_sec = millis / 1000; spec.tv_nsec = (millis % 1000) * 1000000; nanosleep(&spec, 0); } /** A resource manager to ensure that execcmd cleans up if an exception is * raised in the callback, or at different places on errors occurring * during method executions */ class ExecCmdRsrc { public: ExecCmdRsrc(ExecCmd::Internal *parent) : m_parent(parent), m_active(true) { } void inactivate() { m_active = false; } ~ExecCmdRsrc() { if (!m_active || !m_parent) { return; } LOGDEB1("~ExecCmdRsrc: working. mypid: " << getpid() << "\n"); // Better to close the descs first in case the child is waiting in read if (m_parent->m_pipein[0] >= 0) { close(m_parent->m_pipein[0]); } if (m_parent->m_pipein[1] >= 0) { close(m_parent->m_pipein[1]); } if (m_parent->m_pipeout[0] >= 0) { close(m_parent->m_pipeout[0]); } if (m_parent->m_pipeout[1] >= 0) { close(m_parent->m_pipeout[1]); } // It's apparently possible for m_pid to be > 0 and getpgid to fail. In // this case, we have to conclude that the child process does // not exist. Not too sure what causes this, but the previous code // definitely tried to call killpg(-1,) from time to time. pid_t grp; if (m_parent->m_pid > 0 && (grp = getpgid(m_parent->m_pid)) > 0) { LOGDEB("ExecCmd: pid " << m_parent->m_pid << " killpg(" << grp << ", SIGTERM)\n"); int ret = killpg(grp, SIGTERM); if (ret == 0) { for (int i = 0; i < 3; i++) { msleep(i == 0 ? 5 : (i == 1 ? 100 : 2000)); int status; (void)waitpid(m_parent->m_pid, &status, WNOHANG); if (kill(m_parent->m_pid, 0) != 0) { break; } if (i == 2) { LOGDEB("ExecCmd: killpg(" << (grp) << ", SIGKILL)\n"); killpg(grp, SIGKILL); (void)waitpid(m_parent->m_pid, &status, WNOHANG); } } } else { LOGERR("ExecCmd: error killing process group " << (grp) << ": " << errno << "\n"); } } m_parent->m_tocmd.reset(); m_parent->m_fromcmd.reset(); pthread_sigmask(SIG_UNBLOCK, &m_parent->m_blkcld, 0); m_parent->reset(); } private: ExecCmd::Internal *m_parent{nullptr}; bool m_active{false}; }; ExecCmd::~ExecCmd() { if (m) { ExecCmdRsrc r(m); } if (m) { delete m; m = nullptr; } } // In child process. Set up pipes and exec command. // This must not return. _exit() on error. // *** This can be called after a vfork, so no modification of the // process memory at all is allowed *** // The LOGXX calls should not be there, but they occur only after "impossible" // errors, which we would most definitely want to have a hint about. // // Note that any of the LOGXX calls could block on a mutex set in the // father process, so that only absolutely exceptional conditions, // should be logged, for debugging and post-mortem purposes // If one of the calls block, the problem manifests itself by 20mn // (filter timeout) of looping on "ExecCmd::doexec: selectloop // returned 1', because the father is waiting on the read descriptor inline void ExecCmd::Internal::dochild(const string& cmd, const char **argv, const char **envv, bool has_input, bool has_output) { // Start our own process group if (setpgid(0, 0)) { LOGINFO("ExecCmd::DOCHILD: setpgid(0, 0) failed: errno " << errno << "\n"); } // Restore SIGTERM to default. Really, signal handling should be // specified when creating the execmd, there might be other // signals to reset. Resetting SIGTERM helps Recoll get rid of its // filter children for now though. To be fixed one day... // Note that resetting to SIG_DFL is a portable use of // signal(). No need for sigaction() here. // There is supposedely a risk of problems if another thread was // calling a signal-affecting function when vfork was called. This // seems acceptable though as no self-respecting thread is going // to mess with the global process signal disposition. if (signal(SIGTERM, SIG_DFL) == SIG_ERR) { //LOGERR("ExecCmd::DOCHILD: signal() failed, errno " << errno << "\n"); } sigset_t sset; sigfillset(&sset); pthread_sigmask(SIG_UNBLOCK, &sset, 0); sigprocmask(SIG_UNBLOCK, &sset, 0); #ifdef HAVE_SETRLIMIT #if defined RLIMIT_AS || defined RLIMIT_VMEM || defined RLIMIT_DATA if (m_rlimit_as_mbytes > 2000 && sizeof(rlim_t) < 8) { // Impossible limit, don't use it m_rlimit_as_mbytes = 0; } if (m_rlimit_as_mbytes > 0) { struct rlimit ram_limit = { static_cast(m_rlimit_as_mbytes * 1024 * 1024), RLIM_INFINITY }; int resource; // RLIMIT_AS and RLIMIT_VMEM are usually synonyms when VMEM is // defined. RLIMIT_AS is Posix. Both don't really do what we // want, because they count e.g. shared lib mappings, which we // don't really care about. // RLIMIT_DATA only limits the data segment. Modern mallocs // use mmap and will not be bound. (Otoh if we only have this, // we're probably not modern). // So we're unsatisfied either way. #ifdef RLIMIT_AS resource = RLIMIT_AS; #elif defined RLIMIT_VMEM resource = RLIMIT_VMEM; #else resource = RLIMIT_DATA; #endif setrlimit(resource, &ram_limit); } #endif #endif // have_setrlimit if (has_input) { close(m_pipein[1]); if (m_pipein[0] != 0) { dup2(m_pipein[0], 0); close(m_pipein[0]); } } if (has_output) { close(m_pipeout[0]); if (m_pipeout[1] != 1) { if (dup2(m_pipeout[1], 1) < 0) { LOGERR("ExecCmd::DOCHILD: dup2() failed. errno " << errno << "\n"); } if (close(m_pipeout[1]) < 0) { LOGERR("ExecCmd::DOCHILD: close() failed. errno " << errno << "\n"); } } } // Do we need to redirect stderr ? if (!m_stderrFile.empty()) { int fd = open(m_stderrFile.c_str(), O_WRONLY | O_CREAT #ifdef O_APPEND | O_APPEND #endif , 0600); if (fd < 0) { close(2); } else { if (fd != 2) { dup2(fd, 2); } lseek(2, 0, 2); } } // Close all descriptors except 0,1,2 libclf_closefrom(3); execve(cmd.c_str(), (char *const*)argv, (char *const*)envv); // Hu ho. This should never have happened as we checked the // existence of the executable before calling dochild... Until we // did this check, this was the chief cause of LOG mutex deadlock LOGERR("ExecCmd::DOCHILD: execve(" << cmd << ") failed. errno " << errno << "\n"); _exit(127); } void ExecCmd::setrlimit_as(int mbytes) { m->m_rlimit_as_mbytes = mbytes; } int ExecCmd::startExec(const string& cmd, const vector& args, bool has_input, bool has_output) { { // Debug and logging string command = cmd + " "; for (vector::const_iterator it = args.begin(); it != args.end(); it++) { command += "{" + *it + "} "; } LOGDEB("ExecCmd::startExec: (" << has_input << "|" << has_output << ") " << command << "\n"); } // The resource manager ensures resources are freed if we return early ExecCmdRsrc e(m); if (has_input && pipe(m->m_pipein) < 0) { LOGERR("ExecCmd::startExec: pipe(2) failed. errno " << errno << "\n" ); return -1; } if (has_output && pipe(m->m_pipeout) < 0) { LOGERR("ExecCmd::startExec: pipe(2) failed. errno " << errno << "\n"); return -1; } //////////// vfork setup section // We do here things that we could/should do after a fork(), but // not a vfork(). Does no harm to do it here in both cases, except // that it needs cleanup (as compared to doing it just before // exec()). // Allocate arg vector (2 more for arg0 + final 0) typedef const char *Ccharp; Ccharp *argv; argv = (Ccharp *)malloc((args.size() + 2) * sizeof(char *)); if (argv == 0) { LOGERR("ExecCmd::doexec: malloc() failed. errno " << errno << "\n"); return -1; } // Fill up argv argv[0] = cmd.c_str(); int i = 1; vector::const_iterator it; for (it = args.begin(); it != args.end(); it++) { argv[i++] = it->c_str(); } argv[i] = 0; // Environment. We first merge our environment and the specified // variables in a map, overriding existing values, // then generate an appropriate char*[] Ccharp *envv; map envmap; for (int i = 0; environ[i] != 0; i++) { string entry(environ[i]); string::size_type eqpos = entry.find_first_of("="); if (eqpos == string::npos) { continue; } envmap[entry.substr(0, eqpos)] = entry.substr(eqpos+1); } for (const auto& entry : m->m_env) { string::size_type eqpos = entry.find_first_of("="); if (eqpos == string::npos) { continue; } envmap[entry.substr(0, eqpos)] = entry.substr(eqpos+1); } // Allocate space for the array + string storage in one block. unsigned int allocsize = (envmap.size() + 2) * sizeof(char *); for (const auto& it : envmap) { allocsize += it.first.size() + 1 + it.second.size() + 1; } envv = (Ccharp *)malloc(allocsize); if (envv == 0) { LOGERR("ExecCmd::doexec: malloc() failed. errno " << errno << "\n"); free(argv); return -1; } // Copy to new env array i = 0; char *cp = ((char *)envv) + (envmap.size() + 2) * sizeof(char *); for (const auto& it : envmap) { strcpy(cp, (it.first + "=" + it.second).c_str()); envv[i++] = cp; cp += it.first.size() + 1 + it.second.size() + 1; } envv[i++] = 0; // As we are going to use execve, not execvp, do the PATH thing. string exe; if (!which(cmd, exe)) { LOGERR("ExecCmd::startExec: " << (cmd) << " not found\n"); free(argv); free(envv); return -1; } //////////////////////////////// End vfork child prepare section. #if HAVE_POSIX_SPAWN && USE_POSIX_SPAWN // Note that posix_spawn provides no way to setrlimit() the child. { posix_spawnattr_t attrs; posix_spawnattr_init(&attrs); short flags; posix_spawnattr_getflags(&attrs, &flags); flags |= POSIX_SPAWN_USEVFORK; posix_spawnattr_setpgroup(&attrs, 0); flags |= POSIX_SPAWN_SETPGROUP; sigset_t sset; sigemptyset(&sset); posix_spawnattr_setsigmask(&attrs, &sset); flags |= POSIX_SPAWN_SETSIGMASK; sigemptyset(&sset); sigaddset(&sset, SIGTERM); posix_spawnattr_setsigdefault(&attrs, &sset); flags |= POSIX_SPAWN_SETSIGDEF; posix_spawnattr_setflags(&attrs, flags); posix_spawn_file_actions_t facts; posix_spawn_file_actions_init(&facts); if (has_input) { posix_spawn_file_actions_addclose(&facts, m->m_pipein[1]); if (m->m_pipein[0] != 0) { posix_spawn_file_actions_adddup2(&facts, m->m_pipein[0], 0); posix_spawn_file_actions_addclose(&facts, m->m_pipein[0]); } } if (has_output) { posix_spawn_file_actions_addclose(&facts, m->m_pipeout[0]); if (m->m_pipeout[1] != 1) { posix_spawn_file_actions_adddup2(&facts, m->m_pipeout[1], 1); posix_spawn_file_actions_addclose(&facts, m->m_pipeout[1]); } } // Do we need to redirect stderr ? if (!m->m_stderrFile.empty()) { int oflags = O_WRONLY | O_CREAT; #ifdef O_APPEND oflags |= O_APPEND; #endif posix_spawn_file_actions_addopen(&facts, 2, m->m_stderrFile.c_str(), oflags, 0600); } LOGDEB1("using SPAWN\n"); // posix_spawn() does not have any standard way to ask for // calling closefrom(). Afaik there is a solaris extension for this, // but let's just add all fds for (int i = 3; i < libclf_maxfd(); i++) { posix_spawn_file_actions_addclose(&facts, i); } int ret = posix_spawn(&m->m_pid, exe.c_str(), &facts, &attrs, (char *const *)argv, (char *const *)envv); posix_spawnattr_destroy(&attrs); posix_spawn_file_actions_destroy(&facts); if (ret) { LOGERR("ExecCmd::startExec: posix_spawn() failed. errno " << ret << "\n"); return -1; } } #else if (Internal::o_useVfork) { LOGDEB1("using VFORK\n"); m->m_pid = vfork(); } else { LOGDEB1("using FORK\n"); m->m_pid = fork(); } if (m->m_pid < 0) { LOGERR("ExecCmd::startExec: fork(2) failed. errno " << errno << "\n"); return -1; } if (m->m_pid == 0) { // e.inactivate() is not needed. As we do not return, the call // stack won't be unwound and destructors of local objects // won't be called. m->dochild(exe, argv, envv, has_input, has_output); // dochild does not return. Just in case... _exit(1); } #endif // Father process //////////////////// // Vfork cleanup section free(argv); free(envv); /////////////////// // Set the process group for the child. This is also done in the // child process see wikipedia(Process_group) if (setpgid(m->m_pid, m->m_pid)) { // This can fail with EACCES if the son has already done execve // (linux at least) LOGDEB2("ExecCmd: father setpgid(son)(" << m->m_pid << "," << m->m_pid << ") errno " << errno << " (ok)\n"); } sigemptyset(&m->m_blkcld); sigaddset(&m->m_blkcld, SIGCHLD); pthread_sigmask(SIG_BLOCK, &m->m_blkcld, 0); if (has_input) { close(m->m_pipein[0]); m->m_pipein[0] = -1; NetconCli *iclicon = new NetconCli(); iclicon->setconn(m->m_pipein[1]); m->m_tocmd = std::shared_ptr(iclicon); } if (has_output) { close(m->m_pipeout[1]); m->m_pipeout[1] = -1; NetconCli *oclicon = new NetconCli(); oclicon->setconn(m->m_pipeout[0]); m->m_fromcmd = std::shared_ptr(oclicon); } /* Don't want to undo what we just did ! */ e.inactivate(); return 0; } // Netcon callback. Send data to the command's input class ExecWriter : public NetconWorker { public: ExecWriter(const string *input, ExecCmdProvide *provide, ExecCmd::Internal *parent) : m_cmd(parent), m_input(input), m_cnt(0), m_provide(provide) { } void shutdown() { close(m_cmd->m_pipein[1]); m_cmd->m_pipein[1] = -1; m_cmd->m_tocmd.reset(); } virtual int data(NetconData *con, Netcon::Event reason) { if (!m_input) { return -1; } LOGDEB1("ExecWriter: input m_cnt " << m_cnt << " input length " << m_input->length() << "\n"); if (m_cnt >= m_input->length()) { // Fd ready for more but we got none. Try to get data, else // shutdown; if (!m_provide) { shutdown(); return 0; } m_provide->newData(); if (m_input->empty()) { shutdown(); return 0; } else { // Ready with new buffer, reset use count m_cnt = 0; } LOGDEB2("ExecWriter: provide m_cnt " << m_cnt << " input length " << m_input->length() << "\n"); } int ret = con->send(m_input->c_str() + m_cnt, m_input->length() - m_cnt); LOGDEB2("ExecWriter: wrote " << (ret) << " to command\n"); if (ret <= 0) { LOGERR("ExecWriter: data: can't write\n"); return -1; } m_cnt += ret; return ret; } private: ExecCmd::Internal *m_cmd; const string *m_input; unsigned int m_cnt; // Current offset inside m_input ExecCmdProvide *m_provide; }; // Netcon callback. Get data from the command output. class ExecReader : public NetconWorker { public: ExecReader(string *output, ExecCmdAdvise *advise) : m_output(output), m_advise(advise) { } virtual int data(NetconData *con, Netcon::Event reason) { char buf[8192]; int n = con->receive(buf, 8192); LOGDEB1("ExecReader: got " << (n) << " from command\n"); if (n < 0) { LOGERR("ExecCmd::doexec: receive failed. errno " << errno << "\n"); } else if (n > 0) { m_output->append(buf, n); if (m_advise) { m_advise->newData(n); } } // else n == 0, just return return n; } private: string *m_output; ExecCmdAdvise *m_advise; }; int ExecCmd::doexec(const string& cmd, const vector& args, const string *input, string *output) { if (startExec(cmd, args, input != 0, output != 0) < 0) { return -1; } // Cleanup in case we return early ExecCmdRsrc e(m); SelectLoop myloop; int ret = 0; if (input || output) { // Setup output if (output) { NetconCli *oclicon = m->m_fromcmd.get(); if (!oclicon) { LOGERR("ExecCmd::doexec: no connection from command\n"); return -1; } oclicon->setcallback(std::shared_ptr (new ExecReader(output, m->m_advise))); myloop.addselcon(m->m_fromcmd, Netcon::NETCONPOLL_READ); // Give up ownership m->m_fromcmd.reset(); } // Setup input if (input) { NetconCli *iclicon = m->m_tocmd.get(); if (!iclicon) { LOGERR("ExecCmd::doexec: no connection from command\n"); return -1; } iclicon->setcallback(std::shared_ptr (new ExecWriter(input, m->m_provide, m))); myloop.addselcon(m->m_tocmd, Netcon::NETCONPOLL_WRITE); // Give up ownership m->m_tocmd.reset(); } // Do the actual reading/writing/waiting myloop.setperiodichandler(0, 0, m->m_timeoutMs); while ((ret = myloop.doLoop()) > 0) { LOGDEB("ExecCmd::doexec: selectloop returned " << (ret) << "\n"); if (m->m_advise) { m->m_advise->newData(0); } if (m->m_killRequest) { LOGINFO("ExecCmd::doexec: cancel request\n"); break; } } LOGDEB0("ExecCmd::doexec: selectloop returned " << (ret) << "\n"); // Check for interrupt request: we won't want to waitpid() if (m->m_advise) { m->m_advise->newData(0); } // The netcons don't take ownership of the fds: we have to close them // (have to do it before wait, this may be the signal the child is // waiting for exiting). if (input) { close(m->m_pipein[1]); m->m_pipein[1] = -1; } if (output) { close(m->m_pipeout[0]); m->m_pipeout[0] = -1; } } // Normal return: deactivate cleaner, wait() will do the cleanup e.inactivate(); int ret1 = ExecCmd::wait(); if (ret) { return -1; } return ret1; } int ExecCmd::send(const string& data) { NetconCli *con = m->m_tocmd.get(); if (con == 0) { LOGERR("ExecCmd::send: outpipe is closed\n"); return -1; } unsigned int nwritten = 0; while (nwritten < data.length()) { if (m->m_killRequest) { break; } int n = con->send(data.c_str() + nwritten, data.length() - nwritten); if (n < 0) { LOGERR("ExecCmd::send: send failed\n"); return -1; } nwritten += n; } return nwritten; } int ExecCmd::receive(string& data, int cnt) { NetconCli *con = m->m_fromcmd.get(); if (con == 0) { LOGERR("ExecCmd::receive: inpipe is closed\n"); return -1; } const int BS = 4096; char buf[BS]; int ntot = 0; do { int toread = cnt > 0 ? MIN(cnt - ntot, BS) : BS; int n = con->receive(buf, toread); if (n < 0) { LOGERR("ExecCmd::receive: error\n"); return -1; } else if (n > 0) { ntot += n; data.append(buf, n); } else { LOGDEB("ExecCmd::receive: got 0\n"); break; } } while (cnt > 0 && ntot < cnt); return ntot; } int ExecCmd::getline(string& data) { NetconCli *con = m->m_fromcmd.get(); if (con == 0) { LOGERR("ExecCmd::receive: inpipe is closed\n"); return -1; } const int BS = 1024; char buf[BS]; int timeosecs = m->m_timeoutMs / 1000; if (timeosecs == 0) { timeosecs = 1; } // Note that we only go once through here, except in case of // timeout, which is why I think that the goto is more expressive // than a loop again: int n = con->getline(buf, BS, timeosecs); if (n < 0) { if (con->timedout()) { LOGDEB0("ExecCmd::getline: select timeout, report and retry\n"); if (m->m_advise) { m->m_advise->newData(0); } goto again; } LOGERR("ExecCmd::getline: error\n"); } else if (n > 0) { data.append(buf, n); } else { LOGDEB("ExecCmd::getline: got 0\n"); } return n; } class GetlineWatchdog : public ExecCmdAdvise { public: GetlineWatchdog(int secs) : m_secs(secs), tstart(time(0)) {} void newData(int cnt) { if (time(0) - tstart >= m_secs) { throw std::runtime_error("getline timeout"); } } int m_secs; time_t tstart; }; int ExecCmd::getline(string& data, int timeosecs) { GetlineWatchdog gwd(timeosecs); setAdvise(&gwd); try { return getline(data); } catch (...) { return -1; } } // Wait for command status and clean up all resources. // We would like to avoid blocking here too, but there is no simple // way to do this. The 2 possible approaches would be to: // - Use signals (alarm), waitpid() is interruptible. but signals and // threads... This would need a specialized thread, inter-thread comms etc. // - Use an intermediary process when starting the command. The // process forks a timer process, and the real command, then calls // a blocking waitpid on all at the end, and is guaranteed to get // at least the timer process status, thus yielding a select() // equivalent. This is bad too, because the timeout is on the whole // exec, not just the wait // Just calling waitpid() with WNOHANG with a sleep() between tries // does not work: the first waitpid() usually comes too early and // reaps nothing, resulting in almost always one sleep() or more. // // So no timeout here. This has not been a problem in practise inside recoll. // In case of need, using a semi-busy loop with short sleeps // increasing from a few mS might work without creating too much // overhead. int ExecCmd::wait() { ExecCmdRsrc e(m); int status = -1; if (!m->m_killRequest && m->m_pid > 0) { if (waitpid(m->m_pid, &status, 0) < 0) { LOGERR("ExecCmd::waitpid: returned -1 errno " << errno << "\n"); status = -1; } LOGDEB("ExecCmd::wait: got status 0x" << (status) << "\n"); m->m_pid = -1; } // Let the ExecCmdRsrc cleanup, it will do the killing/waiting if needed return status; } bool ExecCmd::maybereap(int *status) { ExecCmdRsrc e(m); *status = -1; if (m->m_pid <= 0) { // Already waited for ?? return true; } pid_t pid = waitpid(m->m_pid, status, WNOHANG); if (pid < 0) { LOGERR("ExecCmd::maybereap: returned -1 errno " << errno << "\n"); m->m_pid = -1; return true; } else if (pid == 0) { LOGDEB1("ExecCmd::maybereap: not exited yet\n"); e.inactivate(); return false; } else { LOGDEB("ExecCmd::maybereap: got status 0x" << (status) << "\n"); m->m_pid = -1; return true; } } // Static bool ExecCmd::backtick(const vector cmd, string& out) { if (cmd.empty()) { LOGERR("ExecCmd::backtick: empty command\n"); return false; } vector::const_iterator it = cmd.begin(); it++; vector args(it, cmd.end()); ExecCmd mexec; int status = mexec.doexec(*cmd.begin(), args, 0, &out); return status == 0; } /// ReExec class methods /////////////////////////////////////////////////// ReExec::ReExec(int argc, char *args[]) { init(argc, args); } void ReExec::init(int argc, char *args[]) { for (int i = 0; i < argc; i++) { m_argv.push_back(args[i]); } m_cfd = open(".", 0); char *cd = getcwd(0, 0); if (cd) { m_curdir = cd; } free(cd); } void ReExec::insertArgs(const vector& args, int idx) { vector::iterator it, cit; unsigned int cmpoffset = (unsigned int) - 1; if (idx == -1 || string::size_type(idx) >= m_argv.size()) { it = m_argv.end(); if (m_argv.size() >= args.size()) { cmpoffset = m_argv.size() - args.size(); } } else { it = m_argv.begin() + idx; if (idx + args.size() <= m_argv.size()) { cmpoffset = idx; } } // Check that the option is not already there if (cmpoffset != (unsigned int) - 1) { bool allsame = true; for (unsigned int i = 0; i < args.size(); i++) { if (m_argv[cmpoffset + i] != args[i]) { allsame = false; break; } } if (allsame) { return; } } m_argv.insert(it, args.begin(), args.end()); } void ReExec::removeArg(const string& arg) { for (vector::iterator it = m_argv.begin(); it != m_argv.end(); it++) { if (*it == arg) { it = m_argv.erase(it); } } } // Reexecute myself, as close as possible to the initial exec void ReExec::reexec() { #if 0 char *cwd; cwd = getcwd(0, 0); FILE *fp = stdout; //fopen("/tmp/exectrace", "w"); if (fp) { fprintf(fp, "reexec: pwd: [%s] args: ", cwd ? cwd : "getcwd failed"); for (vector::const_iterator it = m_argv.begin(); it != m_argv.end(); it++) { fprintf(fp, "[%s] ", it->c_str()); } fprintf(fp, "\n"); } #endif // Execute the atexit funcs while (!m_atexitfuncs.empty()) { (m_atexitfuncs.top())(); m_atexitfuncs.pop(); } // Try to get back to the initial working directory if (m_cfd < 0 || fchdir(m_cfd) < 0) { LOGINFO("ReExec::reexec: fchdir failed, trying chdir\n"); if (!m_curdir.empty() && chdir(m_curdir.c_str())) { LOGERR("ReExec::reexec: chdir failed\n"); } } // Close all descriptors except 0,1,2 libclf_closefrom(3); // Allocate arg vector (1 more for final 0) typedef const char *Ccharp; Ccharp *argv; argv = (Ccharp *)malloc((m_argv.size() + 1) * sizeof(char *)); if (argv == 0) { LOGERR("ExecCmd::doexec: malloc() failed. errno " << errno << "\n"); return; } // Fill up argv int i = 0; vector::const_iterator it; for (it = m_argv.begin(); it != m_argv.end(); it++) { argv[i++] = it->c_str(); } argv[i] = 0; execvp(m_argv[0].c_str(), (char *const*)argv); } //////////////////////////////////////////////////////////////////// #else // TEST #include #include #include #include #include #include #include #include #include #include "log.h" #include "execmd.h" #ifdef BUILDING_RECOLL #include "smallut.h" #include "cancelcheck.h" #endif using namespace std; #ifdef BUILDING_RECOLL // Testing the rclexecm protocol outside of recoll. Here we use the // rcldoc.py filter, you can try with rclaudio too, adjust the file arg // accordingly bool exercise_mhexecm(const string& cmdstr, const string& mimetype, vector& files) { ExecCmd cmd; vector myparams; if (cmd.startExec(cmdstr, myparams, 1, 1) < 0) { cerr << "startExec " << cmdstr << " failed. Missing command?\n"; return false; } for (vector::const_iterator it = files.begin(); it != files.end(); it++) { // Build request message ostringstream obuf; obuf << "Filename: " << (*it).length() << "\n" << (*it); obuf << "Mimetype: " << mimetype.length() << "\n" << mimetype; // Bogus parameter should be skipped by filter obuf << "BogusParam: " << string("bogus").length() << "\n" << "bogus"; obuf << "\n"; cerr << "SENDING: [" << obuf.str() << "]\n"; // Send it if (cmd.send(obuf.str()) < 0) { // The real code calls zapchild here, but we don't need it as // this will be handled by ~ExecCmd //cmd.zapChild(); cerr << "send error\n"; return false; } // Read answer for (int loop = 0;; loop++) { string name, data; // Code from mh_execm.cpp: readDataElement string ibuf; // Read name and length if (cmd.getline(ibuf) <= 0) { cerr << "getline error\n"; return false; } // Empty line (end of message) if (!ibuf.compare("\n")) { cerr << "Got empty line\n"; name.clear(); break; } // Filters will sometimes abort before entering the real // protocol, ie if a module can't be loaded. Check the // special filter error first word: if (ibuf.find("RECFILTERROR ") == 0) { cerr << "Got RECFILTERROR\n"; return false; } // We're expecting something like Name: len\n vector tokens; stringToTokens(ibuf, tokens); if (tokens.size() != 2) { cerr << "bad line in filter output: [" << ibuf << "]\n"; return false; } vector::iterator it = tokens.begin(); name = *it++; string& slen = *it; int len; if (sscanf(slen.c_str(), "%d", &len) != 1) { cerr << "bad line in filter output (no len): [" << ibuf << "]\n"; return false; } // Read element data data.erase(); if (len > 0 && cmd.receive(data, len) != len) { cerr << "MHExecMultiple: expected " << len << " bytes of data, got " << data.length() << endl; return false; } // Empty element: end of message if (name.empty()) { break; } cerr << "Got name: [" << name << "] data [" << data << "]\n"; } } return true; } #endif static char *thisprog; static char usage [] = "trexecmd [-c -r -i -o] cmd [arg1 arg2 ...]\n" " -c : test cancellation (ie: trexecmd -c sleep 1000)\n" " -r : run reexec. Must be separate option.\n" " -i : command takes input\n" " -o : command produces output\n" " If -i is set, we send /etc/group contents to whatever command is run\n" " If -o is set, we print whatever comes out\n" "trexecmd -m [file ...]: test execm:\n" " should be the path to an execm filter\n" " the type of the file parameters\n" "trexecmd -w cmd : do the 'which' thing\n" "trexecmd -l cmd test getline\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_i 0x4 #define OPT_w 0x8 #define OPT_c 0x10 #define OPT_r 0x20 #define OPT_m 0x40 #define OPT_o 0x80 #define OPT_l 0x100 // Data sink for data coming out of the command. We also use it to set // a cancellation after a moment. class MEAdv : public ExecCmdAdvise { public: void newData(int cnt) { if (op_flags & OPT_c) { #ifdef BUILDING_RECOLL static int callcnt; if (callcnt++ == 10) { // Just sets the cancellation flag CancelCheck::instance().setCancel(); // Would be called from somewhere else and throws an // exception. We call it here for simplicity CancelCheck::instance().checkCancel(); } #endif } cerr << "newData(" << cnt << ")" << endl; } }; // Data provider, used if the -i flag is set class MEPv : public ExecCmdProvide { public: FILE *m_fp; string *m_input; MEPv(string *i) : m_input(i) { m_fp = fopen("/etc/group", "r"); } ~MEPv() { if (m_fp) { fclose(m_fp); } } void newData() { char line[1024]; if (m_fp && fgets(line, 1024, m_fp)) { m_input->assign((const char *)line); } else { m_input->erase(); } } }; ReExec reexec; int main(int argc, char *argv[]) { reexec.init(argc, argv); if (0) { // Disabled: For testing reexec arg handling vector newargs; newargs.push_back("newarg"); newargs.push_back("newarg1"); newargs.push_back("newarg2"); newargs.push_back("newarg3"); newargs.push_back("newarg4"); reexec.insertArgs(newargs, 2); } thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ { Usage(); } while (**argv) switch (*(*argv)++) { case 'c': op_flags |= OPT_c; break; case 'r': op_flags |= OPT_r; break; case 'w': op_flags |= OPT_w; break; #ifdef BUILDING_RECOLL case 'm': op_flags |= OPT_m; break; #endif case 'i': op_flags |= OPT_i; break; case 'l': op_flags |= OPT_l; break; case 'o': op_flags |= OPT_o; break; default: Usage(); break; } argc--; argv++; } if (argc < 1) { Usage(); } string arg1 = *argv++; argc--; vector l; while (argc > 0) { l.push_back(*argv++); argc--; } #ifdef BUILDING_RECOLL DebugLog::getdbl()->setloglevel(DEBDEB1); DebugLog::setfilename("stderr"); #endif signal(SIGPIPE, SIG_IGN); if (op_flags & OPT_r) { // Test reexec. Normally only once, next time we fall through // because we remove the -r option (only works if it was isolated, not like -rc chdir("/"); argv[0] = strdup(""); sleep(1); cerr << "Calling reexec\n"; // We remove the -r arg from list, otherwise we are going to // loop (which you can try by commenting out the following // line) reexec.removeArg("-r"); reexec.reexec(); } if (op_flags & OPT_w) { // Test "which" method string path; if (ExecCmd::which(arg1, path)) { cout << path << endl; return 0; } return 1; #ifdef BUILDING_RECOLL } else if (op_flags & OPT_m) { if (l.size() < 2) { Usage(); } string mimetype = l[0]; l.erase(l.begin()); return exercise_mhexecm(arg1, mimetype, l) ? 0 : 1; #endif } else if (op_flags & OPT_l) { ExecCmd mexec; if (mexec.startExec(arg1, l, false, true) < 0) { cerr << "Startexec failed\n"; exit(1); } string output; int ret = mexec.getline(output, 2); cerr << "Got ret " << ret << " output " << output << endl; cerr << "Waiting\n"; int status = mexec.wait(); cerr << "Got status " << status << endl; exit(status); } else { // Default: execute command line arguments ExecCmd mexec; // Set callback to be called whenever there is new data // available and at a periodic interval, to check for // cancellation MEAdv adv; mexec.setAdvise(&adv); mexec.setTimeout(5); // Stderr output goes there mexec.setStderr("/tmp/trexecStderr"); // A few environment variables. Check with trexecmd env mexec.putenv("TESTVARIABLE1=TESTVALUE1"); mexec.putenv("TESTVARIABLE2=TESTVALUE2"); mexec.putenv("TESTVARIABLE3=TESTVALUE3"); string input, output; MEPv pv(&input); string *ip = 0; if (op_flags & OPT_i) { ip = &input; mexec.setProvide(&pv); } string *op = 0; if (op_flags & OPT_o) { op = &output; } int status = -1; try { status = mexec.doexec(arg1, l, ip, op); } catch (...) { cerr << "CANCELLED" << endl; } fprintf(stderr, "Status: 0x%x\n", status); if (op_flags & OPT_o) { cout << output; } exit(status >> 8); } } #endif // TEST recoll-1.23.7/utils/ecrontab.cpp0000644000175000017500000001512313125637102013450 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_ECRONTAB #include "autoconfig.h" #include #include "ecrontab.h" #include "execmd.h" #include "smallut.h" #include "log.h" // Read crontab file and split it into lines. static bool eCrontabGetLines(vector& lines) { string crontab; ExecCmd croncmd; vector args; int status; // Retrieve current crontab contents. An error here means that no // crontab exists, and is not fatal, but we return a different // status than for an empty one args.push_back("-l"); if ((status = croncmd.doexec("crontab", args, 0, &crontab))) { lines.clear(); return false; } // Split crontab into lines stringToTokens(crontab, lines, "\n"); return true; } // Concatenate lines and write crontab static bool eCrontabWriteFile(const vector& lines, string& reason) { string crontab; ExecCmd croncmd; vector args; int status; for (vector::const_iterator it = lines.begin(); it != lines.end(); it++) { crontab += *it + "\n"; } args.push_back("-"); if ((status = croncmd.doexec("crontab", args, &crontab, 0))) { char nbuf[30]; sprintf(nbuf, "0x%x", status); reason = string("Exec crontab -l failed: status: ") + nbuf; return false; } return true; } // Add / change / delete entry identified by marker and id bool editCrontab(const string& marker, const string& id, const string& sched, const string& cmd, string& reason) { vector lines; if (!eCrontabGetLines(lines)) { // Special case: cmd is empty, no crontab, don't create one if (cmd.empty()) return true; } // Remove old copy if any for (vector::iterator it = lines.begin(); it != lines.end(); it++) { // Skip comment if (it->find_first_of("#") == it->find_first_not_of(" \t")) continue; if (it->find(marker) != string::npos && it->find(id) != string::npos) { lines.erase(it); break; } } if (!cmd.empty()) { string nline = sched + " " + marker + " " + id + " " + cmd; lines.push_back(nline); } if (!eCrontabWriteFile(lines, reason)) return false; return true; } bool checkCrontabUnmanaged(const string& marker, const string& data) { vector lines; if (!eCrontabGetLines(lines)) { // No crontab, answer is no return false; } // Scan crontab for (vector::iterator it = lines.begin(); it != lines.end(); it++) { if (it->find(marker) == string::npos && it->find(data) != string::npos) { return true; } } return false; } /** Retrieve the scheduling for a crontab entry */ bool getCrontabSched(const string& marker, const string& id, vector& sched) { LOGDEB0("getCrontabSched: marker[" << (marker) << "], id[" << (id) << "]\n" ); vector lines; if (!eCrontabGetLines(lines)) { // No crontab, answer is no sched.clear(); return false; } string line; for (vector::iterator it = lines.begin(); it != lines.end(); it++) { // Skip comment if (it->find_first_of("#") == it->find_first_not_of(" \t")) continue; if (it->find(marker) != string::npos && it->find(id) != string::npos) { line = *it; break; } } stringToTokens(line, sched); sched.resize(5); return true; } #else // TEST -> #include #include #include #include #include #include #include using namespace std; #include "ecrontab.h" static char *thisprog; static char usage [] = " -a add or replace crontab line \n" " -d delete crontab line \n" " -s get scheduling \n" " -c check for unmanaged lines for string\n" ; static void Usage(void) { fprintf(stderr, "%s: usage:\n%s", thisprog, usage); exit(1); } static int op_flags; #define OPT_MOINS 0x1 #define OPT_a 0x2 #define OPT_d 0x4 #define OPT_w 0x8 #define OPT_c 0x10 #define OPT_s 0x20 const string& marker("RCLCRON_RCLINDEX="); // Note of course the -w does not make sense for a cron entry const string& cmd0("recollindex -w "); const string& id("RECOLL_CONFDIR=\"/home/dockes/.recoll/\""); const string& sched("30 8 * 1 *"); int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; string wt = "10"; string cmd; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) /* Cas du "adb - core" */ Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); cmd = *(++argv); argc--; goto b1; case 'd': op_flags |= OPT_d; break; case 's': op_flags |= OPT_s; break; case 'w': op_flags |= OPT_w; if (argc < 2) Usage(); wt = *(++argv); argc--; goto b1; default: Usage(); break; } b1: argc--; argv++; } if (argc != 0) Usage(); string reason; bool status = false; if (op_flags & OPT_a) { cmd = cmd0 + wt; status = editCrontab(marker, id, sched, cmd, reason); } else if (op_flags & OPT_d) { status = editCrontab(marker, id, sched, "", reason); } else if (op_flags & OPT_s) { vector sched; if (!(status = getCrontabSched(marker, id, sched))) { cerr << "getCrontabSched failed: " << reason << endl; exit(1); } cout << "sched vec size " << sched.size() << endl; cout << "mins " << sched[0] << " hours " << sched[1] << " days of month " << sched[2] << " months " << sched[3] << " days of week " << sched[4] << endl; exit(0); } else if (op_flags & OPT_c) { if ((status = checkCrontabUnmanaged(marker, cmd))) { cerr << "crontab has unmanaged lines for " << cmd << endl; exit(1); } exit(0); } else { Usage(); } if (!status) { cerr << "editCrontab failed: " << reason << endl; exit(1); } exit(0); } #endif // TEST recoll-1.23.7/utils/circache.h0000644000175000017500000000775013125637102013070 00000000000000/* Copyright (C) 2009 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _circache_h_included_ #define _circache_h_included_ /** * A data cache implemented as a circularly managed file * * A single file is used to stored objects. The file grows to a * specified maximum size, then is rewritten from the start, * overwriting older entries. * * Data objects inside the cache each have two parts: a data segment and an * attribute (metadata) dictionary. * They are named using the same identifiers that are used inside the Recoll * index (the UDI). * * Inside the file. the UDIs are stored inside the entry dictionary * under the key "udi". * * It is assumed that the dictionary are small (they are routinely read/parsed) * */ #include #include #include class ConfSimple; class CirCacheInternal; class CirCache { public: CirCache(const std::string& dir); virtual ~CirCache(); virtual std::string getReason(); enum CreateFlags {CC_CRNONE = 0, // Unique entries: erase older instances when same udi // is stored. CC_CRUNIQUE = 1, // Truncate file (restart from scratch). CC_CRTRUNCATE = 2 }; virtual bool create(int64_t maxsize, int flags); enum OpMode {CC_OPREAD, CC_OPWRITE}; virtual bool open(OpMode mode); virtual std::string getpath(); // Set data to 0 if you just want the header virtual bool get(const std::string& udi, std::string& dic, std::string *data = 0, int instance = -1); // Note: the dicp MUST have an udi entry enum PutFlags {NoCompHint = 1}; virtual bool put(const std::string& udi, const ConfSimple *dicp, const std::string& data, unsigned int flags = 0); virtual bool erase(const std::string& udi, bool reallyclear = false); /** Walk the archive. * * Maybe we'll have separate iterators one day, but this is good * enough for now. No put() operations should be performed while * using these. */ /** Back to oldest */ virtual bool rewind(bool& eof); /** Get entry under cursor */ virtual bool getCurrent(std::string& udi, std::string& dic, std::string *data = 0); /** Get current entry udi only. Udi can be empty (erased empty), caller * should call again */ virtual bool getCurrentUdi(std::string& udi); /** Skip to next. (false && !eof) -> error, (false&&eof)->EOF. */ virtual bool next(bool& eof); /* Debug. This writes the entry headers to stdout */ virtual bool dump(); /* Utility: append all entries from sdir to ddir. * * This does not need to be a member at all, just using the namespace here. * * @param ddir destination circache (must be previously created * with appropriate size) * @param sdir source circache * @ret number of entries copied or -a */ static int append(const std::string ddir, const std::string& sdir, std::string *reason = 0); protected: CirCacheInternal *m_d; std::string m_dir; private: CirCache(const CirCache&) {} CirCache& operator=(const CirCache&) { return *this; } }; #endif /* _circache_h_included_ */ recoll-1.23.7/utils/mimeparse.h0000644000175000017500000000717013125527323013310 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _MIME_H_INCLUDED_ #define _MIME_H_INCLUDED_ /* Mime definitions RFC to 4-9-2006: 2045 Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies. N. Freed, N. Borenstein. November 1996. (Format: TXT=72932 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2184, RFC2231) (Status: DRAFT STANDARD) 2046 Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. N. Freed, N. Borenstein. November 1996. (Format: TXT=105854 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2646, RFC3798) (Status: DRAFT STANDARD) 2047 MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text. K. Moore. November 1996. (Format: TXT=33262 bytes) (Obsoletes RFC1521, RFC1522, RFC1590) (Updated by RFC2184, RFC2231) (Status: DRAFT STANDARD) 2183 Communicating Presentation Information in Internet Messages: The Content-Disposition Header Field. R. Troost, S. Dorner, K. Moore, Ed.. August 1997. (Format: TXT=23150 bytes) (Updates RFC1806) (Updated by RFC2184, RFC2231) (Status: PROPOSED STANDARD) 2231 MIME Parameter Value and Encoded Word Extensions: Character Sets, Languages, and Continuations. N. Freed, K. Moore. November 1997. (Format: TXT=19280 bytes) (Obsoletes RFC2184) (Updates RFC2045, RFC2047, RFC2183) (Status: PROPOSED STANDARD) */ #include #include #include #include "base64.h" #ifndef NO_NAMESPACES using std::string; #endif /** A class to represent a MIME header value with parameters */ class MimeHeaderValue { public: string value; std::map params; }; /** * Parse MIME Content-type and Content-disposition value * * @param in the input string should be like: value; pn1=pv1; pn2=pv2. * Example: text/plain; charset="iso-8859-1" */ extern bool parseMimeHeaderValue(const string& in, MimeHeaderValue& psd); /** * Quoted printable decoding. Doubles up as rfc2231 decoder, hence the esc * RFC2045 Quoted printable uses '=' , rfc2331 uses '%'. The two encodings are * otherwise similar. */ extern bool qp_decode(const string& in, string &out, char esc = '='); /** Decode an Internet mail field value encoded according to rfc2047 * * Example input: Some words =?iso-8859-1?Q?RE=A0=3A_Smoke_Tests?= more input * * Note that MIME parameter values are explicitly NOT to be encoded with * this encoding which is only for headers like Subject:, To:. But it * is sometimes used anyway... * * @param in input string, ascii with rfc2047 markup * @return out output string encoded in utf-8 */ extern bool rfc2047_decode(const string& in, string &out); /** Decode RFC2822 date to unix time (gmt secs from 1970 * * @param dt date string (the part after Date: ) * @return unix time */ time_t rfc2822DateToUxTime(const string& dt); #endif /* _MIME_H_INCLUDED_ */ recoll-1.23.7/utils/listmem.cpp0000644000175000017500000000656013224431020013321 00000000000000#include "listmem.h" #include #include #include using namespace std; /* * Functions to list a memory buffer: */ /* Turn byte into Hexadecimal ascii representation */ static char *hexa(unsigned int i) { int j; static char asc[3]; asc[0] = (i >> 4) & 0x0f; asc[1] = i & 0x0f; asc[2] = 0; for (j = 0; j < 2; j++) if (asc[j] > 9) { asc[j] += 55; } else { asc[j] += 48; } return (asc); } static void swap16(unsigned char *d, const unsigned char *s, int n) { if (n & 1) { n >>= 1; n++; } else { n >>= 1; } while (n--) { int i; i = 2 * n; d[i] = s[i + 1]; d[i + 1] = s[i]; } } static void swap32(unsigned char *d, const unsigned char *s, int n) { if (n & 3) { n >>= 2; n++; } else { n >>= 2; } while (n--) { int i; i = 4 * n; d[i] = s[i + 3]; d[i + 1] = s[i + 2]; d[i + 2] = s[i + 1]; d[i + 3] = s[i]; } } /* Turn byte buffer into hexadecimal representation */ void charbuftohex(int len, unsigned char *dt, int maxlen, char *str) { int i; char *bf; for (i = 0, bf = str; i < len; i++) { char *cp; if (bf - str >= maxlen - 4) { break; } cp = hexa((unsigned int)dt[i]); *bf++ = *cp++; *bf++ = *cp++; *bf++ = ' '; } *bf++ = 0; } void listmem(ostream& os, const void *_ptr, int siz, int adr, int opts) { const unsigned char *ptr = (const unsigned char *)_ptr; int i, j, c; char lastlisted[16]; int alreadysame = 0; int oneout = 0; unsigned char *mpt; if (opts & (LISTMEM_SWAP16 | LISTMEM_SWAP32)) { if ((mpt = (unsigned char *)malloc(siz + 4)) == NULL) { os << "OUT OF MEMORY\n"; return; } if (opts & LISTMEM_SWAP16) { swap16(mpt, ptr, siz); } else if (opts & LISTMEM_SWAP32) { swap32(mpt, ptr, siz); } } else { mpt = (unsigned char *)ptr; } for (i = 0; i < siz; i += 16) { /* Check for same data (only print first line in this case) */ if (oneout != 0 && siz - i >= 16 && memcmp(lastlisted, mpt + i, 16) == 0) { if (alreadysame == 0) { os << "*\n"; alreadysame = 1; } continue; } alreadysame = 0; /* Line header */ os << std::setw(4) << i + adr << " "; /* Hexadecimal representation */ for (j = 0; j < 16; j++) { if ((i + j) < siz) { os << hexa(mpt[i + j]) << ((j & 1) ? " " : ""); } else { os << " " << ((j & 1) ? " " : ""); } } os << " "; /* Also print ascii for values that fit */ for (j = 0; j < 16; j++) { if ((i + j) < siz) { c = mpt[i + j]; if (c >= 0x20 && c <= 0x7f) { os << char(c); } else { os << "."; } } else { os << " "; } } os << "\n"; memcpy(lastlisted, mpt + i, 16); oneout = 1; } if (mpt != ptr) { free(mpt); } } recoll-1.23.7/utils/cpuconf.cpp0000644000175000017500000000313013125637102013303 00000000000000/* Copyright (C) 2013 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_CPUCONF #include "autoconfig.h" #include "cpuconf.h" #include // Go c++11 ! bool getCpuConf(CpuConf& cpus) { #if defined(_WIN32) // On windows, indexing is actually twice slower with threads // enabled + there is a bug and the process does not exit at the // end of indexing. Until these are solved, pretend there is only // 1 cpu cpus.ncpus = 1; #else // c++11 cpus.ncpus = std::thread::hardware_concurrency(); #endif return true; } #else // TEST_CPUCONF #include #include using namespace std; #include "cpuconf.h" // Test driver int main(int argc, const char **argv) { CpuConf cpus; if (!getCpuConf(cpus)) { cerr << "getCpuConf failed" << endl; exit(1); } cout << "Cpus: " << cpus.ncpus << endl; exit(0); } #endif // TEST_CPUCONF recoll-1.23.7/utils/netcon.cpp0000644000175000017500000011376613224431020013144 00000000000000/* Copyright (C) 2002 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. */ // Wrapper classes for the socket interface #ifdef BUILDING_RECOLL #include "autoconfig.h" #else #include "config.h" #endif #include "netcon.h" #include #include #include #include #include #ifdef _AIX #include #endif // _AIX #include #include #include #include #include #include #include #include #ifdef HAVE_KQUEUE #include #include #include #endif #include #include "log.h" using namespace std; #ifndef SOCKLEN_T #define SOCKLEN_T socklen_t #endif // Size of path buffer in sockaddr_un (AF_UNIX socket // addr). Mysteriously it is 108 (explicit value) under linux, no // define accessible. Let's take a little margin as it appears that // some systems use 92. I believe we could also malloc a variable size // struct but why bother. #ifndef UNIX_PATH_MAX #define UNIX_PATH_MAX 90 #endif // Need &one, &zero for setsockopt... static const int one = 1; static const int zero = 0; #define LOGSYSERR(who, call, spar) \ LOGERR(who << ": " << call << "(" << spar << ") errno " << \ errno << " (" << strerror(errno) << ")\n") #ifndef MIN #define MIN(a,b) ((a)<(b)?(a):(b)) #endif #ifndef MAX #define MAX(a,b) ((a)>(b)?(a):(b)) #endif #ifndef freeZ #define freeZ(X) if (X) {free(X);X=0;} #endif #define MILLIS(OLD, NEW) ( (uint64_t((NEW).tv_sec) - (OLD).tv_sec) * 1000 + \ ((NEW).tv_usec - (OLD).tv_usec) / 1000 ) // Static method // Simplified interface to 'select()'. Only use one fd, for either // reading or writing. This is only used when not using the // selectloop() style of network i/o. // Note that timeo == 0 does NOT mean wait forever but no wait at all. int Netcon::select1(int fd, int timeo, int write) { int ret; struct timeval tv; fd_set rd; tv.tv_sec = timeo; tv.tv_usec = 0; FD_ZERO(&rd); FD_SET(fd, &rd); if (write) { ret = select(fd + 1, 0, &rd, 0, &tv); } else { ret = select(fd + 1, &rd, 0, 0, &tv); } if (!FD_ISSET(fd, &rd)) { LOGDEB2("Netcon::select1: fd " << fd << " timeout\n"); } return ret; } /////////////////////////////////////////// // SelectLoop class SelectLoop::Internal { public: Internal() { #ifdef HAVE_KQUEUE if ((kq = kqueue()) == -1) { LOGSYSERR("Netcon::selectloop", "kqueue", ""); } #endif } ~Internal() { #ifdef HAVE_KQUEUE if (kq >= 0) close(kq); #endif } // Set by client callback to tell selectloop to return. bool selectloopDoReturn{false}; int selectloopReturnValue{0}; int placetostart{0}; // Map of NetconP indexed by fd map polldata; #ifdef HAVE_KQUEUE int kq{-1}; #endif // The last time we did the periodic thing. Initialized by setperiodic() struct timeval lasthdlcall; // The call back function and its parameter int (*periodichandler)(void *){0}; void *periodicparam{0}; // The periodic interval int periodicmillis{0}; void periodictimeout(struct timeval *tv); void periodictimeout(struct timespec *ts); int maybecallperiodic(); int setselevents(int fd, int events); int setselevents(NetconP& con, int events); }; SelectLoop::SelectLoop() { m = new Internal; } SelectLoop::~SelectLoop() { delete m; } void SelectLoop::loopReturn(int value) { m->selectloopDoReturn = true; m->selectloopReturnValue = value; } void SelectLoop::setperiodichandler(int (*handler)(void *), void *p, int ms) { m->periodichandler = handler; m->periodicparam = p; m->periodicmillis = ms; if (m->periodicmillis > 0) { gettimeofday(&m->lasthdlcall, 0); } } // Compute the appropriate timeout so that the select call returns in // time to call the periodic routine. void SelectLoop::Internal::periodictimeout(struct timeval *tv) { // If periodic not set, the select call times out and we loop // after a very long time (we'd need to pass NULL to select for an // infinite wait, and I'm too lazy to handle it) if (periodicmillis <= 0) { tv->tv_sec = 10000; tv->tv_usec = 0; return; } struct timeval mtv; gettimeofday(&mtv, 0); int millis = periodicmillis - MILLIS(lasthdlcall, mtv); // millis <= 0 means we should have already done the thing. *dont* set the // tv to 0, which means no timeout at all ! if (millis <= 0) { millis = 1; } tv->tv_sec = millis / 1000; tv->tv_usec = (millis % 1000) * 1000; } void SelectLoop::Internal::periodictimeout(struct timespec *ts) { struct timeval tv; periodictimeout(&tv); ts->tv_sec = tv.tv_sec; ts->tv_nsec = tv.tv_usec * 1000; } // Check if it's time to call the handler. selectloop will return to // caller if either we or the handler return 0 int SelectLoop::Internal::maybecallperiodic() { if (periodicmillis <= 0) { return 1; } struct timeval mtv; gettimeofday(&mtv, 0); int millis = periodicmillis - MILLIS(lasthdlcall, mtv); if (millis <= 0) { lasthdlcall = mtv; if (periodichandler) { return periodichandler(periodicparam); } else { return 0; } } return 1; } #ifndef HAVE_KQUEUE int SelectLoop::doLoop() { for (;;) { if (m->selectloopDoReturn) { m->selectloopDoReturn = false; LOGDEB("Netcon::selectloop: returning on request\n"); return m->selectloopReturnValue; } int nfds; fd_set rd, wd; FD_ZERO(&rd); FD_ZERO(&wd); // Walk the netcon map and set up the read and write fd_sets // for select() nfds = 0; for (auto& entry : m->polldata) { NetconP& pll = entry.second; int fd = entry.first; LOGDEB2("Selectloop: fd " << fd << " flags 0x" << pll->m_wantedEvents << "\n"); if (pll->m_wantedEvents & Netcon::NETCONPOLL_READ) { FD_SET(fd, &rd); nfds = MAX(nfds, fd + 1); } if (pll->m_wantedEvents & Netcon::NETCONPOLL_WRITE) { FD_SET(fd, &wd); nfds = MAX(nfds, fd + 1); } } if (nfds == 0) { // This should never happen in a server as we should at least // always monitor the main listening server socket. For a // client, it's up to client code to avoid or process this // condition. // Just in case there would still be open fds in there // (with no r/w flags set). Should not be needed, but safer m->polldata.clear(); LOGDEB1("Netcon::selectloop: no fds\n"); return 0; } LOGDEB2("Netcon::selectloop: selecting, nfds = " << nfds << "\n"); // Compute the next timeout according to what might need to be // done apart from waiting for data struct timeval tv; m->periodictimeout(&tv); // Wait for something to happen int ret = select(nfds, &rd, &wd, 0, &tv); LOGDEB2("Netcon::selectloop: nfds " << nfds << " select returns " << ret << "\n"); if (ret < 0) { LOGSYSERR("Netcon::selectloop", "select", ""); return -1; } if (m->periodicmillis > 0 && m->maybecallperiodic() <= 0) { return 1; } // Timeout, do it again. if (ret == 0) { continue; } // Select returned > 0: at least one fd must be ready. Sweep the fd // table and act on the ready ones. // We don't start the fd sweep at 0, else some fds would be advantaged. // Note that we do an fd sweep, not a map sweep. This is // inefficient because the fd array may be very sparse. Otoh, the // map may change between 2 sweeps, so that we'd have to be smart // with the iterator. As the cost per unused fd is low (just 2 bit // flag tests), we keep it like this for now if (m->placetostart >= nfds) { m->placetostart = 0; } int i, fd; int activefds = 0; for (i = 0, fd = m->placetostart; i < nfds; i++, fd++) { if (fd >= nfds) { fd = 0; } int canread = FD_ISSET(fd, &rd); int canwrite = FD_ISSET(fd, &wd); bool none = !canread && !canwrite; LOGDEB2("Netcon::selectloop: fd " << fd << " " << (none ? "blocked" : "can") << " " << (canread ? "read" : "") << " " << (canwrite ? "write" : "") << "\n"); if (none) { continue; } auto it = m->polldata.find(fd); if (it == m->polldata.end()) { // This should never happen, because we only set our // own fds in the mask ! LOGERR("Netcon::selectloop: fd " << fd << " not found\n"); continue; } activefds++; // Next start will be one beyond last serviced (modulo nfds) m->placetostart = fd + 1; NetconP& pll = it->second; if (canread && pll->cando(Netcon::NETCONPOLL_READ) <= 0) { pll->m_wantedEvents &= ~Netcon::NETCONPOLL_READ; } if (canwrite && pll->cando(Netcon::NETCONPOLL_WRITE) <= 0) { pll->m_wantedEvents &= ~Netcon::NETCONPOLL_WRITE; } if (!(pll->m_wantedEvents & (Netcon::NETCONPOLL_WRITE | Netcon::NETCONPOLL_READ))) { LOGDEB0("Netcon::selectloop: fd " << it->first << " has 0x" << it->second->m_wantedEvents << " mask, erasing\n"); m->polldata.erase(it); } } // fd sweep if (ret > 0 && activefds != ret) { LOGERR("Select returned " << ret << " not equal to " << activefds << " active fd found\n"); return -1; } } // forever loop LOGERR("SelectLoop::doLoop: got out of loop !\n"); return -1; } #else // -> Using kqueue: use select() int SelectLoop::doLoop() { for (;;) { if (m->selectloopDoReturn) { m->selectloopDoReturn = false; LOGDEB("Netcon::selectloop: returning on request\n"); return m->selectloopReturnValue; } // Check that we do have something to wait for. int nfds = 0; for (auto& entry : m->polldata) { NetconP& pll = entry.second; if (pll->m_wantedEvents & Netcon::NETCONPOLL_READ) { nfds++; } else if (pll->m_wantedEvents & Netcon::NETCONPOLL_WRITE) { nfds++; } } if (nfds == 0) { // This should never happen in a server as we should at least // always monitor the main listening server socket. For a // client, it's up to client code to avoid or process this // condition. // Just in case there would still be open fds in there // (with no r/w flags set). Should not be needed, but safer m->polldata.clear(); LOGDEB1("Netcon::selectloop: no fds\n"); return 0; } // Compute the next timeout according to what might need to be // done apart from waiting for data struct timespec ts; m->periodictimeout(&ts); // Wait for something to happen vector events; events.resize(nfds); LOGDEB("Netcon::selectloop: kevent(), nfds = " << nfds << "\n"); int ret = kevent(m->kq, 0, 0, &events[0], events.size(), &ts); LOGDEB("Netcon::selectloop: nfds " << nfds << " kevent returns " << ret << "\n"); if (ret < 0) { LOGSYSERR("Netcon::selectloop", "kevent", ""); return -1; } if (m->periodicmillis > 0 && m->maybecallperiodic() <= 0) { return 1; } if (ret == 0) { // Timeout, do it again. continue; } for (int i = 0; i < ret; i++) { struct kevent& ev = events[i]; if (ev.flags & EV_ERROR) { LOGSYSERR("Netcon::selectLoop", "kevent", ""); LOGERR("Netcon::selectLoop: event error: " << strerror(ev.data)); return -1; } int canread = ev.filter == EVFILT_READ; int canwrite = ev.filter == EVFILT_WRITE; bool none = !canread && !canwrite; LOGDEB("Netcon::selectloop: fd " << int(ev.ident) << " " << (none ? "blocked" : "can") << " " << (canread ? "read" : "") << " " << (canwrite ? "write" : "") << "\n"); if (none) { LOGERR("Kevent returned unknown filter " << ev.filter <polldata.find(int(ev.ident)); if (it == m->polldata.end()) { LOGERR("Netcon::selectloop: fd " << int(ev.ident) << " not found\n"); continue; } NetconP& pll = it->second; if (canread && pll->cando(Netcon::NETCONPOLL_READ) <= 0) { pll->setselevents(pll->getselevents() & ~Netcon::NETCONPOLL_READ); } if (canwrite && pll->cando(Netcon::NETCONPOLL_WRITE) <= 0) { pll->setselevents(pll->getselevents() & ~Netcon::NETCONPOLL_WRITE); } if (!(pll->getselevents() & (Netcon::NETCONPOLL_WRITE | Netcon::NETCONPOLL_READ))) { LOGDEB0("Netcon::selectloop: fd " << it->first << " has 0x" << it->second->getselevents() << " mask, erasing\n"); m->polldata.erase(it); } } // fd sweep } // forever loop LOGERR("SelectLoop::doLoop: got out of loop !\n"); return -1; } #endif // kqueue version int SelectLoop::Internal::setselevents(int fd, int events) { #ifdef HAVE_KQUEUE auto it = polldata.find(fd); if (it == polldata.end()) { return -1; } return setselevents(it->second, events); #endif return 0; } int SelectLoop::Internal::setselevents(NetconP& con, int events) { #ifdef HAVE_KQUEUE struct kevent event; if (events & Netcon::NETCONPOLL_READ) { EV_SET(&event, con->m_fd, EVFILT_READ, EV_ADD, 0, 0, 0); if(kevent(kq, &event, 1, 0, 0, 0) < 0) { LOGSYSERR("SelectLoop::addselcon", "kevent", ""); return -1; } } else { EV_SET(&event, con->m_fd, EVFILT_READ, EV_DELETE, 0, 0, 0); kevent(kq, &event, 1, 0, 0, 0); } if (events & Netcon::NETCONPOLL_WRITE) { EV_SET(&event, con->m_fd, EVFILT_WRITE, EV_ADD, 0, 0, 0); if(kevent(kq, &event, 1, 0, 0, 0) < 0) { LOGSYSERR("SelectLoop::addselcon", "kevent", ""); return -1; } } else { EV_SET(&event, con->m_fd, EVFILT_WRITE, EV_DELETE, 0, 0, 0); kevent(kq, &event, 1, 0, 0, 0); } #endif return 0; } // Add a connection to the monitored set. This can be used to change // the event flags too (won't add duplicates) int SelectLoop::addselcon(NetconP con, int events) { if (!con) { return -1; } LOGDEB1("Netcon::addselcon: fd " << con->m_fd << "\n"); con->set_nonblock(1); con->m_wantedEvents = events; m->polldata[con->m_fd] = con; con->setloop(this); return m->setselevents(con, events); } // Remove a connection from the monitored set. int SelectLoop::remselcon(NetconP con) { if (!con) { return -1; } LOGDEB1("Netcon::remselcon: fd " << con->m_fd << "\n"); m->setselevents(con, 0); auto it = m->polldata.find(con->m_fd); if (it == m->polldata.end()) { LOGDEB1("Netcon::remselcon: con not found for fd " << con->m_fd << "\n"); return -1; } con->setloop(0); m->polldata.erase(it); return 0; } ////////////////////////////////////////////////////////// // Base class (Netcon) methods Netcon::~Netcon() { closeconn(); if (m_peer) { free(m_peer); m_peer = 0; } } void Netcon::closeconn() { if (m_ownfd && m_fd >= 0) { close(m_fd); } m_fd = -1; m_ownfd = true; } char *Netcon::sterror() { return strerror(errno); } void Netcon::setpeer(const char *hostname) { if (m_peer) { free(m_peer); } m_peer = strdup(hostname); } int Netcon::settcpnodelay(int on) { LOGDEB2("Netcon::settcpnodelay\n"); if (m_fd < 0) { LOGERR("Netcon::settcpnodelay: connection not opened\n"); return -1; } char *cp = on ? (char *)&one : (char *)&zero; if (setsockopt(m_fd, IPPROTO_TCP, TCP_NODELAY, cp, sizeof(one)) < 0) { LOGSYSERR("NetconCli::settcpnodelay", "setsockopt", "TCP_NODELAY"); return -1; } return 0; } // Set/reset non-blocking flag on fd int Netcon::set_nonblock(int onoff) { int flags = fcntl(m_fd, F_GETFL, 0); if (flags != -1) { int newflags = onoff ? flags | O_NONBLOCK : flags & ~O_NONBLOCK; if (newflags != flags) if (fcntl(m_fd, F_SETFL, newflags) < 0) { return -1; } } return flags; } int Netcon::setselevents(int events) { m_wantedEvents = events; if (m_loop) { m_loop->m->setselevents(m_fd, events); } return m_wantedEvents; } ///////////////////////////////////////////////////////////////////// // Data socket (NetconData) methods NetconData::NetconData(bool cancellable) : m_buf(0), m_bufbase(0), m_bufbytes(0), m_bufsize(0), m_wkfds{-1,-1} { if (cancellable) { if (pipe(m_wkfds) < 0) { LOGSYSERR("NetconData::NetconData", "pipe", ""); m_wkfds[0] = m_wkfds[1] = -1; } LOGDEB2("NetconData:: m_wkfds[0] " << m_wkfds[0] << " m_wkfds[1] " << m_wkfds[1] << endl); for (int i = 0; i < 2; i++) { int flags = fcntl(m_wkfds[i], F_GETFL, 0); fcntl(m_wkfds[i], F_SETFL, flags | O_NONBLOCK); } } } NetconData::~NetconData() { freeZ(m_buf); m_bufbase = 0; m_bufbytes = m_bufsize = 0; for (int i = 0; i < 2; i++) { if (m_wkfds[i] >= 0) { close(m_wkfds[i]); } } } int NetconData::send(const char *buf, int cnt, int expedited) { LOGDEB2("NetconData::send: fd " << m_fd << " cnt " << cnt << " expe " << expedited << "\n"); int flag = 0; if (m_fd < 0) { LOGERR("NetconData::send: connection not opened\n"); return -1; } if (expedited) { LOGDEB2("NetconData::send: expedited data, count " <= 0) { LOGDEB2("NetconData::cancelReceive: writing to " << m_wkfds[1] << endl); ::write(m_wkfds[1], "!", 1); } } // Receive at most cnt bytes (maybe less) int NetconData::receive(char *buf, int cnt, int timeo) { LOGDEB2("NetconData::receive: cnt " << cnt << " timeo " << timeo << " m_buf 0x" << m_buf << " m_bufbytes " << m_bufbytes << "\n"); if (m_fd < 0) { LOGERR("NetconData::receive: connection not opened\n"); return -1; } int fromibuf = 0; // Get whatever might have been left in the buffer by a previous // getline, except if we're called to fill the buffer of course if (m_buf && m_bufbytes > 0 && (buf < m_buf || buf > m_buf + m_bufsize)) { fromibuf = MIN(m_bufbytes, cnt); memcpy(buf, m_bufbase, fromibuf); m_bufbytes -= fromibuf; m_bufbase += fromibuf; cnt -= fromibuf; LOGDEB2("NetconData::receive: got " << fromibuf << " from mbuf\n"); if (cnt <= 0) { return fromibuf; } } if (timeo > 0) { struct timeval tv; tv.tv_sec = timeo; tv.tv_usec = 0; fd_set rd; FD_ZERO(&rd); FD_SET(m_fd, &rd); bool cancellable = (m_wkfds[0] >= 0); if (cancellable) { LOGDEB2("NetconData::receive: cancel fd " << m_wkfds[0] << endl); FD_SET(m_wkfds[0], &rd); } int nfds = MAX(m_fd, m_wkfds[0]) + 1; int ret = select(nfds, &rd, 0, 0, &tv); LOGDEB2("NetconData::receive: select returned " << ret << endl); if (cancellable && FD_ISSET(m_wkfds[0], &rd)) { char b[100]; read(m_wkfds[0], b, 100); return Cancelled; } if (!FD_ISSET(m_fd, &rd)) { m_didtimo = 1; return TimeoutOrError; } if (ret < 0) { LOGSYSERR("NetconData::receive", "select", ""); m_didtimo = 0; return TimeoutOrError; } } m_didtimo = 0; if ((cnt = read(m_fd, buf + fromibuf, cnt)) < 0) { LOGSYSERR("NetconData::receive", "read", m_fd); return -1; } LOGDEB2("NetconData::receive: normal return, fromibuf " << fromibuf << " cnt " << cnt << "\n"); return fromibuf + cnt; } // Receive exactly cnt bytes (except for timeout) int NetconData::doreceive(char *buf, int cnt, int timeo) { int got, cur; LOGDEB2("Netcon::doreceive: cnt " << cnt << ", timeo " << timeo << "\n"); cur = 0; while (cnt > cur) { got = receive(buf, cnt - cur, timeo); LOGDEB2("Netcon::doreceive: got " << got << "\n"); if (got < 0) { return got; } if (got == 0) { return cur; } cur += got; buf += got; } return cur; } // Read data until cnt-1 characters are read or a newline is found. Add // null char at end of buffer and return. // As we don't know where the newline will be and it would be inefficient to // read a character at a time, we use a buffer // Unlike fgets, we return an integer status: // >0: number of characters returned, not including the final 0 // 0: EOF reached, no chars transferred // -1: error static const int defbufsize = 200; int NetconData::getline(char *buf, int cnt, int timeo) { LOGDEB2("NetconData::getline: cnt " << cnt << ", timeo " << timeo << "\n"); if (m_buf == 0) { if ((m_buf = (char *)malloc(defbufsize)) == 0) { LOGSYSERR("NetconData::getline: Out of mem", "malloc", ""); return -1; } m_bufsize = defbufsize; m_bufbase = m_buf; m_bufbytes = 0; } char *cp = buf; for (;;) { // Transfer from buffer. Have to take a lot of care to keep counts and // pointers consistant in all end cases int maxtransf = MIN(m_bufbytes, cnt - 1); int nn = maxtransf; LOGDEB2("Before loop, bufbytes " << m_bufbytes << ", maxtransf " << maxtransf << ", nn: " << nn << "\n"); for (nn = maxtransf; nn > 0;) { // This is not pretty but we want nn to be decremented for // each byte copied (even newline), and not become -1 if // we go to the end. Better ways welcome! nn--; if ((*cp++ = *m_bufbase++) == '\n') { break; } } // Update counts maxtransf -= nn; // Actual count transferred m_bufbytes -= maxtransf; cnt -= maxtransf; LOGDEB2("After transfer: actual transf " << maxtransf << " cnt " << cnt << ", m_bufbytes " << m_bufbytes << "\n"); // Finished ? if (cnt <= 1 || (cp > buf && cp[-1] == '\n')) { *cp = 0; return cp - buf; } // Transfer from net m_bufbase = m_buf; m_bufbytes = receive(m_buf, m_bufsize, timeo); if (m_bufbytes == 0) { // EOF *cp = 0; return cp - buf; } if (m_bufbytes < 0) { m_bufbytes = 0; *cp = 0; return -1; } } } // Called when selectloop detects that data can be read or written on // the connection. The user callback would normally have been set // up. If it is, call it and return. Else, perform housecleaning: read // and discard. int NetconData::cando(Netcon::Event reason) { LOGDEB2("NetconData::cando\n"); if (m_user) { return m_user->data(this, reason); } // No user callback. Clean up by ourselves if (reason & NETCONPOLL_READ) { #define BS 200 char buf[BS]; int n; if ((n = receive(buf, BS)) < 0) { LOGSYSERR("NetconData::cando", "receive", ""); return -1; } if (n == 0) { // EOF return 0; } } m_wantedEvents &= ~NETCONPOLL_WRITE; return 1; } /////////////////////////////////////////////////////////////////////// // Methods for a client connection (NetconCli) int NetconCli::openconn(const char *host, unsigned int port, int timeo) { int ret = -1; LOGDEB2("Netconcli::openconn: host " << host << ", port " << port << "\n"); closeconn(); struct sockaddr *saddr; socklen_t addrsize; struct sockaddr_in ip_addr; struct sockaddr_un unix_addr; if (host[0] != '/') { memset(&ip_addr, 0, sizeof(ip_addr)); ip_addr.sin_family = AF_INET; ip_addr.sin_port = htons(port); // Server name may be host name or IP address int addr; if ((addr = inet_addr(host)) != -1) { memcpy(&ip_addr.sin_addr, &addr, sizeof(addr)); } else { struct hostent *hp; if ((hp = gethostbyname(host)) == 0) { LOGERR("NetconCli::openconn: gethostbyname(" << host << ") failed\n"); return -1; } memcpy(&ip_addr.sin_addr, hp->h_addr, hp->h_length); } if ((m_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconCli::openconn", "socket", ""); return -1; } addrsize = sizeof(ip_addr); saddr = (sockaddr*)&ip_addr; } else { memset(&unix_addr, 0, sizeof(unix_addr)); unix_addr.sun_family = AF_UNIX; if (strlen(host) > UNIX_PATH_MAX - 1) { LOGERR("NetconCli::openconn: name too long: " << host << "\n"); return -1; } strcpy(unix_addr.sun_path, host); if ((m_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconCli::openconn", "socket", ""); return -1; } addrsize = sizeof(unix_addr); saddr = (sockaddr*)&unix_addr; } if (timeo > 0) { set_nonblock(1); } if (connect(m_fd, saddr, addrsize) < 0) { if (timeo > 0) { if (errno != EINPROGRESS) { goto out; } if (select1(m_fd, timeo, 1) == 1) { goto connectok; } } if (m_silentconnectfailure == 0) { LOGSYSERR("NetconCli", "connect", ""); } goto out; } connectok: if (timeo > 0) { set_nonblock(0); } LOGDEB2("NetconCli::connect: setting keepalive\n"); if (setsockopt(m_fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&one, sizeof(one)) < 0) { LOGSYSERR("NetconCli::connect", "setsockopt", "KEEPALIVE"); } setpeer(host); LOGDEB2("NetconCli::openconn: connection opened ok\n"); ret = 0; out: if (ret < 0) { closeconn(); } return ret; } // Same as previous, but get the port number from services int NetconCli::openconn(const char *host, const char *serv, int timeo) { LOGDEB2("Netconcli::openconn: host " << host << ", serv " << serv << "\n"); if (host[0] != '/') { struct servent *sp; if ((sp = getservbyname(serv, "tcp")) == 0) { LOGERR("NetconCli::openconn: getservbyname failed for " << serv << "\n"); return -1; } // Callee expects the port number in host byte order return openconn(host, ntohs(sp->s_port), timeo); } else { return openconn(host, (unsigned int)0, timeo); } } int NetconCli::setconn(int fd) { LOGDEB2("Netconcli::setconn: fd " << fd << "\n"); closeconn(); m_fd = fd; m_ownfd = false; setpeer(""); return 0; } /////////////////////////////////////////////////////////////////////// // Methods for the main (listening) server connection NetconServLis::~NetconServLis() { #ifdef NETCON_ACCESSCONTROL freeZ(okaddrs.intarray); freeZ(okmasks.intarray); #endif } #if 0 // code for dumping a struct servent static void dump_servent(struct servent *servp) { fprintf(stderr, "Official name %s\n", servp->s_name); for (char **cpp = servp->s_aliases; *cpp; cpp++) { fprintf(stderr, "Nickname %s\n", *cpp); } fprintf(stderr, "Port %d\n", (int)ntohs((short)servp->s_port)); fprintf(stderr, "Proto %s\n", servp->s_proto); } #endif // Set up service. int NetconServLis::openservice(const char *serv, int backlog) { int port; struct servent *servp; if (!serv) { LOGERR("NetconServLis::openservice: null serv??\n"); return -1; } LOGDEB1("NetconServLis::openservice: serv " << serv << "\n"); #ifdef NETCON_ACCESSCONTROL if (initperms(serv) < 0) { return -1; } #endif m_serv = serv; if (serv[0] != '/') { if ((servp = getservbyname(serv, "tcp")) == 0) { LOGERR("NetconServLis::openservice: getservbyname failed for " << serv << "\n"); return -1; } port = (int)ntohs((short)servp->s_port); return openservice(port, backlog); } else { if (strlen(serv) > UNIX_PATH_MAX - 1) { LOGERR("NetconServLis::openservice: too long for AF_UNIX: " << serv << "\n"); return -1; } int ret = -1; struct sockaddr_un addr; if ((m_fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconServLis", "socket", ""); return -1; } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, serv); if (::bind(m_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { LOGSYSERR("NetconServLis", "bind", ""); goto out; } if (listen(m_fd, backlog) < 0) { LOGSYSERR("NetconServLis", "listen", ""); goto out; } LOGDEB1("NetconServLis::openservice: service opened ok\n"); ret = 0; out: if (ret < 0 && m_fd >= 0) { close(m_fd); m_fd = -1; } return ret; } } // Port is a natural host integer value int NetconServLis::openservice(int port, int backlog) { LOGDEB1("NetconServLis::openservice: port " << port << "\n"); #ifdef NETCON_ACCESSCONTROL if (initperms(port) < 0) { return -1; } #endif int ret = -1; struct sockaddr_in ipaddr; if ((m_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { LOGSYSERR("NetconServLis", "socket", ""); return -1; } (void) setsockopt(m_fd, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(one)); #ifdef SO_REUSEPORT (void) setsockopt(m_fd, SOL_SOCKET, SO_REUSEPORT, (char *)&one, sizeof(one)); #endif /*SO_REUSEPORT*/ memset(&ipaddr, 0, sizeof(ipaddr)); ipaddr.sin_family = AF_INET; ipaddr.sin_addr.s_addr = htonl(INADDR_ANY); ipaddr.sin_port = htons((short)port); if (::bind(m_fd, (struct sockaddr *)&ipaddr, sizeof(ipaddr)) < 0) { LOGSYSERR("NetconServLis", "bind", ""); goto out; } if (listen(m_fd, backlog) < 0) { LOGSYSERR("NetconServLis", "listen", ""); goto out; } LOGDEB1("NetconServLis::openservice: service opened ok\n"); ret = 0; out: if (ret < 0 && m_fd >= 0) { close(m_fd); m_fd = -1; } return ret; } #ifdef NETCON_ACCESSCONTROL int NetconServLis::initperms(int port) { if (permsinit) { return 0; } char sport[30]; sprintf(sport, "%d", port); return initperms(sport); } // Get authorized address lists from parameter file. This is disabled for now int NetconServLis::initperms(const char *serv) { if (permsinit) { return 0; } if (serv == 0 || *serv == 0 || strlen(serv) > 80) { LOGERR("NetconServLis::initperms: bad service name " << serv << "\n"); return -1; } char keyname[100]; sprintf(keyname, "%s_okaddrs", serv); if (genparams->getparam(keyname, &okaddrs, 1) < 0) { serv = "default"; sprintf(keyname, "%s_okaddrs", serv); if (genparams->getparam(keyname, &okaddrs) < 0) { LOGERR("NetconServLis::initperms: no okaddrs found in config file\n"); return -1; } } sprintf(keyname, "%s_okmasks", serv); if (genparams->getparam(keyname, &okmasks)) { LOGERR("NetconServLis::initperms: okmasks not found\n"); return -1; } if (okaddrs.len == 0 || okmasks.len == 0) { LOGERR("NetconServLis::initperms: len 0 for okmasks or okaddrs\n"); return -1; } permsinit = 1; return 0; } #endif /* NETCON_ACCESSCONTROL */ // Sample cando routine for server master connection: delete newly // accepted connection. What else ? // This is to be overriden by a derived class method for an application // using the selectloop thing int NetconServLis::cando(Netcon::Event reason) { delete accept(); return 1; } NetconServCon * NetconServLis::accept(int timeo) { LOGDEB("NetconServLis::accept\n"); if (timeo > 0) { int ret = select1(m_fd, timeo); if (ret == 0) { LOGDEB2("NetconServLis::accept timed out\n"); m_didtimo = 1; return 0; } if (ret < 0) { LOGSYSERR("NetconServLis::accept", "select", ""); return 0; } } m_didtimo = 0; NetconServCon *con = 0; int newfd = -1; struct sockaddr_in who; struct sockaddr_un uwho; if (m_serv.empty() || m_serv[0] != '/') { SOCKLEN_T clilen = (SOCKLEN_T)sizeof(who); if ((newfd = ::accept(m_fd, (struct sockaddr *)&who, &clilen)) < 0) { LOGSYSERR("NetconServCon::accept", "accept", ""); goto out; } #ifdef NETCON_ACCESSCONTROL if (checkperms(&who, clilen) < 0) { goto out; } #endif } else { SOCKLEN_T clilen = (SOCKLEN_T)sizeof(uwho); if ((newfd = ::accept(m_fd, (struct sockaddr *)&uwho, &clilen)) < 0) { LOGSYSERR("NetconServCon::accept", "accept", ""); goto out; } } con = new NetconServCon(newfd); if (con == 0) { LOGERR("NetconServLis::accept: new NetconServCon failed\n"); goto out; } // Retrieve peer's host name. Errors are non fatal if (m_serv.empty() || m_serv[0] != '/') { struct hostent *hp; if ((hp = gethostbyaddr((char *) & (who.sin_addr), sizeof(struct in_addr), AF_INET)) == 0) { LOGERR("NetconServLis::accept: gethostbyaddr failed for addr 0x" << who.sin_addr.s_addr << "\n"); con->setpeer(inet_ntoa(who.sin_addr)); } else { con->setpeer(hp->h_name); } } else { con->setpeer(m_serv.c_str()); } LOGDEB2("NetconServLis::accept: setting keepalive\n"); if (setsockopt(newfd, SOL_SOCKET, SO_KEEPALIVE, (char *)&one, sizeof(one)) < 0) { LOGSYSERR("NetconServLis::accept", "setsockopt", "KEEPALIVE"); } LOGDEB2("NetconServLis::accept: got connect from " << con->getpeer() << "\n"); out: if (con == 0 && newfd >= 0) { close(newfd); } return con; } #ifdef NETCON_ACCESSCONTROL int NetconServLis::checkperms(void *cl, int) { // If okmasks and addrs were not initialized, the default is allow to all if (okmasks.len <= 0 || okaddrs.len <= 0) { return 0; } struct sockaddr *addr = (struct sockaddr *)cl; unsigned long ip_addr; if (addr->sa_family != AF_INET) { LOGERR("NetconServLis::checkperms: connection from non-INET addr !\n"); return -1; } ip_addr = ntohl(((struct sockaddr_in *)addr)->sin_addr.s_addr); LOGDEB2("checkperms: ip_addr: 0x" << ip_addr << "\n"); for (int i = 0; i < okaddrs.len; i++) { unsigned int mask; if (i < okmasks.len) { mask = okmasks.intarray[i]; } else { mask = okmasks.intarray[okmasks.len - 1]; } LOGDEB2("checkperms: trying okaddr 0x" << okaddrs.intarray[i] << ", mask 0x" << mask << "\n"); if ((ip_addr & mask) == (okaddrs.intarray[i] & mask)) { return (0); } } LOGERR("NetconServLis::checkperm: connection from bad address 0x" << ip_addr << "\n"); return -1; } #endif /* NETCON_ACCESSCONTROL */ recoll-1.23.7/utils/appformime.h0000644000175000017500000000554013125527323013464 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _APPFORMIME_H_INCLUDED_ #define _APPFORMIME_H_INCLUDED_ #include #include #include /** * Rather strangely, I could not find a reasonably simple piece of * code which would parse /usr/share/applications to return a list of * apps for a given mime type. So here goes. Note that the implementation * is very primitive for now (no use of cache file, no updating once built). * Also, this is not thread-safe, but could be made so quite easily. */ class DesktopDb { public: class AppDef { public: AppDef(const std::string& nm, const std::string& cmd) : name(nm), command(cmd) {} AppDef() {} std::string name; std::string command; }; /** Build/Get the db for the standard fdo directory */ static DesktopDb* getDb(); /** Constructor for a db based on a non-standard location */ DesktopDb(const string& dir); /** In case of error: what happened ? */ const string& getReason(); /** * Get a list of applications able to process a given MIME type. * @param mime MIME type we want the apps for * @param[output] apps appropriate applications * @param[output] reason if we fail, an explanation ? * @return true for no error (apps may still be empty). false if a serious * problem was detected. */ bool appForMime(const std::string& mime, vector *apps, std::string *reason = 0); /** * Get all applications defs: * @param[output] apps applications * @return true */ bool allApps(vector *apps); /** * Get app with given name */ bool appByName(const string& nm, AppDef& app); typedef std::map > AppMap; private: /** This is used by getDb() and builds a db for the standard location */ DesktopDb(); void build(const std::string& dir); DesktopDb(const DesktopDb &); DesktopDb& operator=(const DesktopDb &); AppMap m_appMap; std::string m_reason; bool m_ok; }; #endif /* _APPFORMIME_H_INCLUDED_ */ recoll-1.23.7/utils/fileudi.h0000644000175000017500000000252313125527323012744 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FILEUDI_H_INCLUDED_ #define _FILEUDI_H_INCLUDED_ #include using std::string; // Unique Document Ids for the file-based indexer (main Recoll // indexer). Document Ids are built from a concatenation of the file // path and the internal path (ie: email number inside // folder/attachment number/etc.) As the size of Xapian terms is // limited, the Id path is truncated to a maximum length, and completed // by a hash of the remainder (including the ipath) extern void make_udi(const string& fn, const string& ipath, string &udi); #endif /* _FILEUDI_H_INCLUDED_ */ recoll-1.23.7/utils/cancelcheck.cpp0000644000175000017500000000162113125527323014077 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "cancelcheck.h" CancelCheck& CancelCheck::instance() { static CancelCheck ck; return ck; } recoll-1.23.7/utils/conftree.h0000644000175000017500000004654613224431020013131 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CONFTREE_H_ #define _CONFTREE_H_ /** * A simple configuration file implementation. * * Configuration files have lines like 'name = value', and/or like '[subkey]' * * Lines like '[subkey]' in the file define subsections, with independant * configuration namespaces. Only subsections holding at least one variable are * significant (empty subsections may be deleted during an update, or not) * * Whitespace around name and value is insignificant. * * The names are case-sensitive but don't depend on it, this might change * * Values can be queried for, or set. * * Any line without a '=' is a comment (a line like #var = value * actually assigns a variable named '#var', which is not a big issue) * * A configuration object can be created empty or by reading from a file or * a string. * All 'set' calls cause an immediate rewrite of the backing object if any * (file or string) * * The ConfTree derived class interprets the subkeys as file paths and * lets subdir keys hierarchically inherit the properties from * parents. * * The ConfStack class stacks several Con(Simple/Tree) objects so that * parameters from the top of the stack override the values from lower * (useful to have central/personal config files) */ #include #include #include #include #include // rh7.3 likes iostream better... #if defined(__GNUC__) && __GNUC__ < 3 #include #else #include #include #endif #include "pathut.h" using std::string; using std::vector; using std::map; using std::istream; using std::ostream; /** Internal class used for storing presentation information */ class ConfLine { public: enum Kind {CFL_COMMENT, CFL_SK, CFL_VAR, CFL_VARCOMMENT}; Kind m_kind; string m_data; string m_aux; ConfLine(Kind k, const string& d, string a = string()) : m_kind(k), m_data(d), m_aux(a) { } bool operator==(const ConfLine& o) { return o.m_kind == m_kind && o.m_data == m_data; } }; /** * Virtual base class used to define an interface mostly useful for testing */ class ConfNull { public: enum StatusCode {STATUS_ERROR = 0, STATUS_RO = 1, STATUS_RW = 2}; virtual ~ConfNull() {}; virtual int get(const string& name, string& value, const string& sk = string()) const = 0; virtual bool hasNameAnywhere(const string& nm) const = 0; virtual int set(const string& nm, const string& val, const string& sk = string()) = 0; virtual bool ok() const = 0; virtual vector getNames(const string& sk, const char* = 0)const = 0; virtual int erase(const string&, const string&) = 0; virtual int eraseKey(const string&) = 0; virtual void showall() const {}; virtual vector getSubKeys() const = 0; virtual vector getSubKeys(bool) const = 0; virtual bool holdWrites(bool) = 0; virtual bool sourceChanged() const = 0; }; /** * Manages a simple configuration file with subsections. */ class ConfSimple : public ConfNull { public: /** * Build the object by reading content from file. * @param filename file to open * @param readonly if true open readonly, else rw * @param tildexp try tilde (home dir) expansion for subkey values */ ConfSimple(const char *fname, int readonly = 0, bool tildexp = false, bool trimvalues = true); /** * Build the object by reading content from a string * @param data points to the data to parse. * @param readonly if true open readonly, else rw * @param tildexp try tilde (home dir) expansion for subsection names */ ConfSimple(const string& data, int readonly = 0, bool tildexp = false, bool trimvalues = true); /** * Build an empty object. This will be memory only, with no backing store. * @param readonly if true open read only, else rw * @param tildexp try tilde (home dir) expansion for subsection names */ ConfSimple(int readonly = 0, bool tildexp = false, bool trimvalues = true); virtual ~ConfSimple() {}; /** Origin file changed. Only makes sense if we read the data from a file */ virtual bool sourceChanged() const; /** * Decide if we actually rewrite the backing-store after modifying the * tree. */ virtual bool holdWrites(bool on) { m_holdWrites = on; if (on == false) { return write(); } else { return true; } } /** Clear, then reparse from string */ void reparse(const string& in); /** Clear all content */ void clear() { m_submaps.clear(); m_order.clear(); } /** * Get string value for named parameter, from specified subsection (looks * in global space if sk is empty). * @return 0 if name not found, 1 else */ virtual int get(const string& name, string& value, const string& sk = string()) const; /** * Get integer value for named parameter, from specified subsection (looks * in global space if sk is empty). * @return 0 if name not found, 1 else */ virtual int get(const string& name, int* value, const string& sk = string()) const; /** * Set value for named string parameter in specified subsection (or global) * @return 0 for error, 1 else */ virtual int set(const string& nm, const string& val, const string& sk = string()); /** * Set value for named integer parameter in specified subsection (or global) * @return 0 for error, 1 else */ virtual int set(const string& nm, long long val, const string& sk = string()); /** * Remove name and value from config */ virtual int erase(const string& name, const string& sk); /** * Erase all names under given subkey (and subkey itself) */ virtual int eraseKey(const string& sk); virtual StatusCode getStatus() const; virtual bool ok() const { return getStatus() != STATUS_ERROR; } /** * Walk the configuration values, calling function for each. * The function is called with a null nm when changing subsections (the * value is then the new subsection name) * @return WALK_STOP when/if the callback returns WALK_STOP, * WALK_CONTINUE else (got to end of config) */ enum WalkerCode {WALK_STOP, WALK_CONTINUE}; virtual WalkerCode sortwalk(WalkerCode (*wlkr)(void *cldata, const string& nm, const string& val), void *clidata) const; /** Print all values to stdout */ virtual void showall() const; /** Return all names in given submap. */ virtual vector getNames(const string& sk, const char *pattern = 0) const; /** Check if name is present in any submap. This is relatively expensive * but useful for saving further processing sometimes */ virtual bool hasNameAnywhere(const string& nm) const; /** * Return all subkeys */ virtual vector getSubKeys(bool) const { return getSubKeys(); } virtual vector getSubKeys() const; /** Return subkeys in file order. BEWARE: only for the original from the * file: the data is not duplicated to further copies */ virtual vector getSubKeys_unsorted(bool = false) const { return m_subkeys_unsorted; } /** Test for subkey existence */ virtual bool hasSubKey(const string& sk) const { return m_submaps.find(sk) != m_submaps.end(); } virtual string getFilename() const { return m_filename; } /** Used with config files with specially formatted, xml-like comments. * Extract the comments as text */ virtual bool commentsAsXML(ostream& out); /** !! Note that assignment and copy constructor do not copy the auxiliary data (m_order and subkeys_unsorted). */ /** * Copy constructor. Expensive but less so than a full rebuild */ ConfSimple(const ConfSimple& rhs) : ConfNull() { if ((status = rhs.status) == STATUS_ERROR) { return; } m_filename = rhs.m_filename; m_submaps = rhs.m_submaps; } /** * Assignement. This is expensive */ ConfSimple& operator=(const ConfSimple& rhs) { if (this != &rhs && (status = rhs.status) != STATUS_ERROR) { dotildexpand = rhs.dotildexpand; trimvalues = rhs.trimvalues; m_filename = rhs.m_filename; m_submaps = rhs.m_submaps; } return *this; } /** * Write in file format to out */ bool write(ostream& out) const; /** Give access to semi-parsed file contents */ const vector& getlines() const { return m_order; } protected: bool dotildexpand; bool trimvalues; StatusCode status; private: // Set if we're working with a file string m_filename; time_t m_fmtime; // Configuration data submaps (one per subkey, the main data has a // null subkey) map > m_submaps; vector m_subkeys_unsorted; // Presentation data. We keep the comments, empty lines and // variable and subkey ordering information in there (for // rewriting the file while keeping hand-edited information) vector m_order; // Control if we're writing to the backing store bool m_holdWrites; void parseinput(istream& input); bool write(); // Internal version of set: no RW checking virtual int i_set(const string& nm, const string& val, const string& sk, bool init = false); bool i_changed(bool upd); }; /** * This is a configuration class which attaches tree-like signification to the * submap names. * * If a given variable is not found in the specified section, it will be * looked up the tree of section names, and in the global space. * * submap names should be '/' separated paths (ie: /sub1/sub2). No checking * is done, but else the class adds no functionality to ConfSimple. * * NOTE: contrary to common behaviour, the global or root space is NOT * designated by '/' but by '' (empty subkey). A '/' subkey will not * be searched at all. * * Note: getNames() : uses ConfSimple method, this does *not* inherit * names from englobing submaps. */ class ConfTree : public ConfSimple { public: /* The constructors just call ConfSimple's, asking for key tilde * expansion */ ConfTree(const char *fname, int readonly = 0, bool trimvalues=true) : ConfSimple(fname, readonly, true, trimvalues) {} ConfTree(const string& data, int readonly = 0, bool trimvalues=true) : ConfSimple(data, readonly, true, trimvalues) {} ConfTree(int readonly = 0, bool trimvalues=true) : ConfSimple(readonly, true, trimvalues) {} virtual ~ConfTree() {}; ConfTree(const ConfTree& r) : ConfSimple(r) {}; ConfTree& operator=(const ConfTree& r) { ConfSimple::operator=(r); return *this; } /** * Get value for named parameter, from specified subsection, or its * parents. * @return 0 if name not found, 1 else */ virtual int get(const string& name, string& value, const string& sk) const; using ConfSimple::get; }; /** * Use several config files, trying to get values from each in order. Used to * have a central config, with possible overrides from more specific * (ie personal) ones. * * Notes: it's ok for some of the files not to exist, but the last * one must or we generate an error. We open all trees readonly, except the * topmost one if requested. All writes go to the topmost file. Note that * erase() won't work except for parameters only defined in the topmost * file (it erases only from there). */ template class ConfStack : public ConfNull { public: /// Construct from configuration file names. The earler /// files in have priority when fetching values. Only the first /// file will be updated if ro is false and set() is used. ConfStack(const vector& fns, bool ro = true) { construct(fns, ro); } /// Construct out of single file name and multiple directories ConfStack(const string& nm, const vector& dirs, bool ro = true) { vector fns; for (vector::const_iterator it = dirs.begin(); it != dirs.end(); it++) { fns.push_back(path_cat(*it, nm)); } ConfStack::construct(fns, ro); } ConfStack(const ConfStack& rhs) : ConfNull() { init_from(rhs); } virtual ~ConfStack() { clear(); m_ok = false; } ConfStack& operator=(const ConfStack& rhs) { if (this != &rhs) { clear(); m_ok = rhs.m_ok; if (m_ok) { init_from(rhs); } } return *this; } virtual bool sourceChanged() const { typename vector::const_iterator it; for (it = m_confs.begin(); it != m_confs.end(); it++) { if ((*it)->sourceChanged()) { return true; } } return false; } virtual int get(const string& name, string& value, const string& sk, bool shallow) const { typename vector::const_iterator it; for (it = m_confs.begin(); it != m_confs.end(); it++) { if ((*it)->get(name, value, sk)) { return true; } if (shallow) { break; } } return false; } virtual int get(const string& name, string& value, const string& sk) const { return get(name, value, sk, false); } virtual bool hasNameAnywhere(const string& nm) const { typename vector::const_iterator it; for (it = m_confs.begin(); it != m_confs.end(); it++) { if ((*it)->hasNameAnywhere(nm)) { return true; } } return false; } virtual int set(const string& nm, const string& val, const string& sk = string()) { if (!m_ok) { return 0; } //LOGDEB2(("ConfStack::set [%s]:[%s] -> [%s]\n", sk.c_str(), //nm.c_str(), val.c_str())); // Avoid adding unneeded entries: if the new value matches the // one out from the deeper configs, erase or dont add it // from/to the topmost file typename vector::iterator it = m_confs.begin(); it++; while (it != m_confs.end()) { string value; if ((*it)->get(nm, value, sk)) { // This file has value for nm/sk. If it is the same as the new // one, no need for an entry in the topmost file. Else, stop // looking and add the new entry if (value == val) { m_confs.front()->erase(nm, sk); return true; } else { break; } } it++; } return m_confs.front()->set(nm, val, sk); } virtual int erase(const string& nm, const string& sk) { return m_confs.front()->erase(nm, sk); } virtual int eraseKey(const string& sk) { return m_confs.front()->eraseKey(sk); } virtual bool holdWrites(bool on) { return m_confs.front()->holdWrites(on); } virtual vector getNames(const string& sk, const char *pattern = 0) const { return getNames1(sk, pattern, false); } virtual vector getNamesShallow(const string& sk, const char *patt = 0) const { return getNames1(sk, patt, true); } virtual vector getNames1(const string& sk, const char *pattern, bool shallow) const { vector nms; typename vector::const_iterator it; bool skfound = false; for (it = m_confs.begin(); it != m_confs.end(); it++) { if ((*it)->hasSubKey(sk)) { skfound = true; vector lst = (*it)->getNames(sk, pattern); nms.insert(nms.end(), lst.begin(), lst.end()); } if (shallow && skfound) { break; } } sort(nms.begin(), nms.end()); vector::iterator uit = unique(nms.begin(), nms.end()); nms.resize(uit - nms.begin()); return nms; } virtual vector getSubKeys() const { return getSubKeys(false); } virtual vector getSubKeys(bool shallow) const { vector sks; typename vector::const_iterator it; for (it = m_confs.begin(); it != m_confs.end(); it++) { vector lst; lst = (*it)->getSubKeys(); sks.insert(sks.end(), lst.begin(), lst.end()); if (shallow) { break; } } sort(sks.begin(), sks.end()); vector::iterator uit = unique(sks.begin(), sks.end()); sks.resize(uit - sks.begin()); return sks; } virtual bool ok() const { return m_ok; } private: bool m_ok; vector m_confs; /// Reset to pristine void clear() { typename vector::iterator it; for (it = m_confs.begin(); it != m_confs.end(); it++) { delete(*it); } m_confs.clear(); } /// Common code to initialize from existing object void init_from(const ConfStack& rhs) { if ((m_ok = rhs.m_ok)) { typename vector::const_iterator it; for (it = rhs.m_confs.begin(); it != rhs.m_confs.end(); it++) { m_confs.push_back(new T(**it)); } } } /// Common construct from file names code void construct(const vector& fns, bool ro) { vector::const_iterator it; bool lastok = false; for (it = fns.begin(); it != fns.end(); it++) { T* p = new T(it->c_str(), ro); if (p && p->ok()) { m_confs.push_back(p); lastok = true; } else { delete p; lastok = false; if (!ro) { // For rw acccess, the topmost file needs to be ok // (ro is set to true after the first file) break; } } ro = true; } m_ok = lastok; } }; #endif /*_CONFTREE_H_ */ recoll-1.23.7/utils/idfile.h0000644000175000017500000000226013125527323012555 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _IDFILE_H_INCLUDED_ #define _IDFILE_H_INCLUDED_ #include // Look at data inside file or string, and return mime type or empty string. // // The system's file utility does a bad job on mail folders. idFile // only looks for mail file types for now, but this may change extern std::string idFile(const char *fn); extern std::string idFileMem(const std::string& data); #endif /* _IDFILE_H_INCLUDED_ */ recoll-1.23.7/utils/rclutil.h0000644000175000017500000000660013125637102012776 00000000000000/* Copyright (C) 2016 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 _RCLUTIL_H_INCLUDED_ #define _RCLUTIL_H_INCLUDED_ #include "autoconfig.h" // Misc stuff not generic enough to get into smallut or pathut #include #include #include extern void rclutil_init_mt(); /// Sub-directory for default recoll config (e.g: .recoll) extern std::string path_defaultrecollconfsubdir(); /// e.g. /usr/share/recoll. Depends on OS and config extern const std::string& path_pkgdatadir(); /// Transcode to utf-8 if possible or url encoding, for display. extern bool printableUrl(const std::string& fcharset, const std::string& in, std::string& out); /// Same but, in the case of a Windows local path, also turn "c:/" into /// "/c/" This should be used only for splitting the path in rcldb. extern std::string url_gpathS(const std::string& url); /// Retrieve the temp dir location: $RECOLL_TMPDIR else $TMPDIR else /tmp extern const std::string& tmplocation(); /// Create temporary directory (inside the temp location) extern bool maketmpdir(std::string& tdir, std::string& reason); /// Temporary file class class TempFileInternal { public: TempFileInternal(const std::string& suffix); ~TempFileInternal(); const char *filename() { return m_filename.c_str(); } const std::string& getreason() { return m_reason; } void setnoremove(bool onoff) { m_noremove = onoff; } bool ok() { return !m_filename.empty(); } private: std::string m_filename; std::string m_reason; bool m_noremove; }; typedef std::shared_ptr TempFile; /// Temporary directory class. Recursively deleted by destructor. class TempDir { public: TempDir(); ~TempDir(); const char *dirname() { return m_dirname.c_str(); } const std::string& getreason() { return m_reason; } bool ok() { return !m_dirname.empty(); } /// Recursively delete contents but not self. bool wipe(); private: std::string m_dirname; std::string m_reason; TempDir(const TempDir&) {} TempDir& operator=(const TempDir&) { return *this; }; }; // Freedesktop thumbnail standard path routine // On return, path will have the appropriate value in all cases, // returns true if the file already exists extern bool thumbPathForUrl(const std::string& url, int size, std::string& path); // Duplicate map while ensuring no shared string data (to pass // to other thread): void map_ss_cp_noshr(const std::map s, std::map *d); #endif /* _RCLUTIL_H_INCLUDED_ */ recoll-1.23.7/utils/rclutil.cpp0000644000175000017500000002712313125637102013334 00000000000000/* Copyright (C) 2016 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_RCLUTIL #include "autoconfig.h" #include #include #include #include "safefcntl.h" #include "safeunistd.h" #include "dirent.h" #include "cstr.h" #ifdef _WIN32 #include "safewindows.h" #else #include #include #include #endif #include #include #include #include "safesysstat.h" #include #include "rclutil.h" #include "pathut.h" #include "wipedir.h" #include "transcode.h" #include "md5ut.h" using namespace std; void map_ss_cp_noshr(const map s, map *d) { for (map::const_iterator it = s.begin(); it != s.end(); it++) { d->insert( pair(string(it->first.begin(), it->first.end()), string(it->second.begin(), it->second.end()))); } } #ifdef _WIN32 static bool path_hasdrive(const string& s) { if (s.size() >= 2 && isalpha(s[0]) && s[1] == ':') { return true; } return false; } static bool path_isdriveabs(const string& s) { if (s.size() >= 3 && isalpha(s[0]) && s[1] == ':' && s[2] == '/') { return true; } return false; } #include #pragma comment(lib, "shlwapi.lib") string path_tchartoutf8(TCHAR *text) { #ifdef UNICODE // Simple C // const size_t size = ( wcslen(text) + 1 ) * sizeof(wchar_t); // wcstombs(&buffer[0], text, size); // std::vector buffer(size); // Or: // Windows API std::vector buffer; int size = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL); if (size > 0) { buffer.resize(size); WideCharToMultiByte(CP_UTF8, 0, text, -1, &buffer[0], int(buffer.size()), NULL, NULL); } else { return string(); } return string(&buffer[0]); #else return text; #endif } string path_thisexecpath() { TCHAR text[MAX_PATH]; GetModuleFileName(NULL, text, MAX_PATH); #ifdef NTDDI_WIN8_future PathCchRemoveFileSpec(text, MAX_PATH); #else PathRemoveFileSpec(text); #endif string path = path_tchartoutf8(text); if (path.empty()) { path = "c:/"; } return path; } string path_wingettempfilename(TCHAR *pref) { TCHAR buf[(MAX_PATH + 1)*sizeof(TCHAR)]; TCHAR dbuf[(MAX_PATH + 1)*sizeof(TCHAR)]; GetTempPath(MAX_PATH + 1, dbuf); GetTempFileName(dbuf, pref, 0, buf); // Windows will have created a temp file, we delete it. string filename = path_tchartoutf8(buf); unlink(filename.c_str()); path_slashize(filename); return filename; } #endif // _WIN32 string path_defaultrecollconfsubdir() { #ifdef _WIN32 return "Recoll"; #else return ".recoll"; #endif } // Location for sample config, filters, etc. (e.g. /usr/share/recoll/) const string& path_pkgdatadir() { static string datadir; if (datadir.empty()) { #ifdef _WIN32 datadir = path_cat(path_thisexecpath(), "Share"); #else const char *cdatadir = getenv("RECOLL_DATADIR"); if (cdatadir == 0) { // If not in environment, use the compiled-in constant. datadir = RECOLL_DATADIR; } else { datadir = cdatadir; } #endif } return datadir; } // Printable url: this is used to transcode from the system charset // into either utf-8 if transcoding succeeds, or url-encoded bool printableUrl(const string& fcharset, const string& in, string& out) { int ecnt = 0; if (!transcode(in, out, fcharset, "UTF-8", &ecnt) || ecnt) { out = url_encode(in, 7); } return true; } string url_gpathS(const string& url) { #ifdef _WIN32 string u = url_gpath(url); string nu; if (path_hasdrive(u)) { nu.append(1, '/'); nu.append(1, u[0]); if (path_isdriveabs(u)) { nu.append(u.substr(2)); } else { // This should be an error really nu.append(1, '/'); nu.append(u.substr(2)); } } return nu; #else return url_gpath(url); #endif } const string& tmplocation() { static string stmpdir; if (stmpdir.empty()) { const char *tmpdir = getenv("RECOLL_TMPDIR"); if (tmpdir == 0) { tmpdir = getenv("TMPDIR"); } if (tmpdir == 0) { tmpdir = getenv("TMP"); } if (tmpdir == 0) { tmpdir = getenv("TEMP"); } if (tmpdir == 0) { #ifdef _WIN32 TCHAR bufw[(MAX_PATH + 1)*sizeof(TCHAR)]; GetTempPath(MAX_PATH + 1, bufw); stmpdir = path_tchartoutf8(bufw); #else stmpdir = "/tmp"; #endif } else { stmpdir = tmpdir; } stmpdir = path_canon(stmpdir); } return stmpdir; } bool maketmpdir(string& tdir, string& reason) { #ifndef _WIN32 tdir = path_cat(tmplocation(), "rcltmpXXXXXX"); char *cp = strdup(tdir.c_str()); if (!cp) { reason = "maketmpdir: out of memory (for file name !)\n"; tdir.erase(); return false; } // There is a race condition between name computation and // mkdir. try to make sure that we at least don't shoot ourselves // in the foot #if !defined(HAVE_MKDTEMP) || defined(_WIN32) static std::mutex mmutex; std::unique_lock lock(mmutex); #endif if (! #ifdef HAVE_MKDTEMP mkdtemp(cp) #else mktemp(cp) #endif // HAVE_MKDTEMP ) { free(cp); reason = "maketmpdir: mktemp failed for [" + tdir + "] : " + strerror(errno); tdir.erase(); return false; } tdir = cp; free(cp); #else // _WIN32 // There is a race condition between name computation and // mkdir. try to make sure that we at least don't shoot ourselves // in the foot static std::mutex mmutex; std::unique_lock lock(mmutex); tdir = path_wingettempfilename(TEXT("rcltmp")); #endif // At this point the directory does not exist yet except if we used // mkdtemp #if !defined(HAVE_MKDTEMP) || defined(_WIN32) if (mkdir(tdir.c_str(), 0700) < 0) { reason = string("maketmpdir: mkdir ") + tdir + " failed"; tdir.erase(); return false; } #endif return true; } TempFileInternal::TempFileInternal(const string& suffix) : m_noremove(false) { // Because we need a specific suffix, can't use mkstemp // well. There is a race condition between name computation and // file creation. try to make sure that we at least don't shoot // our own selves in the foot. maybe we'll use mkstemps one day. static std::mutex mmutex; std::unique_lock lock(mmutex); #ifndef _WIN32 string filename = path_cat(tmplocation(), "rcltmpfXXXXXX"); char *cp = strdup(filename.c_str()); if (!cp) { m_reason = "Out of memory (for file name !)\n"; return; } // Using mkstemp this way is awful (bot the suffix adding and // using mkstemp() instead of mktemp just to avoid the warnings) int fd; if ((fd = mkstemp(cp)) < 0) { free(cp); m_reason = "TempFileInternal: mkstemp failed\n"; return; } close(fd); unlink(cp); filename = cp; free(cp); #else string filename = path_wingettempfilename(TEXT("recoll")); #endif m_filename = filename + suffix; if (close(open(m_filename.c_str(), O_CREAT | O_EXCL, 0600)) != 0) { m_reason = string("Could not open/create") + m_filename; m_filename.erase(); } } TempFileInternal::~TempFileInternal() { if (!m_filename.empty() && !m_noremove) { unlink(m_filename.c_str()); } } TempDir::TempDir() { if (!maketmpdir(m_dirname, m_reason)) { m_dirname.erase(); return; } } TempDir::~TempDir() { if (!m_dirname.empty()) { (void)wipedir(m_dirname, true, true); m_dirname.erase(); } } bool TempDir::wipe() { if (m_dirname.empty()) { m_reason = "TempDir::wipe: no directory !\n"; return false; } if (wipedir(m_dirname, false, true)) { m_reason = "TempDir::wipe: wipedir failed\n"; return false; } return true; } // Freedesktop standard paths for cache directory (thumbnails are now in there) static const string& xdgcachedir() { static string xdgcache; if (xdgcache.empty()) { const char *cp = getenv("XDG_CACHE_HOME"); if (cp == 0) { xdgcache = path_cat(path_home(), ".cache"); } else { xdgcache = string(cp); } } return xdgcache; } static const string& thumbnailsdir() { static string thumbnailsd; if (thumbnailsd.empty()) { thumbnailsd = path_cat(xdgcachedir(), "thumbnails"); if (access(thumbnailsd.c_str(), 0) != 0) { thumbnailsd = path_cat(path_home(), ".thumbnails"); } } return thumbnailsd; } // Place for 256x256 files static const string thmbdirlarge = "large"; // 128x128 static const string thmbdirnormal = "normal"; static void thumbname(const string& url, string& name) { string digest; string l_url = url_encode(url); MD5String(l_url, digest); MD5HexPrint(digest, name); name += ".png"; } bool thumbPathForUrl(const string& url, int size, string& path) { string name; thumbname(url, name); if (size <= 128) { path = path_cat(thumbnailsdir(), thmbdirnormal); path = path_cat(path, name); if (access(path.c_str(), R_OK) == 0) { return true; } } path = path_cat(thumbnailsdir(), thmbdirlarge); path = path_cat(path, name); if (access(path.c_str(), R_OK) == 0) { return true; } // File does not exist. Path corresponds to the large version at this point, // fix it if needed. if (size <= 128) { path = path_cat(path_home(), thmbdirnormal); path = path_cat(path, name); } return false; } void rclutil_init_mt() { path_pkgdatadir(); tmplocation(); thumbnailsdir(); } #else // TEST_RCLUTIL void path_to_thumb(const string& _input) { string input(_input); // Make absolute path if needed if (input[0] != '/') { input = path_absolute(input); } input = string("file://") + path_canon(input); string path; //path = url_encode(input, 7); thumbPathForUrl(input, 7, path); cout << path << endl; } const char *thisprog; int main(int argc, const char **argv) { thisprog = *argv++; argc--; string s; vector::const_iterator it; #if 0 if (argc > 1) { cerr << "Usage: thumbpath " << endl; exit(1); } string input; if (argc == 1) { input = *argv++; if (input.empty()) { cerr << "Usage: thumbpath " << endl; exit(1); } path_to_thumb(input); } else { while (getline(cin, input)) { path_to_thumb(input); } } exit(0); #endif } #endif // TEST_RCLUTIL recoll-1.23.7/utils/closefrom.h0000644000175000017500000000211413125527323013310 00000000000000#ifndef _closefrom_h_included_ #define _closefrom_h_included_ /* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Close all descriptors >= fd */ extern int libclf_closefrom(int fd); /* Retrieve max open fd. This might be the actual max open one (not thread-safe) or a system max value. */ extern int libclf_maxfd(int flags=0); #endif /* _closefrom_h_included_ */ recoll-1.23.7/utils/chrono.cpp0000644000175000017500000001510213125527323013143 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef TEST_CHRONO #include "autoconfig.h" #include #include #include "chrono.h" using namespace std; #ifndef CLOCK_REALTIME typedef int clockid_t; #define CLOCK_REALTIME 1 #endif #define SECONDS(TS1, TS2) \ (float((TS2).tv_sec - (TS1).tv_sec) + \ float((TS2).tv_nsec - (TS1).tv_nsec) * 1e-9) #define MILLIS(TS1, TS2) \ ((long long)((TS2).tv_sec - (TS1).tv_sec) * 1000LL + \ ((TS2).tv_nsec - (TS1).tv_nsec) / 1000000) #define MICROS(TS1, TS2) \ ((long long)((TS2).tv_sec - (TS1).tv_sec) * 1000000LL + \ ((TS2).tv_nsec - (TS1).tv_nsec) / 1000) #define NANOS(TS1, TS2) \ ((long long)((TS2).tv_sec - (TS1).tv_sec) * 1000000000LL + \ ((TS2).tv_nsec - (TS1).tv_nsec)) // Using clock_gettime() is nice because it gives us ns res and it helps with // computing threads work times, but it's also a pita because it forces linking // with -lrt. So keep it non-default, special development only. // #define USE_CLOCK_GETTIME // And wont' bother with gettime() on these. #if defined(__APPLE__) || defined(_WIN32) #undef USE_CLOCK_GETTIME #endif #ifdef _MSC_VER #define WIN32_LEAN_AND_MEAN #include #include // portable: uint64_t MSVC: __int64 // MSVC defines this in winsock2.h!? typedef struct timeval { long tv_sec; long tv_usec; } timeval; int gettimeofday(struct timeval * tp, struct timezone * tzp) { // Note: some broken versions only have 8 trailing zero's, the // correct epoch has 9 trailing zero's static const uint64_t EPOCH = ((uint64_t) 116444736000000000ULL); SYSTEMTIME system_time; FILETIME file_time; uint64_t time; GetSystemTime( &system_time ); SystemTimeToFileTime( &system_time, &file_time ); time = ((uint64_t)file_time.dwLowDateTime ) ; time += ((uint64_t)file_time.dwHighDateTime) << 32; tp->tv_sec = (long) ((time - EPOCH) / 10000000L); tp->tv_usec = (long) (system_time.wMilliseconds * 1000); return 0; } #else // -> Not _WIN32 #ifndef USE_CLOCK_GETTIME // Using gettimeofday then, needs struct timeval #include #endif #endif // We use gettimeofday instead of clock_gettime for now and get only // uS resolution, because clock_gettime is more configuration trouble // than it's worth static void gettime(int #ifdef USE_CLOCK_GETTIME clk_id #endif , Chrono::TimeSpec *ts) { #ifdef USE_CLOCK_GETTIME struct timespec mts; clock_gettime(clk_id, &mts); ts->tv_sec = mts.tv_sec; ts->tv_nsec = mts.tv_nsec; #else struct timeval tv; gettimeofday(&tv, 0); ts->tv_sec = tv.tv_sec; ts->tv_nsec = tv.tv_usec * 1000; #endif } ///// End system interface // Note: this not protected against multithread access and not // reentrant, but this is mostly debug code, and it won't crash, just // show bad results. Also the frozen thing is not used that much Chrono::TimeSpec Chrono::o_now; void Chrono::refnow() { gettime(CLOCK_REALTIME, &o_now); } Chrono::Chrono() { restart(); } // Reset and return value before rest in milliseconds long Chrono::restart() { TimeSpec now; gettime(CLOCK_REALTIME, &now); long ret = MILLIS(m_orig, now); m_orig = now; return ret; } long Chrono::urestart() { TimeSpec now; gettime(CLOCK_REALTIME, &now); long ret = MICROS(m_orig, now); m_orig = now; return ret; } // Get current timer value, milliseconds long Chrono::millis(bool frozen) { if (frozen) { return MILLIS(m_orig, o_now); } else { TimeSpec now; gettime(CLOCK_REALTIME, &now); return MILLIS(m_orig, now); } } // long Chrono::micros(bool frozen) { if (frozen) { return MICROS(m_orig, o_now); } else { TimeSpec now; gettime(CLOCK_REALTIME, &now); return MICROS(m_orig, now); } } long long Chrono::amicros() const { TimeSpec ts; ts.tv_sec = 0; ts.tv_nsec = 0; return MICROS(ts, m_orig); } // long long Chrono::nanos(bool frozen) { if (frozen) { return NANOS(m_orig, o_now); } else { TimeSpec now; gettime(CLOCK_REALTIME, &now); return NANOS(m_orig, now); } } float Chrono::secs(bool frozen) { if (frozen) { return SECONDS(m_orig, o_now); } else { TimeSpec now; gettime(CLOCK_REALTIME, &now); return SECONDS(m_orig, now); } } #else ///////////////////// test driver #include #include #include #include #include #include "chrono.h" using namespace std; static char *thisprog; static void Usage(void) { fprintf(stderr, "Usage : %s \n", thisprog); exit(1); } Chrono achrono; Chrono rchrono; void showsecs(long msecs) { fprintf(stderr, "%3.5f S", ((float)msecs) / 1000.0); } void sigint(int sig) { signal(SIGINT, sigint); signal(SIGQUIT, sigint); fprintf(stderr, "Absolute interval: "); showsecs(achrono.millis()); fprintf(stderr, ". Relative interval: "); showsecs(rchrono.restart()); cerr << " Abs micros: " << achrono.amicros() << " Relabs micros: " << rchrono.amicros() - 1430477861905884LL << endl; fprintf(stderr, ".\n"); if (sig == SIGQUIT) { exit(0); } } int main(int argc, char **argv) { thisprog = argv[0]; argc--; argv++; if (argc != 0) { Usage(); } for (int i = 0; i < 50000000; i++); cerr << "Start secs: " << achrono.secs() << endl; fprintf(stderr, "Type ^C for intermediate result, ^\\ to stop\n"); signal(SIGINT, sigint); signal(SIGQUIT, sigint); achrono.restart(); rchrono.restart(); while (1) { pause(); } } #endif /*TEST_CHRONO*/ recoll-1.23.7/utils/md5.cpp0000644000175000017500000001745613224431020012342 00000000000000/* $OpenBSD: md5.c,v 1.7 2004/05/28 15:10:27 millert Exp $ */ /* * This code implements the MD5 message-digest algorithm. * The algorithm is due to Ron Rivest. This code was * written by Colin Plumb in 1993, no copyright is claimed. * This code is in the public domain; do with it what you wish. * * Equivalent code is available from RSA Data Security, Inc. * This code has been tested against that, and is equivalent, * except that you don't need to include two pages of legalese * with every copy. * * To compute the message digest of a chunk of bytes, declare an * MD5Context structure, pass it to MD5Init, call MD5Update as * needed on buffers full of bytes, and then call MD5Final, which * will fill a supplied 16-byte array with the digest. */ #include "autoconfig.h" //#include #include "md5.h" #include #define PUT_64BIT_LE(cp, value) do { \ (cp)[7] = (value) >> 56; \ (cp)[6] = (value) >> 48; \ (cp)[5] = (value) >> 40; \ (cp)[4] = (value) >> 32; \ (cp)[3] = (value) >> 24; \ (cp)[2] = (value) >> 16; \ (cp)[1] = (value) >> 8; \ (cp)[0] = (value); } while (0) #define PUT_32BIT_LE(cp, value) do { \ (cp)[3] = (value) >> 24; \ (cp)[2] = (value) >> 16; \ (cp)[1] = (value) >> 8; \ (cp)[0] = (value); } while (0) static uint8_t PADDING[MD5_BLOCK_LENGTH] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void MD5Init(MD5_CTX *ctx) { ctx->count = 0; ctx->state[0] = 0x67452301; ctx->state[1] = 0xefcdab89; ctx->state[2] = 0x98badcfe; ctx->state[3] = 0x10325476; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void MD5Update(MD5_CTX *ctx, const unsigned char *input, size_t len) { size_t have, need; /* Check how many bytes we already have and how many more we need. */ have = (size_t)((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1)); need = MD5_BLOCK_LENGTH - have; /* Update bitcount */ ctx->count += (uint64_t)len << 3; if (len >= need) { if (have != 0) { memcpy(ctx->buffer + have, input, need); MD5Transform(ctx->state, ctx->buffer); input += need; len -= need; have = 0; } /* Process data in MD5_BLOCK_LENGTH-byte chunks. */ while (len >= MD5_BLOCK_LENGTH) { MD5Transform(ctx->state, input); input += MD5_BLOCK_LENGTH; len -= MD5_BLOCK_LENGTH; } } /* Handle any remaining bytes of data. */ if (len != 0) memcpy(ctx->buffer + have, input, len); } /* * Pad pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void MD5Pad(MD5_CTX *ctx) { uint8_t count[8]; size_t padlen; /* Convert count to 8 bytes in little endian order. */ PUT_64BIT_LE(count, ctx->count); /* Pad out to 56 mod 64. */ padlen = MD5_BLOCK_LENGTH - ((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1)); if (padlen < 1 + 8) padlen += MD5_BLOCK_LENGTH; MD5Update(ctx, PADDING, padlen - 8); /* padlen - 8 <= 64 */ MD5Update(ctx, count, 8); } /* * Final wrapup--call MD5Pad, fill in digest and zero out ctx. */ void MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx) { int i; MD5Pad(ctx); if (digest != NULL) { for (i = 0; i < 4; i++) PUT_32BIT_LE(digest + i * 4, ctx->state[i]); memset(ctx, 0, sizeof(*ctx)); } } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ void MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH]) { uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4]; #ifndef WORDS_BIGENDIAN memcpy(in, block, sizeof(in)); #else for (a = 0; a < MD5_BLOCK_LENGTH / 4; a++) { in[a] = (uint32_t)( (uint32_t)(block[a * 4 + 0]) | (uint32_t)(block[a * 4 + 1]) << 8 | (uint32_t)(block[a * 4 + 2]) << 16 | (uint32_t)(block[a * 4 + 3]) << 24); } #endif a = state[0]; b = state[1]; c = state[2]; d = state[3]; MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2 ] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7 ] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5 ] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3 ] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1 ] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8 ] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6 ] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4 ] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2 ] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9 ] + 0xeb86d391, 21); state[0] += a; state[1] += b; state[2] += c; state[3] += d; } recoll-1.23.7/qtgui/0000755000175000017500000000000013224670235011222 500000000000000recoll-1.23.7/qtgui/spell_w.h0000644000175000017500000000362413224431020012750 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SPELL_W_H_INCLUDED_ #define _SPELL_W_H_INCLUDED_ #include #include #include #include "ui_spell.h" class SpellW : public QWidget, public Ui::SpellBase { Q_OBJECT; public: SpellW(QWidget* parent = 0) : QWidget(parent), m_prevmode(TYPECMB_NONE) { setupUi(this); init(); } virtual bool eventFilter(QObject *target, QEvent *event ); enum comboboxchoice {TYPECMB_NONE, TYPECMB_WILD, TYPECMB_REG, TYPECMB_STEM, TYPECMB_SPELL, TYPECMB_STATS, TYPECMB_FAILED}; public slots: virtual void doExpand(); virtual void wordChanged(const QString&); virtual void textDoubleClicked(); virtual void textDoubleClicked(int, int); virtual void setMode(comboboxchoice); private slots: virtual void onModeChanged(int); signals: void wordSelect(QString); private: // combobox index to expansion type std::vector m_c2t; comboboxchoice m_prevmode; void init(); void copy(); void showStats(); void showFailed(); int cmbIdx(comboboxchoice mode); void setModeCommon(comboboxchoice mode); }; #endif /* _SPELL_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/viewaction_w.h0000644000175000017500000000310513125527323014007 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _VIEWACTION_W_H_INCLUDED_ #define _VIEWACTION_W_H_INCLUDED_ #include #include #include "ui_viewaction.h" class QDialog; class QMouseEvent; class QTableWidget; class ViewAction : public QDialog, public Ui::ViewActionBase { Q_OBJECT public: ViewAction(QWidget* parent = 0) : QDialog(parent) { setupUi(this); init(); } ~ViewAction() {} void selectMT(const QString& mt); public slots: virtual void editActions(); virtual void onItemClicked(QTableWidgetItem *); virtual void onItemDoubleClicked(QTableWidgetItem *); virtual void onUseDesktopCBToggled(int); virtual void onSetExceptCBToggled(int); virtual void onSelSameClicked(); private: virtual void init(); virtual void fillLists(); }; #endif /* _VIEWACTION_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/advshist.h0000644000175000017500000000401613125637102013135 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ADVSHIST_H_INCLUDED_ #define _ADVSHIST_H_INCLUDED_ #include "autoconfig.h" #include #include "recoll.h" #include #include "searchdata.h" /** Advanced search history. * * We store previous searches using the "dynconf" mechanism, as string * entries under the "advSearchHist" key. The strings are generated by * translating the SearchData structure to XML, which is done by * calling SearchData::asXML(). * When reading, we use a QXmlSimpleReader and QXmlDefaultHandler to * turn the XML back into a SearchData object, which is then passed to * the advanced search object fromSearch() method to rebuild the * window state. * * XML generation is performed by ../rcldb/searchdataxml.cpp. * See xmltosd.h for a schema description */ class AdvSearchHist { public: AdvSearchHist(); ~AdvSearchHist(); // Add entry bool push(std::shared_ptr); // Get latest. does not change state std::shared_ptr getnewest(); // Cursor std::shared_ptr getolder(); std::shared_ptr getnewer(); void clear(); private: bool read(); int m_current; std::vector > m_entries; }; #endif // _ADVSHIST_H_INCLUDED_ recoll-1.23.7/qtgui/xmltosd.cpp0000644000175000017500000002444313224431020013332 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "ssearch_w.h" #include "guiutils.h" #include "log.h" #include "xmltosd.h" #include "smallut.h" #include "recoll.h" using namespace std; using namespace Rcl; class SDHXMLHandler : public QXmlDefaultHandler { public: SDHXMLHandler() : isvalid(false) { resetTemps(); } bool startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &attributes); bool endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName); bool characters(const QString &str) { currentText += str; return true; } // The object we set up std::shared_ptr sd; bool isvalid; private: void resetTemps() { currentText = whatclause = ""; text.clear(); field.clear(); slack = 0; d = m = y = di.d1 = di.m1 = di.y1 = di.d2 = di.m2 = di.y2 = 0; hasdates = false; exclude = false; } // Temporary data while parsing. QString currentText; QString whatclause; string field, text; int slack; int d, m, y; DateInterval di; bool hasdates; bool exclude; }; bool SDHXMLHandler::startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &attrs) { LOGDEB2("SDHXMLHandler::startElement: name [" << qs2utf8s(qName) << "]\n"); if (qName == "SD") { // Advanced search history entries have no type. So we're good // either if type is absent, or if it's searchdata int idx = attrs.index("type"); if (idx >= 0 && attrs.value(idx).compare("searchdata")) { LOGDEB("XMLTOSD: bad type: " << qs2utf8s(attrs.value(idx)) << endl); return false; } resetTemps(); // A new search descriptor. Allocate data structure sd = std::shared_ptr(new SearchData); if (!sd) { LOGERR("SDHXMLHandler::startElement: out of memory\n"); return false; } } return true; } bool SDHXMLHandler::endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName) { LOGDEB2("SDHXMLHandler::endElement: name [" << qs2utf8s(qName) << "]\n"); if (qName == "CLT") { if (currentText == "OR") { sd->setTp(SCLT_OR); } } else if (qName == "CT") { whatclause = currentText.trimmed(); } else if (qName == "NEG") { exclude = true; } else if (qName == "F") { field = base64_decode(qs2utf8s(currentText.trimmed())); } else if (qName == "T") { text = base64_decode(qs2utf8s(currentText.trimmed())); } else if (qName == "S") { slack = atoi((const char *)currentText.toUtf8()); } else if (qName == "C") { SearchDataClause *c; if (whatclause == "AND" || whatclause.isEmpty()) { c = new SearchDataClauseSimple(SCLT_AND, text, field); c->setexclude(exclude); } else if (whatclause == "OR") { c = new SearchDataClauseSimple(SCLT_OR, text, field); c->setexclude(exclude); } else if (whatclause == "EX") { // Compat with old hist. We don't generete EX (SCLT_EXCL) anymore // it's replaced with OR + exclude flag c = new SearchDataClauseSimple(SCLT_OR, text, field); c->setexclude(true); } else if (whatclause == "FN") { c = new SearchDataClauseFilename(text); c->setexclude(exclude); } else if (whatclause == "PH") { c = new SearchDataClauseDist(SCLT_PHRASE, text, slack, field); c->setexclude(exclude); } else if (whatclause == "NE") { c = new SearchDataClauseDist(SCLT_NEAR, text, slack, field); c->setexclude(exclude); } else { LOGERR("Bad clause type [" << qs2utf8s(whatclause) << "]\n"); return false; } sd->addClause(c); whatclause = ""; text.clear(); field.clear(); slack = 0; exclude = false; } else if (qName == "D") { d = atoi((const char *)currentText.toUtf8()); } else if (qName == "M") { m = atoi((const char *)currentText.toUtf8()); } else if (qName == "Y") { y = atoi((const char *)currentText.toUtf8()); } else if (qName == "DMI") { di.d1 = d; di.m1 = m; di.y1 = y; hasdates = true; } else if (qName == "DMA") { di.d2 = d; di.m2 = m; di.y2 = y; hasdates = true; } else if (qName == "MIS") { sd->setMinSize(atoll((const char *)currentText.toUtf8())); } else if (qName == "MAS") { sd->setMaxSize(atoll((const char *)currentText.toUtf8())); } else if (qName == "ST") { string types = (const char *)currentText.toUtf8(); vector vt; stringToTokens(types, vt); for (unsigned int i = 0; i < vt.size(); i++) sd->addFiletype(vt[i]); } else if (qName == "IT") { string types(qs2utf8s(currentText)); vector vt; stringToTokens(types, vt); for (unsigned int i = 0; i < vt.size(); i++) sd->remFiletype(vt[i]); } else if (qName == "YD") { string d; base64_decode(qs2utf8s(currentText.trimmed()), d); sd->addClause(new SearchDataClausePath(d)); } else if (qName == "ND") { string d; base64_decode(qs2utf8s(currentText.trimmed()), d); sd->addClause(new SearchDataClausePath(d, true)); } else if (qName == "SD") { // Closing current search descriptor. Finishing touches... if (hasdates) sd->setDateSpan(&di); resetTemps(); isvalid = true; } currentText.clear(); return true; } std::shared_ptr xmlToSearchData(const string& xml, bool verbose) { SDHXMLHandler handler; QXmlSimpleReader reader; reader.setContentHandler(&handler); reader.setErrorHandler(&handler); QXmlInputSource xmlInputSource; xmlInputSource.setData(QString::fromUtf8(xml.c_str())); if (!reader.parse(xmlInputSource) || !handler.isvalid) { if (verbose) { LOGERR("xmlToSearchData: parse failed for [" << xml << "]\n"); } return std::shared_ptr(); } return handler.sd; } // Handler for parsing saved simple search data class SSHXMLHandler : public QXmlDefaultHandler { public: SSHXMLHandler() : isvalid(false) { resetTemps(); } bool startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &attributes); bool endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName); bool characters(const QString &str) { currentText += str; return true; } // The object we set up SSearchDef data; bool isvalid; private: void resetTemps() { currentText = whatclause = ""; text.clear(); } // Temporary data while parsing. QString currentText; QString whatclause; string text; }; bool SSHXMLHandler::startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &attrs) { LOGDEB2("SSHXMLHandler::startElement: name [" << u8s2qs(qName) << "]\n"); if (qName == "SD") { // Simple search saved data has a type='ssearch' attribute. int idx = attrs.index("type"); if (idx < 0 || attrs.value(idx).compare("ssearch")) { if (idx < 0) { LOGDEB("XMLTOSSS: bad type\n"); } else { LOGDEB("XMLTOSSS: bad type: " << qs2utf8s(attrs.value(idx)) << endl); } return false; } resetTemps(); } return true; } bool SSHXMLHandler::endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName) { LOGDEB2("SSHXMLHandler::endElement: name [" << u8s2qs(qName) << "]\n"); currentText = currentText.trimmed(); if (qName == "SL") { stringToStrings(qs2utf8s(currentText), data.stemlangs); } else if (qName == "T") { base64_decode(qs2utf8s(currentText), data.text); } else if (qName == "EX") { data.extindexes.push_back(base64_decode(qs2utf8s(currentText))); } else if (qName == "SM") { if (!currentText.compare("QL")) { data.mode = SSearch::SST_LANG; } else if (!currentText.compare("FN")) { data.mode = SSearch::SST_FNM; } else if (!currentText.compare("OR")) { data.mode = SSearch::SST_ANY; } else if (!currentText.compare("AND")) { data.mode = SSearch::SST_ALL; } else { LOGERR("BAD SEARCH MODE: [" << qs2utf8s(currentText) << "]\n"); return false; } } else if (qName == "AS") { stringToStrings(qs2utf8s(currentText), data.autosuffs); } else if (qName == "AP") { data.autophrase = true; } else if (qName == "SD") { // Closing current search descriptor. Finishing touches... resetTemps(); isvalid = true; } currentText.clear(); return true; } bool xmlToSSearch(const string& xml, SSearchDef& data) { SSHXMLHandler handler; QXmlSimpleReader reader; reader.setContentHandler(&handler); reader.setErrorHandler(&handler); QXmlInputSource xmlInputSource; xmlInputSource.setData(QString::fromUtf8(xml.c_str())); if (!reader.parse(xmlInputSource) || !handler.isvalid) { LOGERR("xmlToSSearch: parse failed for [" << xml << "]\n"); return false; } data = handler.data; return true; } recoll-1.23.7/qtgui/preview_load.cpp0000644000175000017500000000533313125637102014326 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include "log.h" #include "preview_load.h" #include "internfile.h" #include "rcldoc.h" #include "pathut.h" #include "cancelcheck.h" #include "rclconfig.h" LoadThread::LoadThread(RclConfig *config, const Rcl::Doc& idc, bool pvhtm, QObject *parent) : QThread(parent), status(1), m_idoc(idc), m_previewHtml(pvhtm), m_config(*config) { } void LoadThread::run() { FileInterner interner(m_idoc, &m_config, FileInterner::FIF_forPreview); FIMissingStore mst; interner.setMissingStore(&mst); // Even when previewHtml is set, we don't set the interner's // target mtype to html because we do want the html filter to // do its work: we won't use the text/plain, but we want the // text/html to be converted to utf-8 (for highlight processing) try { string ipath = m_idoc.ipath; FileInterner::Status ret = interner.internfile(fdoc, ipath); if (ret == FileInterner::FIDone || ret == FileInterner::FIAgain) { // FIAgain is actually not nice here. It means that the record // for the *file* of a multidoc was selected. Actually this // shouldn't have had a preview link at all, but we don't know // how to handle it now. Better to show the first doc than // a mysterious error. Happens when the file name matches a // a search term. status = 0; // If we prefer HTML and it is available, replace the // text/plain document text if (m_previewHtml && !interner.get_html().empty()) { fdoc.text = interner.get_html(); fdoc.mimetype = "text/html"; } tmpimg = interner.get_imgtmp(); } else { fdoc.mimetype = interner.getMimetype(); mst.getMissingExternal(missing); status = -1; } } catch (CancelExcept) { LOGDEB("LoadThread: cancelled\n" ); status = -1; } } recoll-1.23.7/qtgui/restable.ui0000644000175000017500000000360713125527323013307 00000000000000 ResTable 0 0 640 480 0 0 Qt::Vertical 0 2 QAbstractItemView::NoEditTriggers false true true false false false false 0 0 recoll-1.23.7/qtgui/preview_w.cpp0000644000175000017500000010315413224431020013644 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "log.h" #include "pathut.h" #include "internfile.h" #include "recoll.h" #include "smallut.h" #include "chrono.h" #include "wipedir.h" #include "cancelcheck.h" #include "preview_w.h" #include "guiutils.h" #include "docseqhist.h" #include "rclhelp.h" #include "preview_load.h" #include "preview_plaintorich.h" static const QKeySequence closeKS(Qt::Key_Escape); static const QKeySequence nextDocInTabKS(Qt::ShiftModifier+Qt::Key_Down); static const QKeySequence prevDocInTabKS(Qt::ShiftModifier+Qt::Key_Up); static const QKeySequence closeTabKS(Qt::ControlModifier+Qt::Key_W); static const QKeySequence printTabKS(Qt::ControlModifier+Qt::Key_P); void Preview::init() { setObjectName("Preview"); QVBoxLayout* previewLayout = new QVBoxLayout(this); pvTab = new QTabWidget(this); // Create the first tab. Should be possible to use addEditorTab // but this causes a pb with the sizeing QWidget *unnamed = new QWidget(pvTab); QVBoxLayout *unnamedLayout = new QVBoxLayout(unnamed); PreviewTextEdit *pvEdit = new PreviewTextEdit(unnamed, "pvEdit", this); pvEdit->setReadOnly(true); pvEdit->setUndoRedoEnabled(false); unnamedLayout->addWidget(pvEdit); pvTab->addTab(unnamed, ""); previewLayout->addWidget(pvTab); // Create the buttons and entry field QHBoxLayout *layout3 = new QHBoxLayout(0); searchLabel = new QLabel(this); layout3->addWidget(searchLabel); searchTextCMB = new QComboBox(this); searchTextCMB->setEditable(true); searchTextCMB->setInsertPolicy(QComboBox::NoInsert); searchTextCMB->setDuplicatesEnabled(false); for (unsigned int i = 0; i < m_hData.ugroups.size(); i++) { QString s; for (unsigned int j = 0; j < m_hData.ugroups[i].size(); j++) { s.append(QString::fromUtf8(m_hData.ugroups[i][j].c_str())); if (j != m_hData.ugroups[i].size()-1) s.append(" "); } searchTextCMB->addItem(s); } searchTextCMB->setEditText(""); searchTextCMB->setCompleter(0); layout3->addWidget(searchTextCMB); nextButton = new QPushButton(this); nextButton->setEnabled(true); layout3->addWidget(nextButton); prevButton = new QPushButton(this); prevButton->setEnabled(true); layout3->addWidget(prevButton); clearPB = new QPushButton(this); clearPB->setEnabled(false); layout3->addWidget(clearPB); matchCheck = new QCheckBox(this); layout3->addWidget(matchCheck); previewLayout->addLayout(layout3); resize(QSize(640, 480).expandedTo(minimumSizeHint())); // buddies searchLabel->setBuddy(searchTextCMB); searchLabel->setText(tr("&Search for:")); nextButton->setText(tr("&Next")); prevButton->setText(tr("&Previous")); clearPB->setText(tr("Clear")); matchCheck->setText(tr("Match &Case")); QPushButton * bt = new QPushButton(tr("Close Tab"), this); pvTab->setCornerWidget(bt); (void)new HelpClient(this); HelpClient::installMap((const char *)objectName().toUtf8(), "RCL.SEARCH.GUI.PREVIEW"); // signals and slots connections connect(searchTextCMB, SIGNAL(activated(int)), this, SLOT(searchTextFromIndex(int))); connect(searchTextCMB, SIGNAL(editTextChanged(const QString&)), this, SLOT(searchTextChanged(const QString&))); connect(nextButton, SIGNAL(clicked()), this, SLOT(nextPressed())); connect(prevButton, SIGNAL(clicked()), this, SLOT(prevPressed())); connect(clearPB, SIGNAL(clicked()), searchTextCMB, SLOT(clearEditText())); connect(pvTab, SIGNAL(currentChanged(int)), this, SLOT(currentChanged(int))); connect(bt, SIGNAL(clicked()), this, SLOT(closeCurrentTab())); connect(new QShortcut(closeKS, this), SIGNAL (activated()), this, SLOT (close())); connect(new QShortcut(nextDocInTabKS, this), SIGNAL (activated()), this, SLOT (emitShowNext())); connect(new QShortcut(prevDocInTabKS, this), SIGNAL (activated()), this, SLOT (emitShowPrev())); connect(new QShortcut(closeTabKS, this), SIGNAL (activated()), this, SLOT (closeCurrentTab())); connect(new QShortcut(printTabKS, this), SIGNAL (activated()), this, SIGNAL (printCurrentPreviewRequest())); m_dynSearchActive = false; m_canBeep = true; if (prefs.pvwidth > 100) { resize(prefs.pvwidth, prefs.pvheight); } m_loading = false; currentChanged(pvTab->currentIndex()); m_justCreated = true; } void Preview::emitShowNext() { if (m_loading) return; PreviewTextEdit *edit = currentEditor(); if (edit) { emit(showNext(this, m_searchId, edit->m_docnum)); } } void Preview::emitShowPrev() { if (m_loading) return; PreviewTextEdit *edit = currentEditor(); if (edit) { emit(showPrev(this, m_searchId, edit->m_docnum)); } } void Preview::closeEvent(QCloseEvent *e) { LOGDEB("Preview::closeEvent. m_loading " << (m_loading) << "\n" ); if (m_loading) { CancelCheck::instance().setCancel(); e->ignore(); return; } prefs.pvwidth = width(); prefs.pvheight = height(); /* Release all temporary files (but maybe none is actually set) */ for (int i = 0; i < pvTab->count(); i++) { QWidget *tw = pvTab->widget(i); if (tw) { PreviewTextEdit *edit = tw->findChild("pvEdit"); if (edit) { forgetTempFile(edit->m_tmpfilename); } } } emit previewExposed(this, m_searchId, -1); emit previewClosed(this); QWidget::closeEvent(e); } extern const char *eventTypeToStr(int tp); bool Preview::eventFilter(QObject *target, QEvent *event) { if (event->type() != QEvent::KeyPress) { #if 0 LOGDEB("Preview::eventFilter(): " << (eventTypeToStr(event->type())) << "\n" ); if (event->type() == QEvent::MouseButtonRelease) { QMouseEvent *mev = (QMouseEvent *)event; LOGDEB("Mouse: GlobalY " << (mev->globalY()) << " y " << (mev->y()) << "\n" ); } #endif return false; } PreviewTextEdit *edit = currentEditor(); QKeyEvent *keyEvent = (QKeyEvent *)event; if (m_dynSearchActive) { if (keyEvent->key() == Qt::Key_F3) { LOGDEB2("Preview::eventFilter: got F3\n" ); doSearch(searchTextCMB->currentText(), true, (keyEvent->modifiers() & Qt::ShiftModifier) != 0); return true; } if (target != searchTextCMB) return QApplication::sendEvent(searchTextCMB, event); } else { if (edit && (target == edit || target == edit->viewport())) { if (keyEvent->key() == Qt::Key_Slash || (keyEvent->key() == Qt::Key_F && (keyEvent->modifiers() & Qt::ControlModifier))) { LOGDEB2("Preview::eventFilter: got / or C-F\n" ); searchTextCMB->setFocus(); m_dynSearchActive = true; return true; } else if (keyEvent->key() == Qt::Key_Space) { LOGDEB2("Preview::eventFilter: got Space\n" ); int value = edit->verticalScrollBar()->value(); value += edit->verticalScrollBar()->pageStep(); edit->verticalScrollBar()->setValue(value); return true; } else if (keyEvent->key() == Qt::Key_Backspace) { LOGDEB2("Preview::eventFilter: got Backspace\n" ); int value = edit->verticalScrollBar()->value(); value -= edit->verticalScrollBar()->pageStep(); edit->verticalScrollBar()->setValue(value); return true; } } } return false; } void Preview::searchTextChanged(const QString & text) { LOGDEB1("Search line text changed. text: '" << ((const char *)text.toUtf8()) << "'\n" ); m_searchTextFromIndex = -1; if (text.isEmpty()) { m_dynSearchActive = false; clearPB->setEnabled(false); } else { m_dynSearchActive = true; clearPB->setEnabled(true); doSearch(text, false, false); } } void Preview::searchTextFromIndex(int idx) { LOGDEB1("search line from index " << (idx) << "\n" ); m_searchTextFromIndex = idx; } PreviewTextEdit *Preview::currentEditor() { LOGDEB2("Preview::currentEditor()\n" ); QWidget *tw = pvTab->currentWidget(); PreviewTextEdit *edit = 0; if (tw) { edit = tw->findChild("pvEdit"); } return edit; } // Save current document to file void Preview::emitSaveDocToFile() { PreviewTextEdit *ce = currentEditor(); if (ce && !ce->m_dbdoc.url.empty()) { emit saveDocToFile(ce->m_dbdoc); } } // Perform text search. If next is true, we look for the next match of the // current search, trying to advance and possibly wrapping around. If next is // false, the search string has been modified, we search for the new string, // starting from the current position void Preview::doSearch(const QString &_text, bool next, bool reverse, bool wordOnly) { LOGDEB("Preview::doSearch: text [" << ((const char *)_text.toUtf8()) << "] idx " << (m_searchTextFromIndex) << " next " << (int(next)) << " rev " << (int(reverse)) << " word " << (int(wordOnly)) << "\n" ); QString text = _text; bool matchCase = matchCheck->isChecked(); PreviewTextEdit *edit = currentEditor(); if (edit == 0) { // ?? return; } if (text.isEmpty() || m_searchTextFromIndex != -1) { if (!edit->m_plaintorich->haveAnchors()) { LOGDEB("NO ANCHORS\n" ); return; } // The combobox indices are equal to the search ugroup indices // in hldata, that's how we built the list. if (reverse) { edit->m_plaintorich->prevAnchorNum(m_searchTextFromIndex); } else { edit->m_plaintorich->nextAnchorNum(m_searchTextFromIndex); } QString aname = edit->m_plaintorich->curAnchorName(); LOGDEB("Calling scrollToAnchor(" << ((const char *)aname.toUtf8()) << ")\n" ); edit->scrollToAnchor(aname); // Position the cursor approximately at the anchor (top of // viewport) so that searches start from here QTextCursor cursor = edit->cursorForPosition(QPoint(0, 0)); edit->setTextCursor(cursor); return; } // If next is false, the user added characters to the current // search string. We need to reset the cursor position to the // start of the previous match, else incremental search is going // to look for the next occurrence instead of trying to lenghten // the current match if (!next) { QTextCursor cursor = edit->textCursor(); cursor.setPosition(cursor.anchor(), QTextCursor::KeepAnchor); edit->setTextCursor(cursor); } Chrono chron; LOGDEB("Preview::doSearch: first find call\n" ); QTextDocument::FindFlags flags = 0; if (reverse) flags |= QTextDocument::FindBackward; if (wordOnly) flags |= QTextDocument::FindWholeWords; if (matchCase) flags |= QTextDocument::FindCaseSensitively; bool found = edit->find(text, flags); LOGDEB("Preview::doSearch: first find call return: found " << (found) << " " << (chron.secs()) << " S\n" ); // If not found, try to wrap around. if (!found) { LOGDEB("Preview::doSearch: wrapping around\n" ); if (reverse) { edit->moveCursor (QTextCursor::End); } else { edit->moveCursor (QTextCursor::Start); } LOGDEB("Preview::doSearch: 2nd find call\n" ); chron.restart(); found = edit->find(text, flags); LOGDEB("Preview::doSearch: 2nd find call return found " << (found) << " " << (chron.secs()) << " S\n" ); } if (found) { m_canBeep = true; } else { if (m_canBeep) QApplication::beep(); m_canBeep = false; } LOGDEB("Preview::doSearch: return\n" ); } void Preview::nextPressed() { LOGDEB2("Preview::nextPressed\n" ); doSearch(searchTextCMB->currentText(), true, false); } void Preview::prevPressed() { LOGDEB2("Preview::prevPressed\n" ); doSearch(searchTextCMB->currentText(), true, true); } // Called when user clicks on tab void Preview::currentChanged(int index) { LOGDEB2("PreviewTextEdit::currentChanged\n" ); QWidget *tw = pvTab->widget(index); PreviewTextEdit *edit = tw->findChild("pvEdit"); LOGDEB1("Preview::currentChanged(). Editor: " << (edit) << "\n" ); if (edit == 0) { LOGERR("Editor child not found\n" ); return; } edit->setFocus(); // Disconnect the print signal and reconnect it to the current editor LOGDEB("Disconnecting reconnecting print signal\n" ); disconnect(this, SIGNAL(printCurrentPreviewRequest()), 0, 0); connect(this, SIGNAL(printCurrentPreviewRequest()), edit, SLOT(print())); edit->installEventFilter(this); edit->viewport()->installEventFilter(this); searchTextCMB->installEventFilter(this); emit(previewExposed(this, m_searchId, edit->m_docnum)); } void Preview::closeCurrentTab() { LOGDEB1("Preview::closeCurrentTab: m_loading " << (m_loading) << "\n" ); if (m_loading) { CancelCheck::instance().setCancel(); return; } PreviewTextEdit *e = currentEditor(); if (e) forgetTempFile(e->m_tmpfilename); if (pvTab->count() > 1) { pvTab->removeTab(pvTab->currentIndex()); } else { close(); } } PreviewTextEdit *Preview::addEditorTab() { LOGDEB1("PreviewTextEdit::addEditorTab()\n" ); QWidget *anon = new QWidget((QWidget *)pvTab); QVBoxLayout *anonLayout = new QVBoxLayout(anon); PreviewTextEdit *editor = new PreviewTextEdit(anon, "pvEdit", this); editor->setReadOnly(true); editor->setUndoRedoEnabled(false ); anonLayout->addWidget(editor); pvTab->addTab(anon, "Tab"); pvTab->setCurrentIndex(pvTab->count() -1); return editor; } void Preview::setCurTabProps(const Rcl::Doc &doc, int docnum) { LOGDEB1("Preview::setCurTabProps\n" ); QString title; string ctitle; if (doc.getmeta(Rcl::Doc::keytt, &ctitle) && !ctitle.empty()) { title = QString::fromUtf8(ctitle.c_str(), ctitle.length()); } else { title = QString::fromLocal8Bit(path_getsimple(doc.url).c_str()); } if (title.length() > 20) { title = title.left(10) + "..." + title.right(10); } int curidx = pvTab->currentIndex(); pvTab->setTabText(curidx, title); char datebuf[100]; datebuf[0] = 0; if (!doc.fmtime.empty() || !doc.dmtime.empty()) { time_t mtime = doc.dmtime.empty() ? atoll(doc.fmtime.c_str()) : atoll(doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); strftime(datebuf, 99, "%Y-%m-%d %H:%M:%S", tm); } LOGDEB("Doc.url: [" << (doc.url) << "]\n" ); string url; printableUrl(theconfig->getDefCharset(), doc.url, url); string tiptxt = url + string("\n"); tiptxt += doc.mimetype + " " + string(datebuf) + "\n"; if (!ctitle.empty()) tiptxt += ctitle + "\n"; pvTab->setTabToolTip(curidx, QString::fromUtf8(tiptxt.c_str(), tiptxt.length())); PreviewTextEdit *e = currentEditor(); if (e) { e->m_url = doc.url; e->m_ipath = doc.ipath; e->m_docnum = docnum; } } bool Preview::makeDocCurrent(const Rcl::Doc& doc, int docnum, bool sametab) { LOGDEB("Preview::makeDocCurrent: " << (doc.url) << "\n" ); if (m_loading) { LOGERR("Already loading\n" ); return false; } /* Check if we already have this page */ for (int i = 0; i < pvTab->count(); i++) { QWidget *tw = pvTab->widget(i); if (tw) { PreviewTextEdit *edit = tw->findChild("pvEdit"); if (edit && !edit->m_url.compare(doc.url) && !edit->m_ipath.compare(doc.ipath)) { pvTab->setCurrentIndex(i); return true; } } } // if just created the first tab was created during init if (!sametab && !m_justCreated && !addEditorTab()) { return false; } m_justCreated = false; if (!loadDocInCurrentTab(doc, docnum)) { closeCurrentTab(); return false; } raise(); return true; } void Preview::togglePlainPre() { switch (prefs.previewPlainPre) { case PrefsPack::PP_BR: prefs.previewPlainPre = PrefsPack::PP_PRE; break; case PrefsPack::PP_PRE: prefs.previewPlainPre = PrefsPack::PP_BR; break; case PrefsPack::PP_PREWRAP: default: prefs.previewPlainPre = PrefsPack::PP_PRE; break; } PreviewTextEdit *editor = currentEditor(); if (editor) loadDocInCurrentTab(editor->m_dbdoc, editor->m_docnum); } void Preview::emitWordSelect(QString word) { emit(wordSelect(word)); } /* Code for loading a file into an editor window. The operations that we call have no provision to indicate progression, and it would be complicated or impossible to modify them to do so (Ie: for external format converters). We implement a complicated and ugly mechanism based on threads to indicate to the user that the app is doing things: lengthy operations are done in threads and we update a progress indicator while they proceed (but we have no estimate of their total duration). It might be possible, but complicated (need modifications in handler) to implement a kind of bucket brigade, to have the beginning of the text displayed faster */ // Insert into editor by chunks so that the top becomes visible // earlier for big texts. This provokes some artifacts (adds empty line), // so we can't set it too low. #define CHUNKL 500*1000 // Make sure we don't ever reenter loadDocInCurrentTab: note that I // don't think it's actually possible, this must be the result of a // misguided debug session. class LoadGuard { bool *m_bp; public: LoadGuard(bool *bp) {m_bp = bp ; *m_bp = true;} ~LoadGuard() {*m_bp = false; CancelCheck::instance().setCancel(false);} }; bool Preview::loadDocInCurrentTab(const Rcl::Doc &idoc, int docnum) { LOGDEB1("Preview::loadDocInCurrentTab()\n" ); LoadGuard guard(&m_loading); CancelCheck::instance().setCancel(false); setCurTabProps(idoc, docnum); QString msg = QString("Loading: %1 (size %2 bytes)") .arg(QString::fromLocal8Bit(idoc.url.c_str())) .arg(QString::fromUtf8(idoc.fbytes.c_str())); QProgressDialog progress(msg, tr("Cancel"), 0, 0, this); progress.setMinimumDuration(2000); QEventLoop loop; QTimer tT; tT.setSingleShot(true); connect(&tT, SIGNAL(timeout()), &loop, SLOT(quit())); //////////////////////////////////////////////////////////////////////// // Load and convert document // idoc came out of the index data (main text and some fields missing). // fdoc is the complete one what we are going to extract from storage. LoadThread lthr(theconfig, idoc, prefs.previewHtml, this); connect(<hr, SIGNAL(finished()), &loop, SLOT(quit())); lthr.start(); for (int i = 0;;i++) { tT.start(1000); loop.exec(); if (lthr.isFinished()) break; if (progress.wasCanceled()) { CancelCheck::instance().setCancel(); } if (i == 1) progress.show(); } LOGDEB("loadDocInCurrentTab: after file load: cancel " << (CancelCheck::instance().cancelState()) << " status " << (lthr.status) << " text length " << (lthr.fdoc.text.length()) << "\n" ); if (CancelCheck::instance().cancelState()) return false; if (lthr.status != 0) { progress.close(); QString explain; if (!lthr.missing.empty()) { explain = QString::fromUtf8("
") + tr("Missing helper program: ") + QString::fromLocal8Bit(lthr.missing.c_str()); QMessageBox::warning(0, "Recoll", tr("Can't turn doc into internal " "representation for ") + lthr.fdoc.mimetype.c_str() + explain); } else { if (progress.wasCanceled()) { //QMessageBox::warning(0, "Recoll", tr("Canceled")); } else { QMessageBox::warning(0, "Recoll", tr("Error while loading file")); } } return false; } // Reset config just in case. theconfig->setKeyDir(""); //////////////////////////////////////////////////////////////////////// // Create preview text: highlight search terms // We don't do the highlighting for very big texts: too long. We // should at least do special char escaping, in case a '&' or '<' // somehow slipped through previous processing. bool highlightTerms = lthr.fdoc.text.length() < (unsigned long)prefs.maxhltextmbs * 1024 * 1024; // Final text is produced in chunks so that we can display the top // while still inserting at bottom PreviewTextEdit *editor = currentEditor(); editor->m_plaintorich->clear(); // For an actual html file, if we want to have the images and // style loaded in the preview, we need to set the search // path. Not too sure this is a good idea as I find them rather // distracting when looking for text, esp. with qtextedit // relatively limited html support (text sometimes get hidden by // images). #if 0 string path = fileurltolocalpath(idoc.url); if (!path.empty()) { path = path_getfather(path); QStringList paths(QString::fromLocal8Bit(path.c_str())); editor->setSearchPaths(paths); } #endif editor->setHtml(""); editor->m_format = Qt::RichText; bool inputishtml = !lthr.fdoc.mimetype.compare("text/html"); QStringList qrichlst; #if 1 if (highlightTerms) { progress.setLabelText(tr("Creating preview text")); qApp->processEvents(); if (inputishtml) { LOGDEB1("Preview: got html " << (lthr.fdoc.text) << "\n" ); editor->m_plaintorich->set_inputhtml(true); } else { LOGDEB1("Preview: got plain " << (lthr.fdoc.text) << "\n" ); editor->m_plaintorich->set_inputhtml(false); } ToRichThread rthr(lthr.fdoc.text, m_hData, editor->m_plaintorich, qrichlst, this); connect(&rthr, SIGNAL(finished()), &loop, SLOT(quit())); rthr.start(); for (;;) { tT.start(1000); loop.exec(); if (rthr.isFinished()) break; if (progress.wasCanceled()) { CancelCheck::instance().setCancel(); } } // Conversion to rich text done if (CancelCheck::instance().cancelState()) { if (qrichlst.size() == 0 || qrichlst.front().size() == 0) { // We can't call closeCurrentTab here as it might delete // the object which would be a nasty surprise to our // caller. return false; } else { qrichlst.back() += "Cancelled !"; } } } else { LOGDEB("Preview: no hilighting, loading " << (int(lthr.fdoc.text.size())) << " bytes\n" ); // No plaintorich() call. In this case, either the text is // html and the html quoting is hopefully correct, or it's // plain-text and there is no need to escape special // characters. We'd still want to split in chunks (so that the // top is displayed faster), but we must not cut tags, and // it's too difficult on html. For text we do the splitting on // a QString to avoid utf8 issues. QString qr = QString::fromUtf8(lthr.fdoc.text.c_str(), lthr.fdoc.text.length()); int l = 0; if (inputishtml) { qrichlst.push_back(qr); } else { editor->setPlainText(""); editor->m_format = Qt::PlainText; for (int pos = 0; pos < (int)qr.length(); pos += l) { l = MIN(CHUNKL, qr.length() - pos); qrichlst.push_back(qr.mid(pos, l)); } } } #else // For testing qtextedit bugs... highlightTerms = true; const char *textlist[] = { "Du plain text avec un\n termtag fin de ligne:", "texte apres le tag\n", }; const int listl = sizeof(textlist) / sizeof(char*); for (int i = 0 ; i < listl ; i++) qrichlst.push_back(QString::fromUtf8(textlist[i])); #endif /////////////////////////////////////////////////////////// // Load text into editor window. progress.setLabelText(tr("Loading preview text into editor")); qApp->processEvents(); for (QStringList::iterator it = qrichlst.begin(); it != qrichlst.end(); it++) { qApp->processEvents(); editor->append(*it); // We need to save the rich text for printing, the editor does // not do it consistently for us. editor->m_richtxt.append(*it); if (progress.wasCanceled()) { editor->append("Cancelled !"); LOGDEB("loadDocInCurrentTab: cancelled in editor load\n" ); break; } } progress.close(); editor->m_curdsp = PreviewTextEdit::PTE_DSPTXT; //////////////////////////////////////////////////////////////////////// // Finishing steps // Maybe the text was actually empty ? Switch to fields then. Else free-up // the text memory in the loaded document. We still have a copy of the text // in editor->m_richtxt bool textempty = lthr.fdoc.text.empty(); if (!textempty) lthr.fdoc.text.clear(); editor->m_fdoc = lthr.fdoc; editor->m_dbdoc = idoc; if (textempty) editor->displayFields(); // If this is an image, display it instead of the text. if (!idoc.mimetype.compare(0, 6, "image/")) { string fn = fileurltolocalpath(idoc.url); theconfig->setKeyDir(fn.empty() ? "" : path_getfather(fn)); // We want a real file, so if this comes from data or we have // an ipath, create it. if (fn.empty() || !idoc.ipath.empty()) { TempFile temp = lthr.tmpimg; if (temp) { LOGDEB1("Preview: load: got temp file from internfile\n"); } else if (!FileInterner::idocToFile(temp, string(), theconfig, idoc)) { temp.reset(); // just in case. } if (temp) { rememberTempFile(temp); fn = temp->filename(); editor->m_tmpfilename = fn; } else { editor->m_tmpfilename.erase(); fn.erase(); } } if (!fn.empty()) { editor->m_image = QImage(fn.c_str()); if (!editor->m_image.isNull()) editor->displayImage(); } } // Position the editor so that the first search term is visible if (searchTextCMB->currentText().length() != 0) { // If there is a current search string, perform the search m_canBeep = true; doSearch(searchTextCMB->currentText(), true, false); } else { // Position to the first query term if (editor->m_plaintorich->haveAnchors()) { QString aname = editor->m_plaintorich->curAnchorName(); LOGDEB2("Call movetoanchor(" << ((const char *)aname.toUtf8()) << ")\n" ); editor->scrollToAnchor(aname); // Position the cursor approximately at the anchor (top of // viewport) so that searches start from here QTextCursor cursor = editor->cursorForPosition(QPoint(0, 0)); editor->setTextCursor(cursor); } } // Enter document in document history string udi; if (idoc.getmeta(Rcl::Doc::keyudi, &udi)) { historyEnterDoc(g_dynconf, udi); } editor->setFocus(); emit(previewExposed(this, m_searchId, docnum)); LOGDEB("loadDocInCurrentTab: returning true\n" ); return true; } PreviewTextEdit::PreviewTextEdit(QWidget* parent, const char* nm, Preview *pv) : QTextBrowser(parent), m_preview(pv), m_plaintorich(new PlainToRichQtPreview()), m_dspflds(false), m_docnum(-1) { setContextMenuPolicy(Qt::CustomContextMenu); setObjectName(nm); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); setOpenExternalLinks(false); setOpenLinks(false); } void PreviewTextEdit::createPopupMenu(const QPoint& pos) { LOGDEB1("PreviewTextEdit::createPopupMenu()\n" ); QMenu *popup = new QMenu(this); switch (m_curdsp) { case PTE_DSPTXT: popup->addAction(tr("Show fields"), this, SLOT(displayFields())); if (!m_image.isNull()) popup->addAction(tr("Show image"), this, SLOT(displayImage())); break; case PTE_DSPFLDS: popup->addAction(tr("Show main text"), this, SLOT(displayText())); if (!m_image.isNull()) popup->addAction(tr("Show image"), this, SLOT(displayImage())); break; case PTE_DSPIMG: default: popup->addAction(tr("Show fields"), this, SLOT(displayFields())); popup->addAction(tr("Show main text"), this, SLOT(displayText())); break; } popup->addAction(tr("Select All"), this, SLOT(selectAll())); popup->addAction(tr("Copy"), this, SLOT(copy())); popup->addAction(tr("Print"), this, SLOT(print())); if (prefs.previewPlainPre) { popup->addAction(tr("Fold lines"), m_preview, SLOT(togglePlainPre())); } else { popup->addAction(tr("Preserve indentation"), m_preview, SLOT(togglePlainPre())); } // Need to check ipath until we fix the internfile bug that always // has it convert to html for top level docs if (!m_dbdoc.url.empty() && !m_dbdoc.ipath.empty()) popup->addAction(tr("Save document to file"), m_preview, SLOT(emitSaveDocToFile())); popup->popup(mapToGlobal(pos)); } // Display main text void PreviewTextEdit::displayText() { LOGDEB1("PreviewTextEdit::displayText()\n" ); if (m_format == Qt::PlainText) setPlainText(m_richtxt); else setHtml(m_richtxt); m_curdsp = PTE_DSPTXT; } // Display field values void PreviewTextEdit::displayFields() { LOGDEB1("PreviewTextEdit::displayFields()\n" ); QString txt = "\n"; txt += "" + QString::fromLocal8Bit(m_url.c_str()); if (!m_ipath.empty()) txt += "|" + QString::fromUtf8(m_ipath.c_str()); txt += "

"; txt += "
\n"; for (map::const_iterator it = m_fdoc.meta.begin(); it != m_fdoc.meta.end(); it++) { if (!it->second.empty()) txt += "
" + QString::fromUtf8(it->first.c_str()) + "
" + "
" + QString::fromUtf8(escapeHtml(it->second).c_str()) + "
\n"; } txt += "
"; setHtml(txt); m_curdsp = PTE_DSPFLDS; } void PreviewTextEdit::displayImage() { LOGDEB1("PreviewTextEdit::displayImage()\n" ); if (m_image.isNull()) displayText(); setPlainText(""); if (m_image.width() > width() || m_image.height() > height()) { m_image = m_image.scaled(width(), height(), Qt::KeepAspectRatio); } document()->addResource(QTextDocument::ImageResource, QUrl("image"), m_image); QTextCursor cursor = textCursor(); cursor.insertImage("image"); m_curdsp = PTE_DSPIMG; } void PreviewTextEdit::mouseDoubleClickEvent(QMouseEvent *event) { LOGDEB2("PreviewTextEdit::mouseDoubleClickEvent\n" ); QTextEdit::mouseDoubleClickEvent(event); if (textCursor().hasSelection() && m_preview) m_preview->emitWordSelect(textCursor().selectedText()); } void PreviewTextEdit::print() { LOGDEB("PreviewTextEdit::print\n" ); if (!m_preview) return; #ifndef QT_NO_PRINTER QPrinter printer; QPrintDialog *dialog = new QPrintDialog(&printer, this); dialog->setWindowTitle(tr("Print Current Preview")); if (dialog->exec() != QDialog::Accepted) return; QTextEdit::print(&printer); #endif } recoll-1.23.7/qtgui/rclm_saveload.cpp0000644000175000017500000000773313224431020014456 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" /** Saving and restoring named queries */ #include "safesysstat.h" #include #include #include #include "rclmain_w.h" #include "log.h" #include "readfile.h" #include "xmltosd.h" #include "searchdata.h" #include "copyfile.h" using namespace std; using namespace Rcl; static QString prevDir() { QSettings settings; QString prevdir = settings.value("/Recoll/prefs/lastQuerySaveDir").toString(); string defpath = path_cat(theconfig->getConfDir(), "saved_queries"); if (prevdir.isEmpty()) { if (!path_exists(defpath)) { mkdir(defpath.c_str(), 0700); } return QString::fromLocal8Bit(defpath.c_str()); } else { return prevdir; } } void RclMain::saveLastQuery() { string xml; if (lastSearchSimple()) { xml = sSearch->asXML(); } else { if (g_advshistory) { std::shared_ptr sd; sd = g_advshistory->getnewest(); if (sd) { xml = sd->asXML(); } } } if (xml.empty()) { QMessageBox::information(this, tr("No search"), tr("No preserved previous search")); return; } xml = string("\n") + "\n" + xml + "\n\n"; QFileDialog fileDialog(this, tr("Choose file to save")); fileDialog.setNameFilter(tr("Saved Queries (*.rclq)")); fileDialog.setDefaultSuffix("rclq"); fileDialog.setAcceptMode(QFileDialog::AcceptSave); fileDialog.setDirectory(prevDir()); if (!fileDialog.exec()) return; QString s = fileDialog.selectedFiles().first(); if (s.isEmpty()) { return; } string tofile((const char *)s.toLocal8Bit()); LOGDEB("RclMain::saveLastQuery: XML: [" << (xml) << "]\n" ); string reason; if (!stringtofile(xml, tofile.c_str(), reason)) { QMessageBox::warning(this, tr("Write failed"), tr("Could not write to file")); } return; } void RclMain::loadSavedQuery() { QString s = QFileDialog::getOpenFileName(this, "Open saved query", prevDir(), tr("Saved Queries (*.rclq)")); if (s.isEmpty()) return; string fromfile((const char *)s.toLocal8Bit()); string xml, reason; if (!file_to_string(fromfile, xml, &reason)) { QMessageBox::warning(this, tr("Read failed"), tr("Could not open file: ") + QString::fromUtf8(reason.c_str())); return; } // Try to parse as advanced search SearchData std::shared_ptr sd = xmlToSearchData(xml, false); if (sd) { showAdvSearchDialog(); asearchform->fromSearch(sd); return; } LOGDEB("loadSavedQuery: Not advanced search. Parsing as simple search\n"); // Try to parse as Simple Search SSearchDef sdef; if (xmlToSSearch(xml, sdef)) { if (sSearch->fromXML(sdef)) return; } QMessageBox::warning(this, tr("Load error"), tr("Could not load saved query")); } recoll-1.23.7/qtgui/rclhelp.cpp0000644000175000017500000000430313125637102013273 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "recoll.h" #include "rclhelp.h" #include "log.h" map HelpClient::helpmap; void HelpClient::installMap(string wname, string section) { helpmap[wname] = section; } HelpClient::HelpClient(QObject *parent, const char *) : QObject(parent) { parent->installEventFilter(this); } bool HelpClient::eventFilter(QObject *obj, QEvent *event) { static time_t last_start; if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) { // LOGDEB("HelpClient::eventFilter: " << ((int)event->type()) << "\n" ); QKeyEvent *ke = static_cast(event); if (ke->key() == Qt::Key_F1 || ke->key() == Qt::Key_Help) { if (obj->isWidgetType()) { QWidget *widget = static_cast(obj)->focusWidget(); map::iterator it = helpmap.end(); while (widget) { it = helpmap.find((const char *)widget->objectName().toUtf8()); if (it != helpmap.end()) break; widget = widget->parentWidget(); } if (time(0) - last_start > 5) { last_start = time(0); if (it != helpmap.end()) { LOGDEB("HelpClient::eventFilter: " << (it->first) << "->" << (it->second) << "\n" ); startManual(it->second); } else { LOGDEB("HelpClient::eventFilter: no help section\n" ); startManual(""); } } } return true; } } return false; } recoll-1.23.7/qtgui/webcache.ui0000644000175000017500000000236013125527323013242 00000000000000 Webcache 0 0 400 300 Webcache editor Search regexp searchLE QAbstractItemView::NoEditTriggers true false recoll-1.23.7/qtgui/advsearch_w.h0000644000175000017500000000446513125637102013606 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _ADVSEARCH_W_H_INCLUDED_ #define _ADVSEARCH_W_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include "searchclause_w.h" #include "recoll.h" #include #include "searchdata.h" #include "advshist.h" class QDialog; #include "ui_advsearch.h" class AdvSearch : public QDialog, public Ui::AdvSearchBase { Q_OBJECT public: AdvSearch(QDialog* parent = 0) : QDialog(parent) { setupUi(this); init(); } public slots: virtual void delFiltypPB_clicked(); virtual void delAFiltypPB_clicked(); virtual void addFiltypPB_clicked(); virtual void addAFiltypPB_clicked(); virtual void guiListsToIgnTypes(); virtual void filterDatesCB_toggled(bool); virtual void filterSizesCB_toggled(bool); virtual void restrictFtCB_toggled(bool); virtual void restrictCtCB_toggled(bool); virtual void runSearch(); virtual void fromSearch(std::shared_ptr sdata); virtual void browsePB_clicked(); virtual void saveFileTypes(); virtual void delClause(); virtual void addClause(); virtual void addClause(int); virtual void slotHistoryNext(); virtual void slotHistoryPrev(); signals: void startSearch(std::shared_ptr, bool); private: virtual void init(); std::vector m_clauseWins; QStringList m_ignTypes; bool m_ignByCats; void saveCnf(); void fillFileTypes(); size_t stringToSize(QString); }; #endif /* _ADVSEARCH_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/snippets_w.h0000644000175000017500000000324013125637102013501 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SNIPPETS_W_H_INCLUDED_ #define _SNIPPETS_W_H_INCLUDED_ #include "autoconfig.h" #include #include #include "rcldoc.h" #include "docseq.h" #include "rclmain_w.h" #include "ui_snippets.h" class SnippetsW : public QWidget, public Ui::Snippets { Q_OBJECT public: SnippetsW(Rcl::Doc doc, std::shared_ptr source, QWidget* parent = 0) : QWidget(parent), m_doc(doc), m_source(source) { setupUi((QDialog*)this); init(); } protected slots: virtual void linkWasClicked(const QUrl &); virtual void slotEditFind(); virtual void slotEditFindNext(); virtual void slotEditFindPrevious(); virtual void slotSearchTextChanged(const QString&); signals: void startNativeViewer(Rcl::Doc, int pagenum, QString term); private: void init(); Rcl::Doc m_doc; std::shared_ptr m_source; }; #endif /* _SNIPPETS_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/multisave.cpp0000644000175000017500000001134113224431020013642 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include using namespace std; #include #include #include #include "recoll.h" #include "multisave.h" #include "smallut.h" #include "log.h" #include "pathut.h" #include "internfile.h" const unsigned int maxlen = 200; void multiSave(QWidget *p, vector& docs) { QFileDialog fdialog(p, QWidget::tr("Create or choose save directory")); fdialog.setAcceptMode(QFileDialog::AcceptSave); fdialog.setFileMode(QFileDialog::Directory); fdialog.setOption(QFileDialog::ShowDirsOnly); if (fdialog.exec() == 0) return; QStringList dirl = fdialog.selectedFiles(); if (dirl.size() != 1) { // Can't happen ? QMessageBox::warning(0, "Recoll", QWidget::tr("Choose exactly one directory")); return; } string dir((const char *)dirl[0].toLocal8Bit()); LOGDEB2("multiSave: got dir " << (dir) << "\n" ); /* Save doc to files in target directory. Issues: - It is quite common to have docs in the array with the same file names, e.g. all messages in a folder have the same file name (the folder's). - There is no warranty that the ipath is going to be acceptable as a file name or interesting at all. We don't use it. - We have to make sure the names don't end up too long. If collisions occur, we add a numeric infix (e.g. somefile.23.pdf). We never overwrite existing files and don't give the user an option to do it (they can just as well save to an empty directory and use the file manager to accomplish whatever they want). We don't try hard to protect against race-conditions though. The existing file names are read before beginning the save sequence, and collisions appearing after this are handled by aborting. There is a window between existence check and creation because idoctofile does not use O_EXCL */ set existingNames; string reason; if (!readdir(dir, reason, existingNames)) { QMessageBox::warning(0, "Recoll", QWidget::tr("Could not read directory: ") + QString::fromLocal8Bit(reason.c_str())); return; } set toBeCreated; vector filenames; for (vector::iterator it = docs.begin(); it != docs.end(); it++) { string utf8fn; it->getmeta(Rcl::Doc::keyfn, &utf8fn); string suffix = path_suffix(utf8fn); LOGDEB("Multisave: [" << (utf8fn) << "] suff [" << (suffix) << "]\n" ); if (suffix.empty() || suffix.size() > 10) { suffix = theconfig->getSuffixFromMimeType(it->mimetype); LOGDEB("Multisave: suff from config [" << (suffix) << "]\n" ); } string simple = path_basename(utf8fn, string(".") + suffix); LOGDEB("Multisave: simple [" << (simple) << "]\n" ); if (simple.empty()) simple = "rclsave"; if (simple.size() > maxlen) { simple = simple.substr(0, maxlen); } for (int vers = 0; ; vers++) { ostringstream ss; ss << simple; if (vers) ss << "." << vers; if (!suffix.empty()) ss << "." << suffix; string fn = (const char *)QString::fromUtf8(ss.str().c_str()).toLocal8Bit(); if (existingNames.find(fn) == existingNames.end() && toBeCreated.find(fn) == toBeCreated.end()) { toBeCreated.insert(fn); filenames.push_back(fn); break; } } } for (unsigned int i = 0; i != docs.size(); i++) { string fn = path_cat(dir, filenames[i]); if (path_exists(fn)) { QMessageBox::warning(0, "Recoll", QWidget::tr("Unexpected file name collision, " "cancelling.")); return; } // There is still a race condition here, should we care ? TempFile temp;// not used if (!FileInterner::idocToFile(temp, fn, theconfig, docs[i], false)) { QMessageBox::warning(0, "Recoll", QWidget::tr("Cannot extract document: ") + QString::fromLocal8Bit(docs[i].url.c_str()) + " | " + QString::fromLocal8Bit(docs[i].ipath.c_str()) ); } } } recoll-1.23.7/qtgui/spell.ui0000644000175000017500000000764113125527323012627 00000000000000 SpellBase 0 0 520 465 0 0 100 100 Term Explorer 100 0 Match Case Accents false Qt::NoFocus &Expand Alt+E true Qt::NoFocus &Close Alt+C 7 No db info. 2 2 false false baseWordLE expandPB dismissPB stemLangCMB recoll-1.23.7/qtgui/snippets.ui0000644000175000017500000001012613125527323013345 00000000000000 Snippets 0 0 640 400 Snippets 1 0 QFrame::StyledPanel QFrame::Raised 1 1 0 0 X Qt::ToolButtonTextOnly Find: 0 0 0 0 Next 0 0 Prev Qt::Horizontal QDialogButtonBox::Close searchClosePB clicked() searchFM hide() 33 414 328 414 recoll-1.23.7/qtgui/rclzg.cpp0000644000175000017500000000517313125637102012771 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef USE_ZEITGEIST #include "autoconfig.h" #include "rclzg.h" #include "log.h" #include "pathut.h" #include #include #include #include #include #include #include // Can't see no reason why our logger couldn' static QtZeitgeist::Log zglogger; void zg_send_event(ZgSendType, const Rcl::Doc& doc) { static int needinit = 1; if (needinit) { QtZeitgeist::init(); needinit = 0; } // The subject is about the document QtZeitgeist::DataModel::Subject subject; subject.setUri(QString::fromLocal8Bit(doc.url.c_str())); // TODO: refine these subject.setInterpretation(QtZeitgeist::Interpretation::Subject::NFODocument); if (doc.ipath.empty()) subject.setManifestation(QtZeitgeist::Manifestation::Subject::NFOFileDataObject); else subject.setManifestation(QtZeitgeist::Manifestation::Subject::NFOEmbeddedFileDataObject); subject.setOrigin(QString::fromLocal8Bit(path_getfather(doc.url).c_str())); subject.setMimeType(doc.mimetype.c_str()); string titleOrFilename; doc.getmeta(Rcl::Doc::keytt, &titleOrFilename); if (titleOrFilename.empty()) { doc.getmeta(Rcl::Doc::keyfn, &titleOrFilename); } subject.setText(QString::fromUtf8(titleOrFilename.c_str())); QtZeitgeist::DataModel::Event event; event.setTimestamp(QDateTime::currentDateTime()); event.addSubject(subject); event.setInterpretation(QtZeitgeist::Interpretation::Event::ZGAccessEvent); event.setManifestation(QtZeitgeist::Manifestation::Event::ZGUserActivity); event.setActor("app://recoll.desktop"); QtZeitgeist::DataModel::EventList events; events.push_back(event); LOGDEB("zg_send_event, sending for " << (doc.mimetype) << " " << (doc.url) << "\n" ); zglogger.insertEvents(events); } #endif recoll-1.23.7/qtgui/main.cpp0000644000175000017500000003250013224431525012567 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "rcldb.h" #include "rclconfig.h" #include "pathut.h" #include "recoll.h" #include "smallut.h" #include "rclinit.h" #include "log.h" #include "rclmain_w.h" #include "ssearch_w.h" #include "guiutils.h" #include "smallut.h" #include "readfile.h" #include "recollq.h" extern RclConfig *theconfig; std::mutex thetempfileslock; static vector o_tempfiles; /* Keep an array of temporary files for deletion at exit. It happens that we erase some of them before exiting (ie: when closing a preview tab), we don't reuse the array holes for now */ void rememberTempFile(TempFile temp) { std::unique_lock locker(thetempfileslock); o_tempfiles.push_back(temp); } void forgetTempFile(string &fn) { if (fn.empty()) return; std::unique_lock locker(thetempfileslock); for (vector::iterator it = o_tempfiles.begin(); it != o_tempfiles.end(); it++) { if ((*it) && !fn.compare((*it)->filename())) { it->reset(); } } fn.erase(); } void deleteAllTempFiles() { std::unique_lock locker(thetempfileslock); o_tempfiles.clear(); } Rcl::Db *rcldb; int recollNeedsExit; RclMain *mainWindow; void startManual(const string& helpindex) { if (mainWindow) mainWindow->startManual(helpindex); } bool maybeOpenDb(string &reason, bool force, bool *maindberror) { LOGDEB2("maybeOpenDb: force " << (force) << "\n" ); if (!rcldb) { reason = "Internal error: db not created"; return false; } if (force) rcldb->close(); rcldb->rmQueryDb(""); for (list::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { LOGDEB("main: adding [" << *it << "]\n" ); rcldb->addQueryDb(*it); } Rcl::Db::OpenError error; if (!rcldb->isopen() && !rcldb->open(Rcl::Db::DbRO, &error)) { reason = "Could not open database"; if (maindberror) { reason += " in " + theconfig->getDbDir() + " wait for indexing to complete?"; *maindberror = (error == Rcl::Db::DbOpenMainDb) ? true : false; } return false; } rcldb->setAbstractParams(-1, prefs.syntAbsLen, prefs.syntAbsCtx); return true; } // Retrieve the list currently active stemming languages. We try to // get this from the db, as some may have been added from recollindex // without changing the config. If this fails, use the config. This is // used for setting up choice menus, not updating the configuration. bool getStemLangs(vector& vlangs) { // Try from db string reason; if (maybeOpenDb(reason)) { vlangs = rcldb->getStemLangs(); LOGDEB0("getStemLangs: from index: " << (stringsToString(vlangs)) << "\n" ); return true; } else { // Cant get the langs from the index. Maybe it just does not // exist yet. So get them from the config string slangs; if (theconfig->getConfParam("indexstemminglanguages", slangs)) { stringToStrings(slangs, vlangs); return true; } return false; } } static void recollCleanup() { LOGDEB2("recollCleanup: closing database\n" ); deleteZ(rcldb); deleteZ(theconfig); deleteAllTempFiles(); LOGDEB2("recollCleanup: done\n" ); } void applyStyleSheet(const QString& ssfname) { const char *cfname = (const char *)ssfname.toLocal8Bit(); LOGDEB0("Applying style sheet: [" << (cfname) << "]\n" ); if (cfname && *cfname) { string stylesheet; file_to_string(cfname, stylesheet); qApp->setStyleSheet(QString::fromUtf8(stylesheet.c_str())); } else { qApp->setStyleSheet(QString()); } } extern void qInitImages_recoll(); static const char *thisprog; // BEWARE COMPATIBILITY WITH recollq OPTIONS letters static int op_flags; #define OPT_a 0x1 #define OPT_c 0x2 #define OPT_f 0x4 #define OPT_h 0x8 #define OPT_L 0x10 #define OPT_l 0x20 #define OPT_o 0x40 #define OPT_q 0x80 #define OPT_t 0x100 #define OPT_v 0x200 static const char usage [] = "\n" "recoll [-h] [-c ] [-q query]\n" " -h : Print help and exit\n" " -c : specify config directory, overriding $RECOLL_CONFDIR\n" " -L : force language for GUI messages (e.g. -L fr)\n" " [-o|l|f|a] [-t] -q 'query' : search query to be executed as if entered\n" " into simple search. The default is to interpret the argument as a \n" " query language string (but see modifier options)\n" " In most cases, the query string should be quoted with single-quotes to\n" " avoid shell interpretation\n" " -a : the query will be interpreted as an AND query.\n" " -o : the query will be interpreted as an OR query.\n" " -f : the query will be interpreted as a filename search\n" " -l : the query will be interpreted as a query language string (default)\n" " -t : terminal display: no gui. Results go to stdout. MUST be given\n" " explicitly as -t (not ie, -at), and -q MUST\n" " be last on the command line if this is used.\n" " Use -t -h to see the additional non-gui options\n" "recoll -v : print version\n" "recoll \n" " This is used to open a recoll url (including an ipath), and called\n" " typically from another search interface like the Unity Dash\n" ; static void Usage(void) { FILE *fp = (op_flags & OPT_h) ? stdout : stderr; fprintf(fp, "%s\n", Rcl::version_string().c_str()); fprintf(fp, "%s: Usage: %s", thisprog, usage); exit((op_flags & OPT_h)==0); } int main(int argc, char **argv) { // if we are named recollq or option "-t" is present at all, we // don't do the GUI thing and pass the whole to recollq for // command line / pipe usage. if (!strcmp(argv[0], "recollq")) exit(recollq(&theconfig, argc, argv)); for (int i = 0; i < argc; i++) { if (!strcmp(argv[i], "-t")) { exit(recollq(&theconfig, argc, argv)); } } QApplication app(argc, argv); QCoreApplication::setOrganizationName("Recoll.org"); QCoreApplication::setApplicationName("recoll"); string a_config; string a_lang; string question; string urltoview; thisprog = argv[0]; argc--; argv++; while (argc > 0 && **argv == '-') { (*argv)++; if (!(**argv)) Usage(); while (**argv) switch (*(*argv)++) { case 'a': op_flags |= OPT_a; break; case 'c': op_flags |= OPT_c; if (argc < 2) Usage(); a_config = *(++argv); argc--; goto b1; case 'f': op_flags |= OPT_f; break; case 'h': op_flags |= OPT_h; Usage();break; case 'L': op_flags |= OPT_L; if (argc < 2) Usage(); a_lang = *(++argv); argc--; goto b1; case 'l': op_flags |= OPT_l; break; case 'o': op_flags |= OPT_o; break; case 'q': op_flags |= OPT_q; if (argc < 2) Usage(); question = *(++argv); argc--; goto b1; case 'v': op_flags |= OPT_v; fprintf(stdout, "%s\n", Rcl::version_string().c_str()); return 0; case 't': op_flags |= OPT_t; break; default: Usage(); } b1: argc--; argv++; } // If -q was given, all remaining non-option args are concatenated // to the query. This is for the common case recoll -q x y z to // avoid needing quoting "x y z" if (op_flags & OPT_q) while (argc > 0) { question += " "; question += *argv++; argc--; } // Else the remaining argument should be an URL to be opened if (argc == 1) { urltoview = *argv++;argc--; if (urltoview.compare(0, 7, cstr_fileu)) { Usage(); } } else if (argc > 0) Usage(); string reason; theconfig = recollinit(recollCleanup, 0, reason, &a_config); if (!theconfig || !theconfig->ok()) { QString msg = "Configuration problem: "; msg += QString::fromUtf8(reason.c_str()); QMessageBox::critical(0, "Recoll", msg); exit(1); } // fprintf(stderr, "recollinit done\n"); // Translations for Qt standard widgets QString slang; if (op_flags & OPT_L) { slang = u8s2qs(a_lang); } else { slang = QLocale::system().name().left(2); } QTranslator qt_trans(0); qt_trans.load(QString("qt_%1").arg(slang), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); app.installTranslator(&qt_trans); // Translations for Recoll string translatdir = path_cat(theconfig->getDatadir(), "translations"); QTranslator translator(0); translator.load( QString("recoll_") + slang, translatdir.c_str() ); app.installTranslator( &translator ); // fprintf(stderr, "Translations installed\n"); string historyfile = path_cat(theconfig->getConfDir(), "history"); g_dynconf = new RclDynConf(historyfile); if (!g_dynconf || !g_dynconf->ok()) { QString msg = app.translate ("Main", "\"history\" file is damaged or un(read)writeable, please check " "or remove it: ") + QString::fromLocal8Bit(historyfile.c_str()); QMessageBox::critical(0, "Recoll", msg); exit(1); } g_advshistory = new AdvSearchHist; // fprintf(stderr, "History done\n"); rwSettings(false); // fprintf(stderr, "Settings done\n"); if (!prefs.qssFile.isEmpty()) { applyStyleSheet(prefs.qssFile); } QIcon icon; icon.addFile(QString::fromUtf8(":/images/recoll.png")); app.setWindowIcon(icon); // Create main window and set its size to previous session's RclMain w; mainWindow = &w; if (prefs.mainwidth > 100) { QSize s(prefs.mainwidth, prefs.mainheight); mainWindow->resize(s); } string dbdir = theconfig->getDbDir(); if (dbdir.empty()) { QMessageBox::critical( 0, "Recoll", app.translate("Main", "No db directory in configuration")); exit(1); } rcldb = new Rcl::Db(theconfig); mainWindow->show(); QTimer::singleShot(0, mainWindow, SLOT(initDbOpen())); // Connect exit handlers etc.. Beware, apparently this must come // after mainWindow->show()? app.connect(&app, SIGNAL(lastWindowClosed()), &app, SLOT(quit())); app.connect(&app, SIGNAL(aboutToQuit()), mainWindow, SLOT(close())); mainWindow->sSearch->searchTypCMB->setCurrentIndex(prefs.ssearchTyp); mainWindow->sSearch->searchTypeChanged(prefs.ssearchTyp); if (op_flags & OPT_q) { SSearch::SSearchType stype; if (op_flags & OPT_o) { stype = SSearch::SST_ANY; } else if (op_flags & OPT_f) { stype = SSearch::SST_FNM; } else if (op_flags & OPT_a) { stype = SSearch::SST_ALL; } else { stype = SSearch::SST_LANG; } mainWindow->sSearch->searchTypCMB->setCurrentIndex(int(stype)); mainWindow-> sSearch->setSearchString(QString::fromLocal8Bit(question.c_str())); } else if (!urltoview.empty()) { LOGDEB("MAIN: got urltoview [" << (urltoview) << "]\n" ); mainWindow->setUrlToView(QString::fromLocal8Bit(urltoview.c_str())); } return app.exec(); } QString myGetFileName(bool isdir, QString caption, bool filenosave) { LOGDEB1("myFileDialog: isdir " << (isdir) << "\n" ); QFileDialog dialog(0, caption); if (isdir) { dialog.setFileMode(QFileDialog::Directory); dialog.setOptions(QFileDialog::ShowDirsOnly); } else { dialog.setFileMode(QFileDialog::AnyFile); if (filenosave) dialog.setAcceptMode(QFileDialog::AcceptOpen); else dialog.setAcceptMode(QFileDialog::AcceptSave); } dialog.setViewMode(QFileDialog::List); QFlags flags = QDir::NoDotAndDotDot | QDir::Hidden; if (isdir) flags |= QDir::Dirs; else flags |= QDir::Dirs | QDir::Files; dialog.setFilter(flags); if (dialog.exec() == QDialog::Accepted) { return dialog.selectedFiles().value(0); } return QString(); } recoll-1.23.7/qtgui/guiutils.h0000644000175000017500000001237013125637102013157 00000000000000/* Copyright (C) 2005 Jean-Francois Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _GUIUTILS_H_INCLUDED_ #define _GUIUTILS_H_INCLUDED_ #include #include #include #include #include #include "dynconf.h" extern RclDynConf *g_dynconf; #include "advshist.h" extern AdvSearchHist *g_advshistory; #ifndef NO_NAMESPACES using std::string; using std::list; using std::vector; #endif /** Holder for preferences (gets saved to user Qt prefs) */ class PrefsPack { public: // Simple search entry behaviour bool ssearchOnWS; bool ssearchNoComplete; bool ssearchAsYouType; // Decide if we display the doc category filter control as a // toolbar+combobox or as a button group under simple search enum FilterCtlStyle {FCS_BT, FCS_CMB, FCS_MN}; int filterCtlStyle; int respagesize; int maxhltextmbs; QString reslistfontfamily; // Not saved in prefs for now. Computed from qt defaults and used to // set main character color for webkit/textbrowser reslist and // snippets window. QString fontcolor; QString qtermstyle; // CSS style for query terms in reslist and other places int reslistfontsize; // Result list format string QString reslistformat; string creslistformat; QString reslistheadertext; // Abstract snippet separator QString abssep; // Date strftime format QString reslistdateformat; string creslistdateformat; QString qssFile; QString snipCssFile; QString queryStemLang; int mainwidth; int mainheight; int pvwidth; // Preview window geom int pvheight; int toolArea; // Area for "tools" toolbar int resArea; // Area for "results" toolbar bool ssearchTypSav; // Remember last search mode (else always // start with same) int ssearchTyp; // Use single app (default: xdg-open), instead of per-mime settings bool useDesktopOpen; // Remember sort state between invocations ? bool keepSort; QString sortField; bool sortActive; bool sortDesc; // Abstract preferences. Building abstracts can slow result display bool queryBuildAbstract; bool queryReplaceAbstract; bool startWithAdvSearchOpen; // Try to display html if it exists in the internfile stack. bool previewHtml; // Use
 tag to display highlighted text/plain inside html (else
    // we use 
at end of lines, which lets textedit wrap lines). enum PlainPre {PP_BR, PP_PRE, PP_PREWRAP}; int previewPlainPre; bool collapseDuplicates; bool showResultsAsTable; // Extra query indexes. This are stored in the history file, not qt prefs list allExtraDbs; list activeExtraDbs; // Advanced search subdir restriction: we don't activate the last value // but just remember previously entered values QStringList asearchSubdirHist; // Textual history of simple searches (this is just the combobox list) QStringList ssearchHistory; // Make phrase out of search terms and add to search in simple search bool ssearchAutoPhrase; double ssearchAutoPhraseThreshPC; // Ignored file types in adv search (startup default) QStringList asearchIgnFilTyps; bool fileTypesByCats; // Words that are automatically turned to ext:xx specs in the query // language entry. QString autoSuffs; bool autoSuffsEnable; // Synonyms file QString synFile; bool synFileEnable; QStringList restableFields; vector restableColWidths; // Synthetized abstract length and word context size int syntAbsLen; int syntAbsCtx; // Remembered term match mode int termMatchType; // Program version that wrote this. Not used for now, in prevision // of the case where we might need an incompatible change int rclVersion; bool showTrayIcon; bool closeToTray; int showTempFileWarning; // Advanced search window clause list state vector advSearchClauses; // Default paragraph format for result list static const char *dfltResListFormat; std::string stemlang(); PrefsPack() : respagesize(8), reslistfontsize(10), ssearchTyp(0), queryBuildAbstract(true), queryReplaceAbstract(false), startWithAdvSearchOpen(false), termMatchType(0), rclVersion(1505), showTrayIcon(false), closeToTray(false) {} }; /** Global preferences record */ extern PrefsPack prefs; /** Read write settings from disk file */ extern void rwSettings(bool dowrite); extern QString g_stringAllStem, g_stringNoStem; #endif /* _GUIUTILS_H_INCLUDED_ */ recoll-1.23.7/qtgui/ptrans_w.h0000644000175000017500000000275513125527323013160 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PTRANS_W_H_INCLUDED_ #define _PTRANS_W_H_INCLUDED_ #include #include #include #include "ui_ptrans.h" class QTableWidgetItem; class EditTrans : public QDialog, public Ui::EditTransBase { Q_OBJECT public: EditTrans(const std::string& dbdir, QWidget* parent = 0) : QDialog(parent) { setupUi(this); init(dbdir); } public slots: virtual void onItemDoubleClicked(QTableWidgetItem *); virtual void on_savePB_clicked(); virtual void on_addPB_clicked(); virtual void on_delPB_clicked(); virtual void on_transTW_itemSelectionChanged(); private: virtual void init(const std::string& dbdir); std::string m_dbdir; }; #endif /* _PTRANS_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/multisave.h0000644000175000017500000000165313125527323013330 00000000000000/* * 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 _MULTISAVE_W_H_INCLUDED_ #define _MULTISAVE_W_H_INCLUDED_ #include extern void multiSave(QWidget *parent, vector& docs); #endif /* _MULTISAVE_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/uiprefs_w.h0000644000175000017500000000474513125527323013327 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _UIPREFS_W_H_INCLUDED_ #define _UIPREFS_W_H_INCLUDED_ #include #include #include "ui_uiprefs.h" class QDialog; class ViewAction; class RclMain; class UIPrefsDialog : public QDialog, public Ui::uiPrefsDialogBase { Q_OBJECT public: UIPrefsDialog(RclMain* parent) : QDialog((QWidget*)parent), m_mainWindow(parent) { setupUi(this); init(); } ~UIPrefsDialog(){}; QString reslistFontFamily; int reslistFontSize; QString qssFile; QString snipCssFile; QString synFile; virtual void init(); void setFromPrefs(); public slots: virtual void showFontDialog(); virtual void resetReslistFont(); virtual void showStylesheetDialog(); virtual void showSynFileDialog(); virtual void showSnipCssDialog(); virtual void resetStylesheet(); virtual void resetSnipCss(); virtual void showViewAction(); virtual void showViewAction(const QString& mt); virtual void addExtraDbPB_clicked(); virtual void delExtraDbPB_clicked(); virtual void togExtraDbPB_clicked(); virtual void on_showTrayIconCB_clicked(); virtual void actAllExtraDbPB_clicked(); virtual void unacAllExtraDbPB_clicked(); virtual void setStemLang(const QString& lang); virtual void editParaFormat(); virtual void editHeaderText(); virtual void extradDbSelectChanged(); virtual void extraDbEditPtrans(); signals: void uiprefsDone(); protected slots: virtual void accept(); virtual void reject(); private: void setupReslistFontPB(); // Locally stored data (pending ok/cancel) QString paraFormat; QString headerText; ViewAction *m_viewAction; RclMain *m_mainWindow; }; #endif /* _UIPREFS_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/preview_w.h0000644000175000017500000001312113125637102013314 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PREVIEW_W_H_INCLUDED_ #define _PREVIEW_W_H_INCLUDED_ #include "autoconfig.h" // Always use a qtextbrowser for now, there is no compelling reason to // switch to webkit here #if 1 || defined(RESLIST_TEXTBROWSER) #define PREVIEW_TEXTBROWSER #endif #include #include #include #include #include #ifdef PREVIEW_TEXTBROWSER #include #define PREVIEW_PARENTCLASS QTextBrowser #else #include #define PREVIEW_PARENTCLASS QWebView #endif #include #include "rcldb.h" #include "plaintorich.h" #include "rclmain_w.h" class QTabWidget; class QLabel; class QPushButton; class QCheckBox; class Preview; class PlainToRichQtPreview; class PreviewTextEdit : public PREVIEW_PARENTCLASS { Q_OBJECT; public: PreviewTextEdit(QWidget* parent, const char* name, Preview *pv); void moveToAnchor(const QString& name); enum DspType {PTE_DSPTXT, PTE_DSPFLDS, PTE_DSPIMG}; public slots: virtual void displayFields(); virtual void displayText(); virtual void displayImage(); virtual void print(); virtual void createPopupMenu(const QPoint& pos); friend class Preview; protected: void mouseDoubleClickEvent(QMouseEvent *); private: Preview *m_preview; std::shared_ptr m_plaintorich; bool m_dspflds; string m_url; // filename for this tab string m_ipath; // Internal doc path inside file int m_docnum; // Index of doc in db search results. // doc out of internfile (previous fields come from the index) with // main text erased (for space). Rcl::Doc m_fdoc; // The input doc out of the index/query list Rcl::Doc m_dbdoc; // Saved rich (or plain actually) text: the textedit seems to // sometimes (but not always) return its text stripped of tags, so // this is needed (for printing for example) QString m_richtxt; Qt::TextFormat m_format; // Temporary file name (possibly, if displaying image). The // TempFile itself is kept inside main.cpp (because that's where // signal cleanup happens), but we use its name to ask for release // when the tab is closed. string m_tmpfilename; QImage m_image; DspType m_curdsp; }; class Preview : public QWidget { Q_OBJECT public: Preview(int sid, // Search Id const HighlightData& hdata) // Search terms etc. for highlighting : QWidget(0), m_searchId(sid), m_searchTextFromIndex(-1), m_hData(hdata) { init(); } virtual void closeEvent(QCloseEvent *e ); virtual bool eventFilter(QObject *target, QEvent *event ); /** * Arrange for the document to be displayed either by exposing the tab * if already loaded, or by creating a new tab and loading it. * @para docnum is used to link back to the result list (to highlight * paragraph when tab exposed etc. */ virtual bool makeDocCurrent(const Rcl::Doc& idoc, int docnum, bool sametab = false); void emitWordSelect(QString); friend class PreviewTextEdit; public slots: // Search stuff virtual void searchTextChanged(const QString& text); virtual void searchTextFromIndex(int); virtual void doSearch(const QString& str, bool next, bool reverse, bool wo = false); virtual void nextPressed(); virtual void prevPressed(); // Tabs management virtual void currentChanged(int); virtual void closeCurrentTab(); virtual void emitShowNext(); virtual void emitShowPrev(); virtual void emitSaveDocToFile(); virtual void togglePlainPre(); signals: void previewClosed(Preview *); void wordSelect(QString); void showNext(Preview *w, int sid, int docnum); void showPrev(Preview *w, int sid, int docnum); void previewExposed(Preview *w, int sid, int docnum); void printCurrentPreviewRequest(); void saveDocToFile(Rcl::Doc); private: // Identifier of search in main window. This is used to check that // we make sense when requesting the next document when browsing // successive search results in a tab. int m_searchId; bool m_dynSearchActive; // Index value the search text comes from. -1 if text was edited int m_searchTextFromIndex; bool m_canBeep; bool m_loading; HighlightData m_hData; bool m_justCreated; // First tab create is different QTabWidget* pvTab; QLabel* searchLabel; QComboBox *searchTextCMB; QPushButton* nextButton; QPushButton* prevButton; QPushButton* clearPB; QCheckBox* matchCheck; void init(); virtual void setCurTabProps(const Rcl::Doc& doc, int docnum); virtual PreviewTextEdit *currentEditor(); virtual PreviewTextEdit *addEditorTab(); virtual bool loadDocInCurrentTab(const Rcl::Doc& idoc, int dnm); }; #endif /* _PREVIEW_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/searchclause_w.cpp0000644000175000017500000001345513125637102014642 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "recoll.h" #include "log.h" #include "searchclause_w.h" #include #include #include #include #include #include #include using namespace Rcl; /* * Constructs a SearchClauseW as a child of 'parent', with the * name 'name' and widget flags set to 'f'. */ SearchClauseW::SearchClauseW(QWidget* parent) : QWidget(parent) { QHBoxLayout* hLayout = new QHBoxLayout(this); sTpCMB = new QComboBox(this); sTpCMB->setEditable(false); hLayout->addWidget(sTpCMB); fldCMB = new QComboBox(this); fldCMB->setEditable(false); hLayout->addWidget(fldCMB); proxSlackSB = new QSpinBox(this); hLayout->addWidget(proxSlackSB); wordsLE = new QLineEdit(this); wordsLE->setMinimumSize(QSize(190, 0)); hLayout->addWidget(wordsLE); languageChange(); resize(QSize(0, 0).expandedTo(minimumSizeHint())); connect(sTpCMB, SIGNAL(activated(int)), this, SLOT(tpChange(int))); } /* * Destroys the object and frees any allocated resources */ SearchClauseW::~SearchClauseW() { // no need to delete child widgets, Qt does it all for us } /* * Sets the strings of the subwidgets using the current * language. */ void SearchClauseW::languageChange() { sTpCMB->clear(); sTpCMB->addItem(tr("Any")); // 0 sTpCMB->addItem(tr("All")); //1 sTpCMB->addItem(tr("None"));//2 sTpCMB->addItem(tr("Phrase"));//3 sTpCMB->addItem(tr("Proximity"));//4 sTpCMB->addItem(tr("File name"));//5 // sTpCMB->insertItem(tr("Complex clause"));//6 fldCMB->addItem(tr("No field")); if (theconfig) { set fields = theconfig->getIndexedFields(); for (set::const_iterator it = fields.begin(); it != fields.end(); it++) { // Some fields don't make sense here if (it->compare("filename")) { fldCMB->addItem(QString::fromUtf8(it->c_str())); } } } // Ensure that the spinbox will be enabled/disabled depending on // combobox state tpChange(0); sTpCMB->setToolTip(tr("Select the type of query that will be performed with the words")); proxSlackSB->setToolTip(tr("Number of additional words that may be interspersed with the chosen ones")); } // Translate my window state into an Rcl search clause SearchDataClause *SearchClauseW::getClause() { if (wordsLE->text().isEmpty()) return 0; string field; if (fldCMB->currentIndex() != 0) { field = (const char *)fldCMB->currentText().toUtf8(); } string text = (const char *)wordsLE->text().toUtf8(); switch (sTpCMB->currentIndex()) { case 0: return new SearchDataClauseSimple(SCLT_OR, text, field); case 1: return new SearchDataClauseSimple(SCLT_AND, text, field); case 2: { SearchDataClauseSimple *cl = new SearchDataClauseSimple(SCLT_OR, text, field); cl->setexclude(true); return cl; } case 3: return new SearchDataClauseDist(SCLT_PHRASE, text, proxSlackSB->value(), field); case 4: return new SearchDataClauseDist(SCLT_NEAR, text, proxSlackSB->value(), field); case 5: return new SearchDataClauseFilename(text); case 6: default: return 0; } } void SearchClauseW::setFromClause(SearchDataClauseSimple *cl) { LOGDEB("SearchClauseW::setFromClause\n" ); switch(cl->getTp()) { case SCLT_OR: if (cl->getexclude()) tpChange(2); else tpChange(0); break; case SCLT_AND: tpChange(1); break; case SCLT_PHRASE: tpChange(3); break; case SCLT_NEAR: tpChange(4); break; case SCLT_FILENAME: tpChange(5); break; default: return; } LOGDEB("SearchClauseW::setFromClause: calling erase\n" ); clear(); QString text = QString::fromUtf8(cl->gettext().c_str()); QString field = QString::fromUtf8(cl->getfield().c_str()); switch(cl->getTp()) { case SCLT_OR: case SCLT_AND: case SCLT_PHRASE: case SCLT_NEAR: if (!field.isEmpty()) { int idx = fldCMB->findText(field); if (field >= 0) { fldCMB->setCurrentIndex(idx); } else { fldCMB->setEditText(field); } } /* FALLTHROUGH */ case SCLT_FILENAME: wordsLE->setText(text); break; default: break; } switch(cl->getTp()) { case SCLT_PHRASE: case SCLT_NEAR: { SearchDataClauseDist *cls = dynamic_cast(cl); proxSlackSB->setValue(cls->getslack()); } break; default: break; } } void SearchClauseW::clear() { wordsLE->setText(""); fldCMB->setCurrentIndex(0); proxSlackSB->setValue(0); } // Handle combobox change: may need to enable/disable the distance // spinbox and field spec void SearchClauseW::tpChange(int index) { if (index < 0 || index > 5) return; if (sTpCMB->currentIndex() != index) sTpCMB->setCurrentIndex(index); switch (index) { case 3: case 4: proxSlackSB->show(); proxSlackSB->setEnabled(true); if (index == 4) proxSlackSB->setValue(10); else proxSlackSB->setValue(0); break; default: proxSlackSB->close(); } if (index == 5) { fldCMB->close(); } else { fldCMB->show(); } } recoll-1.23.7/qtgui/viewaction.ui0000644000175000017500000001356713125527323013664 00000000000000 ViewActionBase 0 0 635 726 Native Viewers Select one or several mime types then use the controls in the bottom frame to change how they are processed. false Use Desktop preferences by default Select one or several file types, then use the controls in the frame below to change how they are processed QFrame::StyledPanel QFrame::Sunken QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows true true 2 true true 150 true true false Recoll action: 1 0 QFrame::Box QFrame::Raised current value Qt::PlainText Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse Select same QFrame::Box QFrame::Plain <b>New Values:</b> Exception to Desktop preferences Action (empty -> recoll default) Apply to current selection Qt::Horizontal 40 20 Close recoll-1.23.7/qtgui/advsearch.ui0000644000175000017500000004654213125527323013453 00000000000000 AdvSearchBase 0 0 544 441 Advanced search true 0 Find 2 0 0 All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. QFrame::NoFrame QFrame::Plain Search for <br>documents<br>satisfying: false 4 8 0 All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Qt::Vertical QSizePolicy::Expanding 0 0 0 0 Delete clause false 0 0 Add clause false QFrame::StyledPanel QFrame::Plain 1 0 QFrame::HLine QFrame::Plain Filter 1 0 Check this to enable filtering on dates Filter dates From false To false QFrame::HLine QFrame::Sunken 1 0 Check this to enable filtering on sizes Filter sizes Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size false Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size false QFrame::HLine QFrame::Sunken 1 0 Check this to enable filtering on file types Restrict file types false 1 0 Check this to use file categories instead of raw mime types By categories false Save as default false 0 Searched file types false false 200 20 QAbstractItemView::ExtendedSelection 0 false All ----> false false Sel -----> false false <----- Sel false false <----- All false 0 Ignored file types false false 200 20 QAbstractItemView::ExtendedSelection QFrame::HLine QFrame::Sunken 8 0 300 0 Enter top directory for search true 20 QComboBox::NoInsert false Browse false Restrict results to files in subtree: false Invert Start Search Close false recoll-1.23.7/qtgui/widgets/0000755000175000017500000000000013224670235012670 500000000000000recoll-1.23.7/qtgui/widgets/qxtconfirmationmessage.cpp0000644000175000017500000003404113125527323020107 00000000000000#include "qxtconfirmationmessage.h" /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 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. ** ** *****************************************************************************/ #include #include #include #include #include static const QLatin1String DEFAULT_ORGANIZATION("QxtWidgets"); static const QLatin1String DEFAULT_APPLICATION("QxtConfirmationMessage"); class QxtConfirmationMessagePrivate : public QxtPrivate { public: QXT_DECLARE_PUBLIC(QxtConfirmationMessage) void init(const QString& message = QString()); QString key() const; QString applicationName() const; QString organizationName() const; int showAgain(); void doNotShowAgain(int result); void reset(); bool remember; QCheckBox* confirm; QString overrideApp; QString overrideKey; QString overrideOrg; static QString path; static QSettings::Scope scope; static QSettings::Format format; }; QString QxtConfirmationMessagePrivate::path; QSettings::Scope QxtConfirmationMessagePrivate::scope = QSettings::UserScope; QSettings::Format QxtConfirmationMessagePrivate::format = QSettings::NativeFormat; void QxtConfirmationMessagePrivate::init(const QString& message) { remember = false; confirm = new QCheckBox(&qxt_p()); if (!message.isNull()) confirm->setText(message); else confirm->setText(QxtConfirmationMessage::tr("Do not show again.")); QGridLayout* grid = qobject_cast(qxt_p().layout()); QDialogButtonBox* buttons = qxt_p().findChild(); if (grid && buttons) { const int idx = grid->indexOf(buttons); int row, column, rowSpan, columnSpan = 0; grid->getItemPosition(idx, &row, &column, &rowSpan, &columnSpan); QLayoutItem* buttonsItem = grid->takeAt(idx); grid->addWidget(confirm, row, column, rowSpan, columnSpan, Qt::AlignLeft | Qt::AlignTop); grid->addItem(buttonsItem, ++row, column, rowSpan, columnSpan); } } QString QxtConfirmationMessagePrivate::key() const { QString value = overrideKey; if (value.isEmpty()) { const QString all = qxt_p().windowTitle() + qxt_p().text() + qxt_p().informativeText(); const QByteArray data = all.toLocal8Bit(); value = QString::number(qChecksum(data.constData(), data.length())); } return value; } QString QxtConfirmationMessagePrivate::applicationName() const { QString name = overrideApp; if (name.isEmpty()) name = QCoreApplication::applicationName(); if (name.isEmpty()) name = DEFAULT_APPLICATION; return name; } QString QxtConfirmationMessagePrivate::organizationName() const { QString name = overrideOrg; if (name.isEmpty()) name = QCoreApplication::organizationName(); if (name.isEmpty()) name = DEFAULT_ORGANIZATION; return name; } int QxtConfirmationMessagePrivate::showAgain() { QSettings settings(format, scope, organizationName(), applicationName()); if (!path.isEmpty()) settings.beginGroup(path); return settings.value(key(), -1).toInt(); } void QxtConfirmationMessagePrivate::doNotShowAgain(int result) { QSettings settings(format, scope, organizationName(), applicationName()); if (!path.isEmpty()) settings.beginGroup(path); settings.setValue(key(), result); } void QxtConfirmationMessagePrivate::reset() { QSettings settings(format, scope, organizationName(), applicationName()); if (!path.isEmpty()) settings.beginGroup(path); settings.remove(key()); } /*! \class QxtConfirmationMessage \inmodule QxtWidgets \brief The QxtConfirmationMessage class provides a confirmation message. QxtConfirmationMessage is a confirmation message with checkable \bold {"Do not show again."} option. A checked and accepted confirmation message is no more shown until reseted. Example usage: \code void MainWindow::closeEvent(QCloseEvent* event) { static const QString text(tr("Are you sure you want to quit?")); if (QxtConfirmationMessage::confirm(this, tr("Confirm"), text) == QMessageBox::No) event->ignore(); } \endcode \image qxtconfirmationmessage.png "QxtConfirmationMessage in action." \bold {Note:} QCoreApplication::organizationName and QCoreApplication::applicationName are used for storing settings. In case these properties are empty, \bold "QxtWidgets" and \bold "QxtConfirmationMessage" are used, respectively. */ /*! Constructs a new QxtConfirmationMessage with \a parent. */ QxtConfirmationMessage::QxtConfirmationMessage(QWidget* parent) : QMessageBox(parent) { QXT_INIT_PRIVATE(QxtConfirmationMessage); qxt_d().init(); } /*! Constructs a new QxtConfirmationMessage with \a icon, \a title, \a text, \a confirmation, \a buttons, \a parent and \a flags. */ QxtConfirmationMessage::QxtConfirmationMessage(QMessageBox::Icon icon, const QString& title, const QString& text, const QString& confirmation, QMessageBox::StandardButtons buttons, QWidget* parent, Qt::WindowFlags flags) : QMessageBox(icon, title, text, buttons, parent, flags) { QXT_INIT_PRIVATE(QxtConfirmationMessage); qxt_d().init(confirmation); } /*! Destructs the confirmation message. */ QxtConfirmationMessage::~QxtConfirmationMessage() { } /*! Opens an confirmation message box with the specified \a title, \a text and \a confirmation. The standard \a buttons are added to the message box. \a defaultButton specifies the button used when Enter is pressed. \a defaultButton must refer to a button that was given in \a buttons. If \a defaultButton is QMessageBox::NoButton, QMessageBox chooses a suitable default automatically. Returns the identity of the standard button that was clicked. If Esc was pressed instead, the escape button is returned. If \a parent is \c 0, the message box is an application modal dialog box. If \a parent is a widget, the message box is window modal relative to \a parent. */ QMessageBox::StandardButton QxtConfirmationMessage::confirm(QWidget* parent, const QString& title, const QString& text, const QString& confirmation, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) { QxtConfirmationMessage msgBox(QMessageBox::NoIcon, title, text, confirmation, QMessageBox::NoButton, parent); QDialogButtonBox* buttonBox = msgBox.findChild(); Q_ASSERT(buttonBox != 0); uint mask = QMessageBox::FirstButton; while (mask <= QMessageBox::LastButton) { uint sb = buttons & mask; mask <<= 1; if (!sb) continue; QPushButton* button = msgBox.addButton((QMessageBox::StandardButton)sb); // Choose the first accept role as the default if (msgBox.defaultButton()) continue; if ((defaultButton == QMessageBox::NoButton && buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) || (defaultButton != QMessageBox::NoButton && sb == uint(defaultButton))) msgBox.setDefaultButton(button); } if (msgBox.exec() == -1) return QMessageBox::Cancel; return msgBox.standardButton(msgBox.clickedButton()); } /*! \property QxtConfirmationMessage::confirmationText \brief the confirmation text The default value is \bold {"Do not show again."} */ QString QxtConfirmationMessage::confirmationText() const { return qxt_d().confirm->text(); } void QxtConfirmationMessage::setConfirmationText(const QString& confirmation) { qxt_d().confirm->setText(confirmation); } /*! \property QxtConfirmationMessage::overrideSettingsApplication \brief the override application name used for settings QCoreApplication::applicationName is used when no \bold overrideSettingsApplication has been set. The application name falls back to \bold "QxtConfirmationMessage" when no QCoreApplication::applicationName has been set. The default value is an empty string. */ QString QxtConfirmationMessage::overrideSettingsApplication() const { return qxt_d().overrideApp; } void QxtConfirmationMessage::setOverrideSettingsApplication(const QString& application) { qxt_d().overrideApp = application; } /*! \property QxtConfirmationMessage::overrideSettingsKey \brief the override key used for settings When no \bold overrideSettingsKey has been set, the key is calculated with qChecksum() based on title, text and confirmation message. The default value is an empty string. */ QString QxtConfirmationMessage::overrideSettingsKey() const { return qxt_d().overrideKey; } void QxtConfirmationMessage::setOverrideSettingsKey(const QString& key) { qxt_d().overrideKey = key; } /*! \property QxtConfirmationMessage::overrideSettingsOrganization \brief the override organization name used for settings QCoreApplication::organizationName is used when no \bold overrideSettingsOrganization has been set. The organization name falls back to \bold "QxtWidgets" when no QCoreApplication::organizationName has been set. The default value is an empty string. */ QString QxtConfirmationMessage::overrideSettingsOrganization() const { return qxt_d().overrideOrg; } void QxtConfirmationMessage::setOverrideSettingsOrganization(const QString& organization) { qxt_d().overrideOrg = organization; } /*! \property QxtConfirmationMessage::rememberOnReject \brief whether \bold {"Do not show again."} option is stored even if the message box is rejected (eg. user presses Cancel). The default value is \c false. */ bool QxtConfirmationMessage::rememberOnReject() const { return qxt_d().remember; } void QxtConfirmationMessage::setRememberOnReject(bool remember) { qxt_d().remember = remember; } /*! Returns The format used for storing settings. The default value is QSettings::NativeFormat. */ QSettings::Format QxtConfirmationMessage::settingsFormat() { return QxtConfirmationMessagePrivate::format; } /*! Sets the \a format used for storing settings. */ void QxtConfirmationMessage::setSettingsFormat(QSettings::Format format) { QxtConfirmationMessagePrivate::format = format; } /*! Returns The scope used for storing settings. The default value is QSettings::UserScope. */ QSettings::Scope QxtConfirmationMessage::settingsScope() { return QxtConfirmationMessagePrivate::scope; } /*! Sets the \a scope used for storing settings. */ void QxtConfirmationMessage::setSettingsScope(QSettings::Scope scope) { QxtConfirmationMessagePrivate::scope = scope; } /*! Returns the path used for storing settings. The default value is an empty string. */ QString QxtConfirmationMessage::settingsPath() { return QxtConfirmationMessagePrivate::path; } /*! Sets the \a path used for storing settings. */ void QxtConfirmationMessage::setSettingsPath(const QString& path) { QxtConfirmationMessagePrivate::path = path; } /*! Shows the confirmation message if necessary. The confirmation message is not shown in case \bold {"Do not show again."} has been checked while the same confirmation message was earlierly accepted. A confirmation message is identified by the combination of title, QMessageBox::text and optional QMessageBox::informativeText. A clicked button with role QDialogButtonBox::AcceptRole or QDialogButtonBox::YesRole is considered as "accepted". \warning This function does not reimplement but shadows QMessageBox::exec(). \sa QWidget::windowTitle, QMessageBox::text, QMessageBox::informativeText */ int QxtConfirmationMessage::exec() { int res = qxt_d().showAgain(); if (res == -1) res = QMessageBox::exec(); return res; } /*! \reimp */ void QxtConfirmationMessage::done(int result) { QDialogButtonBox* buttons = this->findChild(); Q_ASSERT(buttons != 0); int role = buttons->buttonRole(clickedButton()); if (qxt_d().confirm->isChecked() && (qxt_d().remember || role != QDialogButtonBox::RejectRole)) { qxt_d().doNotShowAgain(result); } QMessageBox::done(result); } /*! Resets this instance of QxtConfirmationMessage. A reseted confirmation message is shown again until user checks \bold {"Do not show again."} and accepts the confirmation message. */ void QxtConfirmationMessage::reset() { qxt_d().reset(); } recoll-1.23.7/qtgui/widgets/listdialog.h0000644000175000017500000000177013125527323015120 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef LISTDIALOG_H #define LISTDIALOG_H #include "ui_listdialog.h" class ListDialog : public QDialog, public Ui::ListDialog { Q_OBJECT public: ListDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif // LISTDIALOG_H recoll-1.23.7/qtgui/widgets/editdialog.ui0000644000175000017500000000271513125527323015260 00000000000000 EditDialog 0 0 614 509 Dialog Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() Dialog accept() 248 254 157 274 buttonBox rejected() Dialog reject() 316 260 286 274 recoll-1.23.7/qtgui/widgets/qxtglobal.h0000644000175000017500000001564313125527323014766 00000000000000 /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 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. ** ** *****************************************************************************/ #ifndef QXTGLOBAL_H #define QXTGLOBAL_H #include #define QXT_VERSION 0x000700 #define QXT_VERSION_STR "0.7.0" //--------------------------global macros------------------------------ #ifndef QXT_NO_MACROS #ifndef _countof #define _countof(x) (sizeof(x)/sizeof(*x)) #endif #endif // QXT_NO_MACROS //--------------------------export macros------------------------------ #define QXT_STATIC #define QXT_DLLEXPORT DO_NOT_USE_THIS_ANYMORE #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_CORE) # define QXT_CORE_EXPORT Q_DECL_EXPORT # else # define QXT_CORE_EXPORT Q_DECL_IMPORT # endif #else # define QXT_CORE_EXPORT #endif // BUILD_QXT_CORE #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_GUI) # define QXT_GUI_EXPORT Q_DECL_EXPORT # else # define QXT_GUI_EXPORT Q_DECL_IMPORT # endif #else # define QXT_GUI_EXPORT #endif // BUILD_QXT_GUI #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_NETWORK) # define QXT_NETWORK_EXPORT Q_DECL_EXPORT # else # define QXT_NETWORK_EXPORT Q_DECL_IMPORT # endif #else # define QXT_NETWORK_EXPORT #endif // BUILD_QXT_NETWORK #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_SQL) # define QXT_SQL_EXPORT Q_DECL_EXPORT # else # define QXT_SQL_EXPORT Q_DECL_IMPORT # endif #else # define QXT_SQL_EXPORT #endif // BUILD_QXT_SQL #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_WEB) # define QXT_WEB_EXPORT Q_DECL_EXPORT # else # define QXT_WEB_EXPORT Q_DECL_IMPORT # endif #else # define QXT_WEB_EXPORT #endif // BUILD_QXT_WEB #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_BERKELEY) # define QXT_BERKELEY_EXPORT Q_DECL_EXPORT # else # define QXT_BERKELEY_EXPORT Q_DECL_IMPORT # endif #else # define QXT_BERKELEY_EXPORT #endif // BUILD_QXT_BERKELEY #if !defined(QXT_STATIC) && !defined(QXT_DOXYGEN_RUN) # if defined(BUILD_QXT_ZEROCONF) # define QXT_ZEROCONF_EXPORT Q_DECL_EXPORT # else # define QXT_ZEROCONF_EXPORT Q_DECL_IMPORT # endif #else # define QXT_ZEROCONF_EXPORT #endif // QXT_ZEROCONF_EXPORT #if defined(BUILD_QXT_CORE) || defined(BUILD_QXT_GUI) || defined(BUILD_QXT_SQL) || defined(BUILD_QXT_NETWORK) || defined(BUILD_QXT_WEB) || defined(BUILD_QXT_BERKELEY) || defined(BUILD_QXT_ZEROCONF) # define BUILD_QXT #endif QXT_CORE_EXPORT const char* qxtVersion(); #ifndef QT_BEGIN_NAMESPACE #define QT_BEGIN_NAMESPACE #endif #ifndef QT_END_NAMESPACE #define QT_END_NAMESPACE #endif #ifndef QT_FORWARD_DECLARE_CLASS #define QT_FORWARD_DECLARE_CLASS(Class) class Class; #endif /**************************************************************************** ** This file is derived from code bearing the following notice: ** The sole author of this file, Adam Higerd, has explicitly disclaimed all ** copyright interest and protection for the content within. This file has ** been placed in the public domain according to United States copyright ** statute and case law. In jurisdictions where this public domain dedication ** is not legally recognized, anyone who receives a copy of this file is ** permitted to use, modify, duplicate, and redistribute this file, in whole ** or in part, with no restrictions or conditions. In these jurisdictions, ** this file shall be copyright (C) 2006-2008 by Adam Higerd. ****************************************************************************/ #define QXT_DECLARE_PRIVATE(PUB) friend class PUB##Private; QxtPrivateInterface qxt_d; #define QXT_DECLARE_PUBLIC(PUB) friend class PUB; #define QXT_INIT_PRIVATE(PUB) qxt_d.setPublic(this); #define QXT_D(PUB) PUB##Private& d = qxt_d() #define QXT_P(PUB) PUB& p = qxt_p() template class QxtPrivate { public: virtual ~QxtPrivate() {} inline void QXT_setPublic(PUB* pub) { qxt_p_ptr = pub; } protected: inline PUB& qxt_p() { return *qxt_p_ptr; } inline const PUB& qxt_p() const { return *qxt_p_ptr; } inline PUB* qxt_ptr() { return qxt_p_ptr; } inline const PUB* qxt_ptr() const { return qxt_p_ptr; } private: PUB* qxt_p_ptr; }; template class QxtPrivateInterface { friend class QxtPrivate; public: QxtPrivateInterface() { pvt = new PVT; } ~QxtPrivateInterface() { delete pvt; } inline void setPublic(PUB* pub) { pvt->QXT_setPublic(pub); } inline PVT& operator()() { return *static_cast(pvt); } inline const PVT& operator()() const { return *static_cast(pvt); } inline PVT * operator->() { return static_cast(pvt); } inline const PVT * operator->() const { return static_cast(pvt); } private: QxtPrivateInterface(const QxtPrivateInterface&) { } QxtPrivateInterface& operator=(const QxtPrivateInterface&) { } QxtPrivate* pvt; }; #endif // QXT_GLOBAL recoll-1.23.7/qtgui/widgets/editdialog.h0000644000175000017500000000201513125527323015063 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef EDITDIALOG_H #define EDITDIALOG_H #include #include "ui_editdialog.h" class EditDialog : public QDialog, public Ui::EditDialog { Q_OBJECT public: EditDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif // EDITDIALOG_H recoll-1.23.7/qtgui/widgets/qxtconfirmationmessage.h0000644000175000017500000001052313125527323017553 00000000000000#ifndef QXTCONFIRMATIONMESSAGE_H /**************************************************************************** ** Copyright (c) 2006 - 2011, the LibQxt project. ** See the Qxt AUTHORS file for a list of authors and copyright holders. ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * 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. ** * Neither the name of the LibQxt project nor the ** names of its contributors may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 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. ** ** *****************************************************************************/ #define QXTCONFIRMATIONMESSAGE_H #include #include #include "qxtglobal.h" class QxtConfirmationMessagePrivate; class QXT_GUI_EXPORT QxtConfirmationMessage : public QMessageBox { Q_OBJECT QXT_DECLARE_PRIVATE(QxtConfirmationMessage) Q_PROPERTY(QString confirmationText READ confirmationText WRITE setConfirmationText) Q_PROPERTY(QString overrideSettingsApplication READ overrideSettingsApplication WRITE setOverrideSettingsApplication) Q_PROPERTY(QString overrideSettingsKey READ overrideSettingsKey WRITE setOverrideSettingsKey) Q_PROPERTY(QString overrideSettingsOrganization READ overrideSettingsOrganization WRITE setOverrideSettingsOrganization) Q_PROPERTY(bool rememberOnReject READ rememberOnReject WRITE setRememberOnReject) public: explicit QxtConfirmationMessage(QWidget* parent = 0); virtual ~QxtConfirmationMessage(); QxtConfirmationMessage(QMessageBox::Icon icon, const QString& title, const QString& text, const QString& confirmation = QString(), QMessageBox::StandardButtons buttons = QMessageBox::NoButton, QWidget* parent = 0, Qt::WindowFlags flags = Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint); static QMessageBox::StandardButton confirm(QWidget* parent, const QString& title, const QString& text, const QString& confirmation = QString(), QMessageBox::StandardButtons buttons = QMessageBox::Yes | QMessageBox::No, QMessageBox::StandardButton defaultButton = QMessageBox::NoButton); QString confirmationText() const; void setConfirmationText(const QString& confirmation); QString overrideSettingsApplication() const; void setOverrideSettingsApplication(const QString& application); QString overrideSettingsKey() const; void setOverrideSettingsKey(const QString& key); QString overrideSettingsOrganization() const; void setOverrideSettingsOrganization(const QString& organization); bool rememberOnReject() const; void setRememberOnReject(bool remember); static QSettings::Format settingsFormat(); static void setSettingsFormat(QSettings::Format format); static QSettings::Scope settingsScope(); static void setSettingsScope(QSettings::Scope scope); static QString settingsPath(); static void setSettingsPath(const QString& path); public Q_SLOTS: int exec(); void reset(); virtual void done(int result); }; #endif // QXTCONFIRMATIONMESSAGE_H recoll-1.23.7/qtgui/widgets/listdialog.ui0000644000175000017500000000337213125527323015306 00000000000000 ListDialog 0 0 400 300 Dialog GroupBox Qt::Horizontal QDialogButtonBox::Ok true buttonBox accepted() ListDialog accept() 248 254 157 274 buttonBox rejected() ListDialog reject() 316 260 286 274 recoll-1.23.7/qtgui/crontool.ui0000644000175000017500000001573713125527323013354 00000000000000 CronToolW 0 0 508 416 Cron Dialog 0 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> true Days of week (* or 0-7, 0 or 7 is Sunday) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter Hours (* or 0-23) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter 0 0 Minutes (0-59) Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> true Qt::Horizontal QDialogButtonBox::Cancel buttonBox accepted() CronToolW accept() 248 254 157 274 buttonBox rejected() CronToolW reject() 316 260 286 274 recoll-1.23.7/qtgui/firstidx.ui0000644000175000017500000001253713125527323013344 00000000000000 FirstIdxDialog 0 0 502 503 First indexing setup 0 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Qt::RichText true Indexing configuration false false This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule false This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() FirstIdxDialog accept() 248 254 157 274 buttonBox rejected() FirstIdxDialog reject() 316 260 286 274 runidxPB clicked() FirstIdxDialog accept() 215 400 215 228 recoll-1.23.7/qtgui/snippets_w.cpp0000644000175000017500000001751413224431020014034 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include using namespace std; #ifdef SNIPPETS_TEXTBROWSER #include #else #include #include #include #endif #include #include "log.h" #include "recoll.h" #include "snippets_w.h" #include "guiutils.h" #include "rcldb.h" #include "rclhelp.h" #include "plaintorich.h" // Note: the internal search currently does not work with QTextBrowser. To be // fixed by looking at the preview code if someone asks for it... #ifdef SNIPPETS_TEXTBROWSER #define browser ((QTextBrowser*)browserw) #else #define browser ((QWebView*)browserw) #endif class PlainToRichQtSnippets : public PlainToRich { public: virtual string startMatch(unsigned int) { return string(""); } virtual string endMatch() { return string(""); } }; static PlainToRichQtSnippets g_hiliter; void SnippetsW::init() { if (!m_source) return; QPushButton *searchButton = new QPushButton(tr("Search")); searchButton->setAutoDefault(false); buttonBox->addButton(searchButton, QDialogButtonBox::ActionRole); searchFM->hide(); new QShortcut(QKeySequence::Find, this, SLOT(slotEditFind())); new QShortcut(QKeySequence(Qt::Key_Slash), this, SLOT(slotEditFind())); new QShortcut(QKeySequence(Qt::Key_Escape), searchFM, SLOT(hide())); new QShortcut(QKeySequence::FindNext, this, SLOT(slotEditFindNext())); new QShortcut(QKeySequence(Qt::Key_F3), this, SLOT(slotEditFindNext())); new QShortcut(QKeySequence::FindPrevious, this, SLOT(slotEditFindPrevious())); new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F3), this, SLOT(slotEditFindPrevious())); QPushButton *closeButton = buttonBox->button(QDialogButtonBox::Close); if (closeButton) connect(closeButton, SIGNAL(clicked()), this, SLOT(close())); connect(searchButton, SIGNAL(clicked()), this, SLOT(slotEditFind())); connect(searchLE, SIGNAL(textChanged(const QString&)), this, SLOT(slotSearchTextChanged(const QString&))); connect(nextPB, SIGNAL(clicked()), this, SLOT(slotEditFindNext())); connect(prevPB, SIGNAL(clicked()), this, SLOT(slotEditFindPrevious())); #ifdef SNIPPETS_TEXTBROWSER browserw = new QTextBrowser(this); verticalLayout->insertWidget(0, browserw); connect(browser, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); browser->setReadOnly(true); browser->setUndoRedoEnabled(false); browser->setOpenLinks(false); browser->setTabChangesFocus(true); if (prefs.reslistfontfamily.length()) { QFont nfont(prefs.reslistfontfamily, prefs.reslistfontsize); browser->setFont(nfont); } else { browser->setFont(QFont()); } #else browserw = new QWebView(this); verticalLayout->insertWidget(0, browserw); browser->setUrl(QUrl(QString::fromUtf8("about:blank"))); connect(browser, SIGNAL(linkClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); browser->page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); browser->page()->currentFrame()->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); QWebSettings *ws = browser->page()->settings(); if (prefs.reslistfontfamily != "") { ws->setFontFamily(QWebSettings::StandardFont, prefs.reslistfontfamily); ws->setFontSize(QWebSettings::DefaultFontSize, prefs.reslistfontsize); } if (!prefs.snipCssFile.isEmpty()) ws->setUserStyleSheetUrl(QUrl::fromLocalFile(prefs.snipCssFile)); #endif // Make title out of file name if none yet string titleOrFilename; string utf8fn; m_doc.getmeta(Rcl::Doc::keytt, &titleOrFilename); m_doc.getmeta(Rcl::Doc::keyfn, &utf8fn); if (titleOrFilename.empty()) { titleOrFilename = utf8fn; } setWindowTitle(QString::fromUtf8(titleOrFilename.c_str())); vector vpabs; m_source->getAbstract(m_doc, vpabs); HighlightData hdata; m_source->getTerms(hdata); ostringstream oss; oss << "" ""; oss << "\n"; oss << qs2utf8s(prefs.reslistheadertext); oss << "" "" "" ; g_hiliter.set_inputhtml(false); bool nomatch = true; for (vector::const_iterator it = vpabs.begin(); it != vpabs.end(); it++) { if (it->page == -1) { oss << "" << endl; continue; } list lr; if (!g_hiliter.plaintorich(it->snippet, lr, hdata)) { LOGDEB1("No match for [" << (it->snippet) << "]\n" ); continue; } nomatch = false; oss << "" << endl; } oss << "
" << it->snippet << "
"; if (it->page > 0) { oss << "page << "T" << it->term << "\">" << "P. " << it->page << ""; } oss << "" << lr.front().c_str() << "
" << endl; if (nomatch) { oss.str("\n"); oss << qs2utf8s(tr("

Sorry, no exact match was found within limits. " "Probably the document is very big and the snippets " "generator got lost in a maze...

")); } oss << "\n"; #ifdef SNIPPETS_TEXTBROWSER browser->insertHtml(QString::fromUtf8(oss.str().c_str())); #else browser->setHtml(QString::fromUtf8(oss.str().c_str())); #endif } void SnippetsW::slotEditFind() { searchFM->show(); searchLE->selectAll(); searchLE->setFocus(); } void SnippetsW::slotEditFindNext() { if (!searchFM->isVisible()) slotEditFind(); #ifdef SNIPPETS_TEXTBROWSER browser->find(searchLE->text(), 0); #else browser->findText(searchLE->text()); #endif } void SnippetsW::slotEditFindPrevious() { if (!searchFM->isVisible()) slotEditFind(); #ifdef SNIPPETS_TEXTBROWSER browser->find(searchLE->text(), QTextDocument::FindBackward); #else browser->findText(searchLE->text(), QWebPage::FindBackward); #endif } void SnippetsW::slotSearchTextChanged(const QString& txt) { #ifdef SNIPPETS_TEXTBROWSER browser->find(txt, 0); #else browser->findText(txt); #endif } void SnippetsW::linkWasClicked(const QUrl &url) { string ascurl = (const char *)url.toString().toUtf8(); LOGDEB("Snippets::linkWasClicked: [" << (ascurl) << "]\n" ); if (ascurl.size() > 3) { int what = ascurl[0]; switch (what) { case 'P': { string::size_type numpos = ascurl.find_first_of("0123456789"); if (numpos == string::npos) return; int page = atoi(ascurl.c_str() + numpos); string::size_type termpos = ascurl.find_first_of("T"); string term; if (termpos != string::npos) term = ascurl.substr(termpos+1); emit startNativeViewer(m_doc, page, QString::fromUtf8(term.c_str())); return; } } } LOGERR("Snippets::linkWasClicked: bad link [" << (ascurl) << "]\n" ); } recoll-1.23.7/qtgui/spell_w.cpp0000644000175000017500000003542013224431020013302 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "log.h" #include "recoll.h" #include "spell_w.h" #include "guiutils.h" #include "rcldb.h" #include "searchdata.h" #include "rclquery.h" #include "rclhelp.h" #include "wasatorcl.h" #include "execmd.h" #include "indexer.h" using std::list; using std::multimap; using std::string; inline bool wordlessMode(SpellW::comboboxchoice v) { return (v == SpellW::TYPECMB_STATS || v == SpellW::TYPECMB_FAILED); } void SpellW::init() { m_c2t.clear(); expTypeCMB->addItem(tr("Wildcards")); m_c2t.push_back(TYPECMB_WILD); expTypeCMB->addItem(tr("Regexp")); m_c2t.push_back(TYPECMB_REG); expTypeCMB->addItem(tr("Stem expansion")); m_c2t.push_back(TYPECMB_STEM); expTypeCMB->addItem(tr("Spelling/Phonetic")); m_c2t.push_back(TYPECMB_SPELL); expTypeCMB->addItem(tr("Show index statistics")); m_c2t.push_back(TYPECMB_STATS); expTypeCMB->addItem(tr("List files which could not be indexed (slow)")); m_c2t.push_back(TYPECMB_FAILED); // Stemming language combobox stemLangCMB->clear(); vector langs; if (!getStemLangs(langs)) { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } for (vector::const_iterator it = langs.begin(); it != langs.end(); it++) { stemLangCMB->addItem(u8s2qs(*it)); } (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.GUI.TERMEXPLORER"); // signals and slots connections connect(baseWordLE, SIGNAL(textChanged(const QString&)), this, SLOT(wordChanged(const QString&))); connect(baseWordLE, SIGNAL(returnPressed()), this, SLOT(doExpand())); connect(expandPB, SIGNAL(clicked()), this, SLOT(doExpand())); connect(dismissPB, SIGNAL(clicked()), this, SLOT(close())); connect(expTypeCMB, SIGNAL(activated(int)), this, SLOT(onModeChanged(int))); resTW->setShowGrid(0); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) resTW->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); #else resTW->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); #endif resTW->verticalHeader()->setDefaultSectionSize(20); connect(resTW, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(textDoubleClicked(int, int))); resTW->setColumnWidth(0, 200); resTW->setColumnWidth(1, 150); resTW->installEventFilter(this); int idx = cmbIdx((comboboxchoice)prefs.termMatchType); expTypeCMB->setCurrentIndex(idx); onModeChanged(idx); } int SpellW::cmbIdx(comboboxchoice mode) { vector::const_iterator it = std::find(m_c2t.begin(), m_c2t.end(), mode); if (it == m_c2t.end()) it = m_c2t.begin(); return it - m_c2t.begin(); } static const int maxexpand = 10000; /* Expand term according to current mode */ void SpellW::doExpand() { int idx = expTypeCMB->currentIndex(); if (idx < 0 || idx >= int(m_c2t.size())) idx = 0; comboboxchoice mode = m_c2t[idx]; // Can't clear qt4 table widget: resets column headers too resTW->setRowCount(0); if (baseWordLE->text().isEmpty() && !wordlessMode(mode)) return; string reason; if (!maybeOpenDb(reason)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); LOGDEB("SpellW::doExpand: db error: " << (reason) << "\n" ); return; } int mt; switch(mode) { case TYPECMB_WILD: mt = Rcl::Db::ET_WILD; break; case TYPECMB_REG: mt = Rcl::Db::ET_REGEXP; break; case TYPECMB_STEM: mt = Rcl::Db::ET_STEM; break; default: mt = Rcl::Db::ET_WILD; } if (caseSensCB->isChecked()) { mt |= Rcl::Db::ET_CASESENS; } if (diacSensCB->isChecked()) { mt |= Rcl::Db::ET_DIACSENS; } Rcl::TermMatchResult res; string expr = string((const char *)baseWordLE->text().toUtf8()); Rcl::DbStats dbs; rcldb->dbStats(dbs, false); switch (mode) { case TYPECMB_WILD: default: case TYPECMB_REG: case TYPECMB_STEM: { string l_stemlang = qs2utf8s(stemLangCMB->currentText()); if (!rcldb->termMatch(mt, l_stemlang, expr, res, maxexpand)) { LOGERR("SpellW::doExpand:rcldb::termMatch failed\n" ); return; } statsLBL->setText(tr("Index: %1 documents, average length %2 terms." "%3 results") .arg(dbs.dbdoccount).arg(dbs.dbavgdoclen, 0, 'f', 0) .arg(res.entries.size())); } break; case TYPECMB_SPELL: { LOGDEB("SpellW::doExpand: spelling [" << expr << "]\n" ); vector suggs; if (!rcldb->getSpellingSuggestions(expr, suggs)) { QMessageBox::warning(0, "Recoll", tr("Spell expansion error. ")); } for (const auto& it : suggs) { res.entries.push_back(Rcl::TermMatchEntry(it)); } statsLBL->setText(tr("%1 results").arg(res.entries.size())); } break; case TYPECMB_STATS: { showStats(); return; } break; case TYPECMB_FAILED: { showFailed(); return; } break; } if (res.entries.empty()) { resTW->setItem(0, 0, new QTableWidgetItem(tr("No expansion found"))); } else { int row = 0; if (maxexpand > 0 && int(res.entries.size()) >= maxexpand) { resTW->setRowCount(row + 1); resTW->setSpan(row, 0, 1, 2); resTW->setItem(row++, 0, new QTableWidgetItem( tr("List was truncated alphabetically, " "some frequent "))); resTW->setRowCount(row + 1); resTW->setSpan(row, 0, 1, 2); resTW->setItem(row++, 0, new QTableWidgetItem( tr("terms may be missing. " "Try using a longer root."))); resTW->setRowCount(row + 1); resTW->setItem(row++, 0, new QTableWidgetItem("")); } for (vector::iterator it = res.entries.begin(); it != res.entries.end(); it++) { LOGDEB2("SpellW::expand: " << it->wcf << " [" << it->term << "]\n"); char num[30]; if (it->wcf) sprintf(num, "%d / %d", it->docs, it->wcf); else num[0] = 0; resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(u8s2qs(it->term))); resTW->setItem(row++, 1, new QTableWidgetItem(QString::fromUtf8(num))); } } } void SpellW::showStats() { statsLBL->setText(""); int row = 0; Rcl::DbStats res; if (!rcldb->dbStats(res, false)) { LOGERR("SpellW::doExpand:rcldb::dbStats failed\n" ); return; } resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Number of documents"))); resTW->setItem(row++, 1, new QTableWidgetItem( QString::number(res.dbdoccount))); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Average terms per document"))); resTW->setItem(row++, 1, new QTableWidgetItem( QString::number(res.dbavgdoclen, 'f', 0))); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Smallest document length (terms)"))); resTW->setItem(row++, 1, new QTableWidgetItem( QString::number(res.mindoclen))); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Longest document length (terms)"))); resTW->setItem(row++, 1, new QTableWidgetItem( QString::number(res.maxdoclen))); if (!theconfig) return; ConfSimple cs(theconfig->getIdxStatusFile().c_str(), 1); DbIxStatus st; cs.get("fn", st.fn); cs.get("docsdone", &st.docsdone); cs.get("filesdone", &st.filesdone); cs.get("fileerrors", &st.fileerrors); cs.get("dbtotdocs", &st.dbtotdocs); cs.get("totfiles", &st.totfiles); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Results from last indexing:"))); resTW->setItem(row++, 1, new QTableWidgetItem("")); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr(" Documents created/updated"))); resTW->setItem(row++, 1, new QTableWidgetItem(QString::number(st.docsdone))); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr(" Files tested"))); resTW->setItem(row++, 1, new QTableWidgetItem(QString::number(st.filesdone))); resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr(" Unindexed files"))); resTW->setItem(row++, 1, new QTableWidgetItem(QString::number(st.fileerrors))); baseWordLE->setText(QString::fromLocal8Bit(theconfig->getDbDir().c_str())); ExecCmd cmd; vector args; int status; args.push_back("-sk"); args.push_back(theconfig->getDbDir()); string output; status = cmd.doexec("du", args, 0, &output); long long dbkbytes = 0; if (!status) { dbkbytes = atoll(output.c_str()); } resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("Database directory size"))); resTW->setItem(row++, 1, new QTableWidgetItem( u8s2qs(displayableBytes(dbkbytes*1024)))); vector allmimetypes = theconfig->getAllMimeTypes(); multimap mtbycnt; for (vector::const_iterator it = allmimetypes.begin(); it != allmimetypes.end(); it++) { string reason; string q = string("mime:") + *it; Rcl::SearchData *sd = wasaStringToRcl(theconfig, "", q, reason); std::shared_ptr rq(sd); Rcl::Query query(rcldb); if (!query.setQuery(rq)) { LOGERR("Query setup failed: " << (query.getReason()) << "" ); return; } int cnt = query.getResCnt(); mtbycnt.insert(pair(cnt,*it)); } resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(tr("MIME types:"))); resTW->setItem(row++, 1, new QTableWidgetItem("")); for (multimap::const_reverse_iterator it = mtbycnt.rbegin(); it != mtbycnt.rend(); it++) { resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(QString(" ") + u8s2qs(it->second))); resTW->setItem(row++, 1, new QTableWidgetItem( QString::number(it->first))); } } void SpellW::showFailed() { statsLBL->setText(""); int row = 0; Rcl::DbStats res; if (!rcldb->dbStats(res, true)) { LOGERR("SpellW::doExpand:rcldb::dbStats failed\n" ); return; } for (auto entry : res.failedurls) { resTW->setRowCount(row+1); resTW->setItem(row, 0, new QTableWidgetItem(u8s2qs(entry))); resTW->setItem(row++, 1, new QTableWidgetItem("")); } } void SpellW::wordChanged(const QString &text) { if (text.isEmpty()) { expandPB->setEnabled(false); resTW->setRowCount(0); } else { expandPB->setEnabled(true); } } void SpellW::textDoubleClicked() {} void SpellW::textDoubleClicked(int row, int) { QTableWidgetItem *item = resTW->item(row, 0); if (item) emit(wordSelect(item->text())); } void SpellW::onModeChanged(int idx) { if (idx < 0 || idx > int(m_c2t.size())) return; comboboxchoice mode = m_c2t[idx]; setModeCommon(mode); } void SpellW::setMode(comboboxchoice mode) { expTypeCMB->setCurrentIndex(cmbIdx(mode)); setModeCommon(mode); } void SpellW::setModeCommon(comboboxchoice mode) { if (wordlessMode(m_prevmode)) { baseWordLE->setText(""); } m_prevmode = mode; resTW->setRowCount(0); if (o_index_stripchars) { caseSensCB->setEnabled(false); diacSensCB->setEnabled(false); } else { caseSensCB->setEnabled(true); diacSensCB->setEnabled(true); } if (mode == TYPECMB_STEM) { stemLangCMB->setEnabled(true); diacSensCB->setChecked(false); diacSensCB->setEnabled(false); caseSensCB->setChecked(false); caseSensCB->setEnabled(false); } else { stemLangCMB->setEnabled(false); } if (wordlessMode(mode)) { baseWordLE->setEnabled(false); QStringList labels(tr("Item")); labels.push_back(tr("Value")); resTW->setHorizontalHeaderLabels(labels); diacSensCB->setEnabled(false); caseSensCB->setEnabled(false); doExpand(); } else { baseWordLE->setEnabled(true); QStringList labels(tr("Term")); labels.push_back(tr("Doc. / Tot.")); resTW->setHorizontalHeaderLabels(labels); prefs.termMatchType = mode; } } void SpellW::copy() { QItemSelectionModel * selection = resTW->selectionModel(); QModelIndexList indexes = selection->selectedIndexes(); if(indexes.size() < 1) return; // QModelIndex::operator < sorts first by row, then by column. // this is what we need std::sort(indexes.begin(), indexes.end()); // You need a pair of indexes to find the row changes QModelIndex previous = indexes.first(); indexes.removeFirst(); QString selected_text; QModelIndex current; Q_FOREACH(current, indexes) { QVariant data = resTW->model()->data(previous); QString text = data.toString(); // At this point `text` contains the text in one cell selected_text.append(text); // If you are at the start of the row the row number of the previous index // isn't the same. Text is followed by a row separator, which is a newline. if (current.row() != previous.row()) { selected_text.append(QLatin1Char('\n')); } // Otherwise it's the same row, so append a column separator, which is a tab. else { selected_text.append(QLatin1Char('\t')); } previous = current; } // add last element selected_text.append(resTW->model()->data(current).toString()); selected_text.append(QLatin1Char('\n')); qApp->clipboard()->setText(selected_text, QClipboard::Selection); qApp->clipboard()->setText(selected_text, QClipboard::Clipboard); } bool SpellW::eventFilter(QObject *target, QEvent *event) { if (event->type() != QEvent::KeyPress || (target != resTW && target != resTW->viewport())) return false; QKeyEvent *keyEvent = (QKeyEvent *)event; if(keyEvent->matches(QKeySequence::Copy) ) { copy(); return true; } return false; } recoll-1.23.7/qtgui/advsearch_w.cpp0000644000175000017500000004146113125637102014136 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "advsearch_w.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #include "recoll.h" #include "rclconfig.h" #include "log.h" #include "searchdata.h" #include "guiutils.h" #include "rclhelp.h" static const int initclausetypes[] = {1, 3, 0, 2, 5}; static const unsigned int iclausescnt = sizeof(initclausetypes) / sizeof(int); static map cat_translations; static map cat_rtranslations; void AdvSearch::init() { (void)new HelpClient(this); HelpClient::installMap((const char *)objectName().toUtf8(), "RCL.SEARCH.GUI.COMPLEX"); // signals and slots connections connect(delFiltypPB, SIGNAL(clicked()), this, SLOT(delFiltypPB_clicked())); connect(searchPB, SIGNAL(clicked()), this, SLOT(runSearch())); connect(filterDatesCB, SIGNAL(toggled(bool)), this, SLOT(filterDatesCB_toggled(bool))); connect(filterSizesCB, SIGNAL(toggled(bool)), this, SLOT(filterSizesCB_toggled(bool))); connect(restrictFtCB, SIGNAL(toggled(bool)), this, SLOT(restrictFtCB_toggled(bool))); connect(restrictCtCB, SIGNAL(toggled(bool)), this, SLOT(restrictCtCB_toggled(bool))); connect(dismissPB, SIGNAL(clicked()), this, SLOT(close())); connect(browsePB, SIGNAL(clicked()), this, SLOT(browsePB_clicked())); connect(addFiltypPB, SIGNAL(clicked()), this, SLOT(addFiltypPB_clicked())); connect(delAFiltypPB, SIGNAL(clicked()), this, SLOT(delAFiltypPB_clicked())); connect(addAFiltypPB, SIGNAL(clicked()), this, SLOT(addAFiltypPB_clicked())); connect(saveFileTypesPB, SIGNAL(clicked()), this, SLOT(saveFileTypes())); connect(addClausePB, SIGNAL(clicked()), this, SLOT(addClause())); connect(delClausePB, SIGNAL(clicked()), this, SLOT(delClause())); new QShortcut(QKeySequence(Qt::Key_Up), this, SLOT(slotHistoryNext()));; new QShortcut(QKeySequence(Qt::Key_Down), this, SLOT(slotHistoryPrev())); conjunctCMB->insertItem(1, tr("All clauses")); conjunctCMB->insertItem(2, tr("Any clause")); // Create preconfigured clauses for (unsigned int i = 0; i < iclausescnt; i++) { addClause(initclausetypes[i]); } // Tune initial state according to last saved { vector::iterator cit = m_clauseWins.begin(); unsigned int existing = m_clauseWins.size(); for (unsigned int i = 0; i < prefs.advSearchClauses.size(); i++) { if (i < existing) { (*cit)->tpChange(prefs.advSearchClauses[i]); cit++; } else { addClause(prefs.advSearchClauses[i]); } } } (*m_clauseWins.begin())->wordsLE->setFocus(); // Initialize min/max mtime from extrem values in the index int minyear, maxyear; if (rcldb) { rcldb->maxYearSpan(&minyear, &maxyear); minDateDTE->setDisplayFormat("yyyy-MM-dd"); maxDateDTE->setDisplayFormat("yyyy-MM-dd"); minDateDTE->setDate(QDate(minyear, 1, 1)); maxDateDTE->setDate(QDate(maxyear, 12, 31)); } // Initialize lists of accepted and ignored mime types from config // and settings m_ignTypes = prefs.asearchIgnFilTyps; m_ignByCats = prefs.fileTypesByCats; restrictCtCB->setEnabled(false); restrictCtCB->setChecked(m_ignByCats); fillFileTypes(); subtreeCMB->insertItems(0, prefs.asearchSubdirHist); subtreeCMB->setEditText(""); // The clauseline frame is needed to force designer to accept a // vbox to englobe the base clauses grid and 'something else' (the // vbox is so that we can then insert SearchClauseWs), but we // don't want to see it. clauseline->close(); bool calpop = 0; minDateDTE->setCalendarPopup(calpop); maxDateDTE->setCalendarPopup(calpop); // Translations for known categories cat_translations[QString::fromUtf8("texts")] = tr("text"); cat_rtranslations[tr("texts")] = QString::fromUtf8("text"); cat_translations[QString::fromUtf8("spreadsheet")] = tr("spreadsheet"); cat_rtranslations[tr("spreadsheets")] = QString::fromUtf8("spreadsheet"); cat_translations[QString::fromUtf8("presentation")] = tr("presentation"); cat_rtranslations[tr("presentation")] =QString::fromUtf8("presentation"); cat_translations[QString::fromUtf8("media")] = tr("media"); cat_rtranslations[tr("media")] = QString::fromUtf8("media"); cat_translations[QString::fromUtf8("message")] = tr("message"); cat_rtranslations[tr("message")] = QString::fromUtf8("message"); cat_translations[QString::fromUtf8("other")] = tr("other"); cat_rtranslations[tr("other")] = QString::fromUtf8("other"); } void AdvSearch::saveCnf() { // Save my state prefs.advSearchClauses.clear(); for (vector::iterator cit = m_clauseWins.begin(); cit != m_clauseWins.end(); cit++) { prefs.advSearchClauses.push_back((*cit)->sTpCMB->currentIndex()); } } void AdvSearch::addClause() { addClause(0); } void AdvSearch::addClause(int tp) { SearchClauseW *w = new SearchClauseW(clauseFRM); m_clauseWins.push_back(w); ((QVBoxLayout *)(clauseFRM->layout()))->addWidget(w); w->show(); w->tpChange(tp); if (m_clauseWins.size() > iclausescnt) { delClausePB->setEnabled(true); } else { delClausePB->setEnabled(false); } } void AdvSearch::delClause() { if (m_clauseWins.size() <= iclausescnt) return; delete m_clauseWins.back(); m_clauseWins.pop_back(); if (m_clauseWins.size() > iclausescnt) { delClausePB->setEnabled(true); } else { delClausePB->setEnabled(false); } } void AdvSearch::delAFiltypPB_clicked() { yesFiltypsLB->selectAll(); delFiltypPB_clicked(); } // Move selected file types from the searched to the ignored box void AdvSearch::delFiltypPB_clicked() { QList items = yesFiltypsLB->selectedItems(); for (QList::iterator it = items.begin(); it != items.end(); it++) { int row = yesFiltypsLB->row(*it); QListWidgetItem *item = yesFiltypsLB->takeItem(row); noFiltypsLB->insertItem(0, item); } guiListsToIgnTypes(); } // Move selected file types from the ignored to the searched box void AdvSearch::addFiltypPB_clicked() { QList items = noFiltypsLB->selectedItems(); for (QList::iterator it = items.begin(); it != items.end(); it++) { int row = noFiltypsLB->row(*it); QListWidgetItem *item = noFiltypsLB->takeItem(row); yesFiltypsLB->insertItem(0, item); } guiListsToIgnTypes(); } // Compute list of ignored mime type from widget lists void AdvSearch::guiListsToIgnTypes() { yesFiltypsLB->sortItems(); noFiltypsLB->sortItems(); m_ignTypes.clear(); for (int i = 0; i < noFiltypsLB->count();i++) { QListWidgetItem *item = noFiltypsLB->item(i); m_ignTypes.append(item->text()); } } void AdvSearch::addAFiltypPB_clicked() { noFiltypsLB->selectAll(); addFiltypPB_clicked(); } // Activate file type selection void AdvSearch::restrictFtCB_toggled(bool on) { restrictCtCB->setEnabled(on); yesFiltypsLB->setEnabled(on); delFiltypPB->setEnabled(on); addFiltypPB->setEnabled(on); delAFiltypPB->setEnabled(on); addAFiltypPB->setEnabled(on); noFiltypsLB->setEnabled(on); saveFileTypesPB->setEnabled(on); } // Activate file type selection void AdvSearch::filterSizesCB_toggled(bool on) { minSizeLE->setEnabled(on); maxSizeLE->setEnabled(on); } // Activate file type selection void AdvSearch::filterDatesCB_toggled(bool on) { minDateDTE->setEnabled(on); maxDateDTE->setEnabled(on); } void AdvSearch::restrictCtCB_toggled(bool on) { m_ignByCats = on; // Only reset the list if we're enabled. Else this is init from prefs if (restrictCtCB->isEnabled()) m_ignTypes.clear(); fillFileTypes(); } void AdvSearch::fillFileTypes() { noFiltypsLB->clear(); yesFiltypsLB->clear(); noFiltypsLB->insertItems(0, m_ignTypes); QStringList ql; if (m_ignByCats == false) { vector types = theconfig->getAllMimeTypes(); rcldb->getAllDbMimeTypes(types); sort(types.begin(), types.end()); types.erase(unique(types.begin(), types.end()), types.end()); for (vector::iterator it = types.begin(); it != types.end(); it++) { QString qs = QString::fromUtf8(it->c_str()); if (m_ignTypes.indexOf(qs) < 0) ql.append(qs); } } else { vector cats; theconfig->getMimeCategories(cats); for (vector::const_iterator it = cats.begin(); it != cats.end(); it++) { map::const_iterator it1; QString cat; if ((it1 = cat_translations.find(QString::fromUtf8(it->c_str()))) != cat_translations.end()) { cat = it1->second; } else { cat = QString::fromUtf8(it->c_str()); } if (m_ignTypes.indexOf(cat) < 0) ql.append(cat); } } yesFiltypsLB->insertItems(0, ql); } // Save current set of ignored file types to prefs void AdvSearch::saveFileTypes() { prefs.asearchIgnFilTyps = m_ignTypes; prefs.fileTypesByCats = m_ignByCats; rwSettings(true); } void AdvSearch::browsePB_clicked() { QString dir = myGetFileName(true); subtreeCMB->setEditText(dir); } size_t AdvSearch::stringToSize(QString qsize) { size_t size = size_t(-1); qsize.replace(QRegExp("[\\s]+"), ""); if (!qsize.isEmpty()) { string csize(qs2utf8s(qsize)); char *cp; size = strtoll(csize.c_str(), &cp, 10); if (*cp != 0) { switch (*cp) { case 'k': case 'K': size *= 1E3;break; case 'm': case 'M': size *= 1E6;break; case 'g': case 'G': size *= 1E9;break; case 't': case 'T': size *= 1E12;break; default: QMessageBox::warning(0, "Recoll", tr("Bad multiplier suffix in size filter")); size = size_t(-1); } } } return size; } using namespace Rcl; void AdvSearch::runSearch() { string stemLang = prefs.stemlang(); std::shared_ptr sdata(new SearchData(conjunctCMB->currentIndex() == 0 ? SCLT_AND : SCLT_OR, stemLang)); bool hasclause = false; for (vector::iterator it = m_clauseWins.begin(); it != m_clauseWins.end(); it++) { SearchDataClause *cl; if ((cl = (*it)->getClause())) { sdata->addClause(cl); hasclause = true; } } if (!hasclause) return; if (restrictFtCB->isChecked() && noFiltypsLB->count() > 0) { for (int i = 0; i < yesFiltypsLB->count(); i++) { if (restrictCtCB->isChecked()) { QString qcat = yesFiltypsLB->item(i)->text(); map::const_iterator qit; string cat; if ((qit = cat_rtranslations.find(qcat)) != cat_rtranslations.end()) { cat = qs2utf8s(qit->second); } else { cat = qs2utf8s(qcat); } vector types; theconfig->getMimeCatTypes(cat, types); for (vector::const_iterator it = types.begin(); it != types.end(); it++) { sdata->addFiletype(*it); } } else { sdata->addFiletype(qs2utf8s(yesFiltypsLB->item(i)->text())); } } } if (filterDatesCB->isChecked()) { QDate mindate = minDateDTE->date(); QDate maxdate = maxDateDTE->date(); DateInterval di; di.y1 = mindate.year(); di.m1 = mindate.month(); di.d1 = mindate.day(); di.y2 = maxdate.year(); di.m2 = maxdate.month(); di.d2 = maxdate.day(); sdata->setDateSpan(&di); } if (filterSizesCB->isChecked()) { size_t size = stringToSize(minSizeLE->text()); sdata->setMinSize(size); size = stringToSize(maxSizeLE->text()); sdata->setMaxSize(size); } if (!subtreeCMB->currentText().isEmpty()) { QString current = subtreeCMB->currentText(); Rcl::SearchDataClausePath *pathclause = new Rcl::SearchDataClausePath((const char*)current.toLocal8Bit(), direxclCB->isChecked()); if (sdata->getTp() == SCLT_AND) { sdata->addClause(pathclause); } else { std::shared_ptr nsdata(new SearchData(SCLT_AND, stemLang)); nsdata->addClause(new Rcl::SearchDataClauseSub(sdata)); nsdata->addClause(pathclause); sdata = nsdata; } // Keep history clean and sorted. Maybe there would be a // simpler way to do this list entries; for (int i = 0; i < subtreeCMB->count(); i++) { entries.push_back(subtreeCMB->itemText(i)); } entries.push_back(subtreeCMB->currentText()); entries.sort(); entries.unique(); LOGDEB("Subtree list now has " << (entries.size()) << " entries\n" ); subtreeCMB->clear(); for (list::iterator it = entries.begin(); it != entries.end(); it++) { subtreeCMB->addItem(*it); } subtreeCMB->setCurrentIndex(subtreeCMB->findText(current)); prefs.asearchSubdirHist.clear(); for (int index = 0; index < subtreeCMB->count(); index++) prefs.asearchSubdirHist.push_back(subtreeCMB->itemText(index)); } saveCnf(); g_advshistory && g_advshistory->push(sdata); emit startSearch(sdata, false); } // Set up fields from existing search data, which must be compatible // with what we can do... void AdvSearch::fromSearch(std::shared_ptr sdata) { if (sdata->m_tp == SCLT_OR) conjunctCMB->setCurrentIndex(1); else conjunctCMB->setCurrentIndex(0); while (sdata->m_query.size() > m_clauseWins.size()) { addClause(); } subtreeCMB->setEditText(""); direxclCB->setChecked(0); for (unsigned int i = 0; i < sdata->m_query.size(); i++) { // Set fields from clause if (sdata->m_query[i]->getTp() == SCLT_SUB) { LOGERR("AdvSearch::fromSearch: SUB clause found !\n" ); continue; } if (sdata->m_query[i]->getTp() == SCLT_PATH) { SearchDataClausePath *cs = dynamic_cast(sdata->m_query[i]); // We can only use one such clause. There should be only one too // if this is sfrom aved search data. QString qdir = QString::fromLocal8Bit(cs->gettext().c_str()); subtreeCMB->setEditText(qdir); direxclCB->setChecked(cs->getexclude()); continue; } SearchDataClauseSimple *cs = dynamic_cast(sdata->m_query[i]); m_clauseWins[i]->setFromClause(cs); } for (unsigned int i = sdata->m_query.size(); i < m_clauseWins.size(); i++) { m_clauseWins[i]->clear(); } restrictCtCB->setChecked(0); if (!sdata->m_filetypes.empty()) { restrictFtCB_toggled(1); delAFiltypPB_clicked(); for (unsigned int i = 0; i < sdata->m_filetypes.size(); i++) { QString ft = QString::fromUtf8(sdata->m_filetypes[i].c_str()); QList lst = noFiltypsLB->findItems(ft, Qt::MatchExactly); if (!lst.isEmpty()) { int row = noFiltypsLB->row(lst[0]); QListWidgetItem *item = noFiltypsLB->takeItem(row); yesFiltypsLB->insertItem(0, item); } } yesFiltypsLB->sortItems(); } else { addAFiltypPB_clicked(); restrictFtCB_toggled(0); } if (sdata->m_haveDates) { filterDatesCB->setChecked(1); DateInterval &di(sdata->m_dates); QDate mindate(di.y1, di.m1, di.d1); QDate maxdate(di.y2, di.m2, di.d2); minDateDTE->setDate(mindate); maxDateDTE->setDate(maxdate); } else { filterDatesCB->setChecked(0); QDate date; minDateDTE->setDate(date); maxDateDTE->setDate(date); } if (sdata->m_maxSize != (size_t)-1 || sdata->m_minSize != (size_t)-1) { filterSizesCB->setChecked(1); QString sz; if (sdata->m_minSize != (size_t)-1) { sz.setNum(sdata->m_minSize); minSizeLE->setText(sz); } else { minSizeLE->setText(""); } if (sdata->m_maxSize != (size_t)-1) { sz.setNum(sdata->m_maxSize); maxSizeLE->setText(sz); } else { maxSizeLE->setText(""); } } else { filterSizesCB->setChecked(0); minSizeLE->setText(""); maxSizeLE->setText(""); } } void AdvSearch::slotHistoryNext() { if (g_advshistory == 0) return; std::shared_ptr sd = g_advshistory->getnewer(); if (!sd) return; fromSearch(sd); } void AdvSearch::slotHistoryPrev() { if (g_advshistory == 0) return; std::shared_ptr sd = g_advshistory->getolder(); if (!sd) return; fromSearch(sd); } recoll-1.23.7/qtgui/uiprefs_w.cpp0000644000175000017500000004572313125637102013660 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "safesysstat.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include "guiutils.h" #include "rclconfig.h" #include "pathut.h" #include "uiprefs_w.h" #include "viewaction_w.h" #include "log.h" #include "editdialog.h" #include "rclmain_w.h" #include "ptrans_w.h" void UIPrefsDialog::init() { m_viewAction = 0; // See enum above and keep in order ! ssearchTypCMB->addItem(tr("Any term")); ssearchTypCMB->addItem(tr("All terms")); ssearchTypCMB->addItem(tr("File name")); ssearchTypCMB->addItem(tr("Query language")); ssearchTypCMB->addItem(tr("Value from previous program exit")); connect(viewActionPB, SIGNAL(clicked()), this, SLOT(showViewAction())); connect(reslistFontPB, SIGNAL(clicked()), this, SLOT(showFontDialog())); connect(resetFontPB, SIGNAL(clicked()), this, SLOT(resetReslistFont())); connect(stylesheetPB, SIGNAL(clicked()),this, SLOT(showStylesheetDialog())); connect(resetSSPB, SIGNAL(clicked()), this, SLOT(resetStylesheet())); connect(snipCssPB, SIGNAL(clicked()),this, SLOT(showSnipCssDialog())); connect(synFilePB, SIGNAL(clicked()),this, SLOT(showSynFileDialog())); connect(resetSnipCssPB, SIGNAL(clicked()), this, SLOT(resetSnipCss())); connect(idxLV, SIGNAL(itemSelectionChanged()), this, SLOT(extradDbSelectChanged())); connect(ptransPB, SIGNAL(clicked()), this, SLOT(extraDbEditPtrans())); connect(addExtraDbPB, SIGNAL(clicked()), this, SLOT(addExtraDbPB_clicked())); connect(delExtraDbPB, SIGNAL(clicked()), this, SLOT(delExtraDbPB_clicked())); connect(togExtraDbPB, SIGNAL(clicked()), this, SLOT(togExtraDbPB_clicked())); connect(actAllExtraDbPB, SIGNAL(clicked()), this, SLOT(actAllExtraDbPB_clicked())); connect(unacAllExtraDbPB, SIGNAL(clicked()), this, SLOT(unacAllExtraDbPB_clicked())); connect(CLEditPara, SIGNAL(clicked()), this, SLOT(editParaFormat())); connect(CLEditHeader, SIGNAL(clicked()), this, SLOT(editHeaderText())); connect(buttonOk, SIGNAL(clicked()), this, SLOT(accept())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(buildAbsCB, SIGNAL(toggled(bool)), replAbsCB, SLOT(setEnabled(bool))); connect(ssAutoAllCB, SIGNAL(toggled(bool)), ssAutoSpaceCB, SLOT(setDisabled(bool))); connect(ssAutoAllCB, SIGNAL(toggled(bool)), ssAutoSpaceCB, SLOT(setChecked(bool))); setFromPrefs(); } // Update dialog state from stored prefs void UIPrefsDialog::setFromPrefs() { // Entries per result page spinbox pageLenSB->setValue(prefs.respagesize); collapseDupsCB->setChecked(prefs.collapseDuplicates); maxHLTSB->setValue(prefs.maxhltextmbs); if (prefs.ssearchTypSav) { ssearchTypCMB->setCurrentIndex(4); } else { ssearchTypCMB->setCurrentIndex(prefs.ssearchTyp); } switch (prefs.filterCtlStyle) { case PrefsPack::FCS_MN: filterMN_RB->setChecked(1); break; case PrefsPack::FCS_CMB: filterCMB_RB->setChecked(1); break; case PrefsPack::FCS_BT: default: filterBT_RB->setChecked(1); break; } ssAutoSpaceCB->setChecked(prefs.ssearchOnWS); ssNoCompleteCB->setChecked(prefs.ssearchNoComplete); ssAutoAllCB->setChecked(prefs.ssearchAsYouType); syntlenSB->setValue(prefs.syntAbsLen); syntctxSB->setValue(prefs.syntAbsCtx); initStartAdvCB->setChecked(prefs.startWithAdvSearchOpen); keepSortCB->setChecked(prefs.keepSort); showTrayIconCB->setChecked(prefs.showTrayIcon); closeToTrayCB->setChecked(prefs.closeToTray); showTempFileWarningCB->setChecked(prefs.showTempFileWarning == -1); previewHtmlCB->setChecked(prefs.previewHtml); switch (prefs.previewPlainPre) { case PrefsPack::PP_BR: plainBRRB->setChecked(1); break; case PrefsPack::PP_PRE: plainPRERB->setChecked(1); break; case PrefsPack::PP_PREWRAP: default: plainPREWRAPRB->setChecked(1); break; } // Query terms color qtermStyleLE->setText(prefs.qtermstyle); // Abstract snippet separator string abssepLE->setText(prefs.abssep); dateformatLE->setText(prefs.reslistdateformat); // Result list font family and size reslistFontFamily = prefs.reslistfontfamily; reslistFontSize = prefs.reslistfontsize; setupReslistFontPB(); // Style sheet qssFile = prefs.qssFile; if (qssFile.isEmpty()) { stylesheetPB->setText(tr("Choose")); } else { string nm = path_getsimple((const char *)qssFile.toLocal8Bit()); stylesheetPB->setText(QString::fromLocal8Bit(nm.c_str())); } snipCssFile = prefs.snipCssFile; if (snipCssFile.isEmpty()) { snipCssPB->setText(tr("Choose")); } else { string nm = path_getsimple((const char *)snipCssFile.toLocal8Bit()); snipCssPB->setText(QString::fromLocal8Bit(nm.c_str())); } paraFormat = prefs.reslistformat; headerText = prefs.reslistheadertext; // Stemming language combobox stemLangCMB->clear(); stemLangCMB->addItem(g_stringNoStem); stemLangCMB->addItem(g_stringAllStem); vector langs; if (!getStemLangs(langs)) { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } int cur = prefs.queryStemLang == "" ? 0 : 1; for (vector::const_iterator it = langs.begin(); it != langs.end(); it++) { stemLangCMB-> addItem(QString::fromUtf8(it->c_str(), it->length())); if (cur == 0 && !strcmp((const char*)prefs.queryStemLang.toUtf8(), it->c_str())) { cur = stemLangCMB->count(); } } stemLangCMB->setCurrentIndex(cur); autoPhraseCB->setChecked(prefs.ssearchAutoPhrase); autoPThreshSB->setValue(prefs.ssearchAutoPhraseThreshPC); buildAbsCB->setChecked(prefs.queryBuildAbstract); replAbsCB->setEnabled(prefs.queryBuildAbstract); replAbsCB->setChecked(prefs.queryReplaceAbstract); autoSuffsCB->setChecked(prefs.autoSuffsEnable); autoSuffsLE->setText(prefs.autoSuffs); synFileCB->setChecked(prefs.synFileEnable); synFile = prefs.synFile; if (synFile.isEmpty()) { synFilePB->setText(tr("Choose")); } else { string nm = path_getsimple((const char *)synFile.toLocal8Bit()); synFilePB->setText(QString::fromLocal8Bit(nm.c_str())); } // Initialize the extra indexes listboxes idxLV->clear(); for (list::iterator it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { QListWidgetItem *item = new QListWidgetItem(QString::fromLocal8Bit(it->c_str()), idxLV); if (item) item->setCheckState(Qt::Unchecked); } for (list::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { QListitems = idxLV->findItems (QString::fromLocal8Bit(it->c_str()), Qt::MatchFixedString|Qt::MatchCaseSensitive); for (QList::iterator it = items.begin(); it != items.end(); it++) { (*it)->setCheckState(Qt::Checked); } } idxLV->sortItems(); } void UIPrefsDialog::setupReslistFontPB() { QString s; if (reslistFontFamily.length() == 0) { reslistFontPB->setText(tr("Default QtWebkit font")); } else { reslistFontPB->setText(reslistFontFamily + "-" + s.setNum(reslistFontSize)); } } void UIPrefsDialog::accept() { prefs.ssearchOnWS = ssAutoSpaceCB->isChecked(); prefs.ssearchNoComplete = ssNoCompleteCB->isChecked(); prefs.ssearchAsYouType = ssAutoAllCB->isChecked(); if (ssearchTypCMB->currentIndex() == 4) { prefs.ssearchTypSav = true; // prefs.ssearchTyp will be set from the current value when // exiting the program } else { prefs.ssearchTypSav = false; prefs.ssearchTyp = ssearchTypCMB->currentIndex(); } if (filterMN_RB->isChecked()) { prefs.filterCtlStyle = PrefsPack::FCS_MN; } else if (filterCMB_RB->isChecked()) { prefs.filterCtlStyle = PrefsPack::FCS_CMB; } else { prefs.filterCtlStyle = PrefsPack::FCS_BT; } m_mainWindow->setFilterCtlStyle(prefs.filterCtlStyle); prefs.respagesize = pageLenSB->value(); prefs.collapseDuplicates = collapseDupsCB->isChecked(); prefs.maxhltextmbs = maxHLTSB->value(); prefs.qtermstyle = qtermStyleLE->text(); prefs.abssep = abssepLE->text(); prefs.reslistdateformat = dateformatLE->text(); prefs.creslistdateformat = (const char*)prefs.reslistdateformat.toUtf8(); prefs.reslistfontfamily = reslistFontFamily; prefs.reslistfontsize = reslistFontSize; prefs.qssFile = qssFile; QTimer::singleShot(0, m_mainWindow, SLOT(applyStyleSheet())); prefs.snipCssFile = snipCssFile; prefs.reslistformat = paraFormat; prefs.reslistheadertext = headerText; if (prefs.reslistformat.trimmed().isEmpty()) { prefs.reslistformat = prefs.dfltResListFormat; paraFormat = prefs.reslistformat; } prefs.creslistformat = (const char*)prefs.reslistformat.toUtf8(); if (stemLangCMB->currentIndex() == 0) { prefs.queryStemLang = ""; } else if (stemLangCMB->currentIndex() == 1) { prefs.queryStemLang = "ALL"; } else { prefs.queryStemLang = stemLangCMB->currentText(); } prefs.ssearchAutoPhrase = autoPhraseCB->isChecked(); prefs.ssearchAutoPhraseThreshPC = autoPThreshSB->value(); prefs.queryBuildAbstract = buildAbsCB->isChecked(); prefs.queryReplaceAbstract = buildAbsCB->isChecked() && replAbsCB->isChecked(); prefs.startWithAdvSearchOpen = initStartAdvCB->isChecked(); prefs.keepSort = keepSortCB->isChecked(); prefs.showTrayIcon = showTrayIconCB->isChecked(); prefs.closeToTray = closeToTrayCB->isChecked(); prefs.showTempFileWarning = showTempFileWarningCB->isChecked() ? -1 : 1024; prefs.previewHtml = previewHtmlCB->isChecked(); if (plainBRRB->isChecked()) { prefs.previewPlainPre = PrefsPack::PP_BR; } else if (plainPRERB->isChecked()) { prefs.previewPlainPre = PrefsPack::PP_PRE; } else { prefs.previewPlainPre = PrefsPack::PP_PREWRAP; } prefs.syntAbsLen = syntlenSB->value(); prefs.syntAbsCtx = syntctxSB->value(); prefs.autoSuffsEnable = autoSuffsCB->isChecked(); prefs.autoSuffs = autoSuffsLE->text(); prefs.synFileEnable = synFileCB->isChecked(); prefs.synFile = synFile; prefs.allExtraDbs.clear(); prefs.activeExtraDbs.clear(); for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); if (item) { prefs.allExtraDbs.push_back((const char *)item->text().toLocal8Bit()); if (item->checkState() == Qt::Checked) { prefs.activeExtraDbs.push_back((const char *) item->text().toLocal8Bit()); } } } rwSettings(true); string reason; maybeOpenDb(reason, true); emit uiprefsDone(); QDialog::accept(); } void UIPrefsDialog::editParaFormat() { EditDialog dialog(this); dialog.setWindowTitle(tr("Result list paragraph format " "(erase all to reset to default)")); dialog.plainTextEdit->setPlainText(paraFormat); int result = dialog.exec(); if (result == QDialog::Accepted) paraFormat = dialog.plainTextEdit->toPlainText(); } void UIPrefsDialog::editHeaderText() { EditDialog dialog(this); dialog.setWindowTitle(tr("Result list header (default is empty)")); dialog.plainTextEdit->setPlainText(headerText); int result = dialog.exec(); if (result == QDialog::Accepted) headerText = dialog.plainTextEdit->toPlainText(); } void UIPrefsDialog::reject() { setFromPrefs(); QDialog::reject(); } void UIPrefsDialog::setStemLang(const QString& lang) { int cur = 0; if (lang == "") { cur = 0; } else if (lang == "ALL") { cur = 1; } else { for (int i = 1; i < stemLangCMB->count(); i++) { if (lang == stemLangCMB->itemText(i)) { cur = i; break; } } } stemLangCMB->setCurrentIndex(cur); } void UIPrefsDialog::showFontDialog() { bool ok; QFont font; if (prefs.reslistfontfamily.length()) { font.setFamily(prefs.reslistfontfamily); font.setPointSize(prefs.reslistfontsize); } font = QFontDialog::getFont(&ok, font, this); if (ok) { // We used to check if the default font was set, in which case // we erased the preference, but this would result in letting // webkit make a choice of default font which it usually seems // to do wrong. So now always set the font. There is still a // way for the user to let webkit choose the default though: // click reset, then the font name and size will be empty. reslistFontFamily = font.family(); reslistFontSize = font.pointSize(); setupReslistFontPB(); } } void UIPrefsDialog::showStylesheetDialog() { qssFile = myGetFileName(false, "Select stylesheet file", true); string nm = path_getsimple((const char *)qssFile.toLocal8Bit()); stylesheetPB->setText(QString::fromLocal8Bit(nm.c_str())); } void UIPrefsDialog::resetStylesheet() { qssFile = ""; stylesheetPB->setText(tr("Choose")); } void UIPrefsDialog::showSnipCssDialog() { snipCssFile = myGetFileName(false, "Select snippets window CSS file", true); string nm = path_getsimple((const char *)snipCssFile.toLocal8Bit()); snipCssPB->setText(QString::fromLocal8Bit(nm.c_str())); } void UIPrefsDialog::resetSnipCss() { snipCssFile = ""; snipCssPB->setText(tr("Choose")); } void UIPrefsDialog::showSynFileDialog() { synFile = myGetFileName(false, "Select synonyms file", true); if (synFile.isEmpty()) return; string nm = path_getsimple((const char *)synFile.toLocal8Bit()); synFilePB->setText(QString::fromLocal8Bit(nm.c_str())); } void UIPrefsDialog::resetReslistFont() { reslistFontFamily = ""; reslistFontSize = 0; setupReslistFontPB(); } void UIPrefsDialog::showViewAction() { if (m_viewAction== 0) { m_viewAction = new ViewAction(0); } else { // Close and reopen, in hope that makes us visible... m_viewAction->close(); } m_viewAction->show(); } void UIPrefsDialog::showViewAction(const QString& mt) { showViewAction(); m_viewAction->selectMT(mt); } //////////////////////////////////////////// // External / extra search indexes setup void UIPrefsDialog::extradDbSelectChanged() { if (idxLV->selectedItems().size() <= 1) ptransPB->setEnabled(true); else ptransPB->setEnabled(false); } void UIPrefsDialog::extraDbEditPtrans() { string dbdir; if (idxLV->selectedItems().size() == 0) { dbdir = theconfig->getDbDir(); } else if (idxLV->selectedItems().size() == 1) { QListWidgetItem *item = idxLV->selectedItems()[0]; QString qd = item->data(Qt::DisplayRole).toString(); dbdir = (const char *)qd.toLocal8Bit(); } else { QMessageBox::warning( 0, "Recoll", tr("At most one index should be selected")); return; } dbdir = path_canon(dbdir); EditTrans *etrans = new EditTrans(dbdir, this); etrans->show(); } void UIPrefsDialog::togExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); if (item->isSelected()) { if (item->checkState() == Qt::Checked) { item->setCheckState(Qt::Unchecked); } else { item->setCheckState(Qt::Checked); } } } } void UIPrefsDialog::actAllExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); item->setCheckState(Qt::Checked); } } void UIPrefsDialog::unacAllExtraDbPB_clicked() { for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); item->setCheckState(Qt::Unchecked); } } void UIPrefsDialog::delExtraDbPB_clicked() { QList items = idxLV->selectedItems(); for (QList::iterator it = items.begin(); it != items.end(); it++) { delete *it; } } static bool samedir(const string& dir1, const string& dir2) { #ifdef _WIN32 return !dir1.compare(dir2); #else struct stat st1, st2; if (stat(dir1.c_str(), &st1)) return false; if (stat(dir2.c_str(), &st2)) return false; if (st1.st_dev == st2.st_dev && st1.st_ino == st2.st_ino) { return true; } return false; #endif } void UIPrefsDialog::on_showTrayIconCB_clicked() { closeToTrayCB->setEnabled(showTrayIconCB->checkState()); } /** * Browse to add another index. * We do a textual comparison to check for duplicates, except for * the main db for which we check inode numbers. */ void UIPrefsDialog::addExtraDbPB_clicked() { QString input = myGetFileName(true, tr("Select recoll config directory or " "xapian index directory " "(e.g.: /home/me/.recoll or " "/home/me/.recoll/xapiandb)")); if (input.isEmpty()) return; string dbdir = (const char *)input.toLocal8Bit(); if (path_exists(path_cat(dbdir, "recoll.conf"))) { // Chosen dir is config dir. RclConfig conf(&dbdir); dbdir = conf.getDbDir(); if (dbdir.empty()) { QMessageBox::warning( 0, "Recoll", tr("The selected directory looks like a Recoll " "configuration directory but the configuration " "could not be read")); return; } } LOGDEB("ExtraDbDial: got: [" << (dbdir) << "]\n" ); bool stripped; if (!Rcl::Db::testDbDir(dbdir, &stripped)) { QMessageBox::warning(0, "Recoll", tr("The selected directory does not appear to be a Xapian index")); return; } if (o_index_stripchars != stripped) { QMessageBox::warning(0, "Recoll", tr("Cant add index with different case/diacritics" " stripping option")); return; } if (samedir(dbdir, theconfig->getDbDir())) { QMessageBox::warning(0, "Recoll", tr("This is the main/local index!")); return; } for (int i = 0; i < idxLV->count(); i++) { QListWidgetItem *item = idxLV->item(i); string existingdir = (const char *)item->text().toLocal8Bit(); if (samedir(dbdir, existingdir)) { QMessageBox::warning( 0, "Recoll", tr("The selected directory is already in the " "index list")); return; } } QListWidgetItem *item = new QListWidgetItem(QString::fromLocal8Bit(dbdir.c_str()), idxLV); item->setCheckState(Qt::Checked); idxLV->sortItems(); } recoll-1.23.7/qtgui/recoll.pro.in0000644000175000017500000001175013224431020013540 00000000000000TEMPLATE = app LANGUAGE = C++ VPATH = @srcdir@ DEFINES += BUILDING_RECOLL @QMAKE_ENABLE_WEBKIT@ QT += webkit @QMAKE_DISABLE_WEBKIT@ QMAKE_CXXFLAGS += -DRESLIST_TEXTBROWSER -DSNIPPETS_TEXTBROWSER @QMAKE_DISABLE_WEBKIT@ DEFINES += RESLIST_TEXTBROWSER @QMAKE_DISABLE_WEBKIT@ DEFINES += SNIPPETS_TEXTBROWSER QMAKE_CXXFLAGS += -std=c++11 @QMAKE_ENABLE_ZEITGEIST@ QT += dbus @QMAKE_ENABLE_ZEITGEIST@ QMAKE_CXXFLAGS += -DUSE_ZEITGEIST QT += xml greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport @QMAKE_ENABLE_WEBKIT@ greaterThan(QT_MAJOR_VERSION, 4): QT += webkitwidgets CONFIG += qt warn_on thread release HEADERS += \ advsearch_w.h \ advshist.h \ confgui/confgui.h \ confgui/confguiindex.h \ crontool.h \ firstidx.h \ fragbuts.h \ idxsched.h \ preview_load.h \ preview_plaintorich.h \ preview_w.h \ ptrans_w.h \ rclhelp.h \ rclmain_w.h \ reslist.h \ restable.h \ rtitool.h \ searchclause_w.h \ snippets_w.h \ specialindex.h \ spell_w.h \ ssearch_w.h \ systray.h \ uiprefs_w.h \ viewaction_w.h \ webcache.h \ widgets/editdialog.h \ widgets/listdialog.h \ widgets/qxtconfirmationmessage.h SOURCES += \ advsearch_w.cpp \ advshist.cpp \ confgui/confgui.cpp \ confgui/confguiindex.cpp \ crontool.cpp \ fragbuts.cpp \ guiutils.cpp \ main.cpp \ multisave.cpp \ preview_load.cpp \ preview_plaintorich.cpp \ preview_w.cpp \ ptrans_w.cpp \ rclhelp.cpp \ rclm_idx.cpp \ rclm_preview.cpp \ rclm_saveload.cpp \ rclm_view.cpp \ rclm_wins.cpp \ rclmain_w.cpp \ rclzg.cpp \ reslist.cpp \ respopup.cpp \ restable.cpp \ rtitool.cpp \ searchclause_w.cpp \ snippets_w.cpp \ spell_w.cpp \ ssearch_w.cpp \ systray.cpp \ uiprefs_w.cpp \ viewaction_w.cpp \ webcache.cpp \ widgets/qxtconfirmationmessage.cpp \ xmltosd.cpp FORMS = \ advsearch.ui \ crontool.ui \ widgets/editdialog.ui \ firstidx.ui \ idxsched.ui \ widgets/listdialog.ui \ ptrans.ui \ rclmain.ui \ restable.ui \ rtitool.ui \ specialindex.ui \ spell.ui \ snippets.ui \ ssearchb.ui \ uiprefs.ui \ viewaction.ui \ webcache.ui RESOURCES = recoll.qrc unix { UI_DIR = .ui MOC_DIR = .moc OBJECTS_DIR = .obj LIBS += -L../.libs -lrecoll !macx { # Note: libdir may be substituted with sthing like $(exec_prefix)/lib # at this point and will go as such in the Makefile. Expansion will be # completed at make time. LIBS += -Wl,-rpath=@libdir@/recoll } LIBS += @LIBXAPIAN@ $(LIBXAPIANSTATICEXTRA) \ @LIBICONV@ $(BDYNAMIC) @LIBQZEITGEIST@ -lz INCLUDEPATH += ../common @srcdir@/../common @srcdir@/../index \ @srcdir@/../internfile @srcdir@/../query @srcdir@/../unac \ @srcdir@/../utils @srcdir@/../aspell @srcdir@/../rcldb \ @srcdir@/../qtgui @srcdir@/../xaposix @srcdir@/confgui \ @srcdir@/widgets DEPENDPATH += $$INCLUDEPATH } UNAME = $$system(uname -s) contains( UNAME, [lL]inux ) { LIBS += -ldl -lX11 } contains( UNAME, SunOS ) { LIBS += -ldl } macx { ICON = images/recoll.icns } TRANSLATIONS = \ i18n/recoll_cs.ts \ i18n/recoll_da.ts \ i18n/recoll_de.ts \ i18n/recoll_el.ts \ i18n/recoll_es.ts \ i18n/recoll_fr.ts \ i18n/recoll_it.ts \ i18n/recoll_lt.ts \ i18n/recoll_ru.ts \ i18n/recoll_tr.ts \ i18n/recoll_uk.ts \ i18n/recoll_xx.ts \ i18n/recoll_zh_CN.ts \ i18n/recoll_zh.ts \ unix { isEmpty(PREFIX) { PREFIX = /usr/local } message("Prefix is $$PREFIX") DEFINES += PREFIX=\\\"$$PREFIX\\\" # Installation stuff target.path = "$$PREFIX/bin" imdata.files = @srcdir@/mtpics/*.png imdata.path = $$PREFIX/share/recoll/images trdata.files = @srcdir@/i18n/*.qm trdata.path = $$PREFIX/share/recoll/translations desktop.files += @srcdir@/../desktop/recoll-searchgui.desktop desktop.path = $$PREFIX/share/applications/ icona.files += @srcdir@/../desktop/recoll.png icona.path = $$PREFIX/share/icons/hicolor/48x48/apps/ iconb.files += @srcdir@/../desktop/recoll.png iconb.path = $$PREFIX/share/pixmaps/ appdata.files = @srcdir@/../desktop/recoll.appdata.xml appdata.path = $$PREFIX/share/appdata/ INSTALLS += target imdata trdata desktop icona iconb appdata # The recollinstall script used to do the following to install zh_CN as # zh. Is this still needed? #${INSTALL} -m 0444 ${I18N}/recoll_zh_CN.qm \ # ${datadir}/recoll/translations/recoll_zh.qm || exit 1 } recoll-1.23.7/qtgui/uiprefs.ui0000644000175000017500000010510313224431525013153 00000000000000 uiPrefsDialogBase 0 0 542 449 User preferences true 0 User interface Highlight CSS style for query terms false 50 0 Style sheet false Opens a dialog to select the style sheet file Choose Resets the style sheet to default Reset 1 0 Texts over this size will not be highlighted in preview (too slow). Maximum text size highlighted for preview (megabytes) false 1 3 Prefer Html to plain text for preview. false Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Plain text to HTML line style <BR> buttonGroup <PRE> buttonGroup <PRE> + wrap buttonGroup Choose editor applications Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel buttonGroup_2 Toolbar Combobox buttonGroup_2 Menu buttonGroup_2 Start with simple search mode false Disable Qt autocompletion in search entry. false Auto-start simple search on whitespace entry. false Search as you type. false Start with advanced search dialog open. false Remember sort activation state. false Show system tray icon. false Close to tray instead of exiting. false Show warning when opening temporary file. true Qt::Vertical QSizePolicy::Expanding 20 70 Result List 1 0 Number of entries in a result page false 1 9999 8 Result list font false Opens a dialog to select the result list font Helvetica-10 Resets the result list font to the system default Reset Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) false 30 0 Abstract snippet separator false 30 0 User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Snippets window CSS file false Opens a dialog to select the Snippets window CSS style sheet file Choose Resets the Snippets window style Reset Qt::Vertical 20 40 Search parameters If checked, results with the same content under different names will only be shown once. Hide duplicate results. false Stemming language false QFrame::HLine QFrame::Sunken A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Automatically add phrase to simple searches 1 0 Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage false 0.200000000000000 2.000000000000000 QFrame::HLine QFrame::Sunken Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Dynamically build abstracts Do we synthetize an abstract even if the document seemed to have one? Replace abstracts from documents 2 0 Synthetic abstract size (characters) false 1 0 80 100000 10 250 1 0 Synthetic abstract context words false 2 20000 4 QFrame::HLine QFrame::Sunken 1 0 The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. false Enable 30 0 QFrame::HLine QFrame::Sunken 1 0 Synonyms file false Enable 30 0 Choose Qt::Vertical QSizePolicy::Expanding 20 70 External Indexes QAbstractItemView::ExtendedSelection Toggle selected Activate All Deactivate All Paths translations QFrame::HLine QFrame::Sunken Remove from list. This has no effect on the disk index. Remove selected Qt::Horizontal QSizePolicy::Expanding 16 20 true Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Add index Qt::Horizontal QSizePolicy::Expanding 210 20 Apply changes &OK true true Discard changes &Cancel true recoll-1.23.7/qtgui/reslist.cpp0000644000175000017500000007261513224431525013343 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifndef __APPLE__ //#include #endif #include "log.h" #include "smallut.h" #include "recoll.h" #include "guiutils.h" #include "pathut.h" #include "docseq.h" #include "pathut.h" #include "mimehandler.h" #include "plaintorich.h" #include #include "internfile.h" #include "indexer.h" #include "snippets_w.h" #include "listdialog.h" #include "reslist.h" #include "moc_reslist.cpp" #include "rclhelp.h" #include "appformime.h" #include "respopup.h" static const QKeySequence quitKeySeq("Ctrl+q"); static const QKeySequence closeKeySeq("Ctrl+w"); #ifndef RESLIST_TEXTBROWSER #include #include #include #endif // Decide if we set font family and style with a css section in the // html or with qwebsettings setfont... calls. We currently do // it with websettings because this gives an instant redisplay, and // the css has a tendancy to not find some system fonts. Otoh, // SetFontSize() needs a strange offset of 3, not needed with css. #undef SETFONT_WITH_HEADSTYLE class QtGuiResListPager : public ResListPager { public: QtGuiResListPager(ResList *p, int ps) : ResListPager(ps), m_reslist(p) {} virtual bool append(const string& data); virtual bool append(const string& data, int idx, const Rcl::Doc& doc); virtual string trans(const string& in); virtual string detailsLink(); virtual const string &parFormat(); virtual const string &dateFormat(); virtual string nextUrl(); virtual string prevUrl(); virtual string headerContent(); virtual void suggest(const vectoruterms, map >& sugg); virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); private: ResList *m_reslist; }; #if 0 FILE *fp; void logdata(const char *data) { if (fp == 0) fp = fopen("/tmp/recolltoto.html", "a"); if (fp) fprintf(fp, "%s", data); } #else #define logdata(X) #endif ////////////////////////////// // /// QtGuiResListPager methods: bool QtGuiResListPager::append(const string& data) { LOGDEB2("QtGuiReslistPager::appendString : " << data << "\n"); logdata(data.c_str()); m_reslist->append(QString::fromUtf8(data.c_str())); return true; } bool QtGuiResListPager::append(const string& data, int docnum, const Rcl::Doc&) { LOGDEB2("QtGuiReslistPager::appendDoc: blockCount " << m_reslist->document()->blockCount() << ", " << data << "\n"); logdata(data.c_str()); #ifdef RESLIST_TEXTBROWSER int blkcnt0 = m_reslist->document()->blockCount(); m_reslist->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); m_reslist->textCursor().insertBlock(); m_reslist->insertHtml(QString::fromUtf8(data.c_str())); m_reslist->moveCursor(QTextCursor::Start, QTextCursor::MoveAnchor); m_reslist->ensureCursorVisible(); int blkcnt1 = m_reslist->document()->blockCount(); for (int block = blkcnt0; block < blkcnt1; block++) { m_reslist->m_pageParaToReldocnums[block] = docnum; } #else QString sdoc = QString("
").arg(docnum); m_reslist->append(sdoc); m_reslist->append(QString::fromUtf8(data.c_str())); m_reslist->append("
"); #endif return true; } string QtGuiResListPager::trans(const string& in) { return string((const char*)ResList::tr(in.c_str()).toUtf8()); } string QtGuiResListPager::detailsLink() { string chunk = "
"; chunk += trans("(show query)"); chunk += ""; return chunk; } const string& QtGuiResListPager::parFormat() { return prefs.creslistformat; } const string& QtGuiResListPager::dateFormat() { return prefs.creslistdateformat; } string QtGuiResListPager::nextUrl() { return "n-1"; } string QtGuiResListPager::prevUrl() { return "p-1"; } string QtGuiResListPager::headerContent() { string out; out = "\n"); out += qs2utf8s(prefs.reslistheadertext); return out; } void QtGuiResListPager::suggest(const vectoruterms, map >& sugg) { sugg.clear(); bool issimple = m_reslist && m_reslist->m_rclmain && m_reslist->m_rclmain->lastSearchSimple(); for (const auto& uit : uterms) { vector tsuggs; // If the term is in the dictionary, Aspell::suggest won't // list alternatives. In fact we may want to check the // frequencies and propose something anyway if a possible // variation is much more common (as google does) ? if (!rcldb->getSpellingSuggestions(uit, tsuggs)) { continue; } // We should check that the term stems differently from the // base word (else it's not useful to expand the search). Or // is it ? This should depend if stemming is turned on or not if (!tsuggs.empty()) { sugg[uit] = vector(tsuggs.begin(), tsuggs.end()); if (sugg[uit].size() > 5) sugg[uit].resize(5); // Set up the links as a . for (auto& it : sugg[uit]) { if (issimple) { it = string("" + it + ""; } } } } } string QtGuiResListPager::iconUrl(RclConfig *config, Rcl::Doc& doc) { if (doc.ipath.empty()) { vector docs; docs.push_back(doc); vector paths; Rcl::docsToPaths(docs, paths); if (!paths.empty()) { string path; LOGDEB2("ResList::iconUrl: source path [" << paths[0] << "]\n"); if (thumbPathForUrl(cstr_fileu + paths[0], 128, path)) { LOGDEB2("ResList::iconUrl: icon path [" << path << "]\n"); return cstr_fileu + path; } else { LOGDEB2("ResList::iconUrl: no icon: path [" << path << "]\n"); } } else { LOGDEB("ResList::iconUrl: docsToPaths failed\n"); } } return ResListPager::iconUrl(config, doc); } /////// /////// End reslistpager methods class PlainToRichQtReslist : public PlainToRich { public: virtual string startMatch(unsigned int idx) { if (m_hdata) { string s1, s2; stringsToString >(m_hdata->groups[idx], s1); stringsToString >(m_hdata->ugroups[m_hdata->grpsugidx[idx]], s2); LOGDEB2("Reslist startmatch: group " << s1 << " user group " << s2 << "\n"); } return string(""); } virtual string endMatch() { return string(""); } }; static PlainToRichQtReslist g_hiliter; ///////////////////////////////////// ResList::ResList(QWidget* parent, const char* name) : RESLIST_PARENTCLASS(parent), m_curPvDoc(-1), m_lstClckMod(0), m_listId(0), m_rclmain(0), m_ismainres(true) { if (!name) setObjectName("resList"); else setObjectName(name); #ifdef RESLIST_TEXTBROWSER LOGDEB("Reslist: using QTextBrowser\n"); setReadOnly(true); setUndoRedoEnabled(false); setOpenLinks(false); setTabChangesFocus(true); // signals and slots connections connect(this, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); #else LOGDEB("Reslist: using QWebView\n"); // signals and slots connections connect(this, SIGNAL(linkClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); page()->setLinkDelegationPolicy(QWebPage::DelegateAllLinks); settings()->setAttribute(QWebSettings::JavascriptEnabled, true); #endif setFont(); languageChange(); (void)new HelpClient(this); HelpClient::installMap(qs2utf8s(this->objectName()), "RCL.SEARCH.GUI.RESLIST"); #if 0 // See comments in "highlighted connect(this, SIGNAL(highlighted(const QString &)), this, SLOT(highlighted(const QString &))); #endif setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); m_pager = new QtGuiResListPager(this, prefs.respagesize); m_pager->setHighLighter(&g_hiliter); } ResList::~ResList() { // These have to exist somewhere for translations to work #ifdef __GNUC__ __attribute__((unused)) #endif static const char* strings[] = { QT_TR_NOOP("

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

Alternate spellings (accents suppressed): "), QT_TR_NOOP("

Alternate spellings: "), }; } void ResList::setRclMain(RclMain *m, bool ismain) { m_rclmain = m; m_ismainres = ismain; if (!m_ismainres) { connect(new QShortcut(closeKeySeq, this), SIGNAL (activated()), this, SLOT (close())); connect(new QShortcut(quitKeySeq, this), SIGNAL (activated()), m_rclmain, SLOT (fileExit())); connect(this, SIGNAL(previewRequested(Rcl::Doc)), m_rclmain, SLOT(startPreview(Rcl::Doc))); connect(this, SIGNAL(docSaveToFileClicked(Rcl::Doc)), m_rclmain, SLOT(saveDocToFile(Rcl::Doc))); connect(this, SIGNAL(editRequested(Rcl::Doc)), m_rclmain, SLOT(startNativeViewer(Rcl::Doc))); } } void ResList::setFont() { #ifdef RESLIST_TEXTBROWSER if (prefs.reslistfontfamily.length()) { QFont nfont(prefs.reslistfontfamily, prefs.reslistfontsize); QTextBrowser::setFont(nfont); } else { QTextBrowser::setFont(QFont()); } #else #ifndef SETFONT_WITH_HEADSTYLE QWebSettings *websettings = settings(); if (prefs.reslistfontfamily.length()) { // For some reason there is (12-2014) an offset of 3 between what // we request from webkit and what we get. websettings->setFontSize(QWebSettings::DefaultFontSize, prefs.reslistfontsize + 3); websettings->setFontFamily(QWebSettings::StandardFont, prefs.reslistfontfamily); } else { websettings->resetFontSize(QWebSettings::DefaultFontSize); websettings->resetFontFamily(QWebSettings::StandardFont); } #endif #endif } int ResList::newListId() { static int id; return ++id; } extern "C" int XFlush(void *); void ResList::setDocSource(std::shared_ptr nsource) { LOGDEB("ResList::setDocSource()\n"); m_source = std::shared_ptr(new DocSource(theconfig, nsource)); } // A query was executed, or the filtering/sorting parameters changed, // re-read the results. void ResList::readDocSource() { LOGDEB("ResList::readDocSource()\n"); resetView(); if (!m_source) return; m_listId = newListId(); // Reset the page size in case the preference was changed m_pager->setPageSize(prefs.respagesize); m_pager->setDocSource(m_source); resultPageNext(); emit hasResults(m_source->getResCnt()); } void ResList::resetList() { LOGDEB("ResList::resetList()\n"); setDocSource(std::shared_ptr()); resetView(); } void ResList::resetView() { m_curPvDoc = -1; // There should be a progress bar for long searches but there isn't // We really want the old result list to go away, otherwise, for a // slow search, the user will wonder if anything happened. The // following helps making sure that the textedit is really // blank. Else, there are often icons or text left around #ifdef RESLIST_TEXTBROWSER m_pageParaToReldocnums.clear(); clear(); QTextBrowser::append("."); clear(); #ifndef __APPLE__ // XFlush(QX11Info::display()); #endif #else m_text = ""; setHtml(""); #endif } bool ResList::displayingHistory() { // We want to reset the displayed history if it is currently // shown. Using the title value is an ugly hack string htstring = string((const char *)tr("Document history").toUtf8()); if (!m_source || m_source->title().empty()) return false; return m_source->title().find(htstring) == 0; } void ResList::languageChange() { setWindowTitle(tr("Result list")); } #ifdef RESLIST_TEXTBROWSER // Get document number from text block number int ResList::docnumfromparnum(int block) { if (m_pager->pageNumber() < 0) return -1; // Try to find the first number < input and actually in the map // (result blocks can be made of several text blocks) std::map::iterator it; do { it = m_pageParaToReldocnums.find(block); if (it != m_pageParaToReldocnums.end()) return pageFirstDocNum() + it->second; } while (--block >= 0); return -1; } // Get range of paragraph numbers which make up the result for document number pair ResList::parnumfromdocnum(int docnum) { LOGDEB("parnumfromdocnum: docnum " << docnum << "\n"); if (m_pager->pageNumber() < 0) { LOGDEB("parnumfromdocnum: no page return -1,-1\n"); return pair(-1,-1); } int winfirst = pageFirstDocNum(); if (docnum - winfirst < 0) { LOGDEB("parnumfromdocnum: docnum " << docnum << " < winfirst " << winfirst << " return -1,-1\n"); return pair(-1,-1); } docnum -= winfirst; for (std::map::iterator it = m_pageParaToReldocnums.begin(); it != m_pageParaToReldocnums.end(); it++) { if (docnum == it->second) { int first = it->first; int last = first+1; std::map::iterator it1; while ((it1 = m_pageParaToReldocnums.find(last)) != m_pageParaToReldocnums.end() && it1->second == docnum) { last++; } LOGDEB("parnumfromdocnum: return " << first << "," << last << "\n"); return pair(first, last); } } LOGDEB("parnumfromdocnum: not found return -1,-1\n"); return pair(-1,-1); } #endif // TEXTBROWSER // Return doc from current or adjacent result pages. We can get called // for a document not in the current page if the user browses through // results inside a result window (with shift-arrow). This can only // result in a one-page change. bool ResList::getDoc(int docnum, Rcl::Doc &doc) { LOGDEB("ResList::getDoc: docnum " << docnum << " winfirst " << pageFirstDocNum() << "\n"); int winfirst = pageFirstDocNum(); int winlast = m_pager->pageLastDocNum(); if (docnum < 0 || winfirst < 0 || winlast < 0) return false; // Is docnum in current page ? Then all Ok if (docnum >= winfirst && docnum <= winlast) { return m_pager->getDoc(docnum, doc); } // Else we accept to page down or up but not further if (docnum < winfirst && docnum >= winfirst - prefs.respagesize) { resultPageBack(); } else if (docnum < winlast + 1 + prefs.respagesize) { resultPageNext(); } winfirst = pageFirstDocNum(); winlast = m_pager->pageLastDocNum(); if (docnum >= winfirst && docnum <= winlast) { return m_pager->getDoc(docnum, doc); } return false; } void ResList::keyPressEvent(QKeyEvent * e) { if ((e->modifiers() & Qt::ShiftModifier)) { if (e->key() == Qt::Key_PageUp) { // Shift-PageUp -> first page of results resultPageFirst(); return; } } else { if (e->key() == Qt::Key_PageUp || e->key() == Qt::Key_Backspace) { resPageUpOrBack(); return; } else if (e->key() == Qt::Key_PageDown || e->key() == Qt::Key_Space) { resPageDownOrNext(); return; } } RESLIST_PARENTCLASS::keyPressEvent(e); } void ResList::mouseReleaseEvent(QMouseEvent *e) { m_lstClckMod = 0; if (e->modifiers() & Qt::ControlModifier) { m_lstClckMod |= Qt::ControlModifier; } if (e->modifiers() & Qt::ShiftModifier) { m_lstClckMod |= Qt::ShiftModifier; } RESLIST_PARENTCLASS::mouseReleaseEvent(e); } void ResList::highlighted(const QString& ) { // This is supposedly called when a link is preactivated (hover or tab // traversal, but is not actually called for tabs. We would have liked to // give some kind of visual feedback for tab traversal } // Page Up/Down: we don't try to check if current paragraph is last or // first. We just page up/down and check if viewport moved. If it did, // fair enough, else we go to next/previous result page. void ResList::resPageUpOrBack() { #ifdef RESLIST_TEXTBROWSER int vpos = verticalScrollBar()->value(); verticalScrollBar()->triggerAction(QAbstractSlider::SliderPageStepSub); if (vpos == verticalScrollBar()->value()) resultPageBack(); #else if (scrollIsAtTop()) { resultPageBack(); } else { QWebFrame *frame = page()->mainFrame(); frame->scroll(0, -int(0.9*geometry().height())); } setupArrows(); #endif } void ResList::resPageDownOrNext() { #ifdef RESLIST_TEXTBROWSER int vpos = verticalScrollBar()->value(); verticalScrollBar()->triggerAction(QAbstractSlider::SliderPageStepAdd); LOGDEB("ResList::resPageDownOrNext: vpos before " << vpos << ", after " << verticalScrollBar()->value() << "\n"); if (vpos == verticalScrollBar()->value()) resultPageNext(); #else if (scrollIsAtBottom()) { resultPageNext(); } else { QWebFrame *frame = page()->mainFrame(); frame->scroll(0, int(0.9*geometry().height())); } setupArrows(); #endif } void ResList::setupArrows() { emit prevPageAvailable(m_pager->hasPrev() || !scrollIsAtTop()); emit nextPageAvailable(m_pager->hasNext() || !scrollIsAtBottom()); } bool ResList::scrollIsAtBottom() { #ifdef RESLIST_TEXTBROWSER return false; #else QWebFrame *frame = page()->mainFrame(); bool ret; if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) { ret = true; } else { int max = frame->scrollBarMaximum(Qt::Vertical); int cur = frame->scrollBarValue(Qt::Vertical); ret = (max != 0) && (cur == max); LOGDEB2("Scrollatbottom: cur " << cur << " max " << max << "\n"); } LOGDEB2("scrollIsAtBottom: returning " << ret << "\n"); return ret; #endif } bool ResList::scrollIsAtTop() { #ifdef RESLIST_TEXTBROWSER return false; #else QWebFrame *frame = page()->mainFrame(); bool ret; if (!frame || frame->scrollBarGeometry(Qt::Vertical).isEmpty()) { ret = true; } else { int cur = frame->scrollBarValue(Qt::Vertical); int min = frame->scrollBarMinimum(Qt::Vertical); LOGDEB("Scrollattop: cur " << cur << " min " << min << "\n"); ret = (cur == min); } LOGDEB2("scrollIsAtTop: returning " << ret << "\n"); return ret; #endif } // Show previous page of results. We just set the current number back // 2 pages and show next page. void ResList::resultPageBack() { if (m_pager->hasPrev()) { m_pager->resultPageBack(); displayPage(); } } // Go to the first page void ResList::resultPageFirst() { // In case the preference was changed m_pager->setPageSize(prefs.respagesize); m_pager->resultPageFirst(); displayPage(); } // Fill up result list window with next screen of hits void ResList::resultPageNext() { if (m_pager->hasNext()) { m_pager->resultPageNext(); displayPage(); } } void ResList::resultPageFor(int docnum) { m_pager->resultPageFor(docnum); displayPage(); } void ResList::append(const QString &text) { LOGDEB2("QtGuiReslistPager::appendQString : " << qs2utf8s(text) << "\n"); #ifdef RESLIST_TEXTBROWSER QTextBrowser::append(text); #else m_text += text; #endif } void ResList::displayPage() { resetView(); m_pager->displayPage(theconfig); #ifndef RESLIST_TEXTBROWSER setHtml(m_text); #endif LOGDEB0("ResList::displayPg: hasNext " << m_pager->hasNext() << " atBot " << scrollIsAtBottom() << " hasPrev " << m_pager->hasPrev() << " at Top " << scrollIsAtTop() << " \n"); setupArrows(); // Possibly color paragraph of current preview if any previewExposed(m_curPvDoc); } // Color paragraph (if any) of currently visible preview void ResList::previewExposed(int docnum) { LOGDEB("ResList::previewExposed: doc " << docnum << "\n"); // Possibly erase old one to white if (m_curPvDoc != -1) { #ifdef RESLIST_TEXTBROWSER pair blockrange = parnumfromdocnum(m_curPvDoc); if (blockrange.first != -1) { for (int blockn = blockrange.first; blockn < blockrange.second; blockn++) { QTextBlock block = document()->findBlockByNumber(blockn); QTextCursor cursor(block); QTextBlockFormat format = cursor.blockFormat(); format.clearBackground(); cursor.setBlockFormat(format); } } #else QString sel = QString("div[rcldocnum=\"%1\"]").arg(m_curPvDoc - pageFirstDocNum()); LOGDEB2("Searching for element, selector: [" << qs2utf8s(sel) << "]\n"); QWebElement elt = page()->mainFrame()->findFirstElement(sel); if (!elt.isNull()) { LOGDEB2("Found\n"); elt.removeAttribute("style"); } else { LOGDEB2("Not Found\n"); } #endif m_curPvDoc = -1; } // Set background for active preview's doc entry m_curPvDoc = docnum; #ifdef RESLIST_TEXTBROWSER pair blockrange = parnumfromdocnum(docnum); // Maybe docnum is -1 or not in this window, if (blockrange.first < 0) return; // Color the new active paragraph QColor color("LightBlue"); for (int blockn = blockrange.first+1; blockn < blockrange.second; blockn++) { QTextBlock block = document()->findBlockByNumber(blockn); QTextCursor cursor(block); QTextBlockFormat format; format.setBackground(QBrush(color)); cursor.mergeBlockFormat(format); setTextCursor(cursor); ensureCursorVisible(); } #else QString sel = QString("div[rcldocnum=\"%1\"]").arg(docnum - pageFirstDocNum()); LOGDEB2("Searching for element, selector: [" << qs2utf8s(sel) << "]\n"); QWebElement elt = page()->mainFrame()->findFirstElement(sel); if (!elt.isNull()) { LOGDEB2("Found\n"); elt.setAttribute("style", "background: LightBlue;}"); } else { LOGDEB2("Not Found\n"); } #endif } // Double click in res list: add selection to simple search void ResList::mouseDoubleClickEvent(QMouseEvent *event) { RESLIST_PARENTCLASS::mouseDoubleClickEvent(event); #ifdef RESLIST_TEXTBROWSER if (textCursor().hasSelection()) emit(wordSelect(textCursor().selectedText())); #else emit(wordSelect(selectedText())); #endif } void ResList::showQueryDetails() { if (!m_source) return; string oq = breakIntoLines(m_source->getDescription(), 100, 50); QString str; QString desc = tr("Result count (est.)") + ": " + str.setNum(m_source->getResCnt()) + "
"; desc += tr("Query details") + ": " + QString::fromUtf8(oq.c_str()); QMessageBox::information(this, tr("Query details"), desc); } void ResList::linkWasClicked(const QUrl &url) { // qt5: url.toString() does not accept FullyDecoded, but that's what we // want. e.g. Suggestions links are like Sterm|spelling which we // receive as Sterm%7CSpelling string strurl = url_decode(qs2utf8s(url.toString())); LOGDEB("ResList::linkWasClicked: [" << strurl << "]\n"); int what = strurl[0]; switch (what) { // Open abstract/snippets window case 'A': { if (!m_source) return; int i = atoi(strurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR("ResList::linkWasClicked: can't get doc for " << i << "\n"); return; } emit(showSnippets(doc)); } break; // Show duplicates case 'D': { if (!m_source) return; int i = atoi(strurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR("ResList::linkWasClicked: can't get doc for " << i << "\n"); return; } vector dups; if (m_source->docDups(doc, dups) && m_rclmain) { m_rclmain->newDupsW(doc, dups); } } break; // Open parent folder case 'F': { int i = atoi(strurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR("ResList::linkWasClicked: can't get doc for " << i << "\n"); return; } emit editRequested(ResultPopup::getParent(std::shared_ptr(), doc)); } break; // Show query details case 'H': { showQueryDetails(); break; } // Preview and edit case 'P': case 'E': { int i = atoi(strurl.c_str()+1) - 1; Rcl::Doc doc; if (!getDoc(i, doc)) { LOGERR("ResList::linkWasClicked: can't get doc for " << i << "\n"); return; } if (what == 'P') { if (m_ismainres) { emit docPreviewClicked(i, doc, m_lstClckMod); } else { emit previewRequested(doc); } } else { emit editRequested(doc); } } break; // Next/prev page case 'n': resultPageNext(); break; case 'p': resultPageBack(); break; // Run script. Link format Rnn|Script Name case 'R': { int i = atoi(strurl.c_str() + 1) - 1; QString s = url.toString(); int bar = s.indexOf("|"); if (bar == -1 || bar >= s.size()-1) break; string cmdname = qs2utf8s(s.right(s.size() - (bar + 1))); DesktopDb ddb(path_cat(theconfig->getConfDir(), "scripts")); DesktopDb::AppDef app; if (ddb.appByName(cmdname, app)) { QAction act(QString::fromUtf8(app.name.c_str()), this); QVariant v(QString::fromUtf8(app.command.c_str())); act.setData(v); m_popDoc = i; menuOpenWith(&act); } } break; // Spelling: replacement suggestion clicked case 'S': { string s; if (!strurl.empty()) s = strurl.substr(1); string::size_type bar = s.find_first_of("|"); if (bar != string::npos && bar < s.size() - 1) { string o = s.substr(0, bar); string n = s.substr(bar+1); LOGDEB2("Emitting wordreplace " << o << " -> " << n << std::endl); emit wordReplace(u8s2qs(o), u8s2qs(n)); } } break; default: LOGERR("ResList::linkWasClicked: bad link [" << strurl << "]\n"); break;// ?? } } void ResList::createPopupMenu(const QPoint& pos) { LOGDEB("ResList::createPopupMenu(" << pos.x() << ", " << pos.y() << ")\n"); #ifdef RESLIST_TEXTBROWSER QTextCursor cursor = cursorForPosition(pos); int blocknum = cursor.blockNumber(); LOGDEB("ResList::createPopupMenu(): block " << blocknum << "\n"); m_popDoc = docnumfromparnum(blocknum); #else QWebHitTestResult htr = page()->mainFrame()->hitTestContent(pos); if (htr.isNull()) return; QWebElement el = htr.enclosingBlockElement(); while (!el.isNull() && !el.hasAttribute("rcldocnum")) el = el.parent(); if (el.isNull()) return; QString snum = el.attribute("rcldocnum"); m_popDoc = pageFirstDocNum() + snum.toInt(); #endif if (m_popDoc < 0) return; Rcl::Doc doc; if (!getDoc(m_popDoc, doc)) return; int options = ResultPopup::showSaveOne; if (m_ismainres) options |= ResultPopup::isMain; QMenu *popup = ResultPopup::create(this, options, m_source, doc); popup->popup(mapToGlobal(pos)); } void ResList::menuPreview() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) { if (m_ismainres) { emit docPreviewClicked(m_popDoc, doc, 0); } else { emit previewRequested(doc); } } } void ResList::menuSaveToFile() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docSaveToFileClicked(doc); } void ResList::menuPreviewParent() { Rcl::Doc doc; if (getDoc(m_popDoc, doc) && m_source) { Rcl::Doc pdoc = ResultPopup::getParent(m_source, doc); if (pdoc.mimetype == "inode/directory") { emit editRequested(pdoc); } else { emit previewRequested(pdoc); } } } void ResList::menuOpenParent() { Rcl::Doc doc; if (getDoc(m_popDoc, doc) && m_source) emit editRequested(ResultPopup::getParent(m_source, doc)); } void ResList::menuShowSnippets() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit showSnippets(doc); } void ResList::menuShowSubDocs() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit showSubDocs(doc); } void ResList::menuEdit() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit editRequested(doc); } void ResList::menuOpenWith(QAction *act) { if (act == 0) return; string cmd = qs2utf8s(act->data().toString()); Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit openWithRequested(doc, cmd); } void ResList::menuCopyFN() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) ResultPopup::copyFN(doc); } void ResList::menuCopyURL() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) ResultPopup::copyURL(doc); } void ResList::menuExpand() { Rcl::Doc doc; if (getDoc(m_popDoc, doc)) emit docExpand(doc); } int ResList::pageFirstDocNum() { return m_pager->pageFirstDocNum(); } recoll-1.23.7/qtgui/rtitool.ui0000644000175000017500000000754513125527323013207 00000000000000 RTIToolW 0 0 423 207 Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> true Start indexing daemon with my desktop session. Qt::Horizontal 28 20 false 1 0 Also start indexing daemon right now. Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() RTIToolW accept() 204 159 204 90 buttonBox rejected() RTIToolW reject() 204 159 204 90 recoll-1.23.7/qtgui/ptrans.ui0000644000175000017500000000775013125527323013020 00000000000000 EditTransBase 0 0 649 362 Path Translations Setting path translations for false Select one or several file types, then use the controls in the frame below to change how they are processed QFrame::StyledPanel QFrame::Sunken QAbstractItemView::NoEditTriggers QAbstractItemView::ExtendedSelection QAbstractItemView::SelectRows true true 2 true false 300 20 false true false Add false Delete Qt::Horizontal 40 20 Cancel Save recoll-1.23.7/qtgui/respopup.h0000644000175000017500000000246313125637102013171 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RESPOPUP_H_INCLUDED_ #define _RESPOPUP_H_INCLUDED_ #include "autoconfig.h" namespace ResultPopup { enum Options {showExpand = 0x1, showSubs = 0x2, isMain = 0x3, showSaveOne = 0x4, showSaveSel = 0x8}; extern QMenu *create(QWidget *me, int opts, std::shared_ptr source, Rcl::Doc& doc); extern Rcl::Doc getParent(std::shared_ptr source, Rcl::Doc& doc); extern void copyFN(const Rcl::Doc &doc); extern void copyURL(const Rcl::Doc &doc); }; #endif /* _RESPOPUP_H_INCLUDED_ */ recoll-1.23.7/qtgui/rtitool.cpp0000644000175000017500000001136213125527323013344 00000000000000#ifndef _WIN32 /* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "safesysstat.h" #include "safeunistd.h" #include #include #include #include #include "recoll.h" #include "rtitool.h" #include "smallut.h" #include "pathut.h" #include "copyfile.h" #include "readfile.h" #include "execmd.h" using std::string; static const char *rautostartfile = ".config/autostart/recollindex.desktop"; // Just in case we don't find the file in the shared dir, have a // default text ready static const char *desktopfiletext = "[Desktop Entry]\n" "Name=Recoll real time indexer\n" "Comment=Runs in background to extract and index text from modified " "documents\n" "Icon=system-run\n" "Exec=recollindex -w 60 -m\n" "Terminal=false\n" "TerminalOptions=\n" "Type=Application\n" "Categories=Utility;Filesystem;Database;\n" "NoDisplay=true\n" "X-GNOME-Autostart-enabled=true\n" "X-KDE-autostart-after=panel\n" "X-KDE-UniqueApplet=true\n" ; void RTIToolW::init() { connect(this->sesCB, SIGNAL(clicked(bool)), this, SLOT(sesclicked(bool))); string autostartfile = path_cat(path_home(), rautostartfile); if (path_exists(autostartfile)) { sesCB->setChecked(true); } } void RTIToolW::sesclicked(bool on) { nowCB->setEnabled(on); if (!on) nowCB->setChecked(false); } void RTIToolW::accept() { bool exitdial = false; string autostartfile = path_cat(path_home(), rautostartfile); if (sesCB->isChecked()) { // Setting up daemon indexing autostart if (path_exists(autostartfile)) { QString msg = tr("Replacing: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::Button rep = QMessageBox::question(this, tr("Replacing file"), msg, QMessageBox::Ok | QMessageBox::Cancel); if (rep != QMessageBox::Ok) { goto out; } } string text; if (theconfig) { string sourcefile = path_cat(theconfig->getDatadir(), "examples"); sourcefile = path_cat(sourcefile, "recollindex.desktop"); if (path_exists(sourcefile)) { file_to_string(sourcefile, text); } } if (text.empty()) text = desktopfiletext; // Try to create .config and autostart anyway. If they exists this will // do nothing. An error will be detected when we try to create the file string dir = path_cat(path_home(), ".config"); mkdir(dir.c_str(), 0700); dir = path_cat(dir, "autostart"); mkdir(dir.c_str(), 0700); string reason; if (!stringtofile(text, autostartfile.c_str(), reason)) { QString msg = tr("Can't create: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::warning(0, tr("Warning"), msg, QMessageBox::Ok); return; } if (nowCB->isChecked()) { ExecCmd cmd; vector args; int status; args.push_back("-m"); args.push_back("-w"); args.push_back("0"); status = cmd.doexec("recollindex", args, 0, 0); if (status) { QMessageBox::warning(0, tr("Warning"), tr("Could not execute recollindex"), QMessageBox::Ok); goto out; } } exitdial = true; } else { // Turning autostart off if (path_exists(autostartfile)) { QString msg = tr("Deleting: ") + QString::fromLocal8Bit(autostartfile.c_str()); QMessageBox::Button rep = QMessageBox::question(this, tr("Deleting file"), msg, QMessageBox::Ok | QMessageBox::Cancel); if (rep == QMessageBox::Ok) { exitdial = true; unlink(autostartfile.c_str()); if (theconfig) { Pidfile pidfile(theconfig->getPidfile()); pid_t pid; if ((pid = pidfile.open()) != 0) { QMessageBox::Button rep = QMessageBox::question(this, tr("Removing autostart"), tr("Autostart file deleted. Kill current process too ?"), QMessageBox::Yes | QMessageBox::No); if (rep == QMessageBox::Yes) { kill(pid, SIGTERM); } } } } } else { exitdial = true; } } out: if (exitdial) QDialog::accept(); } #endif recoll-1.23.7/qtgui/rclmain.ui0000644000175000017500000004027413125527323013134 00000000000000 RclMainBase 0 0 800 600 0 0 Recoll 0 4 2 4 2 0 0 2 0 0 0 800 25 &File &View &Tools &Preferences &Help &Results E&xit Ctrl+Q fileExitAction Update &index fileToggleIndexingAction &Rebuild index fileRebuildIndexAction &Erase document history fileEraseDocHistoryAction &Erase search history fileEraseSearchHistoryAction Missing &helpers showMissingHelpers_Action Indexed &MIME types showActiveTypes_Action &About Recoll helpAbout_RecollAction &User manual userManualAction :/images/history.png:/images/history.png Document &History Document History toolsDoc_HistoryAction :/images/asearch.png:/images/asearch.png &Advanced Search Advanced/complex Search toolsAdvanced_SearchAction &Sort parameters Sort parameters toolsSort_parametersAction :/images/spell.png:/images/spell.png Term &explorer Term explorer tool toolsSpellAction false :/images/nextpage.png:/images/nextpage.png Next page Next page of results PgDown nextPageAction false :/images/firstpage.png:/images/firstpage.png First page Go to first page of results Shift+PgUp firstPageAction false :/images/prevpage.png:/images/prevpage.png Previous page Previous page of results PgUp prevPageAction &Index configuration indexConfigAction Indexing &schedule indexScheduleAction &GUI configuration queryPrefsAction E&xternal index dialog External index dialog extIdxAction true Enable synonyms Enable synonyms enbSynAction &Full Screen Full Screen F11 toggleFullScreenAction true false :/images/up.png:/images/up.png Sort by date, oldest first Sort by dates from oldest to newest true false :/images/down.png:/images/down.png Sort by date, newest first Sort by dates from newest to oldest Show Query Details true :/images/table.png:/images/table.png Show as table Show results in a spreadsheet-like table Save as CSV (spreadsheet) file Saves the result into a file which you can load in a spreadsheet Next Page Previous Page First Page :/images/code-block.png:/images/code-block.png Query Fragments true With failed files retrying Next update will retry previously failed files fileToggleIndexingAction Save last query Load saved query Special Indexing Indexing with special options Index &statistics Webcache Editor SSearch QWidget

ssearch_w.h
ResList QWidget
reslist.h
ssearch_w.h reslist.h recoll-1.23.7/qtgui/fragbuts.cpp0000644000175000017500000001446213125637102013466 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "safesysstat.h" #include #include #include #include #include #include #include #include #include #include "fragbuts.h" #include "pathut.h" #include "smallut.h" #include "recoll.h" #include "log.h" #include "readfile.h" #include "copyfile.h" using namespace std; class FragButsParser : public QXmlDefaultHandler { public: FragButsParser(FragButs *_parent, vector& _buttons) : parent(_parent), vlw(new QVBoxLayout(parent)), vl(new QVBoxLayout()), buttons(_buttons), hl(0), bg(0), radio(false) { } bool startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &attributes); bool endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName); bool characters(const QString &str) { currentText += str; return true; } bool error(const QXmlParseException& exception) { fatalError(exception); return false; } bool fatalError(const QXmlParseException& x) { errorMessage = QString("%2 at line %3 column %4") .arg(x.message()) .arg(x.lineNumber()) .arg(x.columnNumber()); return false; } QString errorMessage; private: QWidget *parent; QVBoxLayout *vlw; QVBoxLayout *vl; vector& buttons; // Temporary data while parsing. QHBoxLayout *hl; QButtonGroup *bg; QString currentText; QString label; string frag; bool radio; }; bool FragButsParser::startElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName, const QXmlAttributes &/*attributes*/) { currentText = ""; if (qName == "buttons") { radio = false; hl = new QHBoxLayout(); } else if (qName == "radiobuttons") { radio = true; bg = new QButtonGroup(parent); hl = new QHBoxLayout(); } return true; } bool FragButsParser::endElement(const QString & /* namespaceURI */, const QString & /* localName */, const QString &qName) { if (qName == "label") { label = currentText; } else if (qName == "frag") { frag = qs2utf8s(currentText); } else if (qName == "fragbut") { string slab = qs2utf8s(label); trimstring(slab, " \t\n\t"); label = QString::fromUtf8(slab.c_str()); QAbstractButton *abut; if (radio) { QRadioButton *but = new QRadioButton(label, parent); bg->addButton(but); if (bg->buttons().length() == 1) but->setChecked(true); abut = but; } else { QCheckBox *but = new QCheckBox(label, parent); abut = but; } abut->setToolTip(currentText); buttons.push_back(FragButs::ButFrag(abut, frag)); hl->addWidget(abut); } else if (qName == "buttons" || qName == "radiobuttons") { vl->addLayout(hl); hl = 0; } else if (qName == "fragbuts") { vlw->addLayout(vl); } return true; } FragButs::FragButs(QWidget* parent) : QWidget(parent), m_reftime(0), m_ok(false) { m_fn = path_cat(theconfig->getConfDir(), "fragbuts.xml"); string data, reason; if (!path_exists(m_fn)) { // config does not exist: try to create it from sample string src = path_cat(theconfig->getDatadir(), "examples"); src = path_cat(src, "fragbuts.xml"); copyfile(src.c_str(), m_fn.c_str(), reason); } if (!file_to_string(m_fn, data, &reason)) { QMessageBox::warning(0, "Recoll", tr("%1 not found.").arg( QString::fromLocal8Bit(m_fn.c_str()))); LOGERR("Fragbuts:: can't read [" << (m_fn) << "]\n" ); return; } FragButsParser parser(this, m_buttons); QXmlSimpleReader reader; reader.setContentHandler(&parser); reader.setErrorHandler(&parser); QXmlInputSource xmlInputSource; xmlInputSource.setData(QString::fromUtf8(data.c_str())); if (!reader.parse(xmlInputSource)) { QMessageBox::warning(0, "Recoll", tr("%1:\n %2") .arg(QString::fromLocal8Bit(m_fn.c_str())) .arg(parser.errorMessage)); return; } for (vector::iterator it = m_buttons.begin(); it != m_buttons.end(); it++) { connect(it->button, SIGNAL(clicked(bool)), this, SLOT(onButtonClicked(bool))); } setWindowTitle(tr("Query Fragments")); isStale(&m_reftime); m_ok = true; } FragButs::~FragButs() { } bool FragButs::isStale(time_t *reftime) { struct stat st; stat(m_fn.c_str(), &st); bool ret = st.st_mtime != m_reftime; if (reftime) *reftime = st.st_mtime; return ret; } void FragButs::onButtonClicked(bool on) { LOGDEB("FragButs::onButtonClicked: [" << (int(on)) << "]\n" ); emit fragmentsChanged(); } void FragButs::getfrags(std::vector& frags) { for (vector::iterator it = m_buttons.begin(); it != m_buttons.end(); it++) { if (it->button->isChecked() && !it->fragment.empty()) { LOGDEB("FragButs: fragment [" << (it->fragment) << "]\n" ); frags.push_back(it->fragment); } } } recoll-1.23.7/qtgui/crontool.cpp0000644000175000017500000000601513125527323013506 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include "recoll.h" #include "crontool.h" #include "ecrontab.h" #include "smallut.h" static string marker; static string idstring(const string& confdir) { // Quote conf dir, there may be spaces and whatelse in there return string("RECOLL_CONFDIR=") + escapeShell(confdir); } void CronToolW::init() { marker = "RCLCRON_RCLINDEX="; enableButton = new QPushButton(tr("Enable")); disableButton = new QPushButton(tr("Disable")); buttonBox->addButton(enableButton, QDialogButtonBox::ActionRole); buttonBox->addButton(disableButton, QDialogButtonBox::ActionRole); connect(enableButton, SIGNAL(clicked()), this, SLOT(enableCron())); connect(disableButton, SIGNAL(clicked()), this, SLOT(disableCron())); // Try to read the current values if (!theconfig) return; if (checkCrontabUnmanaged(marker, "recollindex")) { QMessageBox::warning(0, "Recoll", tr("It seems that manually edited entries exist for recollindex, cannot edit crontab")); QTimer::singleShot(0, this, SLOT(close())); } string id = idstring(theconfig->getConfDir()); vector sched; if (getCrontabSched(marker, id, sched)) { minsLE->setText(QString::fromUtf8(sched[0].c_str())); hoursLE->setText(QString::fromUtf8(sched[1].c_str())); daysLE->setText(QString::fromUtf8(sched[4].c_str())); } } void CronToolW::enableCron() { changeCron(true); } void CronToolW::disableCron() { changeCron(false); } void CronToolW::changeCron(bool enable) { if (!theconfig) return; string id = idstring(theconfig->getConfDir()); string cmd("recollindex"); string reason; if (!enable) { editCrontab(marker, id, "", "", reason); accept(); } else { string mins(qs2utf8s(minsLE->text().remove(QChar(' ')))); string hours(qs2utf8s(hoursLE->text().remove(QChar(' ')))); string days(qs2utf8s(daysLE->text().remove(QChar(' ')))); string sched = mins + " " + hours + " * * " + days; if (editCrontab(marker, id, sched, cmd, reason)) { accept(); } else { QMessageBox::warning(0, "Recoll", tr("Error installing cron entry. Bad syntax in fields ?")); } } } recoll-1.23.7/qtgui/respopup.cpp0000644000175000017500000001451513125637102013525 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include "log.h" #include "smallut.h" #include "recoll.h" #include "docseq.h" #include "respopup.h" #include "appformime.h" namespace ResultPopup { QMenu *create(QWidget *me, int opts, std::shared_ptr source, Rcl::Doc& doc) { QMenu *popup = new QMenu(me); LOGDEB("ResultPopup::create: opts " << (opts) << " haspages " << (doc.haspages) << " " << (source ? "Source not null" : "Source is Null") << " " << (source ? (source->snippetsCapable() ? "snippetsCapable" : "not snippetsCapable") : "") << "\n" ); string apptag; doc.getmeta(Rcl::Doc::keyapptg, &apptag); popup->addAction(QWidget::tr("&Preview"), me, SLOT(menuPreview())); if (!theconfig->getMimeViewerDef(doc.mimetype, apptag, 0).empty()) { popup->addAction(QWidget::tr("&Open"), me, SLOT(menuEdit())); } bool needopenwith = true; if (!doc.ipath.empty()) needopenwith = false; if (needopenwith) { string backend; doc.getmeta(Rcl::Doc::keybcknd, &backend); if (!backend.empty() && backend.compare("FS")) needopenwith = false; } if (needopenwith) { vector aps; DesktopDb *ddb = DesktopDb::getDb(); if (ddb && ddb->appForMime(doc.mimetype, &aps) && !aps.empty()) { QMenu *sub = popup->addMenu(QWidget::tr("Open With")); if (sub) { for (vector::const_iterator it = aps.begin(); it != aps.end(); it++) { QAction *act = new QAction(QString::fromUtf8(it->name.c_str()), me); QVariant v(QString::fromUtf8(it->command.c_str())); act->setData(v); sub->addAction(act); } sub->connect(sub, SIGNAL(triggered(QAction *)), me, SLOT(menuOpenWith(QAction *))); } } // See if there are any desktop files in $RECOLL_CONFDIR/scripts // and possibly create a "run script" menu. aps.clear(); ddb = new DesktopDb(path_cat(theconfig->getConfDir(), "scripts")); if (ddb && ddb->allApps(&aps) && !aps.empty()) { QMenu *sub = popup->addMenu(QWidget::tr("Run Script")); if (sub) { for (vector::const_iterator it = aps.begin(); it != aps.end(); it++) { QAction *act = new QAction(QString::fromUtf8(it->name.c_str()), me); QVariant v(QString::fromUtf8(it->command.c_str())); act->setData(v); sub->addAction(act); } sub->connect(sub, SIGNAL(triggered(QAction *)), me, SLOT(menuOpenWith(QAction *))); } } delete ddb; } popup->addAction(QWidget::tr("Copy &File Name"), me, SLOT(menuCopyFN())); popup->addAction(QWidget::tr("Copy &URL"), me, SLOT(menuCopyURL())); if ((opts&showSaveOne) && (!doc.isFsFile() || !doc.ipath.empty())) popup->addAction(QWidget::tr("&Write to File"), me, SLOT(menuSaveToFile())); if ((opts&showSaveSel)) popup->addAction(QWidget::tr("Save selection to files"), me, SLOT(menuSaveSelection())); Rcl::Doc pdoc; if (source && source->getEnclosing(doc, pdoc)) { popup->addAction(QWidget::tr("Preview P&arent document/folder"), me, SLOT(menuPreviewParent())); } // Open parent is useful even if there is no parent because we open // the enclosing folder. if (doc.isFsFile()) popup->addAction(QWidget::tr("&Open Parent document/folder"), me, SLOT(menuOpenParent())); if (opts & showExpand) popup->addAction(QWidget::tr("Find &similar documents"), me, SLOT(menuExpand())); if (doc.haspages && source && source->snippetsCapable()) popup->addAction(QWidget::tr("Open &Snippets window"), me, SLOT(menuShowSnippets())); if ((opts & showSubs) && rcldb && rcldb->hasSubDocs(doc)) popup->addAction(QWidget::tr("Show subdocuments / attachments"), me, SLOT(menuShowSubDocs())); return popup; } Rcl::Doc getParent(std::shared_ptr source, Rcl::Doc& doc) { Rcl::Doc pdoc; if (!source || !source->getEnclosing(doc, pdoc)) { // No parent doc: show enclosing folder with app configured for // directories pdoc.url = url_parentfolder(doc.url); pdoc.meta[Rcl::Doc::keychildurl] = doc.url; pdoc.meta[Rcl::Doc::keyapptg] = "parentopen"; pdoc.mimetype = "inode/directory"; } return pdoc; } void copyFN(const Rcl::Doc &doc) { // Our urls currently always begin with "file://" // // Problem: setText expects a QString. Passing a (const char*) // as we used to do causes an implicit conversion from // latin1. File are binary and the right approach would be no // conversion, but it's probably better (less worse...) to // make a "best effort" tentative and try to convert from the // locale's charset than accept the default conversion. QString qfn = QString::fromLocal8Bit(doc.url.c_str()+7); QApplication::clipboard()->setText(qfn, QClipboard::Selection); QApplication::clipboard()->setText(qfn, QClipboard::Clipboard); } void copyURL(const Rcl::Doc &doc) { string url = url_encode(doc.url, 7); QApplication::clipboard()->setText(url.c_str(), QClipboard::Selection); QApplication::clipboard()->setText(url.c_str(), QClipboard::Clipboard); } } recoll-1.23.7/qtgui/rclm_view.cpp0000644000175000017500000004117213224431020013625 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "safeunistd.h" #include #include #include "qxtconfirmationmessage.h" #include "log.h" #include "fileudi.h" #include "execmd.h" #include "transcode.h" #include "docseqhist.h" #include "docseqdb.h" #include "internfile.h" #include "rclmain_w.h" #include "rclzg.h" #include "pathut.h" using namespace std; // Start native viewer or preview for input Doc. This is used to allow // using recoll from another app (e.g. Unity Scope) to view embedded // result docs (docs with an ipath). . We act as a proxy to extract // the data and start a viewer. The Url are encoded as // file://path#ipath void RclMain::viewUrl() { if (m_urltoview.isEmpty() || !rcldb) return; QUrl qurl(m_urltoview); LOGDEB("RclMain::viewUrl: Path [" << ((const char *)qurl.path().toLocal8Bit()) << "] fragment [" << ((const char *)qurl.fragment().toLocal8Bit()) << "]\n"); /* In theory, the url might not be for a file managed by the fs indexer so that the make_udi() call here would be wrong(). When/if this happens we'll have to hide this part inside internfile and have some url magic to indicate the appropriate indexer/identification scheme */ string udi; make_udi((const char *)qurl.path().toLocal8Bit(), (const char *)qurl.fragment().toLocal8Bit(), udi); Rcl::Doc doc; Rcl::Doc idxdoc; // idxdoc.idxi == 0 -> works with base index only if (!rcldb->getDoc(udi, idxdoc, doc) || doc.pc == -1) return; // StartNativeViewer needs a db source to call getEnclosing() on. Rcl::Query *query = new Rcl::Query(rcldb); DocSequenceDb *src = new DocSequenceDb(std::shared_ptr(query), "", std::shared_ptr(new Rcl::SearchData)); m_source = std::shared_ptr(src); // Start a native viewer if the mimetype has one defined, else a // preview. string apptag; doc.getmeta(Rcl::Doc::keyapptg, &apptag); string viewer = theconfig->getMimeViewerDef(doc.mimetype, apptag, prefs.useDesktopOpen); if (viewer.empty()) { startPreview(doc); } else { hide(); startNativeViewer(doc); // We have a problem here because xdg-open will exit // immediately after starting the command instead of waiting // for it, so we can't wait either and we don't know when we // can exit (deleting the temp file). As a bad workaround we // sleep some time then exit. The alternative would be to just // prevent the temp file deletion completely, leaving it // around forever. Better to let the user save a copy if he // wants I think. sleep(30); fileExit(); } } /* Look for html browser. We make a special effort for html because it's * used for reading help. This is only used if the normal approach * (xdg-open etc.) failed */ static bool lookForHtmlBrowser(string &exefile) { vector blist{"opera", "google-chrome", "chromium-browser", "palemoon", "iceweasel", "firefox", "konqueror", "epiphany"}; const char *path = getenv("PATH"); if (path == 0) { path = "/usr/local/bin:/usr/bin:/bin"; } // Look for each browser for (const auto& entry : blist) { if (ExecCmd::which(entry, exefile, path)) return true; } exefile.clear(); return false; } void RclMain::openWith(Rcl::Doc doc, string cmdspec) { LOGDEB("RclMain::openWith: " << cmdspec << "\n"); // Split the command line vector lcmd; if (!stringToStrings(cmdspec, lcmd)) { QMessageBox::warning(0, "Recoll", tr("Bad desktop app spec for %1: [%2]\n" "Please check the desktop file") .arg(QString::fromUtf8(doc.mimetype.c_str())) .arg(QString::fromLocal8Bit(cmdspec.c_str()))); return; } // Look for the command to execute in the exec path and the filters // directory string execname = lcmd.front(); lcmd.erase(lcmd.begin()); string url = doc.url; string fn = fileurltolocalpath(doc.url); // Try to keep the letters used more or less consistent with the reslist // paragraph format. map subs; #ifdef _WIN32 path_backslashize(fn); #endif subs["F"] = fn; subs["f"] = fn; subs["U"] = url_encode(url); subs["u"] = url; execViewer(subs, false, execname, lcmd, cmdspec, doc); } void RclMain::startNativeViewer(Rcl::Doc doc, int pagenum, QString term) { string apptag; doc.getmeta(Rcl::Doc::keyapptg, &apptag); LOGDEB("RclMain::startNativeViewer: mtype [" << doc.mimetype << "] apptag [" << apptag << "] page " << pagenum << " term [" << qs2utf8s(term) << "] url [" << doc.url << "] ipath [" << doc.ipath << "]\n"); // Look for appropriate viewer string cmdplusattr = theconfig->getMimeViewerDef(doc.mimetype, apptag, prefs.useDesktopOpen); if (cmdplusattr.empty()) { QMessageBox::warning(0, "Recoll", tr("No external viewer configured for mime type [") + doc.mimetype.c_str() + "]"); return; } LOGDEB("StartNativeViewer: viewerdef from config: " << cmdplusattr << endl); // Separate command string and viewer attributes (if any) ConfSimple viewerattrs; string cmd; theconfig->valueSplitAttributes(cmdplusattr, cmd, viewerattrs); bool ignoreipath = false; int execwflags = 0; if (viewerattrs.get("ignoreipath", cmdplusattr)) ignoreipath = stringToBool(cmdplusattr); if (viewerattrs.get("maximize", cmdplusattr)) { if (stringToBool(cmdplusattr)) { execwflags |= ExecCmd::EXF_MAXIMIZED; } } // Split the command line vector lcmd; if (!stringToStrings(cmd, lcmd)) { QMessageBox::warning(0, "Recoll", tr("Bad viewer command line for %1: [%2]\n" "Please check the mimeview file") .arg(QString::fromUtf8(doc.mimetype.c_str())) .arg(QString::fromLocal8Bit(cmd.c_str()))); return; } // Look for the command to execute in the exec path and the filters // directory string execpath; if (!ExecCmd::which(lcmd.front(), execpath)) { execpath = theconfig->findFilter(lcmd.front()); // findFilter returns its input param if the filter is not in // the normal places. As we already looked in the path, we // have no use for a simple command name here (as opposed to // mimehandler which will just let execvp do its thing). Erase // execpath so that the user dialog will be started further // down. if (!execpath.compare(lcmd.front())) execpath.erase(); // Specialcase text/html because of the help browser need if (execpath.empty() && !doc.mimetype.compare("text/html") && apptag.empty()) { if (lookForHtmlBrowser(execpath)) { lcmd.clear(); lcmd.push_back(execpath); lcmd.push_back("%u"); } } } // Command not found: start the user dialog to help find another one: if (execpath.empty()) { QString mt = QString::fromUtf8(doc.mimetype.c_str()); QString message = tr("The viewer specified in mimeview for %1: %2" " is not found.\nDo you want to start the " " preferences dialog ?") .arg(mt).arg(QString::fromLocal8Bit(lcmd.front().c_str())); switch(QMessageBox::warning(0, "Recoll", message, "Yes", "No", 0, 0, 1)) { case 0: showUIPrefs(); if (uiprefs) uiprefs->showViewAction(mt); break; case 1: break; } // The user will have to click on the link again to try the // new command. return; } // Get rid of the command name. lcmd is now argv[1...n] lcmd.erase(lcmd.begin()); // Process the command arguments to determine if we need to create // a temporary file. // If the command has a %i parameter it will manage the // un-embedding. Else if ipath is not empty, we need a temp file. // This can be overridden with the "ignoreipath" attribute bool groksipath = (cmd.find("%i") != string::npos) || ignoreipath; // We used to try being clever here, but actually, the only case // where we don't need a local file copy of the document (or // parent document) is the case of an HTML page with a non-file // URL (http or https). Trying to guess based on %u or %f is // doomed because we pass %u to xdg-open. bool wantsfile = false; bool wantsparentfile = cmd.find("%F") != string::npos; if (!wantsparentfile && (cmd.find("%f") != string::npos || urlisfileurl(doc.url) || doc.mimetype.compare("text/html"))) { wantsfile = true; } if (wantsparentfile && !urlisfileurl(doc.url)) { QMessageBox::warning(0, "Recoll", tr("Viewer command line for %1 specifies " "parent file but URL is http[s]: unsupported") .arg(QString::fromUtf8(doc.mimetype.c_str()))); return; } if (wantsfile && wantsparentfile) { QMessageBox::warning(0, "Recoll", tr("Viewer command line for %1 specifies both " "file and parent file value: unsupported") .arg(QString::fromUtf8(doc.mimetype.c_str()))); return; } string url = doc.url; string fn = fileurltolocalpath(doc.url); Rcl::Doc pdoc; if (wantsparentfile) { // We want the path for the parent document. For example to // open the chm file, not the internal page. Note that we just // override the other file name in this case. if (!m_source || !m_source->getEnclosing(doc, pdoc)) { QMessageBox::warning(0, "Recoll", tr("Cannot find parent document")); return; } // Override fn with the parent's : fn = fileurltolocalpath(pdoc.url); // If the parent document has an ipath too, we need to create // a temp file even if the command takes an ipath // parameter. We have no viewer which could handle a double // embedding. Will have to change if such a one appears. if (!pdoc.ipath.empty()) { groksipath = false; } } bool enterHistory = false; bool istempfile = false; LOGDEB("RclMain::startNV: groksipath " << groksipath << " wantsf " << wantsfile << " wantsparentf " << wantsparentfile << "\n"); // If the command wants a file but this is not a file url, or // there is an ipath that it won't understand, we need a temp file: theconfig->setKeyDir(fn.empty() ? "" : path_getfather(fn)); if (((wantsfile || wantsparentfile) && fn.empty()) || (!groksipath && !doc.ipath.empty()) ) { TempFile temp; Rcl::Doc& thedoc = wantsparentfile ? pdoc : doc; if (!FileInterner::idocToFile(temp, string(), theconfig, thedoc)) { QMessageBox::warning(0, "Recoll", tr("Cannot extract document or create " "temporary file")); return; } enterHistory = true; istempfile = true; rememberTempFile(temp); fn = temp->filename(); url = path_pathtofileurl(fn); } // If using an actual file, check that it exists, and if it is // compressed, we may need an uncompressed version if (!fn.empty() && theconfig->mimeViewerNeedsUncomp(doc.mimetype)) { if (access(fn.c_str(), R_OK) != 0) { QMessageBox::warning(0, "Recoll", tr("Can't access file: ") + u8s2qs(fn)); return; } TempFile temp; if (FileInterner::isCompressed(fn, theconfig)) { if (!FileInterner::maybeUncompressToTemp(temp, fn, theconfig, doc)) { QMessageBox::warning(0, "Recoll", tr("Can't uncompress file: ") + QString::fromLocal8Bit(fn.c_str())); return; } } if (temp) { istempfile = true; rememberTempFile(temp); fn = temp->filename(); url = path_pathtofileurl(fn); } } if (istempfile) { QxtConfirmationMessage confirm( QMessageBox::Warning, "Recoll", tr("Opening a temporary copy. Edits will be lost if you don't save" "
them to a permanent location."), tr("Do not show this warning next time (use GUI preferences " "to restore).")); confirm.setSettingsPath("Recoll/prefs"); confirm.setOverrideSettingsKey("showTempFileWarning"); confirm.exec(); } // If we are not called with a page number (which would happen for a call // from the snippets window), see if we can compute a page number anyway. if (pagenum == -1) { pagenum = 1; string lterm; if (m_source) pagenum = m_source->getFirstMatchPage(doc, lterm); if (pagenum == -1) pagenum = 1; else // We get the match term used to compute the page term = QString::fromUtf8(lterm.c_str()); } char cpagenum[20]; sprintf(cpagenum, "%d", pagenum); // Substitute %xx inside arguments string efftime; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { efftime = doc.dmtime.empty() ? doc.fmtime : doc.dmtime; } else { efftime = "0"; } // Try to keep the letters used more or less consistent with the reslist // paragraph format. map subs; subs["D"] = efftime; #ifdef _WIN32 path_backslashize(fn); #endif subs["f"] = fn; subs["F"] = fn; subs["i"] = FileInterner::getLastIpathElt(doc.ipath); subs["M"] = doc.mimetype; subs["p"] = cpagenum; subs["s"] = (const char*)term.toLocal8Bit(); subs["U"] = url_encode(url); subs["u"] = url; // Let %(xx) access all metadata. for (map::const_iterator it = doc.meta.begin(); it != doc.meta.end(); it++) { subs[it->first] = it->second; } execViewer(subs, enterHistory, execpath, lcmd, cmd, doc, execwflags); } void RclMain::execViewer(const map& subs, bool enterHistory, const string& execpath, const vector& _lcmd, const string& cmd, Rcl::Doc doc, int flags) { string ncmd; vector lcmd; for (vector::const_iterator it = _lcmd.begin(); it != _lcmd.end(); it++) { pcSubst(*it, ncmd, subs); LOGDEB("" << *it << "->" << (ncmd) << "\n" ); lcmd.push_back(ncmd); } // Also substitute inside the unsplitted command line and display // in status bar pcSubst(cmd, ncmd, subs); #ifndef _WIN32 ncmd += " &"; #endif QStatusBar *stb = statusBar(); if (stb) { string fcharset = theconfig->getDefCharset(true); string prcmd; transcode(ncmd, prcmd, fcharset, "UTF-8"); QString msg = tr("Executing: [") + QString::fromUtf8(prcmd.c_str()) + "]"; stb->showMessage(msg, 10000); } if (!enterHistory) historyEnterDoc(g_dynconf, doc.meta[Rcl::Doc::keyudi]); // Do the zeitgeist thing zg_send_event(ZGSEND_OPEN, doc); // We keep pushing back and never deleting. This can't be good... ExecCmd *ecmd = new ExecCmd(ExecCmd::EXF_SHOWWINDOW | flags); m_viewers.push_back(ecmd); ecmd->startExec(execpath, lcmd, false, false); } void RclMain::startManual() { startManual(string()); } void RclMain::startManual(const string& index) { string docdir = path_cat(theconfig->getDatadir(), "doc"); // The single page user manual is nicer if we have an index. Else // the webhelp one is nicer if it is present string usermanual = path_cat(docdir, "usermanual.html"); string webhelp = path_cat(docdir, "webhelp"); webhelp = path_cat(webhelp, "index.html"); bool has_wh = path_exists(webhelp); LOGDEB("RclMain::startManual: help index is " << (index.empty()?"(null)":index) << "\n" ); bool indexempty = index.empty(); #ifdef _WIN32 // On Windows I could not find any way to pass the fragment through // rclstartw (tried to set text/html as exception with rclstartw %u). // So always start the webhelp indexempty = true; #endif if (!indexempty) { usermanual += "#"; usermanual += index; } Rcl::Doc doc; if (has_wh && indexempty) { doc.url = path_pathtofileurl(webhelp); } else { doc.url = path_pathtofileurl(usermanual); } doc.mimetype = "text/html"; startNativeViewer(doc); } recoll-1.23.7/qtgui/specialindex.ui0000644000175000017500000001020713125527323014150 00000000000000 SpecIdxW Qt::WindowModal 0 0 413 191 Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. 8 0 300 0 Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse false Start directory (else use regular topdirs): false Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Qt::Horizontal QDialogButtonBox::Cancel|QDialogButtonBox::Ok buttonBox accepted() SpecIdxW accept() 248 254 157 274 buttonBox rejected() SpecIdxW reject() 316 260 286 274 recoll-1.23.7/qtgui/idxsched.ui0000644000175000017500000001044613125527323013300 00000000000000 IdxSchedW 0 0 504 403 Index scheduling setup 0 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Qt::AutoText true Cron scheduling false The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up false Decide if real time indexing will be started when you log in (only for the default index). Qt::Horizontal QDialogButtonBox::Close buttonBox accepted() IdxSchedW accept() 248 254 157 274 buttonBox rejected() IdxSchedW reject() 316 260 286 274 recoll-1.23.7/qtgui/rclzg.h0000644000175000017500000000210113125527323012425 00000000000000/* Copyright (C) 2012 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RCLZG_H_INCLUDED_ #define _RCLZG_H_INCLUDED_ #include "rcldoc.h" enum ZgSendType {ZGSEND_PREVIEW, ZGSEND_OPEN}; #ifndef USE_ZEITGEIST inline void zg_send_event(ZgSendType, const Rcl::Doc&){} #else extern void zg_send_event(ZgSendType tp, const Rcl::Doc& doc); #endif #endif // _RCLZG_H_INCLUDED_ recoll-1.23.7/qtgui/webcache.h0000644000175000017500000000416713125637102013060 00000000000000/* Copyright (C) 2016 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 _WEBCACHE_H_INCLUDED_ #define _WEBCACHE_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include "ui_webcache.h" #include class WebcacheModelInternal; class QCloseEvent; class WebcacheModel : public QAbstractTableModel { Q_OBJECT; public: WebcacheModel(QObject *parent = 0); ~WebcacheModel(); // Reimplemented methods virtual int rowCount (const QModelIndex& = QModelIndex()) const; virtual int columnCount(const QModelIndex& = QModelIndex()) const; virtual QVariant headerData (int col, Qt::Orientation orientation, int role = Qt::DisplayRole) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const; bool deleteIdx(unsigned int idx); std::string getURL(unsigned int idx); public slots: void setSearchFilter(const QString&); void reload(); private: WebcacheModelInternal *m; }; class RclMain; class WebcacheEdit : public QDialog, public Ui::Webcache { Q_OBJECT; public: WebcacheEdit(RclMain *parent); public slots: void saveColState(); void createPopupMenu(const QPoint&); void deleteSelected(); void copyURL(); protected: void closeEvent(QCloseEvent *); private: WebcacheModel *m_model; RclMain *m_recoll; bool m_modified; }; #endif /* _WEBCACHE_H_INCLUDED_ */ recoll-1.23.7/qtgui/ui_rclmain.h-4.50000644000175000017500000003411613125527323013745 00000000000000/******************************************************************************** ** Form generated from reading ui file 'rclmain.ui' ** ** Created: Mon Jan 25 20:45:26 2010 ** by: Qt User Interface Compiler version 4.4.0 ** ** WARNING! All changes made in this file will be lost when recompiling ui file! ********************************************************************************/ #ifndef UI_RCLMAIN_H #define UI_RCLMAIN_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include "reslist.h" #include "ssearch_w.h" QT_BEGIN_NAMESPACE class Ui_RclMainBase { public: QAction *fileExitAction; QAction *fileToggleIndexingAction; QAction *fileEraseDocHistoryAction; QAction *showMissingHelpers_Action; QAction *helpAbout_RecollAction; QAction *userManualAction; QAction *toolsDoc_HistoryAction; QAction *toolsAdvanced_SearchAction; QAction *toolsSort_parametersAction; QAction *toolsSpellAction; QAction *nextPageAction; QAction *firstPageAction; QAction *prevPageAction; QAction *indexConfigAction; QAction *queryPrefsAction; QAction *extIdxAction; QWidget *widget; QVBoxLayout *vboxLayout; QVBoxLayout *vboxLayout1; SSearch *sSearch; Q3ButtonGroup *catgBGRP; QRadioButton *allRDB; ResList *resList; Q3ToolBar *Toolbar; Q3ToolBar *Toolbar1; QMenuBar *MenuBar; QMenu *fileMenu; QMenu *toolsMenu; QMenu *preferencesMenu; QMenu *helpMenu; void setupUi(Q3MainWindow *RclMainBase) { if (RclMainBase->objectName().isEmpty()) RclMainBase->setObjectName(QString::fromUtf8("RclMainBase")); RclMainBase->resize(800, 600); QSizePolicy sizePolicy(static_cast(5), static_cast(5)); sizePolicy.setHorizontalStretch(0); sizePolicy.setVerticalStretch(0); sizePolicy.setHeightForWidth(RclMainBase->sizePolicy().hasHeightForWidth()); RclMainBase->setSizePolicy(sizePolicy); fileExitAction = new QAction(RclMainBase); fileExitAction->setObjectName(QString::fromUtf8("fileExitAction")); fileExitAction->setName("fileExitAction"); fileToggleIndexingAction = new QAction(RclMainBase); fileToggleIndexingAction->setObjectName(QString::fromUtf8("fileToggleIndexingAction")); fileToggleIndexingAction->setName("fileToggleIndexingAction"); fileEraseDocHistoryAction = new QAction(RclMainBase); fileEraseDocHistoryAction->setObjectName(QString::fromUtf8("fileEraseDocHistoryAction")); fileEraseDocHistoryAction->setName("fileEraseDocHistoryAction"); showMissingHelpers_Action = new QAction(RclMainBase); showMissingHelpers_Action->setObjectName(QString::fromUtf8("showMissingHelpers_Action")); showMissingHelpers_Action->setName("showMissingHelpers_Action"); helpAbout_RecollAction = new QAction(RclMainBase); helpAbout_RecollAction->setObjectName(QString::fromUtf8("helpAbout_RecollAction")); helpAbout_RecollAction->setName("helpAbout_RecollAction"); userManualAction = new QAction(RclMainBase); userManualAction->setObjectName(QString::fromUtf8("userManualAction")); userManualAction->setName("userManualAction"); toolsDoc_HistoryAction = new QAction(RclMainBase); toolsDoc_HistoryAction->setObjectName(QString::fromUtf8("toolsDoc_HistoryAction")); toolsDoc_HistoryAction->setName("toolsDoc_HistoryAction"); toolsAdvanced_SearchAction = new QAction(RclMainBase); toolsAdvanced_SearchAction->setObjectName(QString::fromUtf8("toolsAdvanced_SearchAction")); toolsAdvanced_SearchAction->setName("toolsAdvanced_SearchAction"); toolsSort_parametersAction = new QAction(RclMainBase); toolsSort_parametersAction->setObjectName(QString::fromUtf8("toolsSort_parametersAction")); toolsSort_parametersAction->setName("toolsSort_parametersAction"); toolsSpellAction = new QAction(RclMainBase); toolsSpellAction->setObjectName(QString::fromUtf8("toolsSpellAction")); toolsSpellAction->setName("toolsSpellAction"); nextPageAction = new QAction(RclMainBase); nextPageAction->setObjectName(QString::fromUtf8("nextPageAction")); nextPageAction->setName("nextPageAction"); nextPageAction->setEnabled(false); firstPageAction = new QAction(RclMainBase); firstPageAction->setObjectName(QString::fromUtf8("firstPageAction")); firstPageAction->setName("firstPageAction"); firstPageAction->setEnabled(false); prevPageAction = new QAction(RclMainBase); prevPageAction->setObjectName(QString::fromUtf8("prevPageAction")); prevPageAction->setName("prevPageAction"); prevPageAction->setEnabled(false); indexConfigAction = new QAction(RclMainBase); indexConfigAction->setObjectName(QString::fromUtf8("indexConfigAction")); indexConfigAction->setName("indexConfigAction"); queryPrefsAction = new QAction(RclMainBase); queryPrefsAction->setObjectName(QString::fromUtf8("queryPrefsAction")); queryPrefsAction->setName("queryPrefsAction"); extIdxAction = new QAction(RclMainBase); extIdxAction->setObjectName(QString::fromUtf8("extIdxAction")); extIdxAction->setName("extIdxAction"); widget = new QWidget(RclMainBase); widget->setObjectName(QString::fromUtf8("widget")); vboxLayout = new QVBoxLayout(widget); vboxLayout->setSpacing(2); vboxLayout->setMargin(4); vboxLayout->setObjectName(QString::fromUtf8("vboxLayout")); vboxLayout->setContentsMargins(0, 0, 0, 0); vboxLayout1 = new QVBoxLayout(); vboxLayout1->setSpacing(2); vboxLayout1->setMargin(2); vboxLayout1->setObjectName(QString::fromUtf8("vboxLayout1")); sSearch = new SSearch(widget); sSearch->setObjectName(QString::fromUtf8("sSearch")); QSizePolicy sizePolicy1(static_cast(7), static_cast(0)); sizePolicy1.setHorizontalStretch(0); sizePolicy1.setVerticalStretch(0); sizePolicy1.setHeightForWidth(sSearch->sizePolicy().hasHeightForWidth()); sSearch->setSizePolicy(sizePolicy1); vboxLayout1->addWidget(sSearch); catgBGRP = new Q3ButtonGroup(widget); catgBGRP->setObjectName(QString::fromUtf8("catgBGRP")); QSizePolicy sizePolicy2(static_cast(5), static_cast(0)); sizePolicy2.setHorizontalStretch(0); sizePolicy2.setVerticalStretch(0); sizePolicy2.setHeightForWidth(catgBGRP->sizePolicy().hasHeightForWidth()); catgBGRP->setSizePolicy(sizePolicy2); catgBGRP->setFrameShape(Q3GroupBox::GroupBoxPanel); catgBGRP->setFrameShadow(Q3GroupBox::Sunken); catgBGRP->setProperty("selectedId", QVariant(0)); allRDB = new QRadioButton(catgBGRP); allRDB->setObjectName(QString::fromUtf8("allRDB")); vboxLayout1->addWidget(catgBGRP); resList = new ResList(widget); resList->setObjectName(QString::fromUtf8("resList")); QSizePolicy sizePolicy3(static_cast(5), static_cast(5)); sizePolicy3.setHorizontalStretch(2); sizePolicy3.setVerticalStretch(0); sizePolicy3.setHeightForWidth(resList->sizePolicy().hasHeightForWidth()); resList->setSizePolicy(sizePolicy3); vboxLayout1->addWidget(resList); vboxLayout->addLayout(vboxLayout1); RclMainBase->setCentralWidget(widget); Toolbar = new Q3ToolBar(RclMainBase); Toolbar->setObjectName(QString::fromUtf8("Toolbar")); Toolbar1 = new Q3ToolBar(RclMainBase); Toolbar1->setObjectName(QString::fromUtf8("Toolbar1")); MenuBar = new QMenuBar(RclMainBase); MenuBar->setObjectName(QString::fromUtf8("MenuBar")); fileMenu = new QMenu(MenuBar); fileMenu->setObjectName(QString::fromUtf8("fileMenu")); toolsMenu = new QMenu(MenuBar); toolsMenu->setObjectName(QString::fromUtf8("toolsMenu")); preferencesMenu = new QMenu(MenuBar); preferencesMenu->setObjectName(QString::fromUtf8("preferencesMenu")); helpMenu = new QMenu(MenuBar); helpMenu->setObjectName(QString::fromUtf8("helpMenu")); Toolbar->addAction(toolsAdvanced_SearchAction); Toolbar->addAction(toolsSort_parametersAction); Toolbar->addAction(toolsDoc_HistoryAction); Toolbar->addAction(toolsSpellAction); Toolbar1->addAction(firstPageAction); Toolbar1->addAction(prevPageAction); Toolbar1->addAction(nextPageAction); MenuBar->addAction(fileMenu->menuAction()); MenuBar->addAction(toolsMenu->menuAction()); MenuBar->addAction(preferencesMenu->menuAction()); MenuBar->addSeparator(); MenuBar->addAction(helpMenu->menuAction()); fileMenu->addAction(fileToggleIndexingAction); fileMenu->addSeparator(); fileMenu->addAction(fileEraseDocHistoryAction); fileMenu->addAction(showMissingHelpers_Action); fileMenu->addSeparator(); fileMenu->addAction(fileExitAction); toolsMenu->addAction(toolsDoc_HistoryAction); toolsMenu->addAction(toolsAdvanced_SearchAction); toolsMenu->addAction(toolsSort_parametersAction); toolsMenu->addAction(toolsSpellAction); preferencesMenu->addAction(indexConfigAction); preferencesMenu->addSeparator(); preferencesMenu->addAction(queryPrefsAction); preferencesMenu->addAction(extIdxAction); preferencesMenu->addSeparator(); helpMenu->addAction(userManualAction); helpMenu->addAction(showMissingHelpers_Action); helpMenu->addSeparator(); helpMenu->addAction(helpAbout_RecollAction); retranslateUi(RclMainBase); QMetaObject::connectSlotsByName(RclMainBase); } // setupUi void retranslateUi(Q3MainWindow *RclMainBase) { RclMainBase->setWindowTitle(QApplication::translate("RclMainBase", "Recoll", 0, QApplication::UnicodeUTF8)); fileExitAction->setText(QApplication::translate("RclMainBase", "E&xit", 0, QApplication::UnicodeUTF8)); fileExitAction->setShortcut(QApplication::translate("RclMainBase", "Ctrl+Q", 0, QApplication::UnicodeUTF8)); fileToggleIndexingAction->setText(QApplication::translate("RclMainBase", "Update &index", 0, QApplication::UnicodeUTF8)); fileEraseDocHistoryAction->setText(QApplication::translate("RclMainBase", "&Erase document history", 0, QApplication::UnicodeUTF8)); showMissingHelpers_Action->setText(QApplication::translate("RclMainBase", "&Show missing helpers", 0, QApplication::UnicodeUTF8)); helpAbout_RecollAction->setText(QApplication::translate("RclMainBase", "&About Recoll", 0, QApplication::UnicodeUTF8)); userManualAction->setText(QApplication::translate("RclMainBase", "&User manual", 0, QApplication::UnicodeUTF8)); toolsDoc_HistoryAction->setText(QApplication::translate("RclMainBase", "Document &History", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsDoc_HistoryAction->setToolTip(QApplication::translate("RclMainBase", "Document History", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsAdvanced_SearchAction->setText(QApplication::translate("RclMainBase", "&Advanced Search", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsAdvanced_SearchAction->setToolTip(QApplication::translate("RclMainBase", "Advanced/complex Search", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsSort_parametersAction->setText(QApplication::translate("RclMainBase", "&Sort parameters", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsSort_parametersAction->setToolTip(QApplication::translate("RclMainBase", "Sort parameters", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP toolsSpellAction->setText(QApplication::translate("RclMainBase", "Term &explorer", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP toolsSpellAction->setToolTip(QApplication::translate("RclMainBase", "Term explorer tool", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP nextPageAction->setIconText(QApplication::translate("RclMainBase", "Next page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP nextPageAction->setToolTip(QApplication::translate("RclMainBase", "Next page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP firstPageAction->setIconText(QApplication::translate("RclMainBase", "First page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP firstPageAction->setToolTip(QApplication::translate("RclMainBase", "Go to first page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP prevPageAction->setIconText(QApplication::translate("RclMainBase", "Previous page", 0, QApplication::UnicodeUTF8)); #ifndef QT_NO_TOOLTIP prevPageAction->setToolTip(QApplication::translate("RclMainBase", "Previous page of results", 0, QApplication::UnicodeUTF8)); #endif // QT_NO_TOOLTIP indexConfigAction->setText(QApplication::translate("RclMainBase", "&Indexing configuration", 0, QApplication::UnicodeUTF8)); queryPrefsAction->setText(QApplication::translate("RclMainBase", "&Query configuration", 0, QApplication::UnicodeUTF8)); extIdxAction->setIconText(QApplication::translate("RclMainBase", "External index dialog", 0, QApplication::UnicodeUTF8)); extIdxAction->setText(QApplication::translate("RclMainBase", "External index dialog", 0, QApplication::UnicodeUTF8)); catgBGRP->setTitle(QString()); allRDB->setText(QApplication::translate("RclMainBase", "All", 0, QApplication::UnicodeUTF8)); Toolbar->setLabel(QApplication::translate("RclMainBase", "Search tools", 0, QApplication::UnicodeUTF8)); Toolbar1->setLabel(QApplication::translate("RclMainBase", "Result list", 0, QApplication::UnicodeUTF8)); fileMenu->setTitle(QApplication::translate("RclMainBase", "&File", 0, QApplication::UnicodeUTF8)); toolsMenu->setTitle(QApplication::translate("RclMainBase", "&Tools", 0, QApplication::UnicodeUTF8)); preferencesMenu->setTitle(QApplication::translate("RclMainBase", "&Preferences", 0, QApplication::UnicodeUTF8)); helpMenu->setTitle(QApplication::translate("RclMainBase", "&Help", 0, QApplication::UnicodeUTF8)); } // retranslateUi }; namespace Ui { class RclMainBase: public Ui_RclMainBase {}; } // namespace Ui QT_END_NAMESPACE #endif // UI_RCLMAIN_H recoll-1.23.7/qtgui/webcache.cpp0000644000175000017500000002447713125637102013421 00000000000000/* Copyright (C) 2016 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #ifdef _WIN32 #define USING_STD_REGEX #endif #ifndef USING_STD_REGEX #include #include #else #include #endif #include #include #include #include #include #include #include #include #include "recoll.h" #include "webcache.h" #include "beaglequeuecache.h" #include "circache.h" #include "conftree.h" #include "rclmain_w.h" using namespace std; class CEnt { public: CEnt(const string& ud, const string& ur, const string& mt) : udi(ud), url(ur), mimetype(mt) { } string udi; string url; string mimetype; }; class WebcacheModelInternal { public: std::shared_ptr cache; vector all; vector disp; }; WebcacheModel::WebcacheModel(QObject *parent) : QAbstractTableModel(parent), m(new WebcacheModelInternal()) { //qDebug() << "WebcacheModel::WebcacheModel()"; reload(); } WebcacheModel::~WebcacheModel() { delete m; } void WebcacheModel::reload() { m->cache = std::shared_ptr(new BeagleQueueCache(theconfig)); m->all.clear(); m->disp.clear(); if (m->cache) { bool eof; m->cache->cc()->rewind(eof); while (!eof) { string udi, sdic; m->cache->cc()->getCurrent(udi, sdic); ConfSimple dic(sdic); string mime, url; dic.get("mimetype", mime); dic.get("url", url); if (!udi.empty()) { m->all.push_back(CEnt(udi, url, mime)); m->disp.push_back(CEnt(udi, url, mime)); } if (!m->cache->cc()->next(eof)) break; } } emit dataChanged(createIndex(0,0), createIndex(1, m->all.size())); } bool WebcacheModel::deleteIdx(unsigned int idx) { if (idx > m->disp.size() || !m->cache) return false; return m->cache->cc()->erase(m->disp[idx].udi, true); } string WebcacheModel::getURL(unsigned int idx) { if (idx > m->disp.size() || !m->cache) return string(); return m->disp[idx].url; } int WebcacheModel::rowCount(const QModelIndex&) const { //qDebug() << "WebcacheModel::rowCount(): " << m->disp.size(); return int(m->disp.size()); } int WebcacheModel::columnCount(const QModelIndex&) const { //qDebug() << "WebcacheModel::columnCount()"; return 2; } QVariant WebcacheModel::headerData (int col, Qt::Orientation orientation, int role) const { // qDebug() << "WebcacheModel::headerData()"; if (orientation != Qt::Horizontal || role != Qt::DisplayRole) { return QVariant(); } switch (col) { case 0: return QVariant(tr("MIME")); case 1: return QVariant(tr("Url")); default: return QVariant(); } } QVariant WebcacheModel::data(const QModelIndex& index, int role) const { //qDebug() << "WebcacheModel::data()"; Q_UNUSED(index); if (role != Qt::DisplayRole) { return QVariant(); } int row = index.row(); if (row < 0 || row >= int(m->disp.size())) { return QVariant(); } /* We now read the data on init */ #if 0 string sdic; if (!m->cache->cc()->get(m->disp[row].udi, sdic)) { return QVariant(); } ConfSimple dic(sdic); //ostringstream os; dic.write(os); cerr << "DIC: " << os.str() << endl; string mime, url; dic.get("mimetype", mime); dic.get("url", url); #else const string& mime = m->disp[row].mimetype; const string& url = m->disp[row].url; #endif switch (index.column()) { case 0: return QVariant(QString::fromUtf8(mime.c_str())); case 1: return QVariant(QString::fromUtf8(url.c_str())); default: return QVariant(); } } #ifndef USING_STD_REGEX #define M_regexec(A,B,C,D,E) regexec(&(A),B,C,D,E) #else #define M_regexec(A,B,C,D,E) (!regex_match(B,A)) #endif void WebcacheModel::setSearchFilter(const QString& _txt) { string txt = qs2utf8s(_txt); #ifndef USING_STD_REGEX regex_t exp; if (regcomp(&exp, txt.c_str(), REG_NOSUB|REG_EXTENDED)) { //qDebug() << "regcomp failed for " << _txt; return; } #else basic_regex exp; try { exp = basic_regex(txt, std::regex_constants::nosubs | std::regex_constants::extended); } catch(...) { return; } #endif m->disp.clear(); for (unsigned int i = 0; i < m->all.size(); i++) { if (!M_regexec(exp, m->all[i].url.c_str(), 0, 0, 0)) { m->disp.push_back(m->all[i]); } else { //qDebug() << "match failed. exp" << _txt << "data" << // m->all[i].url.c_str(); } } emit dataChanged(createIndex(0,0), createIndex(1, m->all.size())); } static const int ROWHEIGHTPAD = 2; static const char *cwnm = "/Recoll/prefs/webcachecolw"; static const char *wwnm = "/Recoll/prefs/webcachew"; static const char *whnm = "/Recoll/prefs/webcacheh"; static const QKeySequence closeKS(Qt::ControlModifier+Qt::Key_W); WebcacheEdit::WebcacheEdit(RclMain *parent) : QDialog(parent), m_recoll(parent), m_modified(false) { //qDebug() << "WebcacheEdit::WebcacheEdit()"; setupUi(this); m_model = new WebcacheModel(this); tableview->setModel(m_model); tableview->setSelectionBehavior(QAbstractItemView::SelectRows); tableview->setSelectionMode(QAbstractItemView::ExtendedSelection); tableview->setContextMenuPolicy(Qt::CustomContextMenu); tableview->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); QSettings settings; QStringList wl; wl = settings.value(cwnm).toStringList(); QHeaderView *header = tableview->horizontalHeader(); if (header) { if (int(wl.size()) == header->count()) { for (int i = 0; i < header->count(); i++) { header->resizeSection(i, wl[i].toInt()); } } } connect(header, SIGNAL(sectionResized(int,int,int)), this, SLOT(saveColState())); header = tableview->verticalHeader(); if (header) { header->setDefaultSectionSize(QApplication::fontMetrics().height() + ROWHEIGHTPAD); } int width = settings.value(wwnm, 0).toInt(); int height = settings.value(whnm, 0).toInt(); if (width && height) { resize(QSize(width, height)); } connect(searchLE, SIGNAL(textEdited(const QString&)), m_model, SLOT(setSearchFilter(const QString&))); connect(new QShortcut(closeKS, this), SIGNAL (activated()), this, SLOT (close())); connect(tableview, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); } void WebcacheEdit::createPopupMenu(const QPoint& pos) { int selsz = tableview->selectionModel()->selectedRows().size(); if (selsz <= 0) { return; } QMenu *popup = new QMenu(this); if (selsz == 1) { popup->addAction(tr("Copy URL"), this, SLOT(copyURL())); } if (m_recoll) { RclMain::IndexerState ixstate = m_recoll->indexerState(); switch (ixstate) { case RclMain::IXST_UNKNOWN: QMessageBox::warning(0, "Recoll", tr("Unknown indexer state. " "Can't edit webcache file.")); break; case RclMain::IXST_RUNNINGMINE: case RclMain::IXST_RUNNINGNOTMINE: QMessageBox::warning(0, "Recoll", tr("Indexer is running. " "Can't edit webcache file.")); break; case RclMain::IXST_NOTRUNNING: popup->addAction(tr("Delete selection"), this, SLOT(deleteSelected())); break; } } popup->popup(tableview->mapToGlobal(pos)); } void WebcacheEdit::deleteSelected() { QModelIndexList selection = tableview->selectionModel()->selectedRows(); for (int i = 0; i < selection.size(); i++) { if (m_model->deleteIdx(selection[i].row())) { m_modified = true; } } m_model->reload(); m_model->setSearchFilter(searchLE->text()); tableview->clearSelection(); } void WebcacheEdit::copyURL() { QModelIndexList selection = tableview->selectionModel()->selectedRows(); if (selection.size() != 1) return; string url = m_model->getURL(selection[0].row()); if (!url.empty()) { url = url_encode(url, 7); QApplication::clipboard()->setText(url.c_str(), QClipboard::Selection); QApplication::clipboard()->setText(url.c_str(), QClipboard::Clipboard); } } void WebcacheEdit::saveColState() { //qDebug() << "void WebcacheEdit::saveColState()"; QHeaderView *header = tableview->horizontalHeader(); QStringList newwidths; for (int vi = 0; vi < header->count(); vi++) { int li = header->logicalIndex(vi); newwidths.push_back(lltodecstr(header->sectionSize(li)).c_str()); } QSettings settings; settings.setValue(cwnm, newwidths); } void WebcacheEdit::closeEvent(QCloseEvent *event) { if (m_modified) { QMessageBox::information(0, "Recoll", tr("Webcache was modified, you will need " "to run the indexer after closing this " "window.")); } if (!isFullScreen()) { QSettings settings; settings.setValue(wwnm, width()); settings.setValue(whnm, height()); } event->accept(); } recoll-1.23.7/qtgui/advshist.cpp0000644000175000017500000000463213125637102013474 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include "advshist.h" #include "guiutils.h" #include "log.h" #include "xmltosd.h" using namespace std; using namespace Rcl; AdvSearchHist::AdvSearchHist() { read(); m_current = -1; } AdvSearchHist::~AdvSearchHist() { for (vector >::iterator it = m_entries.begin(); it != m_entries.end(); it++) { it->reset(); } } std::shared_ptr AdvSearchHist::getnewest() { if (m_entries.empty()) return std::shared_ptr(); return m_entries[0]; } std::shared_ptr AdvSearchHist::getolder() { m_current++; if (m_current >= int(m_entries.size())) { m_current--; return std::shared_ptr(); } return m_entries[m_current]; } std::shared_ptr AdvSearchHist::getnewer() { if (m_current == -1 || m_current == 0 || m_entries.empty()) return std::shared_ptr(); return m_entries[--m_current]; } bool AdvSearchHist::push(std::shared_ptr sd) { m_entries.insert(m_entries.begin(), sd); if (m_current != -1) m_current++; string xml = sd->asXML(); g_dynconf->enterString(advSearchHistSk, xml, 100); return true; } bool AdvSearchHist::read() { if (!g_dynconf) return false; list lxml = g_dynconf->getStringList(advSearchHistSk); for (list::const_iterator it = lxml.begin(); it != lxml.end(); it++) { std::shared_ptr sd = xmlToSearchData(*it); if (sd) m_entries.push_back(sd); } return true; } void AdvSearchHist::clear() { g_dynconf->eraseAll(advSearchHistSk); } recoll-1.23.7/qtgui/rclm_idx.cpp0000644000175000017500000003603613125637102013453 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include "safeunistd.h" #include #include #include "execmd.h" #include "log.h" #include "transcode.h" #include "indexer.h" #include "rclmain_w.h" #include "specialindex.h" #include "readfile.h" using namespace std; void RclMain::updateIdxStatus() { ConfSimple cs(theconfig->getIdxStatusFile().c_str(), 1); QString msg = tr("Indexing in progress: "); DbIxStatus status; string val; cs.get("phase", val); status.phase = DbIxStatus::Phase(atoi(val.c_str())); cs.get("fn", status.fn); cs.get("docsdone", &status.docsdone); cs.get("filesdone", &status.filesdone); cs.get("fileerrors", &status.fileerrors); cs.get("dbtotdocs", &status.dbtotdocs); cs.get("totfiles", &status.totfiles); QString phs; switch (status.phase) { case DbIxStatus::DBIXS_NONE:phs=tr("None");break; case DbIxStatus::DBIXS_FILES: phs=tr("Updating");break; case DbIxStatus::DBIXS_PURGE: phs=tr("Purge");break; case DbIxStatus::DBIXS_STEMDB: phs=tr("Stemdb");break; case DbIxStatus::DBIXS_CLOSING:phs=tr("Closing");break; case DbIxStatus::DBIXS_DONE:phs=tr("Done");break; case DbIxStatus::DBIXS_MONITOR:phs=tr("Monitor");break; default: phs=tr("Unknown");break; } msg += phs + " "; if (status.phase == DbIxStatus::DBIXS_FILES) { char cnts[100]; if (status.dbtotdocs > 0) { sprintf(cnts, "(%d docs/%d files/%d errors/%d tot files) ", status.docsdone, status.filesdone, status.fileerrors, status.totfiles); } else { sprintf(cnts, "(%d docs/%d files/%d errors) ", status.docsdone, status.filesdone, status.fileerrors); } msg += QString::fromUtf8(cnts) + " "; } string mf;int ecnt = 0; string fcharset = theconfig->getDefCharset(true); if (!transcode(status.fn, mf, fcharset, "UTF-8", &ecnt) || ecnt) { mf = url_encode(status.fn, 0); } msg += QString::fromUtf8(mf.c_str()); statusBar()->showMessage(msg, 4000); } // This is called by a periodic timer to check the status of // indexing, a possible need to exit, and cleanup exited viewers void RclMain::periodic100() { LOGDEB2("Periodic100\n" ); if (m_idxproc) { // An indexing process was launched. If its' done, see status. int status; bool exited = m_idxproc->maybereap(&status); if (exited) { QString reasonmsg; if (m_idxreasontmp) { string reasons; file_to_string(m_idxreasontmp->filename(), reasons); if (!reasons.empty()) { ConfSimple rsn(reasons); vector sects = rsn.getNames(""); for (const auto& nm : sects) { string val; if (rsn.get(nm, val)) { reasonmsg.append(u8s2qs(string("
") + nm + " : " + val)); } } } } deleteZ(m_idxproc); if (status) { if (m_idxkilled) { QMessageBox::warning(0, "Recoll", tr("Indexing interrupted")); m_idxkilled = false; } else { QString msg(tr("Indexing failed")); if (!reasonmsg.isEmpty()) { msg.append(tr(" with additional message: ")); msg.append(reasonmsg); } QMessageBox::warning(0, "Recoll", msg); } } else { // On the first run, show missing helpers. We only do this once if (m_firstIndexing) showMissingHelpers(); if (!reasonmsg.isEmpty()) { QString msg = tr("Non-fatal indexing message: "); msg.append(reasonmsg); QMessageBox::warning(0, "Recoll", msg); } } string reason; maybeOpenDb(reason, 1); } else { // update/show status even if the status file did not // change (else the status line goes blank during // lengthy operations). updateIdxStatus(); } } // Update the "start/stop indexing" menu entry, can't be done from // the "start/stop indexing" slot itself IndexerState prevstate = m_indexerState; if (m_idxproc) { m_indexerState = IXST_RUNNINGMINE; fileToggleIndexingAction->setText(tr("Stop &Indexing")); fileToggleIndexingAction->setEnabled(true); fileRebuildIndexAction->setEnabled(false); actionSpecial_Indexing->setEnabled(false); periodictimer->setInterval(200); } else { Pidfile pidfile(theconfig->getPidfile()); pid_t pid = pidfile.open(); if (pid == getpid()) { // Locked by me m_indexerState = IXST_NOTRUNNING; fileToggleIndexingAction->setText(tr("Index locked")); fileToggleIndexingAction->setEnabled(false); fileRebuildIndexAction->setEnabled(false); actionSpecial_Indexing->setEnabled(false); periodictimer->setInterval(1000); } else if (pid == 0) { m_indexerState = IXST_NOTRUNNING; fileToggleIndexingAction->setText(tr("Update &Index")); fileToggleIndexingAction->setEnabled(true); fileRebuildIndexAction->setEnabled(true); actionSpecial_Indexing->setEnabled(true); periodictimer->setInterval(1000); } else { // Real time or externally started batch indexer running m_indexerState = IXST_RUNNINGNOTMINE; fileToggleIndexingAction->setText(tr("Stop &Indexing")); fileToggleIndexingAction->setEnabled(true); fileRebuildIndexAction->setEnabled(false); actionSpecial_Indexing->setEnabled(false); periodictimer->setInterval(200); } } if ((prevstate == IXST_RUNNINGMINE || prevstate == IXST_RUNNINGNOTMINE) && m_indexerState == IXST_NOTRUNNING) { showTrayMessage("Indexing done"); } // Possibly cleanup the dead viewers for (vector::iterator it = m_viewers.begin(); it != m_viewers.end(); it++) { int status; if ((*it)->maybereap(&status)) { deleteZ(*it); } } vector v; for (vector::iterator it = m_viewers.begin(); it != m_viewers.end(); it++) { if (*it) v.push_back(*it); } m_viewers = v; if (recollNeedsExit) fileExit(); } bool RclMain::checkIdxPaths() { string badpaths; vector args {"recollindex", "-c", theconfig->getConfDir(), "-E"}; ExecCmd::backtick(args, badpaths); if (!badpaths.empty()) { int rep = QMessageBox::warning( 0, tr("Bad paths"), tr("Bad paths in configuration file:\n") + QString::fromLocal8Bit(badpaths.c_str()), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Cancel) return false; } return true; } // This gets called when the "update index" action is activated. It executes // the requested action, and disables the menu entry. This will be // re-enabled by the indexing status check void RclMain::toggleIndexing() { if (!m_idxreasontmp) { // We just store the pointer and let the tempfile cleaner deal // with delete on exiting m_idxreasontmp = new TempFileInternal(".txt"); rememberTempFile(TempFile(m_idxreasontmp)); } switch (m_indexerState) { case IXST_RUNNINGMINE: if (m_idxproc) { // Indexing was in progress, request stop. Let the periodic // routine check for the results. if (m_idxproc->requestChildExit()) { m_idxkilled = true; } } break; case IXST_RUNNINGNOTMINE: { #ifdef _WIN32 QMessageBox::warning(0, tr("Warning"), tr("The current indexing process " "was not started from this " "interface, can't kill it"), QMessageBox::Ok, QMessageBox::NoButton); #else int rep = QMessageBox::information( 0, tr("Warning"), tr("The current indexing process was not started from this " "interface. Click Ok to kill it " "anyway, or Cancel to leave it alone"), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Ok) { Pidfile pidfile(theconfig->getPidfile()); pid_t pid = pidfile.open(); if (pid > 0) kill(pid, SIGTERM); } #endif } break; case IXST_NOTRUNNING: { // Could also mean that no helpers are missing, but then we // won't try to show a message anyway (which is what // firstIndexing is used for) string mhd; m_firstIndexing = !theconfig->getMissingHelperDesc(mhd); if (!checkIdxPaths()) { return; } vector args{"-c", theconfig->getConfDir()}; if (m_idxreasontmp) { args.push_back("-R"); args.push_back(m_idxreasontmp->filename()); } m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); } break; case IXST_UNKNOWN: return; } } void RclMain::rebuildIndex() { switch (m_indexerState) { case IXST_UNKNOWN: case IXST_RUNNINGMINE: case IXST_RUNNINGNOTMINE: return; //?? Should not have been called case IXST_NOTRUNNING: { if (m_idxproc) { LOGERR("RclMain::rebuildIndex: current indexer exec not null\n" ); return; } int rep = QMessageBox::warning(0, tr("Erasing index"), tr("Reset the index and start " "from scratch ?"), QMessageBox::Ok, QMessageBox::Cancel, QMessageBox::NoButton); if (rep == QMessageBox::Ok) { #ifdef _WIN32 // Under windows, it's necessary to close the db here, // else Xapian won't be able to do what it wants with the // (open) files. Of course if there are several GUI // instances, this won't work... if (rcldb) rcldb->close(); #endif // _WIN32 // Could also mean that no helpers are missing, but then we // won't try to show a message anyway (which is what // firstIndexing is used for) string mhd; m_firstIndexing = !theconfig->getMissingHelperDesc(mhd); if (!checkIdxPaths()) { return; } vector args{"-c", theconfig->getConfDir(), "-z"}; if (m_idxreasontmp) { args.push_back("-R"); args.push_back(m_idxreasontmp->filename()); } m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); } } break; } } void SpecIdxW::onBrowsePB_clicked() { QString dir = myGetFileName(true, tr("Top indexed entity"), true); targLE->setText(dir); } bool SpecIdxW::noRetryFailed() { return noRetryFailedCB->isChecked(); } bool SpecIdxW::eraseFirst() { return eraseBeforeCB->isChecked(); } std::vector SpecIdxW::selpatterns() { vector pats; string text = qs2utf8s(selPatsLE->text()); if (!text.empty()) { stringToStrings(text, pats); } return pats; } std::string SpecIdxW::toptarg() { return qs2utf8s(targLE->text()); } void SpecIdxW::onTargLE_textChanged(const QString& text) { if (text.isEmpty()) selPatsLE->setEnabled(false); else selPatsLE->setEnabled(true); } static string execToString(const string& cmd, const vector& args) { string command = cmd + " "; for (vector::const_iterator it = args.begin(); it != args.end(); it++) { command += "{" + *it + "} "; } return command; } void RclMain::specialIndex() { LOGDEB("RclMain::specialIndex\n" ); switch (m_indexerState) { case IXST_UNKNOWN: case IXST_RUNNINGMINE: case IXST_RUNNINGNOTMINE: return; //?? Should not have been called case IXST_NOTRUNNING: default: break; } if (m_idxproc) { LOGERR("RclMain::rebuildIndex: current indexer exec not null\n" ); return; } if (!specidx) // ?? return; vector args{"-c", theconfig->getConfDir()}; if (m_idxreasontmp) { args.push_back("-R"); args.push_back(m_idxreasontmp->filename()); } string top = specidx->toptarg(); if (!top.empty()) { args.push_back("-r"); } if (specidx->eraseFirst()) { if (top.empty()) { args.push_back("-Z"); } else { args.push_back("-e"); } } // The default for retrying differ depending if -r is set if (top.empty()) { if (!specidx->noRetryFailed()) { args.push_back("-k"); } } else { if (specidx->noRetryFailed()) { args.push_back("-K"); } } vector selpats = specidx->selpatterns(); if (!selpats.empty() && top.empty()) { QMessageBox::warning(0, tr("Selection patterns need topdir"), tr("Selection patterns can only be used with a " "start directory"), QMessageBox::Ok, QMessageBox::NoButton); return; } for (vector::const_iterator it = selpats.begin(); it != selpats.end(); it++) { args.push_back("-p"); args.push_back(*it); } if (!top.empty()) { args.push_back(top); } m_idxproc = new ExecCmd; LOGINFO("specialIndex: exec: " << execToString("recollindex", args) <startExec("recollindex", args, false, false); } void RclMain::updateIdxForDocs(vector& docs) { if (m_idxproc) { QMessageBox::warning(0, tr("Warning"), tr("Can't update index: indexer running"), QMessageBox::Ok, QMessageBox::NoButton); return; } vector paths; if (Rcl::docsToPaths(docs, paths)) { vector args{"-c", theconfig->getConfDir(), "-e", "-i"}; if (m_idxreasontmp) { args.push_back("-R"); args.push_back(m_idxreasontmp->filename()); } args.insert(args.end(), paths.begin(), paths.end()); m_idxproc = new ExecCmd; m_idxproc->startExec("recollindex", args, false, false); fileToggleIndexingAction->setText(tr("Stop &Indexing")); } fileToggleIndexingAction->setEnabled(false); actionSpecial_Indexing->setEnabled(false); } recoll-1.23.7/qtgui/ssearch_w.h0000644000175000017500000000562213125637102013272 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SSEARCH_W_H_INCLUDED_ #define _SSEARCH_W_H_INCLUDED_ #include "autoconfig.h" #include #include #include class QTimer; #include "recoll.h" #include "searchdata.h" #include #include "ui_ssearchb.h" struct SSearchDef; class SSearch : public QWidget, public Ui::SSearchBase { Q_OBJECT public: // The values MUST NOT change, there are assumptions about them in // different parts of the code enum SSearchType {SST_ANY = 0, SST_ALL = 1, SST_FNM = 2, SST_LANG = 3}; SSearch(QWidget* parent = 0, const char * = 0) : QWidget(parent) { setupUi(this); init(); } virtual void init(); virtual void setAnyTermMode(); virtual void completion(); virtual bool eventFilter(QObject *target, QEvent *event); virtual bool hasSearchString(); virtual void setPrefs(); // Return last performed search as XML text. virtual std::string asXML(); // Restore ssearch UI from saved search virtual bool fromXML(const SSearchDef& fxml); public slots: virtual void searchTextChanged(const QString & text); virtual void searchTypeChanged(int); virtual void setSearchString(const QString& text); virtual void startSimpleSearch(); virtual void addTerm(QString); virtual void onWordReplace(const QString&, const QString&); virtual void completionTermChosen(const QString& text); virtual void wrapupCompletion(); virtual void timerDone(); virtual void takeFocus(); signals: void startSearch(std::shared_ptr, bool); void clearSearch(); private: bool m_escape; bool m_displayingCompletions; QString m_chosenCompletion; QString m_savedEditText; unsigned int m_completedWordStart; bool m_disableAutosearch; QTimer *m_stroketimeout; bool m_keystroke; QString m_tstartqs; QAbstractItemModel *m_savedModel; std::string m_xml; /* Saved xml version of the search, as we start it */ int partialWord(string& s); int completionList(string s, QStringList& lst, int max = 100); bool startSimpleSearch(const string& q, int maxexp = -1); }; #endif /* _SSEARCH_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/ptrans_w.cpp0000644000175000017500000000756113125637102013510 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include using namespace std; #include #include #include #include #include #include #include "recoll.h" #include "log.h" #include "guiutils.h" #include "conftree.h" #include "ptrans_w.h" void EditTrans::init(const string& dbdir) { m_dbdir = path_canon(dbdir); connect(transTW, SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(onItemDoubleClicked(QTableWidgetItem *))); connect(cancelPB, SIGNAL(clicked()), this, SLOT(close())); QString lab = whatIdxLA->text(); lab.append(QString::fromLocal8Bit(m_dbdir.c_str())); whatIdxLA->setText(lab); QStringList labels(tr("Source path")); labels.push_back(tr("Local path")); transTW->setHorizontalHeaderLabels(labels); ConfSimple *conftrans = theconfig->getPTrans(); if (!conftrans) return; int row = 0; vector opaths = conftrans->getNames(m_dbdir); for (vector::const_iterator it = opaths.begin(); it != opaths.end(); it++) { transTW->setRowCount(row+1); transTW->setItem(row, 0, new QTableWidgetItem( QString::fromLocal8Bit(it->c_str()))); string npath; conftrans->get(*it, npath, m_dbdir); transTW->setItem(row, 1, new QTableWidgetItem( QString::fromLocal8Bit(npath.c_str()))); row++; } resize(QSize(640, 300).expandedTo(minimumSizeHint())); } void EditTrans::onItemDoubleClicked(QTableWidgetItem *item) { transTW->editItem(item); } void EditTrans::on_savePB_clicked() { ConfSimple *conftrans = theconfig->getPTrans(); if (!conftrans) { QMessageBox::warning(0, "Recoll", tr("Config error")); return; } conftrans->holdWrites(true); conftrans->eraseKey(m_dbdir); for (int row = 0; row < transTW->rowCount(); row++) { QTableWidgetItem *item0 = transTW->item(row, 0); string from = path_canon((const char *)item0->text().toLocal8Bit()); QTableWidgetItem *item1 = transTW->item(row, 1); string to = path_canon((const char*)item1->text().toLocal8Bit()); conftrans->set(from, to, m_dbdir); } conftrans->holdWrites(false); close(); } void EditTrans::on_addPB_clicked() { transTW->setRowCount(transTW->rowCount()+1); int row = transTW->rowCount()-1; transTW->setItem(row, 0, new QTableWidgetItem(tr("Original path"))); transTW->setItem(row, 1, new QTableWidgetItem(tr("Local path"))); transTW->editItem(transTW->item(row, 0)); } void EditTrans::on_delPB_clicked() { QModelIndexList indexes = transTW->selectionModel()->selectedIndexes(); vector rows; for (int i = 0; i < indexes.size(); i++) { rows.push_back(indexes.at(i).row()); } sort(rows.begin(), rows.end()); rows.resize(unique(rows.begin(), rows.end()) - rows.begin()); for (int i = rows.size()-1; i >= 0; i--) { transTW->removeRow(rows[i]); } } void EditTrans::on_transTW_itemSelectionChanged() { QModelIndexList indexes = transTW->selectionModel()->selectedIndexes(); if(indexes.size() < 1) delPB->setEnabled(0); else delPB->setEnabled(1); } recoll-1.23.7/qtgui/rclhelp.h0000644000175000017500000000232013125527323012740 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef RCLHELP_H #define RCLHELP_H #include #include #include using std::map; using std::string; class HelpClient : public QObject { Q_OBJECT public: HelpClient(QObject *parent, const char *name = 0); // Install mapping from widget name to manual section static void installMap(string wname, string section); protected: bool eventFilter(QObject *obj, QEvent *event); static map helpmap; }; #endif // RCLHELP_H recoll-1.23.7/qtgui/rclmain_w.h0000644000175000017500000002140713125637102013266 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef RCLMAIN_W_H #define RCLMAIN_W_H #include "autoconfig.h" #include #include #include #include "sortseq.h" #include "preview_w.h" #include "recoll.h" #include "advsearch_w.h" #include "uiprefs_w.h" #include "rcldb.h" #include "searchdata.h" #include "spell_w.h" #include #include "pathut.h" #include "guiutils.h" #include "rclutil.h" class IdxSchedW; class ExecCmd; class Preview; class ResTable; class CronToolW; class RTIToolW; class FragButs; class SpecIdxW; class WebcacheEdit; #include "ui_rclmain.h" namespace confgui { class ConfIndexW; } using confgui::ConfIndexW; class RclTrayIcon; class RclMain : public QMainWindow, public Ui::RclMainBase { Q_OBJECT; public: RclMain(QWidget * parent = 0) : QMainWindow(parent), curPreview(0), asearchform(0), uiprefs(0), indexConfig(0), indexSched(0), cronTool(0), rtiTool(0), spellform(0), fragbuts(0), specidx(0), periodictimer(0), webcache(0), restable(0), displayingTable(0), m_idNoStem(0), m_idAllStem(0), m_toolsTB(0), m_resTB(0), m_filtFRM(0), m_filtCMB(0), m_filtBGRP(0), m_filtMN(0), m_idxproc(0), m_idxkilled(false), m_catgbutvecidx(0), m_sortspecnochange(false), m_indexerState(IXST_UNKNOWN), m_queryActive(false), m_firstIndexing(false), m_searchIsSimple(false), m_pidfile(0) { setupUi(this); init(); } ~RclMain() {} QString getQueryDescription(); /** This is only called from main() to set an URL to be displayed (using recoll as a doc extracter for embedded docs */ virtual void setUrlToView(const QString& u) { m_urltoview = u; } /** Same usage: actually display the current urltoview */ virtual void viewUrl(); bool lastSearchSimple() { return m_searchIsSimple; } // Takes copies of the args instead of refs. Lazy and safe. void newDupsW(const Rcl::Doc doc, const std::vector dups); enum IndexerState {IXST_UNKNOWN, IXST_NOTRUNNING, IXST_RUNNINGMINE, IXST_RUNNINGNOTMINE}; IndexerState indexerState() const { return m_indexerState; } public slots: virtual void fileExit(); virtual void periodic100(); virtual void toggleIndexing(); virtual void rebuildIndex(); virtual void specialIndex(); virtual void startSearch(std::shared_ptr sdata, bool issimple); virtual void previewClosed(Preview *w); virtual void showAdvSearchDialog(); virtual void showSpellDialog(); virtual void showWebcacheDialog(); virtual void showIndexStatistics(); virtual void showFragButs(); virtual void showSpecIdx(); virtual void showAboutDialog(); virtual void showMissingHelpers(); virtual void showActiveTypes(); virtual void startManual(); virtual void startManual(const string&); virtual void showDocHistory(); virtual void showExtIdxDialog(); virtual void setSynEnabled(bool); virtual void showUIPrefs(); virtual void showIndexConfig(); virtual void execIndexConfig(); virtual void showCronTool(); virtual void execCronTool(); virtual void showRTITool(); virtual void execRTITool(); virtual void showIndexSched(); virtual void execIndexSched(); virtual void setUIPrefs(); virtual void enableNextPage(bool); virtual void enablePrevPage(bool); virtual void docExpand(Rcl::Doc); virtual void showSubDocs(Rcl::Doc); virtual void showSnippets(Rcl::Doc); virtual void startPreview(int docnum, Rcl::Doc doc, int keymods); virtual void startPreview(Rcl::Doc); virtual void startNativeViewer(Rcl::Doc, int pagenum = -1, QString term = QString()); virtual void openWith(Rcl::Doc, string); virtual void saveDocToFile(Rcl::Doc); virtual void previewNextInTab(Preview *, int sid, int docnum); virtual void previewPrevInTab(Preview *, int sid, int docnum); virtual void previewExposed(Preview *, int sid, int docnum); virtual void resetSearch(); virtual void eraseDocHistory(); virtual void eraseSearchHistory(); virtual void saveLastQuery(); virtual void loadSavedQuery(); virtual void setStemLang(QAction *id); virtual void adjustPrefsMenu(); virtual void catgFilter(int); virtual void catgFilter(QAction *); virtual void onFragmentsChanged(); virtual void initDbOpen(); virtual void toggleFullScreen(); virtual void on_actionSortByDateAsc_toggled(bool on); virtual void on_actionSortByDateDesc_toggled(bool on); virtual void on_actionShowResultsAsTable_toggled(bool on); virtual void onSortDataChanged(DocSeqSortSpec); virtual void resultCount(int); virtual void applyStyleSheet(); virtual void setFilterCtlStyle(int stl); virtual void showTrayMessage(const QString& text); private slots: virtual void updateIdxStatus(); virtual void onWebcacheDestroyed(QObject *); signals: void docSourceChanged(std::shared_ptr); void stemLangChanged(const QString& lang); void sortDataChanged(DocSeqSortSpec); void resultsReady(); void searchReset(); protected: virtual void closeEvent(QCloseEvent *); virtual void showEvent(QShowEvent *); private: Preview *curPreview; AdvSearch *asearchform; UIPrefsDialog *uiprefs; ConfIndexW *indexConfig; IdxSchedW *indexSched; CronToolW *cronTool; RTIToolW *rtiTool; SpellW *spellform; FragButs *fragbuts; SpecIdxW *specidx; QTimer *periodictimer; WebcacheEdit *webcache; ResTable *restable; bool displayingTable; QAction *m_idNoStem; QAction *m_idAllStem; QToolBar *m_toolsTB; QToolBar *m_resTB; QFrame *m_filtFRM; QComboBox *m_filtCMB; QButtonGroup *m_filtBGRP; QMenu *m_filtMN; QFileSystemWatcher m_watcher; vector m_viewers; ExecCmd *m_idxproc; // Indexing process bool m_idxkilled; // Killed my process TempFileInternal *m_idxreasontmp{nullptr}; map m_stemLangToId; vector m_catgbutvec; int m_catgbutvecidx; DocSeqFiltSpec m_filtspec; bool m_sortspecnochange; DocSeqSortSpec m_sortspec; std::shared_ptr m_source; IndexerState m_indexerState; bool m_queryActive; bool m_firstIndexing; bool m_searchIsSimple; // Last search was started from simple // If set on init, will be displayed either through ext app, or // preview (if no ext app set) QString m_urltoview; RclTrayIcon *m_trayicon; // We sometimes take the indexer lock (e.g.: when editing the webcache) Pidfile *m_pidfile; virtual void init(); virtual void setupResTB(bool combo); virtual void previewPrevOrNextInTab(Preview *, int sid, int docnum, bool next); // flags may contain ExecCmd::EXF_xx values virtual void execViewer(const map& subs, bool enterHistory, const string& execpath, const vector& lcmd, const string& cmd, Rcl::Doc doc, int flags=0); virtual void setStemLang(const QString& lang); virtual void onSortCtlChanged(); virtual void showIndexConfig(bool modal); virtual void showIndexSched(bool modal); virtual void showCronTool(bool modal); virtual void showRTITool(bool modal); virtual void updateIdxForDocs(vector&); virtual void initiateQuery(); virtual bool containerUpToDate(Rcl::Doc& doc); virtual void setFiltSpec(); virtual bool checkIdxPaths(); }; #endif // RCLMAIN_W_H recoll-1.23.7/qtgui/preview_load.h0000644000175000017500000000300713125637102013767 00000000000000/* Copyright (C) 2015 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PVW_LOAD_H_INCLUDED_ #define _PVW_LOAD_H_INCLUDED_ #include #include #include "rcldoc.h" #include "pathut.h" #include "rclutil.h" #include "rclconfig.h" /* * A thread to perform the file reading / format conversion work for preview */ class LoadThread : public QThread { Q_OBJECT; public: LoadThread(RclConfig *conf, const Rcl::Doc& idoc, bool pvhtml, QObject *parent = 0); virtual ~LoadThread() { } virtual void run(); public: // The results are returned through public members. int status; Rcl::Doc fdoc; TempFile tmpimg; std::string missing; private: Rcl::Doc m_idoc; bool m_previewHtml; RclConfig m_config; }; #endif /* _PVW_LOAD_H_INCLUDED_ */ recoll-1.23.7/qtgui/viewaction_w.cpp0000644000175000017500000001545713125637102014354 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include using namespace std; #include #include #include #include #include #include #include "recoll.h" #include "log.h" #include "guiutils.h" #include "viewaction_w.h" void ViewAction::init() { selSamePB->setEnabled(false); connect(closePB, SIGNAL(clicked()), this, SLOT(close())); connect(chgActPB, SIGNAL(clicked()), this, SLOT(editActions())); connect(actionsLV,SIGNAL(itemDoubleClicked(QTableWidgetItem *)), this, SLOT(onItemDoubleClicked(QTableWidgetItem *))); connect(actionsLV,SIGNAL(itemClicked(QTableWidgetItem *)), this, SLOT(onItemClicked(QTableWidgetItem *))); useDesktopCB->setChecked(prefs.useDesktopOpen); onUseDesktopCBToggled(prefs.useDesktopOpen); connect(useDesktopCB, SIGNAL(stateChanged(int)), this, SLOT(onUseDesktopCBToggled(int))); connect(setExceptCB, SIGNAL(stateChanged(int)), this, SLOT(onSetExceptCBToggled(int))); connect(selSamePB, SIGNAL(clicked()), this, SLOT(onSelSameClicked())); resize(QSize(640, 480).expandedTo(minimumSizeHint())); } void ViewAction::onUseDesktopCBToggled(int onoff) { prefs.useDesktopOpen = onoff != 0; fillLists(); setExceptCB->setEnabled(prefs.useDesktopOpen); } void ViewAction::onSetExceptCBToggled(int onoff) { newActionLE->setEnabled(onoff != 0); } void ViewAction::fillLists() { currentLBL->clear(); actionsLV->clear(); actionsLV->verticalHeader()->setDefaultSectionSize(20); vector > defs; theconfig->getMimeViewerDefs(defs); actionsLV->setRowCount(defs.size()); int row = 0; set viewerXs; if (prefs.useDesktopOpen) { viewerXs = theconfig->getMimeViewerAllEx(); } for (vector >::const_iterator it = defs.begin(); it != defs.end(); it++) { actionsLV->setItem(row, 0, new QTableWidgetItem(QString::fromUtf8(it->first.c_str()))); if (!prefs.useDesktopOpen || viewerXs.find(it->first) != viewerXs.end()) { actionsLV->setItem( row, 1, new QTableWidgetItem(QString::fromUtf8(it->second.c_str()))); } else { actionsLV->setItem( row, 1, new QTableWidgetItem(tr("Desktop Default"))); } row++; } QStringList labels(tr("MIME type")); labels.push_back(tr("Command")); actionsLV->setHorizontalHeaderLabels(labels); } void ViewAction::selectMT(const QString& mt) { actionsLV->clearSelection(); QListitems = actionsLV->findItems(mt, Qt::MatchFixedString|Qt::MatchCaseSensitive); for (QList::iterator it = items.begin(); it != items.end(); it++) { (*it)->setSelected(true); actionsLV->setCurrentItem(*it, QItemSelectionModel::Columns); } } void ViewAction::onSelSameClicked() { actionsLV->clearSelection(); QString value = currentLBL->text(); if (value.isEmpty()) return; string action = qs2utf8s(value); fprintf(stderr, "value: %s\n", action.c_str()); vector > defs; theconfig->getMimeViewerDefs(defs); for (unsigned int i = 0; i < defs.size(); i++) { if (defs[i].second == action) { QListitems = actionsLV->findItems(QString::fromUtf8(defs[i].first.c_str()), Qt::MatchFixedString|Qt::MatchCaseSensitive); for (QList::iterator it = items.begin(); it != items.end(); it++) { (*it)->setSelected(true); QTableWidgetItem *item1 = actionsLV->item((*it)->row(), 1); item1->setSelected(true); } } } } // Fill the input fields with the row's values when the user clicks void ViewAction::onItemClicked(QTableWidgetItem * item) { QTableWidgetItem *item0 = actionsLV->item(item->row(), 0); string mtype = (const char *)item0->text().toLocal8Bit(); vector > defs; theconfig->getMimeViewerDefs(defs); for (unsigned int i = 0; i < defs.size(); i++) { if (defs[i].first == mtype) { currentLBL->setText(QString::fromUtf8(defs[i].second.c_str())); selSamePB->setEnabled(true); return; } } currentLBL->clear(); selSamePB->setEnabled(false); } void ViewAction::onItemDoubleClicked(QTableWidgetItem * item) { actionsLV->clearSelection(); item->setSelected(true); QTableWidgetItem *item0 = actionsLV->item(item->row(), 0); item0->setSelected(true); editActions(); } void ViewAction::editActions() { QString action0; int except0 = -1; set viewerXs = theconfig->getMimeViewerAllEx(); list mtypes; bool dowarnmultiple = true; for (int row = 0; row < actionsLV->rowCount(); row++) { QTableWidgetItem *item0 = actionsLV->item(row, 0); if (!item0->isSelected()) continue; string mtype = (const char *)item0->text().toLocal8Bit(); mtypes.push_back(mtype); QTableWidgetItem *item1 = actionsLV->item(row, 1); QString action = item1->text(); int except = viewerXs.find(mtype) != viewerXs.end(); if (action0.isEmpty()) { action0 = action; except0 = except; } else { if ((action != action0 || except != except0) && dowarnmultiple) { switch (QMessageBox::warning(0, "Recoll", tr("Changing entries with " "different current values"), "Continue", "Cancel", 0, 0, 1)) { case 0: dowarnmultiple = false;break; case 1: return; } } } } if (action0.isEmpty()) return; string sact = (const char *)newActionLE->text().toLocal8Bit(); trimstring(sact); #ifdef _WIN32 path_slashize(sact); #endif for (list::const_iterator mit = mtypes.begin(); mit != mtypes.end(); mit++) { set::iterator xit = viewerXs.find(*mit); if (setExceptCB->isChecked()) { if (xit == viewerXs.end()) { viewerXs.insert(*mit); } } else { if (xit != viewerXs.end()) { viewerXs.erase(xit); } } // An empty action will restore the default (erase from // topmost conftree) theconfig->setMimeViewerDef(*mit, sact); } theconfig->setMimeViewerAllEx(viewerXs); fillLists(); } recoll-1.23.7/qtgui/systray.h0000644000175000017500000000230113125527323013024 00000000000000/* * 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 _SYSTRAY_H_INCLUDED_ #define _SYSTRAY_H_INCLUDED_ #include #include class RclMain; class RclTrayIcon : public QSystemTrayIcon { Q_OBJECT public: RclTrayIcon(RclMain *mainw, const QIcon& icon, QObject* parent = 0) : QSystemTrayIcon(icon, parent), m_mainw(mainw) { init(); } public slots: void onRestore(); private: void init(); RclMain *m_mainw; }; #endif /* _SYSTRAY_H_INCLUDED_ */ recoll-1.23.7/qtgui/specialindex.h0000644000175000017500000000303213125527323013760 00000000000000/* * 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 _SPECIDX_W_H_INCLUDED_ #define _SPECIDX_W_H_INCLUDED_ #include #include #include "ui_specialindex.h" class QPushButton; class SpecIdxW : public QDialog, public Ui::SpecIdxW { Q_OBJECT public: SpecIdxW(QWidget * parent = 0) : QDialog(parent) { setupUi(this); selPatsLE->setEnabled(false); connect(browsePB, SIGNAL(clicked()), this, SLOT(onBrowsePB_clicked())); connect(targLE, SIGNAL(textChanged(const QString&)), this, SLOT(onTargLE_textChanged(const QString&))); } bool noRetryFailed(); bool eraseFirst(); std::vector selpatterns(); std::string toptarg(); public slots: void onTargLE_textChanged(const QString&); void onBrowsePB_clicked(); }; #endif /* _SPECIDX_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/systray.cpp0000644000175000017500000000261513125527323013367 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include "systray.h" #include "rclmain_w.h" void RclTrayIcon::init() { QAction *restoreAction = new QAction(tr("Restore"), this); QAction *quitAction = new QAction(tr("Quit"), this); connect(restoreAction, SIGNAL(triggered()), this, SLOT(onRestore())); connect(quitAction, SIGNAL(triggered()), m_mainw, SLOT(fileExit())); QMenu *trayIconMenu = new QMenu(0); trayIconMenu->addAction(restoreAction); trayIconMenu->addAction(quitAction); setContextMenu(trayIconMenu); } void RclTrayIcon::onRestore() { // Hide and show to restore on current desktop m_mainw->hide(); m_mainw->show(); } recoll-1.23.7/qtgui/firstidx.h0000644000175000017500000000204013125527323013142 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FIRSTIDX_H_INCLUDED_ #define _FIRSTIDX_H_INCLUDED_ #include "ui_firstidx.h" class FirstIdxDialog : public QDialog, public Ui::FirstIdxDialog { Q_OBJECT public: FirstIdxDialog(QWidget * parent = 0) : QDialog(parent) { setupUi(this); } }; #endif /* _FIRSTIDX_H_INCLUDED_ */ recoll-1.23.7/qtgui/xmltosd.h0000644000175000017500000000602313224431020012771 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef XMLTOSD_H_INCLUDED #define XMLTOSD_H_INCLUDED #include "autoconfig.h" /** Parsing XML from saved queries or advanced search history. * * Here is how the schemas looks like: * * For advanced search * * * * AND|OR * * [] * AND|OR|FN|PH|NE * [base64data] * [base64data] * slack * * * [base64 path] * [base64 path] * * * 162014 <--! datemin --> * 3062014 <--! datemax --> * minsize * maxsize * space-sep mtypes * space-sep mtypes * * * * For Simple search: * * * base64-encoded query text * OR|AND|FN|QL * space-separated lang list * * space-separated suffix list * base64-encoded config path>/EX> * */ #include #include "searchdata.h" // Parsing XML from advanced search history or saved advanced search into // a SearchData structure: std::shared_ptr xmlToSearchData(const string& xml, bool complain = true); // Parsing XML from saved simple search to ssearch parameters struct SSearchDef { SSearchDef() : autophrase(false), mode(0) {} std::vector stemlangs; std::vector autosuffs; std::vector extindexes; std::string text; bool autophrase; int mode; }; bool xmlToSSearch(const string& xml, SSearchDef&); #endif /* XMLTOSD_H_INCLUDED */ recoll-1.23.7/qtgui/images/0000755000175000017500000000000013224670235012467 500000000000000recoll-1.23.7/qtgui/images/recoll.png0000644000175000017500000000071113125527323014373 00000000000000‰PNG  IHDR00Ø`nÐ pHYs  šœtIME× §štEXtCommentCreated with The GIMPïd%n?IDATXÃcœr3}õÙ~ÿ-\²×t$¯iKá’µßKôÕg\²kÂqI11 2@‰ƒ™ƒþÿl!4Ø¢Œq4ʆZѰà)¾¸¾þz-Æ‹'ÊðèýÊÍÆ€[/Œ/špš¯Åx:ªá’Õºú\ëÊ3\²Õðx&dåÙ‘íG ÆÑ‚q4ʆf”1î[ëƒKîÓÑ«¿í¡M±ÿ h ¦k²Ìר_u\ÓÁÙ.þù\öã6kœZ?ë k›úÿh.#à ÆÁ–Ë]” ºtih4Ê/ÏpÀ%÷ŽKðŒœ.Yå7÷•ßÜÃ%ûPAø+7žæ/9|1vÉǸ$ù޾£÷š¶$ž6µ(îA•Ñ~ÙhWz4ÊF£l #ùÃÂÚ’xš¿1,<šËFsÙh”FUçyIÁÙÖIEND®B`‚recoll-1.23.7/qtgui/images/close.png0000644000175000017500000000213713125527323014224 00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<ñIDATxÚbüÿÿ?-@±€FFFœ ¬­£€”Ì ˆœ8±ò.= 5Ä&Ð ¶±‰RÿÿÿËgdd`eea`cckøùóï_?þþýó¨f"PlÂéÓk?  @ 5R󙘘 LMüý45常Øáj®_̰k×q†Í›·3üùóûÐŒÄ3gÖ]@6 €P †º_HHH °0‰A]]o8>~üŠaòä¥@‹®‚\ìxöìú 0ƒn0Ôûû $%…ÞýÇÀÌÌ„ÕP˜Ü÷ï?º»ç1ܺud¨ã¹s>€Ì d] ïy1pp°]£  Î *ÊÏðþýgüäÉ+mm`¸³0üøñ‹!&ÆŸ››×h`Ì0€bB„Ë¿|e A Ÿ>}e°²Ò*ædæg——€úîÝ'°%%)vv60ÿþýˇ™@,°$Š}eey°Fxñâ=ƒ²2'˜-%% L ¿.\¸Í` ÷â³go6m:Àðôé  ¥€AÃ, §çJžˆªÆ–¤Þ½ûغõ(ƒ««0Eȃù ` ½d¨­ÊðõëW¸;0•ü @L°Xdeeeøüù Ðàp¼rå. +ï`D6CA€“““–‘ˆf0¼}ûÃÓ§¯1¨ ˆ=xðÃPø÷”+ÿÙ pŽz÷î=ŠBKKc†ÔT? ììôdäI‹PÄ¿}ûw$@Á‚â(›þúõ‹á÷ïß`lffÀ“ŒâýC‡.¢ž—Î0üãǰY y€ *P@yÿû÷ï ˜ecÈÏCÉaMM3¦O_ÎpäÈeÃ]]mXXX¾|ù .?®]Û 6 €3ÈÄÞ#€,?-Ú|úô Coïb`æaàååŠod8yò:XDŸ9s¬çõëW`3`† RÁ1þ¯^½6PSS¦†ëàðº}û!ØPn¸ V®ÜÁððás O/‚ů\¹ ÌÚß@YzL @¡B&&A l¹_ZZV@KK”¶ñP¦¹té*0•ÜBׯï‚B„Ql‚ ŸÏÉÉe ££̶ØK¸;w2\¼x˜ö? K„ 3 €°ô††þà‚”÷ÙÙÙ„„D€¥XógÏÞ¼y Lßá=ÐPŒ‚ €°Œ  y\5ýû÷¦ñ,öqUMÄH«Ê ÀàØúÄ`ÃæèIEND®B`‚recoll-1.23.7/qtgui/images/history.png0000644000175000017500000000275313125527323014624 00000000000000‰PNG  IHDRÄ´l; pHYs  ­#½ugAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFaIDATxÚbd („løÿ÷ŸÁÿ?þýý{áɶЄô#. •¸ÝÿÿþÍÿ÷çoÐ@ Cÿaþçï {O|}"ù6ý„a°ZÒ>ÿÿþõ]–ð_€‹WY„ACEAUŠ›‹…‘áôýO Oo¿ax|ê>Ãïû¯€ýYðïÏ¿Â÷—³Q|@(«%ƒ ý¿ŸÙ@ÆZ!ÝZœ!@žƒá߆¶WdY|¼Ô~ùgßüfX¸÷!ÃñyGþ¼ùtè ÇO·‹à†3ÜДýÿÿÿßÏÄËnà­ÇÐæ(Æ #Ä 6ô/Pþé“ ¢ì ’² €bÂÌ öšB ì Ž?øýî‹+¯óÊߟöü™@pƒ… â¦3±³x¸Dè2” 0°112õ3üýÁª* ’2pþ£‡8ù…88ô†ï½!ñçów‰?_öm™@`ƒU÷Ãu†œ£ C•­+ÔPkÿÁ Ò —‚ð•K"œ,^<{Æ`äèÉ ÎÇÁð’Ÿ—áþî+Ììvÿþ8ø €˜@ Íçåf6…ú h2þùBÿâ+/0Äy:2üû÷ÁÀΙá×ï ?€¶jš(0ð©K€RL>ÈL€‚ü÷_€°Šƒž0Xóo˜¡ÿQ-¸ŒdhÍôE Bú¶ —>32ìxø™áá§Ÿ ÒöZÀ$ù7d&@±(En¥SU! —~ `ZÇ4” šfn^¾À𦵙‰ †æLXÀðMÙ‚áý/v†Ÿÿ(ؤôe.þý+ÀÀX$@LÀ`0%~AAN†+¯1lÝ~‹áˆï@ï¼øàÁ†Òè@†§2|þøÁ.&“á5PâÅ‹ <@€ðÛ›¯nn<Ï "- `0 ('ƒ‚è¼/?0ð2p2|üu5ÐÅ·ï=``°··g˜0aÃŽéðtßtô7¿ó×o ÿß}bàf †ÿÿÁrÄt1(q3|ûðÁ-ÞŠhà¨ÁÌ@uJ¦ö jöž Mí í“ø„ÅÁ©ä0Ép³01°±½ ƒªµ2ÃóGïav^ p(Êx®zo¢'`d¥ζ ›9™A4Ð"F o€úã;3 +Ð6`Dþ†í†ïÀ´÷ ˆ¿‚00ÆO¬;ǰ¹~0÷õ 8U]¼áÖɇ@Cþ dº„h+#/#Ðù¢|Ü ‚\l@q&0¹Ù@|eËyq@@A –R®¿`xvû8†!®ekæÓ˸¡–‚ÅXAj˜À²ñ£³2n"ˆ °Á/Ä^øÿûÏ‚5ÓŽ0üýþ¬¤äzN  .f¨¡Ì63 ýýõÃÒÊ5 £ƒ\Œ,´ÿýýWøöù§ =å›~}û.+€ŽG&Ȱ}ÇŸ2\¾üœƒ "Æ Å??ÿ`h˜ÅðæÉ{…0ónð›Ó©@E߃›//Ä-e¸tö1(õ€ gªºyé)Ãó»¯á©TÈ\”‚ €pVM\’­@Ãóô в? rT`¤?@c",LÑ@1S™2³— À²>0»^@w6`ÿÌB¯¾…¶aIEND®B`‚recoll-1.23.7/qtgui/images/cancel.png0000644000175000017500000000156313125527323014346 00000000000000‰PNG  IHDRÄ´l;gAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<IDATxÚbüÿÿ?-@1 üÒ…Aà¥3ƒ±ú/É3(\”c@7 €˜Ð Šíÿû‡áü" 5ª?Ïð—aÿy TÈ ÝP¾¨þh_ö?0Åm8ÔÐý²Žò2ö²ÿ€ì3"È ÝP½ N_ÁW@—ÜÖÇ4ÙPYA qySQËOñC  ˆ‹ÿ3€\¨ðÿï_†ß?~}gàÖra µøT|Ca8º¡ ߀ñÿßþýÇ Ø`€b4###(LAÞ¹d(Èp†_?>ßËðlåé@ aÏ€Íз÷ž1Ü?ñîÐŽfŸ.€Ì ¸Á S÷A.åQ·ÌðóÃNjǞ¬¿ü(Ç@ÈPXª ƒA¦  ð© ÿÉÀðã;Ãç›W€–üfàÇk(Ì`€Â0@a r¹¤®¿¢&Ø`†Ÿ þ4f0@a5®* ÿǰ_Î[K€WBÅÐ^2Ü9ò«¡0ƒˆW:…FØûȆ2|Ío°Üÿ¸3@1JüÈa 6ôÛ6EEpR<ÆŽ=¡Äìý_30|þõƒ3ƒ²3(Íî?ÆŠi8@¡„1.Caò>È¥ C¾ƒèã†×ïÿ1ÜùÅð¨ÝÑú/"¹Ü`B†‚" ™ ïƒ\*òhË À7†× dÊ1܆’AlðeFP)EL⇆é~e&Ñï¯#nhýÿÿ€b‚8(ð—áÁÿßÿ¦S«Ÿ@ö?G÷_cÆÙˆá /èAåéYq†óo|Dÿ¿vú,¥ÞŸâÃ]lef08ÂÀðþ%Ð] dŸ?-€@fJäËS`‚K)‰  Ô¥ ðý3 €0ª&Py ÄDWM@Ã`.EÎyÄH«Ê À€øØ4…IEND®B`‚recoll-1.23.7/qtgui/images/sortparms.png0000644000175000017500000000140013125527323015141 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  d_‘tIMEÖÿÎÁºIDAT8Ë­”¿KAÇ?;;{»ñ‚A/"Sˆ„A;ƒÁ:¢DÐÆ¤Q°ðH¥UÒ\HÀÚ.‚䈤QÛCHHq‚9îÌÞîÌlŠ»]÷~ùò…av™7ß÷Þ÷Í{–1†ý£cˆè‚0Ô„aˆÖ†?å*ϧ[Ýì1ưwPˆ÷ÈÓq•+~T®øQé¤í¢ãŸ¥èó×ÝÈC§%*gA42<ùŠF†ÉnŠt ¤¸®¬ï‡GGø²ó£c–"¾pë]†ÜªÇô÷¡6C/#IÛzžËí^î߻ӑ\Ä—bÒ1&˜\š"÷Ap<Ï 7Ð×1rËe7¹U€1&X`€WùŠ‹&1ö…R†üÇí®WÞ¼´dv³YqÃOÈææáI/ý‡}”FO›´žŸÁ¶m´Öüú]$ 5ÛÛçeu¥Qì 4a,™(\WR«)*Õ¿8Ž'ÄéŸX†gÑ‹®©*e¨T|jAˆR×Í µAJÙVÌ:É’.hq¬iëðQÊ\¡Ó¢±àšˆe°m»Ñòr)®‚V9ÒE¼6qz\^¢[Û¦¿¯¢q-»ÏŠ7{2I·F¿i€ZMuÕXÖS•¬­¿enn–µõ·üüAÅOfã‡ÃIEND®B`‚recoll-1.23.7/qtgui/images/asearch.png0000644000175000017500000000175713125527323014534 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs  šœtIMEÖ(Ï'Q|IDAT8˵•ÝoU‡ŸsÎÌìì¶”-ÛÒÖíGJ-âWÓ ’ bµ 4é• xí…‰1È…1\pabcÄP{Á…ƒá†„@Bk­‰©6´uË–h©vë²3sŽínÒvZê…'9É›Ì;ÏüÞßyç=ð?-Q nþ:n¤¡IEÏÇ+zÞÖµÿÙ2À*R :Ÿi]“¬A QŽ6hcð|M&“#_(âû_œ:½â=ëQ%• ¥¸Úàû­ B„WimÆ/?ÐÆó5:0=ƒAJmY(%7îèèýÀàÐM¾ºŸC¯½¸K©p+æS©g‡‡»‡^@)Åê3ž™ºÏÀ¥!>xÿ#v=Ù†Öc A ­Ãçÿš»ñx,àö•Aò Œ(£ãSœï¿ˆÐ†ÙÉî^;…·0]¶Cˆ%Õ¡Š/_>ýðä'ïòR¥Ë—®0šÍ!D´6ÔòJ×ÿø™˜b:}ƒúž±bÛÖ/å_Ú¶-žho¢¥¹½Ïï^“øT<ÏÛGwÓÜÙËý¡‹ŒœÇ§2‘Üütºþ3ƒ1 µááÂ_ÿÎû/ëκêdSü›Hm{O*×2r¦ÿ³§Wçü Jhoëà/|IEND®B`‚recoll-1.23.7/qtgui/images/firstpage.png0000644000175000017500000000245413125527323015105 00000000000000‰PNG  IHDRÄ´l;bKGDÿÿÿ ½§“ pHYs íÀ,tIMEÓ ';]ȯ²¹IDATxÚ••Kˆ\E†¿ª{o¿»§ÍÌ$v0=3†$FCŠÁ A¢â"jwÄ•;])ˆÄ•м ˆ  DÑhıã˜ÄG0‰Nb2Ó=Ý=ý¸}ŸUå¢M4ÔâÔ9õñSçÔ)Á¿Xmϼftcr`ãcô¢£{/ÝmÑ?ÿÝ ì³AáäÐá£ÎóB'ûkæÕC®ëªÿ×ö̯ñ8–óp!Ÿ+_9Q’kÆ3lœè“u'Û~nh–›MÝîú¾NüCŽ<{½yó ×u“Ë‚k{æ§@ì#UÚ¾åê,wÝTdó:Ã것%G©èôN-Æ|Pøôh‡Èï}ŸÖí'®3û?¸·þ¢ôåB©tç½[ÇÄ£·eÙP±H;±‚(1¼x@qÃH)˜(ÙlžrXs…Ã醙èâÆ–™©oŸÍž­×ëæ"¸rÓŠÝ}sY„:Ö©,ŒGëµOà™3<ÿnÌ5kab0ưv•C1çˆïΪñ 2ÎZŽœ­‘Ú¯· +½÷†õ¥ÌÎ[3ì¸%ÍR'bjÂXóöœÅÓ¤‘Bpûu6'ÏD±&ˆ QbXUx‘ÍB3žnªuókøþ´]Û=ç`ÌÎB>Sª­O!„!Ÿ±èûš Ò|öS†gÌ\¬Cc%¦ë]ÚJ6VßžLÛ­ÂŽF<}Ø&-¥Ò˜,g†Áèv~ÂáÓ9žº?=*š1üÚŠøúÄ€(1# 2œm+Ž.–éù9ú¤feSOT«6PAÈêDQàGš?Rsøtî¥JÃ+ ÿ·žŸš€Hƒmƒ°*X©ª äé|ΉYñ4¥¼¸ `[âo{l€°àÃcd:+4EûB°8,u ¥¼äÿZ!S“< –6—¼,žÊ+þðR>ûT“„6F/gºC=£D/%?õ–æ±m’+Ë#ßàñ7`aù2GBA…`TCjoQ:º×æ ÛÚ± ¶U|aÙðÜ{ŠfoägSðä½°z !„‰Fk…Ö £)[!¢–¶ N”Í/çå—î¶Hèd¿ »]Gu(g&²C:+/¼ïÑŒ :3 /=ª™)÷YWP)xT «sŽê ƒŽ—QKǬå¶pOMž=Çõ3Â$³W;D‰á\Ë'-cT³ÐŒÙ°6E6-I;‚CÇV(¤ò©„¼“`‹˜3ç[„^çÀfñÎë@è×ëæªÚ#§Â˜k½ ™ c-R¶ íÒŽ!ˆ Íõ•4}Ó§3ˆF1Û ˆ9±ÐÓ­vwn\ßWçŽý‹CèîšÓj™ê\×·7õ†Ét1ç°ªh“r$)[%†#'}Z½„”-p,XîÆ=Õe±Ù››LŽì­ÊúWÀ²ëºê"¸^¯›í³¹vËLéúV®Ù§ûÃ$•±‘ÏÚØR"£hu<Žý<Ô?,ô++½ãêø¾ß¡ ×uãËþ »ví’@þ(÷ݑȳIJQ)f­,@ßWVºaœÈ¨¥ƒ凟KÀÊ?þ ‚ ÕPÓ垨V±RUE–Â$¡ÔÞbÙür~ÌZn}Àw]Wÿ™ñdz`Ó!€±IEND®B`‚recoll-1.23.7/qtgui/images/recoll.icns0000644000175000017500000002156613125527323014556 00000000000000icns#vis32ÿh”•‘Òë쾑ªêé㙓”•–’Ñê뾑’«éèâš”•‘’ŽÓî𾌎©îìå—‘ÒÒÓµ¨¨¾ÔÔÇ©ª­ÐÓÒëêî§‹Š½ðîÓŽ—åìëìëï®”’ÂððÔ–æîì¾¾À”ƒ‚¡Â½„¾‘{ss‚“‹¨ïíæ–Ž‘‘’|ttƒ”Œ©îìå—‘ªª«Š||”­§µÓÒϬ©ªêéí¬’ÀîíÓ‘˜åëêéè쩾îìÒ‘’˜äêéãã嬖•¾çæÐ—˜žÞäã™™—Ðæç¾•–¬åäÞž˜™“”Òìªìê䘒“”•‘Òë쾑ªêé㙓”_ÙØÜ™}®Þ܇ÔÚÙØ×Ûš€~­ÝÛÁ€‚ˆÓÙØÜÛß—{z®áàÄ|~…ÖÞÜ™™˜·ÄÄ®——¤Ã¿œ˜™€|Ãàá­z{˜ßÝÖ…}}~zÄâã®xy—áߨƒ{}€­©§§ª†­ÞÝâŽmk§äâÄz|ƒØàÞÜÛàŽnl§âßÃ|~…ÖÞÜÂÂÄŽ©Å÷˜™œ¿Ã€|Äàá®z{—ßÝÖ…}‚~ÃÝß®|~˜ÝÛÔ‡€‡‡…Àר®ƒ„›ÖÕÏŒ†‡ÔÔÖ›„ƒ®Ø×À…†ŒÏÕÔÚÙÝ™~|®ßÝÂ~€‡ÔÛÚÙØÜ™}®Þ܇ÔÚÙffh@10LihY226cg€fVh@10LihY226cgfhhj@/.MkjY/04eih@@?SZZM??FZYWB@@11/[lmN./@jie40100/R``G..?kje4/0LMIŠ£¤vGM„L>ijeÁæç¥`nZ./4ejihidÀ忤`mY/04eihYZV¢ÀÁŠR\S?@BWYY220UdeJ00@ihd51€2M0ZjkM/0@hhd512665WeeM44Bdc`956ccdB44MeeW569`dcggi@0/MjiY115dhgffh@10MihY226cgfs8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿil32 K”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“”•–‘¼ìæçæéÝŸ“–•–Àëæççè䘔•‘Œ¼òëìëîᛎ‘‘ŠÀðëììí蔃½¾ƒ¿ƒ½¾ƒ¿ƒ½íìñÀ‰šâïìíì󼋎“éîíçæë¿–•–“ŸÝéæçæì½‘–••”˜äèçèçì¿•”•’žÞêçèçí½•””“—åéèçæë¿•”•’žÝéæçæì¼‘–••”˜äèçêéîÁ–•–“Ÿàìéêé𽎓’’‘–æëêÞÝṋ‘‘Ž™ÕàÝÞÝâ½›Ÿžž¡ÛßÞ‚ž x{zzy~šŸžžŸš¿áÝÞÞßÛ¡ž‚’“„s€uty“’’“Œ¿îéêêëæ–‘’‚•–†t€vuz‘–••–Àëæççè䘔•‚”•…t€vuz•””•¿ìçèèéå—“”‚•–‡t€vuz‘–••–¿ëæççè䘔•‚‚r€tswŒ‰Àñìííî铎¿ ¾Â¤‚‡††„¸À¿¾ƒ½ƒ¿ìëð–•–“ âîëìëò¼Œ‘”èíìçæë¿•”•’žÝéæçæì¼‘–••”˜äèçèçì¿•”•’žÞêçèçí½•””“—åé…èçì¿•”•’žÞêçèçí½•””“—åéèéèíÀ”“”‘ßëèéèï¼”““’–æêéåäè¿’˜—˜• Üçäåäê½”˜——–šâæå—˜”½êäåäçÜ •˜—˜’¿èäååæâš–—“”¼ïèéèëß‘”“”Àíèééêæ–’“”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“…”•½íçèçêÞž’•”•¿ìçèèéå—“”ÙØÝ¯|ƒ‚ƒ€ÏÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ÏÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ŒÎÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ÏÛØÙØß¬~ƒ‚‚†ÕÚÙØ×ܯ}„ƒ„ÎÚר×Þ¬„ƒƒ‚†ÕÙØÝÜá¯x~{ŠÒßÜÝÜã¬z~~}‚ÙÞ݃¯­ƒ¬®‚¯®ƒ¬ƒ¯|}x¬åÞßÞâÓˆy}|}v¯ãÞßßàÛ€{|ƒ„­Ýר×Ú΄ƒ„~®ÜרØÙÕ†‚ƒ‚ƒ~¬ßØÙØÛÏ€ƒ‚ƒ|¯ÝØÙÙÚÕ†‚ƒ„¬Þר×Ú΄ƒ„}¯ÜרØÙÕ†‚ƒ€|¬âÛÜÛÞÑ‹~€z¯ßÚÛÛÜׄ€Œ‰¬ÑÌÍÌÏÅ”ŠŒˆ®ÑÍÎÎÏË‹ŒÎÍÑ©}ƒ‚ƒ€‹ÅÐÍÎÍÒ¬‰ŒŒ‹ËÏÎÛÚà©lustp€ÎÞÚÛÚá¬|€€„×ÜÛØ×Ü©qxwxtƒÌÛר×Þ¬„ƒƒ‚†ÕÙØÙØÝ©pwvws‚ÍÜØÙØß¬~ƒ‚‚†ÕÚÙØ×Ü©qxwxtƒÌÛר×Ý­„ƒƒ‚†ÕÙØßÞä©irpqm}ÑâÞßÞå¬x}||{€Ûà߃¬ª‚©ªƒ¬­ƒ¯ƒ¬~z¬ãÜÝÜßÒŠ{~x¯áÜÝÝÞÙ‚}~ƒ„¬Þר×Ú΄ƒ„}¯ÜרØÙÕ†‚ƒ‚ƒ~¬ßØÙØÛÎŒ€ƒ‚ƒ|¯ÝØÙÙÚÕ†…‚ƒ~¬ßØÙØÛÏ€ƒ‚ƒ|¯ÝØÙÙÚÕ†‚‚}¬àÙÚÙÜÏŒ‚‚{¯ÞÙÚÚÛÖ…€†‡ƒ¬ÚÔÕÔ×Ì„‡†‡¯ØÔÕÕÖÒ‰…†ÕÔØ¯‡†‡„Ë×ÔÕÔÚ¬ƒ‡††…‰ÒÖÕÚÙÞ¯{‚‚ŒÏÜÙÚÙà¬}‚€…ÖÛÚÙØÝ¯|ƒ‚ƒ€ŒÎÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ÏÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ŒÎÛØÙØß¬~ƒ‚‚†ÕÚ…ÙØÝ¯|ƒ‚ƒ€ÏÛØÙØß¬~ƒ‚‚†ÕÚÙ‚fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dgf‚hjM-21108bihhglL/€103fih„MƒLƒM„LƒM01-Kmhiijb7.001,Nlhiijg2/0‚42Lhdeef_:34451Mg€efc634‚31Lieffg`923340Mh€fgd52†31Mjfggha923340Mh€fgd523‚20Jfbccd]81223/Ni€ghe4129:6Vxsttvm@799:6Mb`^;‚9`a[”ÔËÍÌÐÀm]a`_cL79;^‚`ghb¡æÜÞÝáÏudhgfjK0€214ehgfgaâØÚÙÝÌtcgfeiL1€325dg…fgažãÙÛÚÞÍtcgfeiL1€325dgfef`á×ÙØÜËsbfedhL2€436cfeijd¤ëáãâæÔxfjihmK-100/2gjiL MHt£ž ”VJM€L„MƒL‚1/Hd`aab[70112-Mj€hif301‚31Mjfggha:23340Mh€fgd52†31Lieffg`923340Mh€fgd52†31Lieffg`923340Mh€fgd523‚20Ljfggh`81223/Mi€ghe412‚53Lgcdde_;45562Mf€deb745‚dfM26554:^eddcgL3€547bed‚giM/32219ahggfjL0€214ehg‚fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dg†fhM043329`gffeiL1€325dgfl8mkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿih32 †”©†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ膔†©³†Ó¾†©È†Ó†©†èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”†è†¾°†…¡™¾†”†v…†”ӆ蔌†v…†”ӆ蔌†v…†”ӆ蔆v…†”ӆ蔌†v…†”ӆ蔆v…†”ӆ蔆v…†”ӆ蔌†v…†”ӆ蔆v…†”ӆ膔†ÓÁ†°†Ó´†©†Ó†èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”èÓ†”¾†è©†”†è†”©†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ蔩†è¾†”ӆ膔†ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚­†Ù˜†‚ÙÆ‚­†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚­†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚†Ù†Ã¸†˜­†Ã£†˜†Ã†‚˜†Ù®†‚Æق˜†Ù®†‚Æق˜†Ù­†‚Æق˜†Ù­†‚Æق˜†Ù®†‚Æق˜†Ù­†‚Æق˜†Ù­†‚Æق˜†Ù®†‚Æق˜†Ù­†‚Æن‚†­ ¬§§¨§§¨§§¨ª™­†ÙÀ†v¨†Ù˜†‚ÙÀ†v§†Ù˜†‚ÙÀ†v§†Ù˜†‚ÙÀ†v¨†Ù˜†‚ÙÀ†v§†Ù˜†‚ÙÀ†v¨†Ù˜†‚ÙÀ†v¨†Ù˜†‚ÙÀ†v§†Ù˜†‚ÙÀ†v¨†Ù˜†‚†Ù†˜¢†À¬†˜¸†Ã†˜†‚˜†Ù­†‚Æق˜†Ù®†‚Æق˜†Ù®†‚Æق˜†Ù­†‚Æق˜†Ù®†‚Æق˜†Ù®†‚Æق˜†Ù­†‚Æق˜†Ù®†‚Æق˜†Ù®†‚Æن‚†ÙÆ‚­†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚­†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚­†Ù˜†‚ÙÆ‚®†Ù˜†‚ÙÆ‚®†Ù˜†‚†Ù†fY†3L†f@†3fY†3L†f@†3fY†3M†f@†3fY†3L†f@†3fY†3L†f@†3fY†3M†f@†3fY†3L†f@†3fY†3M†f@†3fY†3M†f@†3†f†YS†@L†YF†@†Y†3@†fM†3Y†f3@†fM†3Y†f3@†fL†3Y†f3@†fL†3Y†f3@†fM†3Y†f3@†fL†3Y†f3@†fL†3Y†f3@†fM†3Y†f3@†fL†3Y†f†3†La† v™L†fƒ†Û¡†f@†3fƒ†Û †f@†3fƒ†Û †f@†3fƒ†Û¡†f@†3fƒ†Û †f@†3fƒ†Û¡†f@†3fƒ†Û¡†f@†3fƒ†Û †f@†3fƒ†Û¡†f@†3†f†@Q†ƒb†@S†Y†@†3@†fL†3Y†f3@†fM†3Y†f3@†fM†3Y†f3@†fL†3Y†f3@†fM†3Y†f3@†fM†3Y†f3@†fL†3Y†f3@†fM†3Y†f3@†fM†3Y†f†3†fY†3L†f@†3fY†3M†f@†3fY†3M†f@†3fY†3L†f@†3fY†3M†f@†3fY†3M†f@†3fY†3L†f@†3fY†3M†f@†3fY†3M†f@†3†fh8mk ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿrecoll-1.23.7/qtgui/images/code-block.png0000644000175000017500000000100013125527323015105 00000000000000‰PNG  IHDRójœ sRGB®Îé pHYs „ „ªâcytIMEÙ/6¢;CºPLTEUUU€€€‡‡‡ˆˆˆÒÒÒÖÖÖˆˆˆˆˆˆÐÐÐÕÕÕVVVWWWXXX[[[]]]___aaacccdddgggiiijjjkkkmmmnnnooo………‡‡‡‰‰‰ŠŠŠ’’’”””•••–––———™™™›››žžž¡¡¡¥¥¥¦¦¦¬¬¬®®®°°°²²²´´´···¸¸¸¹¹¹»»»ÁÁÁÂÂÂÎÎÎÏÏÏÑÑÑÒÒÒÓÓÓÿÿÿ‹)>– tRNS{{}}…†ˆ‰`²ubKGD=ÐmQY¨IDATxÚÉ‚@ ÝEÐqÔAE@\÷åÿ¿ËÀ •Tq²O]¯rHWþ † Ó „išbÙ¤çÑë <î:óë圓dHg–ö»8ôt6ÖžkÏmG§³fÍ2,•Γ•“á鬈^ƨQö?ÞZQ^²è ‚·,‰‘ì&K82 ‚’mè1d€^”ȵ(ÑÜ—%PŸæ%\ùYÖê·Z9ãiƒ&IEND®B`‚recoll-1.23.7/qtgui/images/table.png0000644000175000017500000000642713125527323014214 00000000000000‰PNG  IHDRÄ´l; pHYs  ÒÝ~ü OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF2IDATxÚ´•½kTAÅwÞämv7Y5Š"XË XÙ,íì¬mýÄ^°,$¶6vö»e!ELLˆÆMÌÇ{ogîµØì’ ÙÄäÂc8o†3wÎaΈ™qå_¾™{·´´r¿b¡ª¨*Q S#FÅ€¨Š™ âpNâÀ9¡”¦$Îaf$>I§oL}òk+k³OŸ<žÌó‚Ž*!D¢1(1*!1F¢)$8¼&¯\ħ %ï‰1266J–å¼~;÷Àï¦NsTq ¿7¶IGµœ2’8²¼Cš&d6rÓ‹8>ù ˜uG†ùˆÿf ‚7îÍ>dh5€¸îwØ~ ÞãD¸;] Ùl233Ó_xRü}5G×Û¥WÎ vr«tur" û˜Uuhâ¢(!DèJQä»4›óÇÛ_'Á•k·Àƒ "}þWão?·@À!P=Óë,€5>“œ(•{æqÆ;<Àîî­ÖéÍkµZûÌ»…ˆâ1c¬ZåN½1´YõzZ­ÖÇFcÀ¼®Æ§âXODpb''?ööyШ,o„þÄr»™ë!tŽœ?ˆÍ_„¨Õ¸î²?J–”*5Ú«‹t__fuqÔ—H}Jµz•üWïÔ:L^¾ŽlµI© \’Àö֦ʳ¯žÿmo>Šj±—§``€™íEªí¼Ã9§1„~‹Î'–à Ô!ø‰‰ å¼ÓŸÎøùÑ8IEND®B`‚recoll-1.23.7/qtgui/images/prevpage.png0000644000175000017500000000240213125527323014723 00000000000000‰PNG  IHDRÄ´l;gAMA¯È7Šé¹IDATxœ•[lUÇgn;;»Ûv/[J¡\*·å"E@Ò‚! ÆH‚D‰‰‰ø ‰‰ð‚ꋆ/#JH$"PÁ¨)5`±7*mi¡ô–vw»;»³3> tA.z’ïeΜßùÎ÷ÿŸó þsl÷¢§"Øš–ƒl%HjC°Ç|Ø*ñÀÏöj^F֟“W„æUH'Ò˜±²©Èì%ùѹÿ6Þ)"›ú£pSxÎU•S1;Ä„ †•…«&ç/ÑÔÐB¬ãw›äðçø­D÷Œ>ìÛQAÖ>d”//{~ë*^Zç£lX¤ÒµÝßÌ,\ì/sòÛ:¬žsù9’ôÞ ÖßšŒë#‹k§ì~w—Àõaè쇄éB%²’> ÁS°ßQ’­?6b¤kng.ƒåª/ý³kžx÷jÖ/‚Ö^ŠA& ªs&»Dã¶ –‚±”O+8“ŽŽh±=Ø${æûX{s=y¥;·mßÌÖU º`d Ì h ÔTBIò øã² N[î|Ò„â0\1'1ØÑ´1ÿÖ™k’òZÉ‚'Ù\£ÓÚ ƒ£K‚*Cuøu÷PÍÝ# ˆ§r1š„¬sƒeUB¼  ·+„ª-­ZVŽ®@{›Í¤<óø­ZGÏšÔý© ( DN !¹µ 8}6©®S«íü]†„œ-’ )˜5=Ÿæ+ÐÒ ²€µ sІ¶4¿]RåÉäûÜï†Çq$£cnÖyáJ T‚™¢(ªÈó‚Yâ|§›Í–•àÕr.¬œ¦ñØŒœ…lÇuÊ'uÐØá ,«²‘¯)éÅ‹êQH¤áê0”„œ[5Í9Ñ£ÞsÆGØï0Œe í€êQqdM(B÷Ä!ÍXÆáFRÐÙḭ̈s³:¯oÎp¦Ý&àu3µ°m×9Ç›F’2Ð=+#kư⑔떋ߌù#!éaÁ¡‹*º×âíZTNUùºÁádx|[> >?h*ŒưmózBRºåtôؘZ¸n™8uÚŒ ‰ † ¥_b4aQ5]BWÕsÝÂaSà÷ ¯Àð‚ÇãFÀýŒ\ë:œn}ã+ @’å½WÚ:È:6Å0| êþVØ{ʼ*¼¸¼>ð݆&†Ë$Ú} YÓöß¼ôŠ-I}±UhÞÒYsè282º ý†D-,-Z6ádY@8_CuûfÆa(jÒÒv“ 纈ö V…õúµ6ôÜɹkÚô\˜ð¿ „ôŠð.,ü†OÇqñ$7£±‘d¿À甕ÞÙ"h®Í“žíαÿ;ìñz °ŠŠ`j|˦•ë»2€¬+‡†»;íx2ÍìRp¹Á]?šškaÅCy_/õåx·U 8e<p@Iìlšho§-ËÊ¡éÉË »¥•¶TfL¥q~}‡–šº&•^‹a‹Û9YÆ©ƒªAÐ\>}èÀàg± Û?ºgW(UO§Â-–â ÖÎ÷Qä[EÁ™~›óÃ’&£ëàr@¨œN8÷K7Ý®¶ª½Åè=2™ç]¬>Z#Ë|[½¬®ªyu%%•´q{'X·HàÒÀ¡Áh4Ë©“7é<{íºi²>ÒúxÇÔÿ Á5_•aiúCþ'ë—Ρ®ÆGЯOçÚÈÚ„£®uŒsù\Ñáè$ã¥ð‰§†îÉøLá/^s| ²´ÓåVWz|Aw€T2M|<žLe~ÆäÀ؉u'þuxf"þ %}_jçÌ* »@BŒ E¾>zìÑ‘ÿªû)}ÔE0q,XIEND®B`‚recoll-1.23.7/qtgui/images/spell.png0000644000175000017500000000052313125527323014233 00000000000000‰PNG  IHDRÄ´l;gAMA± üabKGDÿÿÿ ½§“ pHYs  ­#½utIMEÑ ¬å¹ÐIDATxœíR» ƒ0}6=J‰†>0Æ Ã@ƒAn’4—"9Ç86d¥ˆò¤“,¿û<¿3ðGÂÌR»FŽ4/®9ÓôLmiš&œ,ÖZQ.¥²mÛ÷L "af!¢UR×uþLDÒ÷½÷Uk”K5Ïú6ޏ”Bg‹z«Ú‚†Á¬&Å*Ž8”|1¯˜™À¼båˆHEìâι¡ Ë¢÷u<žçÌ,fš$çvóqÄy\\¾¾·`á÷qLîáGqIüõ¯á0ØÎ„PÑ[§IEND®B`‚recoll-1.23.7/qtgui/images/down.png0000644000175000017500000000676013125527323014074 00000000000000‰PNG  IHDRÄ´l; pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF IDATxÚ”“MoU†ŸsïÌÄSÛñG§"j+" TEˆ*l@‚bÏ‚5B|õðØöP>¶H°aU‰Ï(P[Z¡´8 "qœ×&öÜ{Xxâ˜Ôã–#]͹çý?>nmmÅUûõWÄÅ/°xй×l µóoW§ÞDfG{{¿\²kß#k)ä’­ºðÄ;À'Y…tözõE{cj1äðÏ_ñÕ'/Ï*z0ÀÞË+?ÿ‹O½9©~Vü;\k.¥ `LIEND®B`‚recoll-1.23.7/qtgui/images/up.png0000644000175000017500000000666613125527323013556 00000000000000‰PNG  IHDRÄ´l; pHYs  šœ OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-ÛgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFÑIDATxÚ¬ÕÏoTUÀñï¹ï½™Î0Ã+ hhTBÍDwnŒ cÜÛ™?À’¼Vf²#qk ü ,Ûò¦ ‚`ºTЪ-–þ൯ÓöýºÇÅL«‰¿Æ©wõrßyŸ{òî9÷Šª2ÈhaðE»1:H¼ýá•þUñýf®ý/p+£Ÿßmø·V ’dL¬7ƒ0ÞÜ Âè׉†?½â.­°glZáËCãµfv‡‚[A-|Üð§æ F­âRPw Ëë±UnW›“ÿ·‚0Zj7ü©{ÊÈl—²8b Vâ‚'¹á«ÃG*“­àVF?¶þo¡ú0¥¬9Ð?|°×V6r–r¥søHyb²“ü#Ü Âè~»áßùªÁu-V{!Ò— @*Ž!N,‘ué<÷|éƒÉNú'X^¼òjóüt~·Ýð瀃‡Àyæªò’AP° q KåyÊPº†w Fwl7ß:ã5?™Î·a ùÞÑë÷Ž;wÏG=MÉÄ¡ÈJÀ“—³Ï]ÇXßTž=)œšåÚ½Y½ƒëPT–Iùéö)Ç2]\þôuÇØï—_Šg»¹ÎedYB‚ƒ°ÅG§eþóºçf©ÁQЬà™J™×Þ‡«ŸéMtóu,¤y‘Âcøzìxi'ã çÎ>ºð;{òéNå oÚí^³Ð]…dpâØ¬¹øöâÐçyôKBz›g¡ØT ‘ÚЧVªý'ÀcéeÞ›ö¬°}b'áά߫âo‡°Ì£€Qtg­ÇÃð†°@éáš‚Âò.`Y1@¸ Ù~ ™„ïñ ê¸àÒÄ¢ ýe7¿â±ÓÅÓ-\GÕJ¦TŒÚáá$ã’,oŒËžjlÖÖ3\#ñFî{g.¾ñ`7[¬fˆ¤"bú—oúoåöÛ®_3}[É¢[IEND®B`‚recoll-1.23.7/qtgui/ssearchb.ui0000644000175000017500000000526713125527323013304 00000000000000 SSearchBase 0 0 593 48 SSearchBase 2 4 false Erase search entry Clear Ctrl+S false Start query Search Qt::TabFocus Choose search type. 8 0 155 0 Enter search terms here. Type ESC SPC for completions of current term. true 200 QComboBox::NoInsert false recoll-1.23.7/qtgui/crontool.h0000644000175000017500000000243513125527323013155 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _CRONTOOL_W_H_INCLUDED_ #define _CRONTOOL_W_H_INCLUDED_ #include "ui_crontool.h" class QPushButton; class CronToolW : public QDialog, public Ui::CronToolW { Q_OBJECT public: CronToolW(QWidget * parent = 0) : QDialog(parent), enableButton(0), disableButton(0) { setupUi(this); init(); } QPushButton *enableButton; QPushButton *disableButton; private slots: void enableCron(); void disableCron(); private: void init(); void changeCron(bool enable); }; #endif /* _CRONTOOL_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/preview_plaintorich.cpp0000644000175000017500000001244113125637102015721 00000000000000/* Copyright (C) 2014 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include "preview_plaintorich.h" #include "plaintorich.h" #include "log.h" #include "guiutils.h" #include "cancelcheck.h" using namespace std; PlainToRichQtPreview::PlainToRichQtPreview() { clear(); } void PlainToRichQtPreview::clear() { m_curanchor = 1; m_lastanchor = 0; m_groupanchors.clear(); m_groupcuranchors.clear(); } bool PlainToRichQtPreview::haveAnchors() { return m_lastanchor != 0; } string PlainToRichQtPreview::PlainToRichQtPreview::header() { if (!m_inputhtml) { switch (prefs.previewPlainPre) { case PrefsPack::PP_BR: m_eolbr = true; return ""; case PrefsPack::PP_PRE: m_eolbr = false; return "
";
        case PrefsPack::PP_PREWRAP:
            m_eolbr = false;
            return ""
                "
";
        }
    }
    return cstr_null;
}

string PlainToRichQtPreview::startMatch(unsigned int grpidx)
{
    LOGDEB2("startMatch, grpidx "  << (grpidx) << "\n" );
    grpidx = m_hdata->grpsugidx[grpidx];
    LOGDEB2("startMatch, ugrpidx "  << (grpidx) << "\n" );
    m_groupanchors[grpidx].push_back(++m_lastanchor);
    m_groupcuranchors[grpidx] = 0; 
    return string("").
        append("");
}

string  PlainToRichQtPreview::endMatch()
{
    return string("");
}

string  PlainToRichQtPreview::termAnchorName(int i) const
{
    static const char *termAnchorNameBase = "TRM";
    char acname[sizeof(termAnchorNameBase) + 20];
    sprintf(acname, "%s%d", termAnchorNameBase, i);
    return string(acname);
}

string  PlainToRichQtPreview::startChunk()
{
    return "
";
}

int  PlainToRichQtPreview::nextAnchorNum(int grpidx)
{
    LOGDEB2("nextAnchorNum: group "  << (grpidx) << "\n" );
    map::iterator curit = 
        m_groupcuranchors.find(grpidx);
    map >::iterator vecit = 
        m_groupanchors.find(grpidx);
    if (grpidx == -1 || curit == m_groupcuranchors.end() ||
        vecit == m_groupanchors.end()) {
        if (m_curanchor >= m_lastanchor)
            m_curanchor = 1;
        else
            m_curanchor++;
    } else {
        if (curit->second >= vecit->second.size() -1)
            m_groupcuranchors[grpidx] = 0;
        else 
            m_groupcuranchors[grpidx]++;
        m_curanchor = vecit->second[m_groupcuranchors[grpidx]];
        LOGDEB2("nextAnchorNum: curanchor now "  << (m_curanchor) << "\n" );
    }
    return m_curanchor;
}

int  PlainToRichQtPreview::prevAnchorNum(int grpidx)
{
    map::iterator curit = 
        m_groupcuranchors.find(grpidx);
    map >::iterator vecit = 
        m_groupanchors.find(grpidx);
    if (grpidx == -1 || curit == m_groupcuranchors.end() ||
        vecit == m_groupanchors.end()) {
        if (m_curanchor <= 1)
            m_curanchor = m_lastanchor;
        else
            m_curanchor--;
    } else {
        if (curit->second <= 0)
            m_groupcuranchors[grpidx] = vecit->second.size() -1;
        else 
            m_groupcuranchors[grpidx]--;
        m_curanchor = vecit->second[m_groupcuranchors[grpidx]];
    }
    return m_curanchor;
}

QString  PlainToRichQtPreview::curAnchorName() const
{
    return QString::fromUtf8(termAnchorName(m_curanchor).c_str());
}


ToRichThread::ToRichThread(const string &i, const HighlightData& hd,
                           std::shared_ptr ptr,
                           QStringList& qrichlist,
                           QObject *parent)
    : QThread(parent), m_input(i), m_hdata(hd), m_ptr(ptr), m_output(qrichlist)
{
}

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

void ToRichThread::run()
{
    list out;
    try {
        m_ptr->plaintorich(m_input, out, m_hdata, CHUNKL);
    } catch (CancelExcept) {
        return;
    }

    // Convert C++ string list to QString list
    for (list::iterator it = out.begin(); 
         it != out.end(); it++) {
        m_output.push_back(QString::fromUtf8(it->c_str(), it->length()));
    }
}

recoll-1.23.7/qtgui/searchclause_w.h0000644000175000017500000000276013125527323014307 00000000000000/*
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
#ifndef SEARCHCLAUSE_H
#define SEARCHCLAUSE_H
// A class for entry of a search clause: type (OR/AND/etc.), distance
// for PHRASE or NEAR, and text

#include 
#include 
#include "searchdata.h"

class QVBoxLayout;
class QHBoxLayout;
class QComboBox;
class QSpinBox;
class QLineEdit;

class SearchClauseW : public QWidget
{
    Q_OBJECT

public:
    SearchClauseW(QWidget* parent = 0);
    ~SearchClauseW();
    Rcl::SearchDataClause *getClause();
    void setFromClause(Rcl::SearchDataClauseSimple *cl);
    void clear();

    QComboBox* sTpCMB;
    QComboBox* fldCMB;
    QSpinBox*  proxSlackSB;
    QLineEdit* wordsLE;

public slots:
    virtual void tpChange(int);
protected slots:
    virtual void languageChange();
};

#endif // SEARCHCLAUSE_H
recoll-1.23.7/qtgui/idxsched.h0000644000175000017500000000223713125527323013111 00000000000000/*
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
#ifndef _IDXSCHED_H_INCLUDED_
#define _IDXSCHED_H_INCLUDED_

#include "ui_idxsched.h"
#include "rclhelp.h"

class IdxSchedW : public QDialog, public Ui::IdxSchedW {
    Q_OBJECT
    public:
    IdxSchedW(QWidget * parent = 0) 
	: QDialog(parent)
    {
	setupUi(this);
	(void)new HelpClient(this);
	HelpClient::installMap((const char *)this->objectName().toUtf8(), 
			   "RCL.INDEXING");
    }
};


#endif /* _IDXSCHED_H_INCLUDED_ */
recoll-1.23.7/qtgui/rclm_wins.cpp0000644000175000017500000003145613125637102013650 00000000000000/* Copyright (C) 2005 J.F.Dockes
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation; either version 2 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */
#include "autoconfig.h"

#include 
#include 

#include "log.h"
#include "internfile.h"
#include "listdialog.h"
#include "confgui/confguiindex.h"
#include "idxsched.h"
#include "crontool.h"
#include "rtitool.h"
#include "snippets_w.h"
#include "fragbuts.h"
#include "specialindex.h"
#include "rclmain_w.h"
#include "webcache.h"

using namespace std;

static const QKeySequence quitKeySeq("Ctrl+q");
static const QKeySequence closeKeySeq("Ctrl+w");

// Open advanced search dialog.
void RclMain::showAdvSearchDialog()
{
    if (asearchform == 0) {
	asearchform = new AdvSearch(0);
        if (asearchform == 0) {
            return;
        }
	connect(new QShortcut(quitKeySeq, asearchform), SIGNAL (activated()), 
		this, SLOT (fileExit()));

	connect(asearchform, 
		SIGNAL(startSearch(std::shared_ptr, bool)), 
		this, SLOT(startSearch(std::shared_ptr, bool)));
	asearchform->show();
    } else {
	// Close and reopen, in hope that makes us visible...
	asearchform->close();
	asearchform->show();
    }
}

void RclMain::showSpellDialog()
{
    if (spellform == 0) {
	spellform = new SpellW(0);
	connect(new QShortcut(quitKeySeq, spellform), SIGNAL (activated()), 
		this, SLOT (fileExit()));
	connect(spellform, SIGNAL(wordSelect(QString)),
		sSearch, SLOT(addTerm(QString)));
	spellform->show();
    } else {
	// Close and reopen, in hope that makes us visible...
	spellform->close();
        spellform->show();
    }
}

void RclMain::showWebcacheDialog()
{
    switch (indexerState()) {
    case RclMain::IXST_UNKNOWN:
        QMessageBox::warning(0, "Recoll", tr("Unknown indexer state. "
                                             "Can't access webcache file."));
        return;
    case RclMain::IXST_RUNNINGMINE:
    case RclMain::IXST_RUNNINGNOTMINE:
        QMessageBox::warning(0, "Recoll", tr("Indexer is running. "
                                             "Can't access webcache file."));
        return;
    case RclMain::IXST_NOTRUNNING:
        break;
    }

    if (!m_pidfile) {
        m_pidfile = new Pidfile(theconfig->getPidfile());
        if (m_pidfile->open() != 0) {
            deleteZ(m_pidfile);
            return;
        }
        if (m_pidfile->write_pid() != 0) {
            deleteZ(m_pidfile);
            return;
        }
    }
    
    if (webcache == 0) {
	webcache = new WebcacheEdit(this);
        webcache->setAttribute(Qt::WA_DeleteOnClose);
        connect(new QShortcut(quitKeySeq, webcache), SIGNAL (activated()), 
		this, SLOT (fileExit()));
        connect(webcache, SIGNAL(destroyed(QObject*)),
                this, SLOT(onWebcacheDestroyed(QObject*)) );
        webcache->show();
    }
}
void RclMain::onWebcacheDestroyed(QObject *)
{
    deleteZ(m_pidfile);
    webcache = 0;
}

void RclMain::showIndexStatistics()
{
    showSpellDialog();
    if (spellform == 0)
        return;
    spellform->setMode(SpellW::TYPECMB_STATS);
}

void RclMain::showFragButs()
{
    if (fragbuts && fragbuts->isStale(0)) {
        deleteZ(fragbuts);
    }
    if (fragbuts == 0) {
	fragbuts = new FragButs(0);
        if (fragbuts->ok()) {
            fragbuts->show();
            connect(fragbuts, SIGNAL(fragmentsChanged()),
                    this, SLOT(onFragmentsChanged()));
        } else {
            deleteZ(fragbuts);
        }
    } else {
	// Close and reopen, in hope that makes us visible...
	fragbuts->close();
        fragbuts->show();
    }
}

void RclMain::showSpecIdx()
{
    if (specidx == 0) {
	specidx = new SpecIdxW(0);
        connect(specidx, SIGNAL(accepted()), this, SLOT(specialIndex()));
        specidx->show();
    } else {
	// Close and reopen, in hope that makes us visible...
	specidx->close();
        specidx->show();
    }
}

void RclMain::showIndexConfig()
{
    showIndexConfig(false);
}
void RclMain::execIndexConfig()
{
    showIndexConfig(true);
}
void RclMain::showIndexConfig(bool modal)
{
    LOGDEB("showIndexConfig()\n" );
    if (indexConfig == 0) {
	indexConfig = new ConfIndexW(0, theconfig);
	connect(new QShortcut(quitKeySeq, indexConfig), SIGNAL (activated()), 
		this, SLOT (fileExit()));
    } else {
	// Close and reopen, in hope that makes us visible...
	indexConfig->close();
	indexConfig->reloadPanels();
    }
    if (modal) {
	indexConfig->exec();
	indexConfig->setModal(false);
    } else {
	indexConfig->show();
    }
}

void RclMain::showIndexSched()
{
    showIndexSched(false);
}
void RclMain::execIndexSched()
{
    showIndexSched(true);
}
void RclMain::showIndexSched(bool modal)
{
#ifdef _WIN32
    QMessageBox::information(this, tr("Index scheduling"),
                             tr("Sorry, not available under Windows for now, use the File menu entries "
                                "to update the index"));
    return;
#endif    
    LOGDEB("showIndexSched()\n" );
    if (indexSched == 0) {
	indexSched = new IdxSchedW(this);
	connect(new QShortcut(quitKeySeq, indexSched), SIGNAL (activated()), 
		this, SLOT (fileExit()));
	connect(indexSched->cronCLB, SIGNAL(clicked()), 
		this, SLOT(execCronTool()));
	if (theconfig && theconfig->isDefaultConfig()) {
#ifdef RCL_MONITOR
	    connect(indexSched->rtidxCLB, SIGNAL(clicked()), 
		    this, SLOT(execRTITool()));
#else
	    indexSched->rtidxCLB->setEnabled(false);
	    indexSched->rtidxCLB->setToolTip(tr("Disabled because the real time indexer was not compiled in."));
#endif
	} else {
	    indexSched->rtidxCLB->setEnabled(false);
	    indexSched->rtidxCLB->setToolTip(tr("This configuration tool only works for the main index."));
	}
    } else {
	// Close and reopen, in hope that makes us visible...
	indexSched->close();
    }
    if (modal) {
	indexSched->exec();
	indexSched->setModal(false);
    } else {
	indexSched->show();
    }
}

void RclMain::showCronTool()
{
    showCronTool(false);
}
void RclMain::execCronTool()
{
    showCronTool(true);
}
void RclMain::showCronTool(bool modal)
{
    LOGDEB("showCronTool()\n" );
    if (cronTool == 0) {
	cronTool = new CronToolW(0);
	connect(new QShortcut(quitKeySeq, cronTool), SIGNAL (activated()), 
		this, SLOT (fileExit()));
    } else {
	// Close and reopen, in hope that makes us visible...
	cronTool->close();
    }
    if (modal) {
	cronTool->exec();
	cronTool->setModal(false);
    } else {
	cronTool->show();
    }
}

void RclMain::showRTITool()
{
    showRTITool(false);
}
void RclMain::execRTITool()
{
    showRTITool(true);
}
void RclMain::showRTITool(bool modal)
{
    LOGDEB("showRTITool()\n" );
    if (rtiTool == 0) {
	rtiTool = new RTIToolW(0);
	connect(new QShortcut(quitKeySeq, rtiTool), SIGNAL (activated()), 
		this, SLOT (fileExit()));
    } else {
	// Close and reopen, in hope that makes us visible...
	rtiTool->close();
    }
    if (modal) {
	rtiTool->exec();
	rtiTool->setModal(false);
    } else {
	rtiTool->show();
    }
}

void RclMain::showUIPrefs()
{
    if (uiprefs == 0) {
	uiprefs = new UIPrefsDialog(this);
	connect(new QShortcut(quitKeySeq, uiprefs), SIGNAL (activated()), 
		this, SLOT (fileExit()));
	connect(uiprefs, SIGNAL(uiprefsDone()), this, SLOT(setUIPrefs()));
	connect(this, SIGNAL(stemLangChanged(const QString&)), 
		uiprefs, SLOT(setStemLang(const QString&)));
    } else {
	// Close and reopen, in hope that makes us visible...
	uiprefs->close();
        rwSettings(false);
        uiprefs->setFromPrefs();
    }
    uiprefs->show();
}

void RclMain::showExtIdxDialog()
{
    showUIPrefs();
    uiprefs->tabWidget->setCurrentIndex(3);
}

void RclMain::showAboutDialog()
{
    string vstring = Rcl::version_string() +
        string("
http://www.recoll.org") + string("
http://www.xapian.org"); QMessageBox::information(this, tr("About Recoll"), vstring.c_str()); } void RclMain::showMissingHelpers() { string miss; if (!theconfig->getMissingHelperDesc(miss)) { QMessageBox::information(this, "", tr("Indexing did not run yet")); return; } QString msg = QString::fromUtf8("

") + tr("External applications/commands needed for your file types " "and not found, as stored by the last indexing pass in "); msg += ""; msg += QString::fromLocal8Bit(theconfig->getConfDir().c_str()); msg += "/missing:

\n";
    if (!miss.empty()) {
	msg += QString::fromUtf8(miss.c_str());
    } else {
	msg += tr("No helpers found missing");
    }
    msg += "
"; QMessageBox::information(this, tr("Missing helper programs"), msg); } void RclMain::showActiveTypes() { string reason; bool maindberror; if (!maybeOpenDb(reason, true, &maindberror)) { QMessageBox::warning(0, tr("Error"), u8s2qs(reason), QMessageBox::Ok, QMessageBox::NoButton); return; } // All mime types in index. vector vdbtypes; if (!rcldb->getAllDbMimeTypes(vdbtypes)) { QMessageBox::warning(0, tr("Error"), tr("Index query error"), QMessageBox::Ok, QMessageBox::NoButton); return; } set mtypesfromdb; mtypesfromdb.insert(vdbtypes.begin(), vdbtypes.end()); // All types listed in mimeconf: vector mtypesfromconfig = theconfig->getAllMimeTypes(); // Intersect file system types with config types (those not in the // config can be indexed by name, not by content) set mtypesfromdbconf; for (vector::const_iterator it = mtypesfromconfig.begin(); it != mtypesfromconfig.end(); it++) { if (mtypesfromdb.find(*it) != mtypesfromdb.end()) mtypesfromdbconf.insert(*it); } // Substract the types for missing helpers (the docs are indexed // by name only): string miss; if (theconfig->getMissingHelperDesc(miss) && !miss.empty()) { FIMissingStore st(miss); map >::const_iterator it; for (it = st.m_typesForMissing.begin(); it != st.m_typesForMissing.end(); it++) { set::const_iterator it1; for (it1 = it->second.begin(); it1 != it->second.end(); it1++) { set::iterator it2 = mtypesfromdbconf.find(*it1); if (it2 != mtypesfromdbconf.end()) mtypesfromdbconf.erase(it2); } } } ListDialog dialog; dialog.setWindowTitle(tr("Indexed MIME Types")); // Turn the result into a string and display dialog.groupBox->setTitle(tr("Content has been indexed for these mime types:")); // We replace the list with an editor so that the user can copy/paste delete dialog.listWidget; QTextEdit *editor = new QTextEdit(dialog.groupBox); editor->setReadOnly(true); dialog.horizontalLayout->addWidget(editor); if (mtypesfromdbconf.empty()) { editor->append(tr("Types list empty: maybe wait for indexing to " "progress?")); } else { for (set::const_iterator it = mtypesfromdbconf.begin(); it != mtypesfromdbconf.end(); it++) { editor->append(QString::fromUtf8(it->c_str())); } } editor->moveCursor(QTextCursor::Start); editor->ensureCursorVisible(); dialog.exec(); } void RclMain::newDupsW(const Rcl::Doc, const vector dups) { ListDialog dialog; dialog.setWindowTitle(tr("Duplicate documents")); dialog.groupBox->setTitle(tr("These Urls ( | ipath) share the same" " content:")); // We replace the list with an editor so that the user can copy/paste delete dialog.listWidget; QTextEdit *editor = new QTextEdit(dialog.groupBox); editor->setReadOnly(true); dialog.horizontalLayout->addWidget(editor); for (vector::const_iterator it = dups.begin(); it != dups.end(); it++) { if (it->ipath.empty()) editor->append(QString::fromLocal8Bit(it->url.c_str())); else editor->append(QString::fromLocal8Bit(it->url.c_str()) + " | " + QString::fromUtf8(it->ipath.c_str())); } editor->moveCursor(QTextCursor::Start); editor->ensureCursorVisible(); dialog.exec(); } void RclMain::showSnippets(Rcl::Doc doc) { SnippetsW *sp = new SnippetsW(doc, m_source); connect(sp, SIGNAL(startNativeViewer(Rcl::Doc, int, QString)), this, SLOT(startNativeViewer(Rcl::Doc, int, QString))); connect(new QShortcut(quitKeySeq, sp), SIGNAL (activated()), this, SLOT (fileExit())); connect(new QShortcut(closeKeySeq, sp), SIGNAL (activated()), sp, SLOT (close())); sp->show(); } recoll-1.23.7/qtgui/rclm_preview.cpp0000644000175000017500000002050513125637102014342 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "log.h" #include "internfile.h" #include "rclzg.h" #include "rclmain_w.h" static const QKeySequence quitKeySeq("Ctrl+q"); // If a preview (toplevel) window gets closed by the user, we need to // clean up because there is no way to reopen it. And check the case // where the current one is closed void RclMain::previewClosed(Preview *w) { LOGDEB("RclMain::previewClosed(" << (w) << ")\n" ); if (w == curPreview) { LOGDEB("Active preview closed\n" ); curPreview = 0; } else { LOGDEB("Old preview closed\n" ); } delete w; } // Document up to date check. The main problem we try to solve is // displaying the wrong message from a compacted mail folder. // // Also we should re-run the query after updating the index because // the ipaths may be wrong in the current result list. For now, the // user does this by clicking search again once the indexing is done // // We only do this for the main index, else jump and prey (cant update // anyway, even the makesig() call might not make sense for our base // config) bool RclMain::containerUpToDate(Rcl::Doc& doc) { static bool ignore_out_of_date_preview = false; // If ipath is empty, we decide we don't care. Also, we need an index, if (ignore_out_of_date_preview || doc.ipath.empty() || rcldb == 0) return true; string udi; doc.getmeta(Rcl::Doc::keyudi, &udi); if (udi.empty()) { // Whatever... return true; } string sig; if (!FileInterner::makesig(theconfig, doc, sig)) { QMessageBox::warning(0, "Recoll", tr("Can't access file: ") + QString::fromLocal8Bit(doc.url.c_str())); // Let's try the preview anyway... return true; } if (!rcldb->needUpdate(udi, sig)) { // Alles ist in ordnung return true; } // We can only run indexing on the main index (dbidx 0) bool ismainidx = rcldb->whatDbIdx(doc) == 0; // Indexer already running? bool ixnotact = (m_indexerState == IXST_NOTRUNNING); QString msg = tr("Index not up to date for this file. " "Refusing to risk showing the wrong entry. "); if (ixnotact && ismainidx) { msg += tr("Click Ok to update the " "index for this file, then you will need to " "re-run the query when indexing is done. "); } else if (ismainidx) { msg += tr("The indexer is running so things should " "improve when it's done. "); } else if (ixnotact) { // Not main index msg += tr("The document belongs to an external index " "which I can't update. "); } msg += tr("Click Cancel to return to the list.
" "Click Ignore to show the preview anyway (and remember for " "this session)."); QMessageBox::StandardButtons bts = QMessageBox::Ignore | QMessageBox::Cancel; if (ixnotact &&ismainidx) bts |= QMessageBox::Ok; int rep = QMessageBox::warning(0, tr("Warning"), msg, bts, (ixnotact && ismainidx) ? QMessageBox::Cancel : QMessageBox::NoButton); if (m_indexerState == IXST_NOTRUNNING && rep == QMessageBox::Ok) { LOGDEB("Requesting index update for " << (doc.url) << "\n" ); vector docs(1, doc); updateIdxForDocs(docs); } if (rep == QMessageBox::Ignore) { ignore_out_of_date_preview = true; return true; } else { return false; } } /** * Open a preview window for a given document, or load it into new tab of * existing window. * * @param docnum db query index * @param mod keyboards modifiers like ControlButton, ShiftButton */ void RclMain::startPreview(int docnum, Rcl::Doc doc, int mod) { LOGDEB("startPreview(" << (docnum) << ", doc, " << (mod) << ")\n" ); if (!containerUpToDate(doc)) return; // Do the zeitgeist thing zg_send_event(ZGSEND_PREVIEW, doc); if (mod & Qt::ShiftModifier) { // User wants new preview window curPreview = 0; } if (curPreview == 0) { HighlightData hdata; m_source->getTerms(hdata); curPreview = new Preview(reslist->listId(), hdata); if (curPreview == 0) { QMessageBox::warning(0, tr("Warning"), tr("Can't create preview window"), QMessageBox::Ok, QMessageBox::NoButton); return; } connect(new QShortcut(quitKeySeq, curPreview), SIGNAL (activated()), this, SLOT (fileExit())); connect(curPreview, SIGNAL(previewClosed(Preview *)), this, SLOT(previewClosed(Preview *))); connect(curPreview, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); connect(curPreview, SIGNAL(showNext(Preview *, int, int)), this, SLOT(previewNextInTab(Preview *, int, int))); connect(curPreview, SIGNAL(showPrev(Preview *, int, int)), this, SLOT(previewPrevInTab(Preview *, int, int))); connect(curPreview, SIGNAL(previewExposed(Preview *, int, int)), this, SLOT(previewExposed(Preview *, int, int))); connect(curPreview, SIGNAL(saveDocToFile(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); curPreview->setWindowTitle(getQueryDescription()); curPreview->show(); } curPreview->makeDocCurrent(doc, docnum); } /** * Open a preview window for a given document, no linking to result list * * This is used to show ie parent documents, which have no corresponding * entry in the result list. * */ void RclMain::startPreview(Rcl::Doc doc) { Preview *preview = new Preview(0, HighlightData()); if (preview == 0) { QMessageBox::warning(0, tr("Warning"), tr("Can't create preview window"), QMessageBox::Ok, QMessageBox::NoButton); return; } connect(new QShortcut(quitKeySeq, preview), SIGNAL (activated()), this, SLOT (fileExit())); connect(preview, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); // Do the zeitgeist thing zg_send_event(ZGSEND_PREVIEW, doc); preview->show(); preview->makeDocCurrent(doc, 0); } // Show next document from result list in current preview tab void RclMain::previewNextInTab(Preview * w, int sid, int docnum) { previewPrevOrNextInTab(w, sid, docnum, true); } // Show previous document from result list in current preview tab void RclMain::previewPrevInTab(Preview * w, int sid, int docnum) { previewPrevOrNextInTab(w, sid, docnum, false); } // Combined next/prev from result list in current preview tab void RclMain::previewPrevOrNextInTab(Preview * w, int sid, int docnum, bool nxt) { LOGDEB("RclMain::previewNextInTab sid " << (sid) << " docnum " << (docnum) << ", listId " << (reslist->listId()) << "\n" ); if (w == 0) // ?? return; if (sid != reslist->listId()) { QMessageBox::warning(0, "Recoll", tr("This search is not active any more")); return; } if (nxt) docnum++; else docnum--; if (docnum < 0 || !m_source || docnum >= m_source->getResCnt()) { QApplication::beep(); return; } Rcl::Doc doc; if (!reslist->getDoc(docnum, doc)) { QMessageBox::warning(0, "Recoll", tr("Cannot retrieve document info from database")); return; } w->makeDocCurrent(doc, docnum, true); } // Preview tab exposed: if the preview comes from the currently // displayed result list, tell reslist (to color the paragraph) void RclMain::previewExposed(Preview *, int sid, int docnum) { LOGDEB2("RclMain::previewExposed: sid " << (sid) << " docnum " << (docnum) << ", m_sid " << (reslist->listId()) << "\n" ); if (sid != reslist->listId()) { return; } reslist->previewExposed(docnum); } recoll-1.23.7/qtgui/ssearch_w.cpp0000644000175000017500000005750713224431020013625 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "log.h" #include "guiutils.h" #include "searchdata.h" #include "ssearch_w.h" #include "textsplit.h" #include "wasatorcl.h" #include "rclhelp.h" #include "xmltosd.h" #include "smallut.h" using namespace std; // Typing interval after which we consider starting autosearch: no sense to do // this is user is typing fast and continuously static const int strokeTimeoutMS = 250; void SSearch::init() { // See enum above and keep in order ! searchTypCMB->addItem(tr("Any term")); searchTypCMB->addItem(tr("All terms")); searchTypCMB->addItem(tr("File name")); searchTypCMB->addItem(tr("Query language")); // We'd like to use QComboBox::InsertAtTop but it doesn't do lru // (existing item stays at its place instead of jumping at top) queryText->setInsertPolicy(QComboBox::NoInsert); queryText->addItems(prefs.ssearchHistory); queryText->setEditText(""); connect(queryText->lineEdit(), SIGNAL(returnPressed()), this, SLOT(startSimpleSearch())); connect(queryText->lineEdit(), SIGNAL(textChanged(const QString&)), this, SLOT(searchTextChanged(const QString&))); connect(clearqPB, SIGNAL(clicked()), queryText->lineEdit(), SLOT(clear())); connect(searchPB, SIGNAL(clicked()), this, SLOT(startSimpleSearch())); connect(searchTypCMB, SIGNAL(activated(int)), this, SLOT(searchTypeChanged(int))); queryText->installEventFilter(this); queryText->view()->installEventFilter(this); queryText->setInsertPolicy(QComboBox::NoInsert); // Note: we can't do the obvious and save the completer instead because // the combobox lineedit will delete the completer on setCompleter(0). // But the model does not belong to the completer so it's not deleted... m_savedModel = queryText->completer()->model(); if (prefs.ssearchNoComplete) queryText->completer()->setModel(0); // Recoll searches are always case-sensitive because of the use of // capitalization to suppress stemming queryText->completer()->setCaseSensitivity(Qt::CaseSensitive); m_displayingCompletions = false; m_escape = false; m_disableAutosearch = true; m_stroketimeout = new QTimer(this); m_stroketimeout->setSingleShot(true); connect(m_stroketimeout, SIGNAL(timeout()), this, SLOT(timerDone())); m_keystroke = false; } void SSearch::takeFocus() { LOGDEB2("SSearch: take focus\n" ); queryText->setFocus(Qt::ShortcutFocusReason); // If the focus was already in the search entry, the text is not selected. // Do it for consistency queryText->lineEdit()->selectAll(); } void SSearch::timerDone() { QString qs = queryText->currentText(); LOGDEB1("SSearch::timerDone: qs [" << (qs2utf8s(qs)) << "]\n" ); searchTextChanged(qs); } void SSearch::searchTextChanged(const QString& text) { QString qs = queryText->currentText(); LOGDEB1("SSearch::searchTextChanged. ks " << (m_keystroke) << " qs [" << (qs2utf8s(text)) << "]\n" ); if (text.isEmpty()) { searchPB->setEnabled(false); clearqPB->setEnabled(false); queryText->setFocus(); emit clearSearch(); } else { searchPB->setEnabled(true); clearqPB->setEnabled(true); if (m_keystroke) { m_tstartqs = qs; } if (prefs.ssearchAsYouType && !m_disableAutosearch && !m_keystroke && m_tstartqs == qs) { m_disableAutosearch = true; string s; int cs = partialWord(s); LOGDEB1("SSearch::searchTextChanged: autosearch. cs " << (cs) << " s [" << (s) << "]\n" ); if (cs < 0) { startSimpleSearch(); } else if (!m_stroketimeout->isActive() && s.size() >= 2) { s = qs2utf8s(queryText->currentText()); s += "*"; startSimpleSearch(s, 20); } } } m_keystroke = false; } void SSearch::searchTypeChanged(int typ) { LOGDEB("Search type now " << (typ) << "\n" ); // Adjust context help if (typ == SST_LANG) HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.LANG"); else HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.GUI.SIMPLE"); // Also fix tooltips switch (typ) { case SST_LANG: queryText->setToolTip(tr( "Enter query language expression. Cheat sheet:
\n" "term1 term2 : 'term1' and 'term2' in any field.
\n" "field:term1 : 'term1' in field 'field'.
\n" " Standard field names/synonyms:
\n" " title/subject/caption, author/from, recipient/to, filename, ext.
\n" " Pseudo-fields: dir, mime/format, type/rclcat, date, size.
\n" " Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
\n" "term1 term2 OR term3 : term1 AND (term2 OR term3).
\n" " You can use parentheses to make things clearer.
\n" "\"term1 term2\" : phrase (must occur exactly). Possible modifiers:
\n" "\"term1 term2\"p : unordered proximity search with default distance.
\n" "Use Show Query link when in doubt about result and see manual (<F1>) for more detail.\n" )); break; case SST_FNM: queryText->setToolTip(tr("Enter file name wildcard expression.")); break; case SST_ANY: case SST_ALL: default: queryText->setToolTip(tr( "Enter search terms here. Type ESC SPC for completions of current term." )); } } void SSearch::startSimpleSearch() { QString qs = queryText->currentText(); LOGDEB("SSearch::startSimpleSearch(): qs [" << (qs2utf8s(qs)) << "]\n" ); if (qs.length() == 0) return; string u8 = (const char *)queryText->currentText().toUtf8(); trimstring(u8); if (u8.length() == 0) return; if (!startSimpleSearch(u8)) return; LOGDEB("startSimpleSearch: updating history\n" ); // Search terms history: // We want to have the new text at the top and any older identical // entry to be erased. There is no standard qt policy to do this ? // So do it by hand. QString txt = queryText->currentText(); QString txtt = txt.trimmed(); int index = queryText->findText(txtt); if (index > 0) { queryText->removeItem(index); } if (index != 0) { queryText->insertItem(0, txtt); queryText->setEditText(txt); } m_disableAutosearch = true; m_stroketimeout->stop(); // Save the current state of the listbox list to the prefs (will // go to disk) prefs.ssearchHistory.clear(); for (int index = 0; index < queryText->count(); index++) { prefs.ssearchHistory.push_back(queryText->itemText(index)); } } void SSearch::setPrefs() { if (prefs.ssearchNoComplete) { queryText->completer()->setModel(0); } else { queryText->completer()->setModel(m_savedModel); } } string SSearch::asXML() { return m_xml; } bool SSearch::startSimpleSearch(const string& u8, int maxexp) { LOGDEB("SSearch::startSimpleSearch(" << (u8) << ")\n" ); string stemlang = prefs.stemlang(); ostringstream xml; xml << "\n"; xml << " " << stemlang << "\n"; xml << " " << base64_encode(u8) << "\n"; SSearchType tp = (SSearchType)searchTypCMB->currentIndex(); Rcl::SearchData *sdata = 0; if (tp == SST_LANG) { xml << " QL\n"; string reason; if (prefs.autoSuffsEnable) { sdata = wasaStringToRcl(theconfig, stemlang, u8, reason, (const char *)prefs.autoSuffs.toUtf8()); if (!prefs.autoSuffs.isEmpty()) { xml << " " << qs2utf8s(prefs.autoSuffs) << "\n"; } } else { sdata = wasaStringToRcl(theconfig, stemlang, u8, reason); } if (sdata == 0) { QMessageBox::warning(0, "Recoll", tr("Bad query string") + ": " + QString::fromUtf8(reason.c_str())); return false; } } else { sdata = new Rcl::SearchData(Rcl::SCLT_OR, stemlang); if (sdata == 0) { QMessageBox::warning(0, "Recoll", tr("Out of memory")); return false; } Rcl::SearchDataClause *clp = 0; if (tp == SST_FNM) { xml << " FN\n"; clp = new Rcl::SearchDataClauseFilename(u8); } else { // ANY or ALL, several words. if (tp == SST_ANY) { xml << " OR\n"; clp = new Rcl::SearchDataClauseSimple(Rcl::SCLT_OR, u8); } else { xml << " AND\n"; clp = new Rcl::SearchDataClauseSimple(Rcl::SCLT_AND, u8); } } sdata->addClause(clp); } if (prefs.ssearchAutoPhrase && rcldb) { xml << " \n"; sdata->maybeAddAutoPhrase(*rcldb, prefs.ssearchAutoPhraseThreshPC / 100.0); } if (maxexp != -1) { sdata->setMaxExpand(maxexp); } for (list::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { xml << " " << base64_encode(*it) << ""; } xml << "\n"; m_xml = xml.str(); LOGDEB("SSearch::startSimpleSearch:xml:[" << (m_xml) << "]\n" ); std::shared_ptr rsdata(sdata); emit startSearch(rsdata, true); return true; } bool SSearch::fromXML(const SSearchDef& fxml) { string asString; set cur; set stored; // Retrieve current list of stemlangs. prefs returns a // space-separated list Warn if stored differs from current, // but don't change the latter. stringToStrings(prefs.stemlang(), cur); stored = set(fxml.stemlangs.begin(), fxml.stemlangs.end()); stringsToString(fxml.stemlangs, asString); if (cur != stored) { QMessageBox::warning( 0, "Recoll", tr("Stemming languages for stored query: ") + QString::fromUtf8(asString.c_str()) + tr(" differ from current preferences (kept)")); } // Same for autosuffs stringToStrings(qs2utf8s(prefs.autoSuffs), cur); stored = set(fxml.autosuffs.begin(), fxml.autosuffs.end()); stringsToString(fxml.stemlangs, asString); if (cur != stored) { QMessageBox::warning( 0, "Recoll", tr("Auto suffixes for stored query: ") + QString::fromUtf8(asString.c_str()) + tr(" differ from current preferences (kept)")); } cur = set(prefs.activeExtraDbs.begin(), prefs.activeExtraDbs.end()); stored = set(fxml.extindexes.begin(), fxml.extindexes.end()); stringsToString(fxml.extindexes, asString); if (cur != stored) { QMessageBox::warning( 0, "Recoll", tr("External indexes for stored query: ") + QString::fromUtf8(asString.c_str()) + tr(" differ from current preferences (kept)")); } if (prefs.ssearchAutoPhrase && !fxml.autophrase) { QMessageBox::warning( 0, "Recoll", tr("Autophrase is set but it was unset for stored query")); } else if (!prefs.ssearchAutoPhrase && fxml.autophrase) { QMessageBox::warning( 0, "Recoll", tr("Autophrase is unset but it was set for stored query")); } setSearchString(QString::fromUtf8(fxml.text.c_str())); // We used to use prefs.ssearchTyp here. Not too sure why? // Minimize user surprise factor ? Anyway it seems cleaner to // restore the saved search type searchTypCMB->setCurrentIndex(fxml.mode); return true; } void SSearch::setSearchString(const QString& txt) { m_disableAutosearch = true; m_stroketimeout->stop(); queryText->setEditText(txt); } bool SSearch::hasSearchString() { return !queryText->lineEdit()->text().isEmpty(); } // Add term to simple search. Term comes out of double-click in // reslist or preview. // It would probably be better to cleanup in preview.ui.h and // reslist.cpp and do the proper html stuff in the latter case // (which is different because it format is explicit richtext // instead of auto as for preview, needed because it's built by // fragments?). static const char* punct = " \t()<>\"'[]{}!^*.,:;\n\r"; void SSearch::addTerm(QString term) { LOGDEB("SSearch::AddTerm: [" << ((const char *)term.toUtf8()) << "]\n" ); string t = (const char *)term.toUtf8(); string::size_type pos = t.find_last_not_of(punct); if (pos == string::npos) return; t = t.substr(0, pos+1); pos = t.find_first_not_of(punct); if (pos != string::npos) t = t.substr(pos); if (t.empty()) return; term = QString::fromUtf8(t.c_str()); QString text = queryText->currentText(); text += QString::fromLatin1(" ") + term; queryText->setEditText(text); m_disableAutosearch = true; m_stroketimeout->stop(); } void SSearch::onWordReplace(const QString& o, const QString& n) { LOGDEB("SSearch::onWordReplace: o [" << (qs2utf8s(o)) << "] n [" << (qs2utf8s(n)) << "]\n" ); QString txt = queryText->currentText(); QRegExp exp = QRegExp(QString("\\b") + o + QString("\\b")); exp.setCaseSensitivity(Qt::CaseInsensitive); txt.replace(exp, n); queryText->setEditText(txt); m_disableAutosearch = true; m_stroketimeout->stop(); Qt::KeyboardModifiers mods = QApplication::keyboardModifiers (); if (mods == Qt::NoModifier) startSimpleSearch(); } void SSearch::setAnyTermMode() { searchTypCMB->setCurrentIndex(SST_ANY); } // If text does not end with space, return last (partial) word and >0 // else return -1 int SSearch::partialWord(string& s) { // Extract last word in text QString txt = queryText->currentText(); int cs = txt.lastIndexOf(" "); if (cs == -1) cs = 0; else cs++; if (txt.size() == 0 || cs == txt.size()) { return -1; } s = qs2utf8s(txt.right(txt.size() - cs)); return cs; } // Create completion list for term by adding a joker at the end and calling // rcldb->termMatch(). int SSearch::completionList(string s, QStringList& lst, int max) { if (!rcldb) return -1; if (s.empty()) return 0; // Query database for completions s += "*"; Rcl::TermMatchResult tmres; if (!rcldb->termMatch(Rcl::Db::ET_WILD, "", s, tmres, max) || tmres.entries.size() == 0) { return 0; } for (vector::iterator it = tmres.entries.begin(); it != tmres.entries.end(); it++) { lst.push_back(QString::fromUtf8(it->term.c_str())); } return lst.size(); } // Complete last word in input by querying db for all possible terms. void SSearch::completion() { LOGDEB("SSearch::completion\n" ); m_disableAutosearch = true; m_stroketimeout->stop(); if (!rcldb) return; if (searchTypCMB->currentIndex() == SST_FNM) { // Filename: no completion QApplication::beep(); return; } // Extract last word in text string s; int cs = partialWord(s); if (cs < 0) { QApplication::beep(); return; } // Query database for completions QStringList lst; const int maxdpy = 80; const int maxwalked = 10000; if (completionList(s, lst, maxwalked) <= 0) { QApplication::beep(); return; } if (lst.size() >= maxdpy) { LOGDEB0("SSearch::completion(): truncating list\n" ); lst = lst.mid(0, maxdpy); lst.append("[...]"); } // If list from db is single word, insert it, else popup the listview if (lst.size() == 1) { QString txt = queryText->currentText(); txt.truncate(cs); txt.append(lst[0]); queryText->setEditText(txt); } else { m_savedEditText = queryText->currentText(); m_displayingCompletions = true; m_chosenCompletion.clear(); m_completedWordStart = cs; queryText->clear(); queryText->addItems(lst); queryText->showPopup(); connect(queryText, SIGNAL(activated(const QString&)), this, SLOT(completionTermChosen(const QString&))); } } void SSearch::completionTermChosen(const QString& text) { if (text != "[...]") m_chosenCompletion = text; else m_chosenCompletion.clear(); } void SSearch::wrapupCompletion() { LOGDEB("SSearch::wrapupCompletion\n" ); queryText->clear(); queryText->addItems(prefs.ssearchHistory); if (!m_chosenCompletion.isEmpty()) { m_savedEditText.truncate(m_completedWordStart); m_savedEditText.append(m_chosenCompletion); } queryText->setEditText(m_savedEditText); m_disableAutosearch = true; m_savedEditText.clear(); m_chosenCompletion.clear(); m_displayingCompletions = false; disconnect(queryText, SIGNAL(activated(const QString&)), this, SLOT(completionTermChosen(const QString&))); } #undef SHOWEVENTS #if defined(SHOWEVENTS) const char *eventTypeToStr(int tp) { switch (tp) { case 0: return "None"; case 1: return "Timer"; case 2: return "MouseButtonPress"; case 3: return "MouseButtonRelease"; case 4: return "MouseButtonDblClick"; case 5: return "MouseMove"; case 6: return "KeyPress"; case 7: return "KeyRelease"; case 8: return "FocusIn"; case 9: return "FocusOut"; case 10: return "Enter"; case 11: return "Leave"; case 12: return "Paint"; case 13: return "Move"; case 14: return "Resize"; case 15: return "Create"; case 16: return "Destroy"; case 17: return "Show"; case 18: return "Hide"; case 19: return "Close"; case 20: return "Quit"; case 21: return "ParentChange"; case 131: return "ParentAboutToChange"; case 22: return "ThreadChange"; case 24: return "WindowActivate"; case 25: return "WindowDeactivate"; case 26: return "ShowToParent"; case 27: return "HideToParent"; case 31: return "Wheel"; case 33: return "WindowTitleChange"; case 34: return "WindowIconChange"; case 35: return "ApplicationWindowIconChange"; case 36: return "ApplicationFontChange"; case 37: return "ApplicationLayoutDirectionChange"; case 38: return "ApplicationPaletteChange"; case 39: return "PaletteChange"; case 40: return "Clipboard"; case 42: return "Speech"; case 43: return "MetaCall"; case 50: return "SockAct"; case 132: return "WinEventAct"; case 52: return "DeferredDelete"; case 60: return "DragEnter"; case 61: return "DragMove"; case 62: return "DragLeave"; case 63: return "Drop"; case 64: return "DragResponse"; case 68: return "ChildAdded"; case 69: return "ChildPolished"; case 70: return "ChildInserted"; case 72: return "LayoutHint"; case 71: return "ChildRemoved"; case 73: return "ShowWindowRequest"; case 74: return "PolishRequest"; case 75: return "Polish"; case 76: return "LayoutRequest"; case 77: return "UpdateRequest"; case 78: return "UpdateLater"; case 79: return "EmbeddingControl"; case 80: return "ActivateControl"; case 81: return "DeactivateControl"; case 82: return "ContextMenu"; case 83: return "InputMethod"; case 86: return "AccessibilityPrepare"; case 87: return "TabletMove"; case 88: return "LocaleChange"; case 89: return "LanguageChange"; case 90: return "LayoutDirectionChange"; case 91: return "Style"; case 92: return "TabletPress"; case 93: return "TabletRelease"; case 94: return "OkRequest"; case 95: return "HelpRequest"; case 96: return "IconDrag"; case 97: return "FontChange"; case 98: return "EnabledChange"; case 99: return "ActivationChange"; case 100: return "StyleChange"; case 101: return "IconTextChange"; case 102: return "ModifiedChange"; case 109: return "MouseTrackingChange"; case 103: return "WindowBlocked"; case 104: return "WindowUnblocked"; case 105: return "WindowStateChange"; case 110: return "ToolTip"; case 111: return "WhatsThis"; case 112: return "StatusTip"; case 113: return "ActionChanged"; case 114: return "ActionAdded"; case 115: return "ActionRemoved"; case 116: return "FileOpen"; case 117: return "Shortcut"; case 51: return "ShortcutOverride"; case 30: return "Accel"; case 32: return "AccelAvailable"; case 118: return "WhatsThisClicked"; case 120: return "ToolBarChange"; case 121: return "ApplicationActivated"; case 122: return "ApplicationDeactivated"; case 123: return "QueryWhatsThis"; case 124: return "EnterWhatsThisMode"; case 125: return "LeaveWhatsThisMode"; case 126: return "ZOrderChange"; case 127: return "HoverEnter"; case 128: return "HoverLeave"; case 129: return "HoverMove"; case 119: return "AccessibilityHelp"; case 130: return "AccessibilityDescription"; case 150: return "EnterEditFocus"; case 151: return "LeaveEditFocus"; case 152: return "AcceptDropsChange"; case 153: return "MenubarUpdated"; case 154: return "ZeroTimerEvent"; case 155: return "GraphicsSceneMouseMove"; case 156: return "GraphicsSceneMousePress"; case 157: return "GraphicsSceneMouseRelease"; case 158: return "GraphicsSceneMouseDoubleClick"; case 159: return "GraphicsSceneContextMenu"; case 160: return "GraphicsSceneHoverEnter"; case 161: return "GraphicsSceneHoverMove"; case 162: return "GraphicsSceneHoverLeave"; case 163: return "GraphicsSceneHelp"; case 164: return "GraphicsSceneDragEnter"; case 165: return "GraphicsSceneDragMove"; case 166: return "GraphicsSceneDragLeave"; case 167: return "GraphicsSceneDrop"; case 168: return "GraphicsSceneWheel"; case 169: return "KeyboardLayoutChange"; case 170: return "DynamicPropertyChange"; case 171: return "TabletEnterProximity"; case 172: return "TabletLeaveProximity"; default: return "UnknownEvent"; } } #endif bool SSearch::eventFilter(QObject *target, QEvent *event) { #if defined(SHOWEVENTS) if (event->type() == QEvent::Timer || event->type() == QEvent::UpdateRequest || event->type() == QEvent::Paint) return false; LOGDEB2("SSearch::eventFilter: target " << (target) << " (" << (queryText->lineEdit()) << ") type " << (eventTypeToStr(event->type())) << "\n" ); #endif if (target == queryText->view()) { if (event->type() == QEvent::Hide) { // List was closed. If we were displaying completions, need // to reset state. if (m_displayingCompletions) { QTimer::singleShot(0, this, SLOT(wrapupCompletion())); } } return false; } if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = (QKeyEvent *)event; LOGDEB1("SSearch::eventFilter: keyPress (m_escape " << (m_escape) << ") key " << (ke->key()) << "\n" ); if (ke->key() == Qt::Key_Escape) { LOGDEB("Escape\n" ); m_escape = true; m_disableAutosearch = true; m_stroketimeout->stop(); return true; } else if (m_escape && ke->key() == Qt::Key_Space) { LOGDEB("Escape space\n" ); ke->accept(); completion(); m_escape = false; m_disableAutosearch = true; m_stroketimeout->stop(); return true; } else if (ke->key() == Qt::Key_Space) { if (prefs.ssearchOnWS) startSimpleSearch(); } else { m_escape = false; m_keystroke = true; if (prefs.ssearchAsYouType) { m_disableAutosearch = false; QString qs = queryText->currentText(); LOGDEB0("SSearch::eventFilter: start timer, qs [" << (qs2utf8s(qs)) << "]\n" ); m_stroketimeout->start(strokeTimeoutMS); } } } return false; } recoll-1.23.7/qtgui/recoll.qrc0000644000175000017500000000103113125527323013123 00000000000000 images/asearch.png images/cancel.png images/close.png images/code-block.png images/history.png images/nextpage.png images/prevpage.png images/firstpage.png images/sortparms.png images/spell.png images/table.png images/up.png images/down.png images/recoll.png recoll-1.23.7/qtgui/i18n/0000755000175000017500000000000013224670235012001 500000000000000recoll-1.23.7/qtgui/i18n/recoll_ru.qm0000644000175000017500000025033413224431020014240 00000000000000<¸dÊÍ!¿`¡½ÝBH+éï-ê¯C+;õG¤6H,Š*H,Ç;HYÇfIA«'Zl¹­mb¾¼^$˜•̤¦yhº¨¥¶1¶E‘GÐD žÙ] Î ½ÏÝLô¼hLôÊ¥VE˜3VEÈf¾¼šlÀ­ÖxÆÊؘÅ7 ¬ÒݬôY¬ô¤4Eî<$—ÁÁ'Hä¾ß*Ð%¥Ã*ì0¦œ+Lôd¬+f¾vŒ1øý:Îd¢¾AVŽxG…Ô78Gߪ-H6óÌJH6õÌwJ+‚fHJ+‚IJJ6• ÄJ6•à8L™b’MzÊwPh¨·ñSŠ˜ÌÔS¸¹ØÓT°5¸ŸWTi WÈÕ˜iXÉÄ8/Z0ƒ3Á[ %¹x\ƒµÓe®f¼gwîÂsºñsºñ¢üv8“™Év®Âv®Â£\zϳ…€€£$¤„j† Œ!þk—¤´Þ´0œ ÍÜéªJ B®½Þ(ܯfSÝ϶Êð…¾º° ìÃÞÀÐùƒ¢CÐùƒÓhÐùƒÝNãnžýgt Í:•4Õ EµŸ©nô²»ô²50,… ·;¸sÑÞ>.cpÁDo2“ÞN›ÆXM¹0+X®©3`Þ^ºŠhˆ¸5†lÿtÇÒnÚk¢wñ…¸fwñ…߀üÞ¦:‘v㯕ñ“pv¢‰ÿ†£cêáÎxClÞñƒröëͺø`ó L‰ìþSIÃÈÿµ ÿØ…Î_ çq-p#Bvå½;v奷8w 5·uw 5Ñw 5Ç•wî·°ŒU·Ÿ.ˆw£¹Þ潩ֳÓ6ª6•˧¯†”‡©»f3¨{ͼu0øÐgžªÐgž£…ÔÂõg!׸~òOì;U0ï¡©4{úUh8úeî¿ ¬@æ!D9£&Á'Ž.‡NsÞ=úd:?úd½åG$ß…JUY÷JUY»áY ôÑ[–ujR_nÎǺ™=°u)Ç–Ê·Œ‘¢¯¢Ê—¥HÊ—¥£'ÎÅå3*Ôä^-KÝôL#žæõÎí%ìx 6ùJg(œþA¢´¶þŠ¥1”ÿ%´ÕÿAîÔB `÷<.„_çÞÄYõ³Aëd³Ð;[¾Í <Äö¿ÍLƒàõNB™ß>XË4•ªe 2–…vhÕ舀㇋£…(PŒ$Œ¯b¶’"3 ¿’ZÓ Î˜I¼6I˜I¼f™n• ™n•Ëtšß¤”ƒŸf•Ö¢Ÿf•鯟f•!«©O«Äç¬,¥6}¯ƒW4Á¯ƒWb¯Äy%2#Äy%)7΄՜%Ð: ¸Ú#)sãX|ûråõW1 Ì” Di¾0iË  -Z -¼µ )ÖT8ìB9€ oBìSɧk¶Þ­¤oˆ•É:r?)¹Örž‰¥|ôòu„kåww‹¦,¯ ‹ÜðÑ¥ŒÇ<¨¹";“›ˆ˜Æ¸›ˆ˜ËD¦AS|ªÃ¢›4·¨ Á‡·¨ ÔÞ»œRÍZÇ¢•wÃ×I^«àØ~C¨èêÈ‘Ðéã>a€ðŒµ<®`³®”Mð8ƒ$è" ÆêUKô:sp hbu9N6v2ãhö–T#k—BfyšK¦ %9¦©n¦Õ¦öõ4¨«‡ ™¶7¾f€ÅÄÅ^êIÄÖ[–¶ÊXÔ‚ënD†üðw)ÉlþÛC«!vôÛ#+ä=7I^¥ò<ˆ~ÓâFW#È@F¯N%ÎH:"v½_guKÀapä÷@f 6³|§N:ŒÍwwAŒÏ—¼Ènº “’ž™Åó̦š´£Ã²ð x¾l¯šÓtêÓt£ÿÈàˆ=Ɇt@…â]85BåÅ •éŽ#°îñÐÈ3c,öyäB:uî4 Gñî:ÙJýnïüQçÇoN}}n߀;EÀå”ò“=J¨0ΩÔÕ8h¬¨”ã½°cànÄÆwÈ@ÃÍ©ÊÁ§ÓÌí³dÛͳ½×°‹JÝÜäœc øä´¥‡úæí:?î?À’~ö¨å kú ÃA, ´H¤£ -(5Ñ 9ZyÆ ;´3”' D©õì K¨ó­4 ]#——W c‡Cz! k¨µkL lMˆbà ‰Œî?i ŸÁòy! £qDÍî «ƒÔµÉ ­îV ®œ¯$ý ²9þl ü>5ö ä3‘s äîlj íåõ \ *NiF :^Õ¶ Üc  *R3g +<” „ 6  G.~KQ `P•X `ç£ a·E«P c·E«˜ d8Þ€ ygí ˜Iœº ¤žû­ ®VT÷Ô ²ëCx] Äã¼1 âæçªÄ æõçª^ ®© ®ù©Ö Ô… | ye1ì THz ŽÚe ,xƒb =!P Kj×¹. h¹°eN ’þƒÏ ™÷žæ éþ÷ £Ü j½ ¨Î£¬% ¬rx »ïµŽk Ù·å® Û·å®K ÛÓ!> ?¾.Î Vd”û 'И¨ý +bCy¸ /¥– 97Ã! 9ɘš L*¿i PÖ™‰d RVŽ  T#s‘ Vü Ñ \iC7‘ ]æùå `F¥ ù hôî¿ v—¥šó {l5@ €!Yš˜ €!Y½Š ‚W屩 ŠŠO Œïõ±N ¬æà†Å ¹iÉö– ÓÍ® Ú÷Ò” Ýøì é—~-ª õ­NßÑ ö†ÀËÛ m£¸" 'RçL& -èô¸Ô 8þ FÁ“š OE°JÚ ]„Ä7D ]„Äá@ uò0°° y·Û y¹~ ‚±3 …È©#+ ‡uÄ ‡uÖÚ ‰P‰. ‰P¢ 5d2u ¤š„—× ¬Š©1K ½ý7^Ö ÇòÞ!ž ÊÕ’4ò ÕH > ÛQ5æ* û£ÒD q©¥^€-%Ýnz”/¸.Å8bóÑW9µ¯<<Þ>N8óQá~6yW"ùv7Y~s¨![žs´_\Н2We3¬ªg3¬ïpû~_!Õ à™³#ì!­c‹»m€Àp¿­c’Â|“sDÂ|“;<ÎÁ'›ló l¤^ü©Ü´ü¶LôiAzA5 ?>;O All clauses AdvSearchN1>5 ?>;5 Any clause AdvSearchX525@=K9 ACDD8:A <=>68B5;O 2 D8;LB@5 @07<5@0$Bad multiplier suffix in size filter AdvSearch<C;LB8<5480media AdvSearchA>>1I5=8Omessage AdvSearch8=>5other AdvSearch?@575=B0F88 presentation AdvSearchB01;8FK spreadsheet AdvSearchB01;8FK spreadsheets AdvSearch B5:ABtext AdvSearch B5:ABKtexts AdvSearch<----- A5 <----- All AdvSearchBase<----- -B8 <----- Sel AdvSearchBase>1028BL ?>;5 Add clause AdvSearchBase!;>6=K9 ?>8A:Advanced search AdvSearchBaseA5 ----> All ----> AdvSearchBaseÖA5 =5?CABK5 ?>;O A?@020 1C4CB >1J548=5=K ;>38G5A:8<  ("2A5 A;>20") 8;8  (";N1>5 A;>2>"). <br>>;O B8?0 ";N1K5", "2A5" 8;8 "157 MB8E" ?@8=8<0NB =01>@ ?@>ABKE A;>2 8 D@07K, 70:;NGQ==K5 2 42>9=K5 :02KG:8.<br>CABK5 ?>;O 83=>@8@CNBAO.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase@>A<>B@Browse AdvSearchBase> :0B53>@8O< By categories AdvSearchBase::;NG8BL D8;LB@>20=85 ?> 40B5'Check this to enable filtering on dates AdvSearchBase6$8;LB@>20BL ?> B8?0< D09;>2,Check this to enable filtering on file types AdvSearchBase@:;NG8BL D8;LB@>20=85 ?> @07<5@C'Check this to enable filtering on sizes AdvSearchBaseLA?>;L7>20BL :0B53>@88, 0 =5 B8?K MIME;Check this to use file categories instead of raw mime types AdvSearchBase0:@KBLClose AdvSearchBase#1@0BL ?>;5 Delete clause AdvSearchBase:2548B5 :0B0;>3 =0G0;0 ?>8A:0Enter top directory for search AdvSearchBase $8;LB@Filter AdvSearchBase($8;LB@>20=85 ?> 40B5 Filter dates AdvSearchBase.$8;LB@>20=85 ?> @07<5@C Filter sizes AdvSearchBase 09B8Find AdvSearchBaseBFrom AdvSearchBase3=>@8@C5<K5Ignored file types AdvSearchBase1@0B8BLInvert AdvSearchBase0:A. @07<5@ Max. Size AdvSearchBasex0:A. @07<5@. >6=> 8A?>;L7>20BL k/K, m/M, g/G :0: <=>68B5;84Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase8=. @07<5@ Min. Size AdvSearchBase„8=8<0;L=K9 @07<5@. >6=> 8A?>;L7>20BL k/K, m/M, g/G :0: <=>68B5;84Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase,3@0=8G8BL B8?K D09;>2Restrict file types AdvSearchBase2A:0BL B>;L:> 2 :0B0;>35:%Restrict results to files in subtree: AdvSearchBase.!>E@0=8BL :0: C<>;G0=85Save as default AdvSearchBaseRA:0BL <br>4>:C<5=BK,<br>C4>2;5B2>@ONI85:'Search for
documents
satisfying: AdvSearchBaseA:><K5Searched file types AdvSearchBase-B8 ----> Sel -----> AdvSearchBase0G0BL ?>8A: Start Search AdvSearchBase>To AdvSearchBaseŽ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0A?8A0=85 ?0:5B=>3> 8=45:A8@>20=8O <span style=" font-weight:600;">Recoll</span> (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">064>5 ?>;5 <>65B A>45@60BL H01;>= (*), >4=> G8A;5==>5 7=0G5=85, A?8A>: G5@57 70?OBCN (1,3,5) 8;8 480?07>= (1-7). -B8 ?>;O 1C4CB 8A?>;L7>20=K <span style=" font-style:italic;">:0: 5ABL</span> 2 D09;5 crontab, 4;O >7=0:><;5=8O A ?>;=K< A8=B0:A8A>< :>B>@>3> A<. crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />0?@8<5@, 22>4 <span style=" font-family:'Courier New,courier';">*</span> 4;O <span style=" font-style:italic;">=8</span>, <span style=" font-family:'Courier New,courier';">12,19</span> 4;O <span style=" font-style:italic;">'0AK</span> 8 <span style=" font-family:'Courier New,courier';">15</span> 4;O <span style=" font-style:italic;">8=CBK</span> 70?CAB8B recollindex 5654=52=> 2 12:15 8 19:15.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> 0A?8A0=85 A >G5=L G0ABK<8 70?CA:0<8 <>65B >:070BLAO <5=55 MDD5:B82=K<, G5< 8=45:A8@>20=85 2 @50;L=>< 2@5<5=8.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

 CronToolW80;>3 Cron Cron Dialog CronToolWZ=8 =545;8 (* 8;8 0-7, 0 8;8 7 - 2>A:@5A5=L5))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWK:;NG8BLDisable CronToolW:;NG8BLEnable CronToolWnH81:0 CAB0=>2:8 70?8A8 cron. 525@=K9 A8=B0:A8A ?>;59?3Error installing cron entry. Bad syntax in fields ? CronToolW"'0AK (* 8;8 0-23)Hours (* or 0-23) CronToolW¦>E>65, GB> 4;O recollindex 5ABL 2@CG=CN ?@02;5=K5 70?8A8, =5 1C45< B@>30BL crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolW8=CBK (0-59)Minutes (0-59) CronToolW 80;>3Dialog EditDialog&H81:0 :>=D83C@0F88 Config error EditTrans>:0;L=K9 ?CBL Local path EditTrans 7=0G0;L=K9 ?CBL Original path EditTransAE>4=K9 ?CBL Source path EditTrans>1028BLAdd EditTransBase B<5=0Cancel EditTransBase#40;8BLDelete EditTransBase&>@@5:B8@>2:0 ?CB59Path Translations EditTransBase!>E@0=8BLSave EditTransBase²K15@8B5 B8?K D09;>2 8 8A?>;L7C9B5 :=>?:8 =865, GB>1K 87<5=8BL B>, :0: >=8 >1@010BK20NBAOkSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBase0040BL :>@@5:B8@>2:C 4;OSetting path translations for  EditTransBase Ú<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">>E>65, GB> 8=45:A 4;O MB>9 :>=D83C@0F88 =5 ACI5AB2C5B.</span><br /><br />A;8 =04> ?@>8=45:A8@>20BL 4><0H=89 :0B0;>3 A =01>@>< @07C<=KE C<>;G0=89, =06<8B5 :=>?:C <span style=" font-style:italic;">0?CAB8BL 8=45:A8@>20=85</span>. >4@>1=>AB8 <>6=> 1C45B CB>G=8BL ?>765. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A;8 B@51C5BAO 1>;LH5 :>=B@>;O, 2>A?>;L7C9B5AL AAK;:0<8 4;O CB>G=5=8O :>=D83C@0F88 8 @0A?8A0=8O 8=45:A8@>20=8O.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-B>B 8=AB@C<5=B0@89 4>ABC?5= 2 ;N1>5 2@5<O ?>A@54AB2>< <5=N <span style=" font-style:italic;">0AB@>9:8</span>.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

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

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

RTIToolWf"0:65 70?CAB8BL A;C61C 8=45:A8@>20=8O ?@O<> A59G0A.%Also start indexing daemon right now.RTIToolWh$09; 02B>70?CA:0 C40;Q=. AB0=>28BL B5:CI89 ?@>F5AA?2Autostart file deleted. Kill current process too ?RTIToolW"5 <>3C A>740BL: Can't create: RTIToolW@52>7<>6=> 70?CAB8BL recollindexCould not execute recollindexRTIToolW#40;ON D09; Deleting fileRTIToolW#40;ON:  Deleting: RTIToolWn2B><0B8G5A:89 70?CA: 8=45:A8@>20=8O 2 @50;L=>< 2@5<5=8"Real time indexing automatic startRTIToolW"#18@0N 02B>70?CA:Removing autostartRTIToolW0<5=ON D09;Replacing fileRTIToolW0<5=ON:  Replacing: RTIToolWl0?CA:0BL A;C61C 8=45:A8@>20=8O 2<5AB5 A <>59 A5AA859..Start indexing daemon with my desktop session.RTIToolWAB>@>6=>WarningRTIToolW(2A5 O7K:8)(all languages)RclMain(157 A;>2>D>@<) (no stemming)RclMain ?@>3@0<<5 About RecollRclMain2A5AllRclMainœ525@=0O :><0=4=0O AB@>:0 ?@>3@0<<K ?@>A<>B@0 %1: [%2] @>25@LB5 D09; mimeviewCBad viewer command line for %1: [%2] Please check the mimeview fileRclMain*5B 4>ABC?0 : D09;C: Can't access file: RclMainJ52>7<>6=> A>740BL >:=> ?@54?@>A<>B@0Can't create preview windowRclMain:52>7<>6=> @0A?0:>20BL D09;: Can't uncompress file: RclMain`5 <>3C >1=>28BL 8=45:A: 8=45:A0B>@ C65 B@C48BAO#Can't update index: indexer runningRclMainl52>7<>6=> 872;5GL 4>:C<5=B 8;8 A>740BL 2@5<5==K9 D09;0Cannot extract document or create temporary fileRclMainL52>7<>6=> =09B8 @>48B5;LA:89 4>:C<5=BCannot find parent documentRclMainZ52>7<>6=> 872;5GL 8=D>@<0F8N 4>:C<5=B0 87 +Cannot retrieve document info from databaseRclMain0:@K20NClosingRclMainb@>8=45:A8@>20=> A>45@60=85 A;54CNI8E MIME-B8?>2:.Content has been indexed for these mime types:RclMain¨5 C40;>AL >B:@KBL 2=5H=89 8=45:A.  =5 >B:@KB0. @>25@LB5 A?8A>: 2=5H=8E 8=45:A>2.HCould not open external index. Db not open. Check external indexes list.RclMain$AB>@8O 4>:C<5=B>2Document historyRclMain >B>2>DoneRclMain.C1;8@>20==K5 4>:C<5=BKDuplicate documentsRclMain!B8@0N 8=45:A Erasing indexRclMain H81:0ErrorRclMainK?>;=ON: [ Executing: [RclMain"@51C5<K5 2=5H=85 ?@>3@0<<K 4;O 20H8E B8?>2 D09;>2 =5 =0945=K: A<. D09; pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMain0==K5 8AB>@88 History dataRclMainH81:0 70?@>A0Index query errorRclMain.=45:A8@C5<K5 MIME-B8?KIndexed MIME TypesRclMainD=45:A8@>20=85 ?>:0 =5 2K?>;=O;>ALIndexing did not run yetRclMain2=45:A8@>20=85 =5 C40;>ALIndexing failedRclMain =45:A8@>20=85: Indexing in progress: RclMain.=45:A8@>20=85 ?@5@20=>Indexing interruptedRclMainJ54>AB0NI85 2A?><>30B5;L=K5 ?@>3@0<<KMissing helper programsRclMain>=8B>@MonitorRclMainX5 C:070=0 2=5H=OO ?@>3@0<<0 ?@>A<>B@0 4;O [-No external viewer configured for mime type [RclMainLA5 2A?><>30B5;L=K5 ?@>3@0<<K 4>ABC?=KNo helpers found missingRclMain0>8A: =5 40; @57C;LB0B>2No results foundRclMainBACBAB2C5BNoneRclMainG8AB8BLPurgeRclMain®0?@>A >1@010BK205BAO.<br>7-70 >3@0=8G5=89 181;8>B5:8<br>>AB0=>2 ?@5@2QB 2AN ?@>3@0<<CeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain" 57C;LB0BK ?>8A:0 Query resultsRclMain@1=C;8BL 8=45:A 8 =0G0BL 70=>2>?(Reset the index and start from scratch ?RclMain, 57C;LB0B>2 (?@8<5@=>)Result count (est.)RclMain!>E@0=8BL D09; Save fileRclMain070 :>@=59StemdbRclMain0&@5@20BL 8=45:A8@>20=85Stop &IndexingRclMain&;>65==K5 4>:C<5=BKSub-documents and attachmentsRclMainô"5:CI89 ?@>F5AA 8=45:A8@>20=8O =5 1K; 70?CI5= 87 MB>3> 8=B5@D59A0. 06<8B5 OK 4;O >AB0=>20 8;8 B<5=8BL, GB>1 @01>B0; A515yThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain´@>3@0<<0 ?@>A<>B@0, C:070==0O 2 mimeview 4;O %1: %2, =5 =0945=0. B:@KBL 480;>3 =0AB@>5:?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainz0==K5 URL ( | 8=45:A=K5 ?CB8) 8<5NB >4=> 8 B> 65 A>45@68<>5:-These Urls ( | ipath) share the same content:RclMain2-B>B ?>8A: C65 =5 0:B825="This search is not active any moreRclMain58725AB=>UnknownRclMain 1=>28BL &8=45:A Update &IndexRclMain1=>2;ONUpdatingRclMainÔ><0=4=0O AB@>:0 ?@>3@0<<K ?@>A<>B@0 4;O %1 A>45@68B :0: A0< D09;, B0: 8 @>48B5;O: B0:>5 =5 ?>445@68205BAOQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainAB>@>6=>WarningRclMain<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languagesRclMainD8;LB@>20==>5filteredRclMain <5480mediaRclMainA>>1I5=8OmessageRclMain8=>5otherRclMain?@575=B0F88 presentationRclMainA>@B8@>20==>5sortedRclMainB01;8FK spreadsheetRclMain B5:ABtextRclMain& ?@>3@0<<5 &About Recoll RclMainBase&!;>6=K9 ?>8A:&Advanced Search RclMainBase8&G8AB8BL 8AB>@8N 4>:C<5=B>2&Erase document history RclMainBase0G8AB8BL 8AB>@8N &?>8A:0&Erase search history RclMainBase &$09;&File RclMainBase> 25AL &M:@0= &Full Screen RclMainBase0>=D83C@0F8O 8&=B5@D59A0&GUI configuration RclMainBase&>4A:07:0&Help RclMainBase8>=D83C@0F8O &8=45:A8@>20=8O&Index configuration RclMainBase&0AB@>9:8 &Preferences RclMainBase$5@5&8=45:A8@>20BL&Rebuild index RclMainBase&!?8A>: &@57C;LB0B>2&Results RclMainBase*&0@0<5B@K A>@B8@>2:8&Sort parameters RclMainBase&=AB@C<5=BK&Tools RclMainBase& C:>2>4AB2> &User manual RclMainBase!;>6=K9 ?>8A:Advanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$AB>@8O 4>:C<5=B>2Document History RclMainBase&&AB>@8O 4>:C<5=B>2Document &History RclMainBase &KE>4E&xit RclMainBase080;>3 &2=5H=53> 8=45:A0E&xternal index dialog RclMainBase.80;>3 2=5H=53> 8=45:A0External index dialog RclMainBaseF11F11 RclMainBase5@20O AB@0=8F0 First Page RclMainBase5@20O AB@0=8F0 First page RclMainBase> 25AL M:@0= Full Screen RclMainBaseJ5@59B8 : ?5@2>9 AB@0=8F5 @57C;LB0B>2Go to first page of results RclMainBase!;54. AB@0=8F0 Next Page RclMainBase!;54. AB@0=8F0 Next page RclMainBase<!;54CNI0O AB@0=8F0 @57C;LB0B>2Next page of results RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBase@54. AB@0=8F0 Previous Page RclMainBase@54. AB@0=8F0 Previous page RclMainBase>@54K4CI0O AB@0=8F0 @57C;LB0B>2Previous page of results RclMainBase RecollRecoll RclMainBase(!>E@0=8BL 2 CSV-D09;Save as CSV (spreadsheet) file RclMainBase®!>E@0=8BL @57C;LB0BK 2 B5:AB>2K9 D09; A @0745;8B5;O<8, >B:@K205<K9 :0: B01;8F0 2 Office@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift-PgUp Shift+PgUp RclMainBase.>:070BL 45B0;8 70?@>A0Show Query Details RclMainBase.>:070BL 2 2845 B01;8FK Show as table RclMainBaseD>:070BL @57C;LB0BK 2 2845 B01;8FK(Show results in a spreadsheet-like table RclMainBaseL!>@B8@>20BL ?> 40B0< >B =>2KE : AB0@K<Sort by date, newest first RclMainBaseL!>@B8@>20BL ?> 40B0< >B AB0@KE : =>2K<Sort by date, oldest first RclMainBaseL!>@B8@>20BL ?> 40B0< >B =>2KE : AB0@K<#Sort by dates from newest to oldest RclMainBaseL!>@B8@>20BL ?> 40B0< >B AB0@KE : =>2K<#Sort by dates from oldest to newest RclMainBase(0@0<5B@K A>@B8@>2:8Sort parameters RclMainBase&02830B>@ &B5@<8=>2Term &explorer RclMainBase@=AB@C<5=B 8AA;54>20=8O B5@<8=>2Term explorer tool RclMainBase 1=>28BL &8=45:A Update &index RclMainBaseK45@6:0Abstract RecollModel 2B>@Author RecollModel0B0Date RecollModel0B0 8 2@5<O Date and time RecollModel0B0 4>:C<5=B0 Document date RecollModel  07<5@ 4>:C<5=B0 Document size RecollModel0B0 D09;0 File date RecollModel<O D09;0 File name RecollModel 07<5@ D09;0 File size RecollModel I-?CBLIpath RecollModel;NG52K5 A;>20Keywords RecollModel"8? MIME MIME type RecollModel7<5=5=>Mtime RecollModel$AE>4=0O :>48@>2:0Original character set RecollModel 5;520=B=>ABLRelevancy rating RecollModel0720=85Title RecollModelURLURL RecollModel"(?>:070BL 70?@>A) (show query)ResList0<p><b>5 =0945=></b><br>

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

Alternate spellings (accents suppressed): ResListJ<p><i>;LB5@=0B82=0O >@D>3@0D8O: </i>

Alternate spellings: ResList$AB>@8O 4>:C<5=B>2Document historyResList>:C<5=BK DocumentsResList!;54CNI0ONextResListB:@KBLOpenResList@54?@>A<>B@PreviewResList@54K4CI0OPreviousResList&>4@>1=>AB8 70?@>A0 Query detailsResList, 57C;LB0B>2 (?@8<5@=>)Result count (est.)ResList$!?8A>: @57C;LB0B>2 Result listResList$@03<5=BKSnippetsResList&>:C<5=B =54>ABC?5=Unavailable documentResList?>forResList87 <8=8<C<out of at leastResList &#40;8BL AB>;15F&Delete columnResTable<&!1@>A8BL ?0@0<5B@K A>@B8@>2:8 &Reset sortResTable$&!>E@0=8BL :0: CSV &Save as CSVResTable*>1028BL :>;>=:C "%1"Add "%1" columnResTable@5 C40;>AL >B:@KBL/A>740BL D09;:Can't open/create file: ResTable8!>E@0=8BL B01;8FC 2 CSV-D09;Save table to CSV fileResTableA5 A;>20 All termsSSearchN1>5 A;>2>Any termSSearch.525@=0O AB@>:0 70?@>A0Bad query stringSSearch42548B5 <0A:C 8<5=8 D09;0.$Enter file name wildcard expression.SSearch 2548B5 ?>8A:>2K5 A;>20. >6=> =060BL Esc-?@>15; 4;O 4>?>;=5=8O B5:CI53> A;>20.FEnter search terms here. Type ESC SPC for completions of current term.SSearch<O D09;0 File nameSSearch&54>AB0B>G=> ?0<OB8 Out of memorySSearch/7K: 70?@>A0Query languageSSearch&K15@8B5 B8? ?>8A:0Choose search type. SSearchBaseG8AB8BLClear SSearchBase Ctrl+SCtrl+S SSearchBase 2548B5 ?>8A:>2K5 A;>20. >6=> =060BL Esc-?@>15; 4;O 4>?>;=5=8O B5:CI53> A;>20.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase&G8AB8BL ?>;5 22>40Erase search entry SSearchBaseSSearchBase SSearchBase SSearchBase A:0BLSearch SSearchBase&@8ABC?8BL : ?>8A:C Start query SSearchBase2A5All SearchClauseW ;N1>5Any SearchClauseW8<O D09;0 File name SearchClauseW5 8A?. ?>;ONo field SearchClauseW157None SearchClauseW>;8G5AB2> 4>?>;=8B5;L=KE A;>2, :>B>@K5 <>3CB >:070BLAO <564C 2K1@0==K<8HNumber of additional words that may be interspersed with the chosen ones SearchClauseW D@070Phrase SearchClauseW1;87>ABL Proximity SearchClauseWpK15@8B5 B8? 70?@>A0, :>B>@K9 1C45B ?@>87254Q= ?> A;>20<>Select the type of query that will be performed with the words SearchClauseW 09B8:Find:Snippets!;54CNI0ONextSnippets@54K4CI0OPrevSnippets$@03<5=BKSnippetsSnippets A:0BLSearch SnippetsW@>A<>B@BrowseSpecIdxW&0:@KBL&Close SpellBase& 0A:@KBL &Expand  SpellBaseC40@5=8OAccents SpellBase Alt+CAlt+C SpellBase Alt-EAlt+E SpellBase@538AB@Case SpellBase#G8BK20BLMatch SpellBase(5B 8=D>@<0F88 > . No db info. SpellBase$02830B>@ B5@<8=>2 Term Explorer SpellBase %1 @57C;LB0B(>2) %1 resultsSpellW<!@54=55 G8A;> A;>2 2 4>:C<5=B5Average terms per documentSpellW6 07<5@ :0B0;>30 107K 40==KEDatabase directory sizeSpellW>:. / A53> Doc. / Tot.SpellW†=45:A: %1 4>:C<5=B(>2), A@54=OO 4;8=0 %2 A;>2(>). %3 @57C;LB0B(>2)7Index: %1 documents, average length %2 terms.%3 resultsSpellW-;5<5=BItemSpellWr!?8A>: 1K; >1@570= 2 0;D028B=>< ?>@O4:5, =5:>B>@K5 G0ABK51List was truncated alphabetically, some frequent SpellWMIME-B8?K: MIME types:SpellW( 0A:@KB85 =5 =0945=>No expansion foundSpellW '8A;> 4>:C<5=B>2Number of documentsSpellW 532K@065=85RegexpSpellW6>:070BL AB0B8AB8:C 8=45:A0Show index statisticsSpellW$0?8A0=85/D>=5B8:0Spelling/PhoneticSpellW  0A:@KB85 >A=>2KStem expansionSpellW !;>2>TermSpellW=0G5=85ValueSpellW(01;>=K WildcardsSpellW<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languagesSpellWvA;>20 <>3CB >BACBAB2>20BL. >?@>1C9B5 1>;55 4;8==K9 :>@5=L..terms may be missing. Try using a longer root.SpellWA5 A;>20 All terms UIPrefsDialogN1>5 A;>2>Any term UIPrefsDialogR!;54C5B 2K18@0BL =5 1>;LH5 >4=>3> 8=45:A0$At most one index should be selected UIPrefsDialogŒ52>7<>6=> 4>1028BL 8=45:A A 4@C38<8 =0AB@>9:0<8 @538AB@0 8 480:@8B8:8>Cant add index with different case/diacritics stripping option UIPrefsDialogK15@8B5Choose UIPrefsDialog/7K: 70?@>A0Query language UIPrefsDialog`03>;>2>: A?8A:0 @57C;LB0B>2 (?> C<>;G0=8N ?CAB)%Result list header (default is empty) UIPrefsDialog¬$>@<0B 0170F0 2 A?8A:5 @57C;LB0B>2 (>G8AB8B5, GB>1K 25@=CBLAO : 20@80=BC ?> C<>;G0=8N)3 :>=D83C@0F88 Recoll 8;8 8=45:A0 Xapian (=0?@8<5@, /home/O/.recoll 8;8 /home/?@8OB5;L/.recoll/xapiandb)nSelect recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) UIPrefsDialogVK1@0==K9 :0B0;>3 =5 ?>E>6 =0 8=45:A Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogD-B>B :0B0;>3 C65 2 A?8A:5 8=45:A>23The selected directory is already in the index list UIPrefsDialogÀK1@0==K9 :0B0;>3 2K3;O48B :0: :0B0;>3 :>=D83C@0F88 Recoll, => =0AB@>9:8 =5 <>3CB 1KBL ?@>G8B0=KjThe selected directory looks like a Recoll configuration directory but the configuration could not be read UIPrefsDialog&-B> 3;02=K9 8=45:A!This is the main/local index! UIPrefsDialog<>H81:0 ?>;CG5=8O A?8A:0 O7K:>2#error retrieving stemming languages UIPrefsDialogd7<5=5=85 70?8A59 A @07;8G=K<8 B5:CI8<8 7=0G5=8O<8.Changing entries with different current values ViewAction><0=40Command ViewAction$7OBL 87 >:@C65=8ODesktop Default ViewAction"8? MIME MIME type ViewActionP59AB285 (?CAB> -> 20@80=B ?> C<>;G0=8N) Action (empty -> recoll default)ViewActionBase*@8<5=8BL : 2K45;5=8NApply to current selectionViewActionBase0:@KBLCloseViewActionBaseD5@5>?@545;8BL =0AB@>9:8 >:@C65=8O Exception to Desktop preferencesViewActionBase >4=K5 2LN5@KNative ViewersViewActionBase²K15@8B5 B8?K D09;>2 8 8A?>;L7C9B5 :=>?:8 =865, GB>1K 87<5=8BL B>, :0: >=8 >1@010BK20NBAOkSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBase®K15@8B5 MIME-B8?K 8 8A?>;L7C9B5 :=>?:8 =865, GB>1K 87<5=8BL B>, :0: >=8 >1@010BK20NBAOlSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBase@A?>;L7>20BL =0AB@>9:8 >:@C65=8O"Use Desktop preferences by defaultViewActionBaseÄ:;NG05B 8=45:A8@>20=85 AB@0=8F, >B:@K202H8EAO 2 Firefox.<br>(=C6=> 4>?>;=5=85 Recoll 4;O Firefox)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelWL0:A8<0;L=K9 @07<5@ web-E@0=8;8I0 () Max. size for the web store (MB)confgui::ConfBeaglePanelWH1@010BK20BL ?>A5IQ==K5 web-AB@0=8FKProcess the WEB history queueconfgui::ConfBeaglePanelW <O :0B0;>30 4;O E@0=5=8O :>?89 ?>A5IQ==KE web-AB@0=8F.<br>CBL, =5 O2;ONI89AO 01A>;NB=K<, 15@QBAO >B=>A8B5;L=> :0B0;>30 :>=D83C@0F88.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWL<O :0B0;>30 4;O E@0=8;8I0 web-AB@0=8FWeb page store directory nameconfgui::ConfBeaglePanelWJ52>7<>6=> 70?8A0BL D09; :>=D83C@0F88Can't write configuration fileconfgui::ConfIndexW@>A<>B@Chooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWÌ<p>2B><0B8G5A:8 2:;NG05B GC2AB28B5;L=>ABL 4;O @538AB@0 A8<2>;>2, 5A;8 AB@>:0 ?>8A:0 A>45@68B 703;02=K5 1C:2K (:@><5 ?5@2>9 1C:2K).  ?@>B82=>< A;CG05 8A?>;L7C9B5 O7K: 70?@>A>2 (<>48D8:0B>@ <i>C</i> 4;O C:070=8O GC2AB28B5;L=>AB8).â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelWÎ<p>2B><0B8G5A:8 2:;NG05B GC2AB28B5;L=>ABL 4;O 480:@8B8:8, 5A;8 AB@>:0 ?>8A:0 A>45@68B 480:@8B8G5A:85 7=0:8 (=5 2 Unac-8A:;NG5=8OE).  ?@>B82=>< A;CG05 8A?>;L7C9B5 O7K: 70?@>A>2 (<>48D8:0B>@ <i>D</i> 4;O C:070=8O GC2AB28B5;L=>AB8).Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelWb<p>0:A8<0;L=>5 G8A;> @0A:@KB89 4;O >4=>3> A;>20 (=0?@. ?@8 8A?>;L7>20=88 <0A>:). =0G5=85 ?> C<>;G0=8N (10 000) O2;O5BAO @07C<=K< 8 ?><>65B 871560BL A;8H:>< 70B@0B=KE 70?@>A>2.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelW:<p>0:A8<0;L=>5 G8A;> M;5<5=B0@=KE ?@54;>65=89, 4>102;O5<KE 2 70?@>A : Xapian.  =5:>B>@KE A;CG0OE @57C;LB0B>< @0A:@KB8O A;>2 <>65B AB0BL G@57<5@=>5 ?>B@51;5=85 ?0<OB8. =0G5=85 ?> C<>;G0=8N (100 000) 4>AB0B>G=> 2 1>;LH8=AB25 A;CG052 8 ?>4E>48B 4;O A>2@5<5==KE 0??0@0B=KE :>=D83C@0F89.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWX2B><0B8G5A:0O GC2AB28B5;L=>ABL 4;O @538AB@0$Automatic character case sensitivityconfgui::ConfSearchPanelW\2B><0B8G5A:0O GC2AB28B5;L=>ABL 4;O 480:@8B8:8 Automatic diacritics sensitivityconfgui::ConfSearchPanelWJ0:A8<0;L=>5 G8A;> Xapian-?@54;>65=89Maximum Xapian clauses countconfgui::ConfSearchPanelWB0:A8<0;L=>5 G8A;> @0A:@KB89 A;>2Maximum term expansion countconfgui::ConfSearchPanelW:=5H=85 D8;LB@K, 2K?>;=ONI85AO 4>;LH5 C:070==>3> ?@545;L=>3> 2@5<5=8 @01>BK, ?@8=C48B5;L=> 7025@H0NBAO. -B> <>65B ?><>GL 2 B5E @54:8E A;CG0OE, :>340 D8;LB@ (=0?@8<5@, postscript) 70F8:;8205BAO ?@8 >1@01>B:5 =5:>B>@>3> 4>:C<5=B0. =0G5=85, @02=>5 -1, 2K:;NG05B ?@>25@:C 2@5<5=8 @01>BK. ­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW 1I55Globalconfgui::ConfSubPanelWðA;8 MB> 7=0G5=85 CAB0=>2;5=> (B.5. =5 @02=> -1), B> ?@8 8=45:A8@>20=88 B5:AB>2K5 D09;K @071820NBAO =0 D@03<5=BK A>>B25BAB2CNI53> @07<5@0. 0==0O >?F8O <>65B ?><>GL ?@8 2K?>;=5=88 ?>8A:0 2 >G5=L 1>;LH8E B5:AB>2KE D09;0E (=0?@8<5@, D09;0E 6C@=0;>2).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWB@545; @07<5@0 A60B>3> D09;0 (KB)Max. compressed file size (KB)confgui::ConfSubPanelWJ@545;L=>5 2@5<O @01>BK D8;LB@0 (A5:)Max. filter exec. time (S)confgui::ConfSubPanelWH@545; @07<5@0 B5:AB>2>3> D09;0 (MB)Max. text file size (MB)confgui::ConfSubPanelWJ 07<5@ AB@0=8FK B5:AB>2>3> D09;0 (KB)Text file page size (KB)confgui::ConfSubPanelW-B> 7=0G5=85 CAB0=02;8205B ?>@>3 @07<5@0 A60BKE D09;>2, :>B>@K5 1C4CB >1@010BK20BLAO. -1 >B:;NG05B ?>@>3, 0 >B:;NG05B 45:><?@5AA8N.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW¸-B> 7=0G5=85 CAB0=02;8205B ?>@>3 @07<5@0 B5:AB>2KE D09;>2, :>B>@K5 1C4CB >1@010BK20BLAO. -1 >B:;NG05B ?>@>3. 0==0O =0AB@>9:0 <>65B 1KBL ?>;57=0 4;O ?@54>B2@0I5=8O 8=45:A8@>20=8O 1>;LH8E D09;>2: 6C@=0;>2 A>>1I5=89 8 B.?.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWL<p>-B> 8A:;NG5=8O 4;O <5E0=87<0 Unac, :>B>@K9 C40;O5B 2AN 480:@8B8:C 8 2K?>;=O5B :0=>=8G5A:CN 45:><?>78F8N. >6=> ?5@5>?@545;8BL <5E0=87< C40;5=8O 4;O 20H53> O7K:0 8;8 4>1028BL 45:><?>78F88 (=0?@., 4;O ;830BC@). 0640O 70?8AL >B45;O5BAO ?@>15;0<8 8 A>AB>8B 87 8AE>4=>3> A8<2>;0 8 8=B5@?@5B0F88.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelW/7K: aspellAspell languageconfgui::ConfTopPanelW&0B0;>3 107K 40==KEDatabase directory nameconfgui::ConfTopPanelWB:;NG05B 8A?>;L7>20=85 aspell 4;O 35=5@0F88 ?@81;865=89 =0?8A0=8O 2 =02830B>@5 B5@<8=>2.<br> >;57=>, 5A;8 aspell >BACBAB2C5B 8;8 A;><0=. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW8=B5@20; 70?8A8 8=45:A0 (1)Index flush megabytes intervalconfgui::ConfTopPanelW$09; 6C@=0;0 Log file nameconfgui::ConfTopPanelW&>4@>1=>ABL 6C@=0;0Log verbosity levelconfgui::ConfTopPanelW,5 8A?>;L7>20BL aspellNo aspell usageconfgui::ConfTopPanelW@>?CA:0BL Skipped pathsconfgui::ConfTopPanelW*/7K:8 A> A;>2>D>@<0<8Stemming languagesconfgui::ConfTopPanelW–$09;, :C40 1C4CB 70?8AK20BLAO A>>1I5=8O.<br>'stderr' 4;O 2K2>40 =0 B5@<8=0;PThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW,/7K: A;>20@O aspell. 1KG=> 2@>45 'en' 8;8 'ru'...<br>A;8 7=0G5=85 =5 C:070=>, 1C45B 8A?>;L7>20=> >:@C65=85 (;>:0;L), GB> >1KG=> @01>B05B. 'B>1K ?>A<>B@5BL, :0:85 20@80=BK 4>ABC?=K 2 A8AB5<5, =015@8B5 'aspell config' 8 ?@>25@LB5, :0:85 .dat-D09;K 5ABL 2 :0B0;>35 'data-dir'. 3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW„/7K:8, 4;O :>B>@KE 1C4CB ?>AB@>5=K<br>A;>20@8 @0A:@KB8O A;>2>D>@<.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¬!?8A>: :0B0;>3>2, 345 =0G8=05BAO @5:C@A82=>5 8=45:A8@>20=85. 1KG=> 4><0H=89 :0B0;>3.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWæ<O :0B0;>30, 2 :>B>@>< E@0=8BAO 8=45:A<br>B=>A8B5;L=K9 ?CBL 15@QBAO >B :0B0;>30 :>=D83C@0F88. 1KG=> 'xapiandb'.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWD-B> 7=0G5=85 >?@545;O5B :>;8G5AB2> ?@>8=45:A8@>20==KE 40==KE <564C A1@>A0<8 =0 48A:.<br>><>305B :>=B@>;8@>20BL 8A?>;L7>20=85 ?0<OB8 ?@8 8=45:A0F88. 1KG=> 10Mb ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW¢-B> 7=0G5=85 >?@545;O5B ?>4@>1=>ABL A>>1I5=89,<br>>B >H81>: 4> >B;04>G=KE 40==KE.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW&=45:A8@C5<K5 ?0?:8Top directoriesconfgui::ConfTopPanelWUnac-8A:;NG5=8OUnac exceptionsconfgui::ConfTopPanelW&B<5=0&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase*<BR> (?5@52>4 AB@>:8)
uiPrefsDialogBase"<PRE> (?@5D>@<0B)

uiPrefsDialogBase<PRE> + ?5@5=>A
 + wrapuiPrefsDialogBase„>8A: [rolling stones] (420 A;>20) 1C45B 87<5=Q= =0 [rolling 8;8 stones 8;8 (rolling phrase 2 stones)].
-B> <>65B ?>4=OBL @57C;LB0BK, 4;O :>B>@KE A;>20 A;54CNB 8<5==> 2 B>< ?>@O4:5, :0: 22545=K.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseH 0745;8B5;L D@03<5=B>2 2 @57C;LB0B0EAbstract snippet separatoruiPrefsDialogBase:;NG8BL 2A5Activate AlluiPrefsDialogBase>1028BL 8=45:A	Add indexuiPrefsDialogBase&@8<5=8BL 87<5=5=8O
Apply changesuiPrefsDialogBaseP0G8=0BL ?@>AB>9 ?>8A: ?> 22>4C ?@>15;0.-Auto-start simple search on whitespace entry.uiPrefsDialogBase`2B><0B8G5A:8 4>102;OBL D@07C ?@8 ?@>AB>< ?>8A:5+Automatically add phrase to simple searchesuiPrefsDialogBaseT>@>3 G0AB>BK B5@<>2 02B>D@07K 2 ?@>F5=B0E.Autophrase term frequency threshold percentageuiPrefsDialogBaseK1@0BLChooseuiPrefsDialogBase K1>@ @540:B>@>2Choose editor applicationsuiPrefsDialogBaseì)Q;:=8B5, GB>1K 4>1028BL 4@C3>9 :0B0;>3 8=45:A0 2 A?8A>:. >6=> 2K1@0BL :0B0;>3 :>=D83C@0F88 Recoll 8;8 8=45:A Xapian.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBase4$>@<0B 40BK ?> strftime(3)Date format (strftime(3))uiPrefsDialogBaseK:;NG8BL 2A5Deactivate AlluiPrefsDialogBasehB:;NG8BL Qt-02B>7025@H5=85 ?@8 22>45 AB@>:8 ?>8A:0.*Disable Qt autocompletion in search entry.uiPrefsDialogBase$B<5=8BL 87<5=5=8ODiscard changesuiPrefsDialogBasef!>74020BL ;8 :>=A?5:B, 5A;8 4>:C<5=B C65 8<55B 53>?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase !;54C5B ;8 ?KB0BLAO ?>AB@>8BL :>=A?5:B 87 =0945==KE 4>:C<5=B>2, >?8@0OAL =0 :>=B5:AB :;NG52KE A;>2?
>65B 1KBL <54;5==K< 4;O 1>;LH8E 4>:C<5=B>2.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBase@8=0<8G5A:>5 2K45;5=85 :>=A?5:B0Dynamically build abstractsuiPrefsDialogBaseD@028BL HTML-703>;>2>: @57C;LB0B>2#Edit result page html header insertuiPrefsDialogBaseR@028BL AB@>:C D>@<0B8@>20=8O @57C;LB0B>2#Edit result paragraph format stringuiPrefsDialogBase:;NG8BLEnableuiPrefsDialogBase=5H=85 8=45:AKExternal IndexesuiPrefsDialogBase>@>3 G0AB>BK 2 ?@>F5=B0E, ?>A;5 :>B>@>3> <K =5 8A?>;L7C5< B5@<K 2 02B>D@075. 
'0ABK5 B5@<K O2;ONBAO ACI5AB25==>9 ?@>1;5<>9 ?@>872>48B5;L=>AB8 =0 D@070E. 
@>?CI5==K5 B5@<K 4>?>;=ONB ?@>A04:C D@07K 8 C<5=LH0NB MDD5:B82=>ABL $. 
=0G5=85 ?> C<>;G0=8N - 2 (?@>F5=B0). þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase"@OB0BL 4C1;8:0BKHide duplicate results.uiPrefsDialogBase¦>:07K20BL @57C;LB0BK A B5< 65 A>45@60=85< ?>4 @07=K<8 8<5=0<8 =5 1>;55 >4=>3> @070XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseÎ!B@>:8 2 PRE-B5:AB5 =5 ?5@5=>AOBAO. BR B5@O5B G0ABL >BABC?>2. PRE + ?5@5=>A <>65B 1KBL E>@>H8< 2K1>@><.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBaser0:A8<0;L=K9 >1JQ< B5:AB0 A 2K45;5=85< ?@8 ?@>A<>B@5 (1)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseT>;8G5AB2> 70?8A59 =0 AB@0=8FC @57C;LB0B>2"Number of entries in a result pageuiPrefsDialogBasezB:@K205B 480;>3 2K1>@0 B01;8FK AB8;59 CSS 4;O >:=0 $@03<5=BKAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBasebB:@K205B 480;>3 2K1>@0 H@8DB0 A?8A:0 @57C;LB0B>2-Opens a dialog to select the result list fontuiPrefsDialogBaseDB:@KBL 480;>3 2K1>@0 D09;0 AB8;59-Opens a dialog to select the style sheet fileuiPrefsDialogBase&>@@5:B8@>2:0 ?CB59Paths translationsuiPrefsDialogBase>!B8;L >B>1@065=8O B5:AB0 2 HTMLPlain text to HTML line styleuiPrefsDialogBaseT@54?>G8B0BL HTML B5:ABC 4;O ?@54?@>A<>B@0&Prefer Html to plain text for preview.uiPrefsDialogBaseh038G5A:85 @0AH8@5=8O 8<5=8 D09;0 4;O O7K:0 70?@>A>2(Query language magic file name suffixes.uiPrefsDialogBase>0?><=8BL A>AB>O=85 A>@B8@>2:8.Remember sort activation state.uiPrefsDialogBaseb#40;8BL 87 A?8A:0. =45:A =0 48A:5 157 87<5=5=89.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase$#40;8BL 2K45;5==K5Remove selecteduiPrefsDialogBaseX0<5I0BL :>=A?5:B, A>45@60I89AO 2 4>:C<5=B0E Replace abstracts from documentsuiPrefsDialogBase5@=CBLResetuiPrefsDialogBase>!1@0AK205B AB8;L >:=0 $@03<5=BK Resets the Snippets window styleuiPrefsDialogBase`#AB0=02;8205B H@8DB A?8A:0 @57C;LB0B>2 2 >1KG=K91Resets the result list font to the system defaultuiPrefsDialogBase45@=CBL AB8;8 ?> C<>;G0=8N!Resets the style sheet to defaultuiPrefsDialogBase$!?8A>: @57C;LB0B>2Result ListuiPrefsDialogBase0(@8DB A?8A:0 @57C;LB0B>2Result list fontuiPrefsDialogBase*A:0BL ?> <5@5 22>40.Search as you type.uiPrefsDialogBase 0@0<5B@K ?>8A:0Search parametersuiPrefsDialogBase6CSS-D09; 4;O >:=0 $@03<5=BKSnippets window CSS fileuiPrefsDialogBaseZB:@K20BL 480;>3 A;>6=>3> ?>8A:0 ?@8 70?CA:5.'Start with advanced search dialog open.uiPrefsDialogBase/7K: A;>2>D>@<Stemming languageuiPrefsDialogBase01>@ AB8;59Style sheetuiPrefsDialogBase >=B5:AB=KE A;>2 Synthetic abstract context wordsuiPrefsDialogBaseT 07<5@ A>740205<>3> :>=A?5:B0 (2 A8<2>;0E)$Synthetic abstract size (characters)uiPrefsDialogBase²"5:ABK 1>;LH53> @07<5@0 =5 1C4CB ?>4A25G820BLAO ?@8 ?@5420@8B5;L=>< ?@>A<>B@5 (<54;5==>).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase”!;>20 2 A?8A:5 1C4CB 02B><0B8G5A:8 ?@5>1@07>20=K : 284C ext:xxx 2 70?@>A5.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase,5@5:;NG8BL 2K45;5==K5Toggle selecteduiPrefsDialogBase=B5@D59AUser interfaceuiPrefsDialogBase@54?>GB5=8OUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_tr.qm0000644000175000017500000006000513224431020014231 00000000000000<¸dÊÍ!¿`¡½ÝB+;4-;a+;EÖ¨¥(
Lô)zLô2¬4ÜEîU$—+t*Ð%!>*ì0!o+Lô
 1ø	G…ÔSGß#øH6ó2øH6õ3%J+‚rJ+‚-˜J6•$J6•9ïWÈÕXÉÄSÐe®àsºñ™sºñàv8“¼v®ÂÌv®Â zϳA€€£KÜ0œ=hÍ8ÃÐùƒ)Ðùƒ5IÐùƒ92EµS0,…=>.cÛXM¹OÉ‘vãIq•ñ“Š£cê÷ÎxC
zÞñƒ®ó
LþSI-ÿµ<
çEp#ôvå*w5(;w5,Üw50%w56ÒŒU;ɩֳ5ª6•2Ž»f3"8ͼuPˆì;UÕúU
úeîÑ¬X§&ÁN°.‡N˜?úd*NJUYSJUY)4Y ô3›º™VáÝôLK„ìx<‹þA¢'Lƒ:!€ã‡Z˜I¼	[˜I¼F™n•™n•2aŸf•6 Ÿf•:úŸf•KN«#,«-ËÚ#O/ãX|;Ž
-Zå-¼'d)ÖTT	BìS1Nr?)(vrž¹‹¦,&‘‹Üð3øŒÇ<"n›ˆ˜/²›ˆ˜27¦AStªÃ¢·¨
+·¨
6D»œR3RÇ¢•UØ~CzðŒµV`³&'"	/ÞUKôTÂp
hI,—B¡šK@&¦	%A¦öõö¶7*ÊXÔ˜þDCJ¥FW#0bF¯NMŒÍw#ŒÏ—)¨n(¾“’žIβð¨ɆtX^QçÇ2}}Í”ò“Vq¨0ÎA*Ä/qÌí³
Qͳ)×ÝÜEKäœcö¨å=àúÃXý	´H ‰	9Zy/	K¨ó%z	®œ¯L5	ü>QÓ	äî
è
Üc
+<”?
6 
`P)
`ç£
c·E$ˆ
yÓ
˜IœE
²ëCë
âæç$%®#^®ù#«TH6ŽÚ
„h¹°
¶¨Î£$Ļ﵃۷å%â'И"Â97ÃùPÖ™vRVŽÅT#QVü>B\iCST`F¥UÚ÷4ÝøìHÖö†À2¾
8þF
FÁã
y·8
‚±3E
‡u-Z
‡u7
‰PH
‰Pü
5dQ
ÕHš
û£43€O/¸.ƒ<ÞWq=Â!¢G7ÒIJ›™bÙ ×zc*ßzc5ÿ‚3.+Ì‚3.-ý“Ýè7S›P¾	¦Àè'¾É¾9Ë“>–;:vQá~RRY~s!â[žs&Ãg3%7Õ BGÂ|“þÂ|“U$ó
l <ü©Ütü¶L¶iY[Tüm ifadelerAll clauses	AdvSearch00fadelerin herhangi biri
Any clause	AdvSearchortamlarmedia	AdvSearch
dierother	AdvSearchhesap tablolar1spreadsheets	AdvSearchmetinlertexts	AdvSearch<----- Tümü
<----- All
AdvSearchBase<----- Seç
<----- Sel
AdvSearchBase0fade ekle
Add clause
AdvSearchBaseGeli_mi_ aramaAdvanced search
AdvSearchBaseTümü ---->	All ---->
AdvSearchBase
GözatBrowse
AdvSearchBase"Kategorilere göre
By categories
AdvSearchBase‚Dosya tipleri üzerinde filtreleme kullanmak için bunu i_aretleyin,Check this to enable filtering on file types
AdvSearchBase²Dosya tipleri yerine ham mime tipleri üzerinde filtreleme kullanmak için bunu i_aretleyin;Check this to use file categories instead of raw mime types
AdvSearchBase
KapatClose
AdvSearchBase0fadeyi sil
Delete clause
AdvSearchBase<Arama için en üst dizini girinEnter top directory for search
AdvSearchBase0Yoksay1lan dosya tipleriIgnored file types
AdvSearchBase6Dosya tiplerini s1n1rland1rRestrict file types
AdvSearchBaselArama sonuçlar1n1 bu dizin ve a_a1s1 ile s1n1rland1r:%Restrict results to files in subtree:
AdvSearchBase.öntan1ml1 olarak kaydetSave as default
AdvSearchBase4Uyan <br>belgeleri<br>ara:'Search for 
documents
satisfying: AdvSearchBase(Aranan dosya tipleriSearched file types AdvSearchBaseSeç -----> Sel -----> AdvSearchBaseAramay1 Ba_lat Start Search AdvSearchBase 0ptalCancel EditTransBaseZYap1land1rma içerisinde veritaban1 dizini yok No db directory in configurationMain&Sonraki&NextPreview&Önceki &PreviousPreview A&ra: &Search for:PreviewD^unun için iç gösterim yap1lam1yor0Can't turn doc into internal representation for Preview 0ptalCancelPreviewTemizleClearPreviewSekmeyi Kapat Close TabPreview8Önizleme metni olu_turuluyorCreating preview textPreviewNÖnizleme metni düzenleyiciye yükleniyor Loading preview text into editorPreviewE_le_me ^a&rt1 Match &CasePreview0Yard1mc1 program kay1p: Missing helper program: Preview<<b>Özelle_tirilmi_ alt aaçlarCustomised subtreesQObjectæ<i>A_a1daki parametreler, ya seçili alt dizin için uygulan1r ya da üst düzeyde veya üstteki metin kutusunda hiçbir _ey seçilmediinde yada bo_ bir sat1r seçildiinde uygulan1r.<br>+/- dümelerine t1klayarak dizinleri ekleyip ç1karabilirsiniz.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject4Sembolik balant1lar1 izleFollow symbolic linksQObjectè0ndekslerken sembolik balant1lar1 izle. Ayn1 ögelerin yeniden indekslenmesinden kaç1nmak için öntan1ml1 deer hay1rTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$Genel parametrelerGlobal parametersQObject:Tüm dosya isimlerini indeksleIndex all file namesQObjectÐ0çerii tan1nmayan ya da i_lenemeyen (ya da desteklenmeyen mime tipi) dosyalar1 indeksle. Öntan1ml1 evet}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject$Yerel parametrelerLocal parametersQObject&Arama parametreleriSearch parametersQObjectAtlanan isimler Skipped namesQObject0ndekslenmi_ s1ralama içerisindeki alt dizinlerin listesi <br>ki burada baz1 parametrelerin yeniden tan1mlanmas1 gerekir. Öntan1ml1: bo_.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject‚Bu nitelikler insekslenmemesi gereken dosya ve dizinler içindir.LThese are patterns for file or directory names which should not be indexed.QObject&Önizle&PreviewQWidget(&Dosya Ad1n1 KopyalaCopy &File NameQWidget&Adresi Kopyala Copy &URLQWidget*Benzer belgeleri &bulFind &similar documentsQWidget Uyar1WarningRTIToolW(tüm diller)(all languages)RclMain2(kök ayr1_t1rma kullanma) (no stemming)RclMainRecoll Hakk1nda About RecollRclMainDÖnizleme penceresi olu_turulam1yorCan't create preview windowRclMainbBelge aç1lamad1 ya da geçici dosya olu_turulamad10Cannot extract document or create temporary fileRclMainPVeritaban1ndan belge bilgileri al1namad1+Cannot retrieve document info from databaseRclMainKapat1l1yorClosingRclMainBelge geçmi_iDocument historyRclMain"Çal1_t1r1l1yor: [ Executing: [RclMainGeçmi_ verileri History dataRclMain20ndeksleme devam ediyor: Indexing in progress: RclMainTemizlePurgeRclMainArama Sonuçlar1 Query resultsRclMain.KökAyr1_t1rmaVeritaban1StemdbRclMain4Bu arama atr1k etkin deil"This search is not active any moreRclMainBilinmeyenUnknownRclMain Uyar1WarningRclMainxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languagesRclMainortamlarmediaRclMain dierotherRclMain &Recoll Hakk1nda &About Recoll RclMainBase&Geli_mi_ arama&Advanced Search RclMainBase0&Belge geçmi_ini temizle&Erase document history RclMainBase &Dosya&File RclMainBase&Yard1m&Help RclMainBase&Tercihler &Preferences RclMainBase&&S1ralama Ölçütleri&Sort parameters RclMainBase&Araçlar&Tools RclMainBase(&Kullan1c1 El Kitab1 &User manual RclMainBase2Geli_mi_/karma_1k AramaAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBaseBelge Geçmi_iDocument History RclMainBaseBelge &Geçmi_iDocument &History RclMainBase&Ç1kE&xit RclMainBase.D1_ indeksler penceresiExternal index dialog RclMainBase0lk sayfa First page RclMainBase8Sonuçlar1n ilk sayfas1na gitGo to first page of results RclMainBaseSonraki sayfa Next page RclMainBase4Sonuçlar1n sonraki sayfas1Next page of results RclMainBaseÖnceki sayfa Previous page RclMainBase2Sonuçlar1n önceki sayfas1Previous page of results RclMainBase RecollRecoll RclMainBase$S1ralama ölçütleriSort parameters RclMainBase 0fade g&östericiTerm &explorer RclMainBase(0fade gösterme arac1Term explorer tool RclMainBase"0ndeksi g&üncelle Update &index RclMainBase TarihDate RecollModelDosya ad1 File name RecollModel (sorguyu göster) (show query)ResList<<p><b>Sonuç bulunamad1</b><br>

No results found
ResListBelge geçmi_iDocument historyResListSonrakiNextResList ÖnizlePreviewResList ÖncekiPreviousResListSorgu detaylar1 Query detailsResListSonuç listesi Result listResList Eri_ilemez belgeUnavailable documentResListTüm sözcükler All termsSSearch2Sözcüklerin herhangi biriAny termSSearch,Uygunsuz arama ifadesiBad query stringSSearch®Aranacak ifadeleri buraya girin. Geçerli sözcüün tamamlanmas1 için ESC SPACE kullan1n.FEnter search terms here. Type ESC SPC for completions of current term.SSearchDosya ad1 File nameSSearchYetersiz bellek Out of memorySSearchArama diliQuery languageSSearchTemizleClear SSearchBase Ctrl+SCtrl+S SSearchBase®Aranacak ifadeleri buraya girin. Geçerli sözcüün tamamlanmas1 için ESC SPACE kullan1n.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase.Arama girdisini temizleErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseAraSearch SSearchBaseSorguyu ba_lat Start query SSearchBaseDosya ad1 File name SearchClauseW‚Seçilen sözcüklerin aras1nda yer alabilecek ek sözcüklerin say1s1HNumber of additional words that may be interspersed with the chosen ones SearchClauseWZSözcükler ile kullan1lacak sorgu biçimini seç>Select the type of query that will be performed with the words SearchClauseWSonrakiNextSnippetsAraSearch SnippetsW GözatBrowseSpecIdxW &Kapat&Close SpellBase&Geni_let &Expand  SpellBase Alt+KAlt+C SpellBase Alt+GAlt+E SpellBase0fade Gösterici Term Explorer SpellBase0Hiç geni_leme bulunamad1No expansion foundSpellWDüzenli ifadeRegexpSpellW Heceleme/FonetikSpelling/PhoneticSpellW4Kök ayr1_t1rma geni_lemesiStem expansionSpellW 0fadeTermSpellW Özel karakterler WildcardsSpellWxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languagesSpellWTüm sözcükler All terms UIPrefsDialog2Sözcüklerin herhangi biriAny term UIPrefsDialog GözatChoose UIPrefsDialogDosya ad1 File name UIPrefsDialogArama diliQuery language UIPrefsDialoglSeçilen dizin bir Xapian indeks dizini gibi görünmüyor;The selected directory does not appear to be a Xapian index UIPrefsDialogRSeçilen dizin zaten indeks listesinde var3The selected directory is already in the index list UIPrefsDialog0Bu ana/yerel veritaban1!This is the main/local index! UIPrefsDialogxsözcük kökleri ayr1_t1r1labilir diller al1n1rken hata olu_tu#error retrieving stemming languages UIPrefsDialog KapatCloseViewActionBase$Doal GöstericilerNative ViewersViewActionBase>Yap1land1rma dosyas1 yaz1lamad1Can't write configuration fileconfgui::ConfIndexW GözatChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW GenelGlobalconfgui::ConfSubPanelWAspell diliAspell languageconfgui::ConfTopPanelW0Veritaban1 dizininin ad1Database directory nameconfgui::ConfTopPanelW20ndex düzeltme MB aral11Index flush megabytes intervalconfgui::ConfTopPanelW*Günlük dosyas1n1n ad1 Log file nameconfgui::ConfTopPanelW:Günlük dosyas1 ayr1nt1 düzeyiLog verbosity levelconfgui::ConfTopPanelW(Aspell kullan1m1 yokNo aspell usageconfgui::ConfTopPanelWAtlanan yollar Skipped pathsconfgui::ConfTopPanelWLSözcük kökleri ayr1_t1r1labilir dillerStemming languagesconfgui::ConfTopPanelWŒ0letilerin yaz1laca1 dosya.<br>Uçbirim ç1kt1s1 için 'stderr' kullan1nPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWKök ayr1_t1rma geni_lemesi için sözlükleri<br>in_a edilecek olan diller.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¦Özyinelemeli indesklemenin ba_layaca1 dizinlerin listesi. Öntan1ml1: ev dizininiz.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWBu deer diske gönderilecek indekslenmi_ veri miktar1n1 ayarlar.<br>Bu indeksleyicinin bellek kullan1m1n1 kontrol etmeye yarar. Öntan1ml1 10MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWªBu deer ileti boyutunu ayarlar,<br>sadece hatalardan hata ay1klama verilerine kadar.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelWÜst dizinlerTop directoriesconfgui::ConfTopPanelW &0ptal&CanceluiPrefsDialogBase &TAMAM&OKuiPrefsDialogBaseÔ[linux kernel] (2 sözcük) aramas1 [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak dei_tirilecektir. Bu, aranacak sözcüklerin tam olarak girildii gibi görüntülendii sonuçlara yüksek öncelik verilmesini salayacakt1r.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase$Tümünü Etkinle_tir Activate AlluiPrefsDialogBase0ndeks ekle Add indexuiPrefsDialogBase*Dei_iklikleri uygula Apply changesuiPrefsDialogBase„Beyaz alan girdisi olduunda basit aramay1 otomatik olarak ba_lat.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseXBasit aramalara ifadeyi otomatik olarak ekle+Automatically add phrase to simple searchesuiPrefsDialogBase GözatChooseuiPrefsDialogBase$Tümünü Pasifle_tirDeactivate AlluiPrefsDialogBase$Dei_iklikleri silDiscard changesuiPrefsDialogBasezBelgenin bir özeti varsa bile bir yapay özet olu_turulsun mu?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseöSorgu sözcükleri kullan1larak sonuç listesi girdileri için özet olu_turulsun mu ? Büyük boyutlu belgelerde yava_ olabilir.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase>Özetleri dinamik olarak olu_turDynamically build abstractsuiPrefsDialogBaseD1_ indekslerExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBasedÖnizlemede vurgulanacak en fazla metin boyutu (MB)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseFBir sonuç sayfas1ndaki sonuç say1s1"Number of entries in a result pageuiPrefsDialogBasejSonuç listesi yaz1tipini seçmek için bir pencere açar-Opens a dialog to select the result list fontuiPrefsDialogBase:S1ralama kurallar1n1 hat1rla.Remember sort activation state.uiPrefsDialogBaseXListeden sil. Bu diskteki indeksi etkilemez.7Remove from list. This has no effect on the disk index.uiPrefsDialogBaseSeçileni silRemove selecteduiPrefsDialogBase6Belgelerden özetleri kald1r Replace abstracts from documentsuiPrefsDialogBaseS1f1rlaResetuiPrefsDialogBasebSonuç listesi yaz1tipini sistem ayarlar1na döndür1Resets the result list font to the system defaultuiPrefsDialogBase,Sonuç listesi yaz1tipiResult list fontuiPrefsDialogBase&Arama parametreleriSearch parametersuiPrefsDialogBaseFGeli_mi_ arama penceresi ile ba_la.'Start with advanced search dialog open.uiPrefsDialogBase&Kök ayr1_t1rma diliStemming languageuiPrefsDialogBase*Yapay özet sözcükleri Synthetic abstract context wordsuiPrefsDialogBaseFYapay özet boyutu (karakter say1s1)$Synthetic abstract size (characters)uiPrefsDialogBase„Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yava_).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseSeç /B1rakToggle selecteduiPrefsDialogBase"Kullan1c1 arayüzüUser interfaceuiPrefsDialogBase(Kullan1c1 tercihleriUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_zh.qm0000644000175000017500000020526213224431020014233 00000000000000<¸dÊÍ!¿`¡½ÝB X+Ûc-Û¯ +;éH,­H,Ð HYÐIIA¿nZlÆÝmbÉó¦y‡ ¨¥Ä-¶E°îÐD¼Ù]æLôÈyLôÒjVE´VEÐÕf¾ÈŸlÀÀÞ¬Õ ¬ôÓ¬ôº¹Eîú$—Ì8'HäÊ$*Ð%»ú*ì0¼c+Lô„5+f¾¨1ø Ï:Îd¹‘G…Ôø9Gß¾®H6óÓBH6õÓoJ+‚…eJ+‚ÎAJ6•lJ6•ØL™b±IPh¨Å‡T°5ÆWT‡±WÈÕ´3XÉÄøÒ[ %Æ´e®…¹gwîÌvsºñÁsºñ¹»v8“µ%v®Âv®Âº zϳý€€£î4„jªzŒ!þ +0œãSÍ׌ªJ†®½Þ-¶ÊðªEº°PÃÞËÐùƒ¹@ÐùƒÕXÐùƒ×ßãnÞ³Õ ?Eµ¸70,…ã>.cŒbDo2±ÒXM¹ô¶X®©Eè`Þ^Ç lÿtУnÚ‰wñ…Åâwñ…Ø`‘vã딕ñ“Œ-¢‰Ýý£cê ßÎxC‰KÞñƒ“ó L­IþSIÍÿµá= 猦p#^våÉvå¥Äöw 5Å'w 5Írw 5Ðrw 5Ö9wîÅVŒUàóŸ.¬2£¹ÞÙ_©Ö³Õ.ª6•Òெ”«ˆ»f3½NͼuõAÐgž>Ðgžº2ÔÂõ…úì;U®Êï¡©FéúU†Ëúeî — ¬ýÆ!Dùz&Áð.‡NŽ3=údùÕ?údɈG$ß©ÌJUY°ºJUYÈY ôÔ>[–uˆ'_nÔ º™ûÀuñ–Ê·®mÊ—¥îÊ—¥¹æÎÅåö Ôä^ó³ÝôLíøìxâ²ùJgð¾þA¢ÃB Ø<.©nçÞÎõÂ1ëdÂŒ;[¾Óœ<ÄöÊÖLƒØ¼e 2²ûvhÕÚ€€ã‡­á…(P®(Œ¯bÄ’"3 ¹’ZÓ r˜I¼GP˜I¼…?™n•2™n•Ò¹Ÿf•Ö Ÿf•Û/Ÿf•í«¾«Îj¯ƒWG%¯ƒW‚âÄy%EKÄy%ñ΄ն„Ð:Â$Ú#ñOãX|Û½åõWD~Ì” R -Z 9-¼Ã^)ÖTùB9€á‹BìSÑêk¶ÞÀ°oˆ•Ñr?)Çrž­|ôòa„kåY‹¦,Á‹ÜðÔuŒÇ<½€›ˆ˜ÏÛˆ˜Ò‘¦AS PªÃ¢¶·¨ Ì ·¨ ÕÛ»œRÓ×Ç¢•“×I^¿ÇØ~C øèêȱéã>‚ðŒµúö`³Á=" ÏíUKôúp hë]u9ev2ã‡9–T#ˆ¢—B…ŠšKåA¦ %1¦öõ’¨«‡¸í¶7É·ÄÖ[³$ÊXÔ ¢ënD«9ðw)Ñ»þç½CìD#+äû57I^¼+FW#ÐýF¯NïH:"Õ_gucïŒÍw)ŒÏ—ÈÃnÇ@“’žëѦš´ºb²ð оl¯µVÓtpÓtºŠÈà¬Ɇtý‡éŽ#Áï3ƒ::uîö“QçÇ‹‰}}‹L€;EË–”ò“ûl¨0ÎåßÄÏ‚Ìí³„dͳÈê×°­¤ÝÜè–äœc ä´¥«Éæí:¯ºö¨åãŸú Ãþ ´H»& 9ZyÏD ;´3² K¨óÀr ]#—³‘ k¨µˆÙ lMˆƒ ‰Œîü¿ ŸÁò‘N «ƒÔÃ× ­îßÉ ®œ¯îu ²9Ý= ü>÷] ä íåõì¯ *N‡o ÜcÛ *RF+ +<”är 6 ¯ G.~c® `P²| `ç£ c·E¿— d8Ø6 y†’ ˜IœèØ ¤žÛò ²ëC‘ ÄãÈR âæç¿+ æõç¾ß ®¾4 ®ù¾m Ô… † yeE" THÆ ŽÚ„— =!fˆ Kjׯ~ h¹°„Í éÝž £Ü ˆp ¨Î£¿ö »ïµ¯0 Û·åÁ ÛÓíI Vd²I 'И½¼ /¥²¸ 97á 9É´X L*Êš PÖ™¬É RVޏ T#ü Vüãë \iCøx ]æùØ÷ `F¥— hôîÊ_ v—¥µí {lö÷ €!Yµ® €!YÉI ¬æà« ÓÍ·e Ú÷ÔÚ Ýøìë# é—~óþ ö†ÀÓ m£Å´ 'Rçd/ -èôÆ@ 8þéF FÁ±¢ OE°ci uò0Á± y·× y¹~4 ‚±3 …È©í— ‡uÍÎ ‡uÖj ‰P¬¡ ‰P¹ 5dõ¥ ¤š„³Û ¬Š©Dµ ½ý7€¯ ÕHÎ û£Ԡ q©»±€óo%Ýn‘¥/¸.ÿ<Þü"G|Qá~÷°Y~s½[žsÂç\НEsg3ÀCpû~€äÕ æ!êÏ­c™»m€ËM¿­cpÂ|“ÇÂ|“úPÎÁ'¶Jó lºáü©Ü$ü¶LZiþ@QhègaNö All clauses AdvSearchNûagaNö Any clause AdvSearche‡Nö\:[øÇnäVhv„TSUOMN kcxn$Bad multiplier suffix in size filter AdvSearch YZ’OSe‡Nömedia AdvSearch®Nömessage AdvSearchQv[ƒother AdvSearchoy:e‡hc presentation AdvSearchu5[Pˆhh< spreadsheet AdvSearchu5[Pˆhh< spreadsheets AdvSearche‡g,e‡Nötext AdvSearche‡g,texts AdvSearch !yûR¨Qhè <----- All AdvSearchBase !yûR¨ N-˜y <----- Sel AdvSearchBasemûR gaNö Add clause AdvSearchBasešØzïd}"Advanced search AdvSearchBase yûR¨Qhè!’ All ----> AdvSearchBaseÌSó¹v„b@g —^zz[WkµýOc qg;‘Nÿ QhègaNö  ˜yÿ b;‘bÿ NûagaNö  ˜yÿ ge~ÄT0<br> Nûa  Qhè TŒ eà N yÍ[Wkµ|{W‹ýc¥SדQe{€SU‹Í‹íTŒSÌ_S÷_u(v„‹Í~Äv„~ÄT0<br>zzv„“QehFOˆ«_ýue0All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBasemO‰ÈBrowse AdvSearchBase c Y'|{geÇnä By categories AdvSearchBase N-ÙN*ÿ NåO¿”ˆ[ùeågÛˆLÇnä'Check this to enable filtering on dates AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö|{W‹ÛˆLÇnä,Check this to enable filtering on file types AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö\:[øÛˆLÇnä'Check this to enable filtering on sizes AdvSearchBase4 N-ÙN*ÿ NåO¿Ou(ƒY'v„R|{ÿ € N Ou(QwOSv„e‡Nö|{W‹;Check this to use file categories instead of raw mime types AdvSearchBaseQs•íClose AdvSearchBaseR –dgaNö Delete clause AdvSearchBase“Qe‰d}"v„gN \Bvî_UEnter top directory for search AdvSearchBaseÇnäFilter AdvSearchBaseÇnäeåg Filter dates AdvSearchBaseÇnä\:[ø Filter sizes AdvSearchBasegåb~Find AdvSearchBaseNÎFrom AdvSearchBase‰_ýuev„e‡Nö|{W‹Ignored file types AdvSearchBase SÍlÇnägaNöInvert AdvSearchBasegY'\:[ø Max. Size AdvSearchBase0gY'\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseg\\:[ø Min. Size AdvSearchBase0g\\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase –P[še‡Nö|{W‹Restrict file types AdvSearchBase"\~ÓgœN-v„e‡Nö–P[šW(kd[Pvî_UhN-ÿ%Restrict results to files in subtree: AdvSearchBase OÝ[XN:žØ‹¤P<Save as default AdvSearchBase(d}"<br>ná³NåN gaNö<br>v„e‡hcÿ'Search for
documents
satisfying: AdvSearchBase\ˆ«d}"v„e‡Nö|{W‹Searched file types AdvSearchBase yûR¨ N-˜y!’ Sel -----> AdvSearchBase_YËd}" Start Search AdvSearchBaseR0To AdvSearchBase<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> by‘Ï}"_‹¡RNûR¡(cron) </p><p class="P1">kÏN*[WkµýSïNåSbìNN*‘M{&(*)0SUN*ep[WP<0S÷R–”v„Rˆh(1,3,5)TŒƒVô(1-7)0fôQÆxnW0‹ôÿ ÙN›[WkµOˆ«<span class="T3">c SŸh7</span>“QúR0crontab e‡NöN-ÿ VàkdÙ‘ÌSïNåOu(crontab v„b@g ‹ílÕÿ S€crontab(5)0</p><p class="P1"><br/>O‹Y‚ÿ W(<span class="T3">eåg</span>N-“Qe<span class="T4">*</span>ÿ <span class="T3">\eö</span>N-“Qe<span class="T4">12,19</span>ÿ <span class="T3">R”Ÿ</span>N-“Qe<span class="T4">15 </span>v„‹Ýÿ OW(kÏY)v„12:15 AM TŒ7:15 PMT/R¨recollindex0</p><p class="P1">NN*˜‘~AbgˆLv„‹¡RNûR¡ÿ Qv`'€ýSï€ýkÔN N [žeö}"_0</p></body></html> Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

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

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

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

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

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

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

Alternate spellings (accents suppressed): ResListe‡hcS†SòDocument historyResList{, DocumentsResListN N˜uNextResListbS_OpenResList˜„‰ÈPreviewResListN N˜uPreviousResList gå‹â‹íSå~Æ‚‚ Query detailsResList~ÓgœepÿO0‹¡P<ÿ Result count (est.)ResList~ÓgœRˆh Result listResList eàlÕ‹¿•îe‡hcUnavailable documentResListN*e‡hcÿ gå‹âgaNöÿforResListN*e‡hcÿ g\Qqg out of at leastResListR –dkdRÿ&Dÿ &Delete columnResTable‘Ínc’^gaNöÿ&Rÿ  &Reset sortResTableOÝ[XN:CSVÿ&Sÿ  &Save as CSVResTablemûR "%1"RAdd "%1" columnResTableeàlÕbS_/R^úe‡NöÿCan't open/create file: ResTable\ˆhhSelect the type of query that will be performed with the words SearchClauseWN N˜uNextSnippetsd}"Search SnippetsWmO‰ÈBrowseSpecIdxW Qs•íÿ&Cÿ &Close SpellBase \U_ÿ&Eÿ &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBaseg*b~R0epcn^“Oá`o0 No db info. SpellBase ‹Í‹íc¢}"Vh Term Explorer SpellBase e‡hcep/`;ep Doc. / Tot.SpellW g*b~R0bi\UNo expansion foundSpellW kcRˆh¾_RegexpSpellWbüQ™/SÑ—óhÀgåSpelling/PhoneticSpellW‹Íh9bi\UStem expansionSpellW‹Í‹íTermSpellW‘M{& WildcardsSpellWcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesSpellWQhè‹Í‹í All terms UIPrefsDialogNûN‹Í‹íAny term UIPrefsDialog béChoose UIPrefsDialoge‡NöT  File name UIPrefsDialoggå‹â‹íŠQuery language UIPrefsDialog N-v„vî_UN f/Xapian}"_;The selected directory does not appear to be a Xapian index UIPrefsDialog N-v„vî_U]ò~ÏW(}"_RˆhN-3The selected directory is already in the index list UIPrefsDialogÙf/N;‰/g,W0}"_ÿThis is the main/local index! UIPrefsDialogcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languages UIPrefsDialogT}NäCommand ViewActione‡Nö|{W‹ MIME type ViewActionQs•íCloseViewActionBase g,W0gåw VhNative ViewersViewActionBaseQ˜u[XP¨v„gY'\:[øÿMBÿ  Max. size for the web store (MB)confgui::ConfBeaglePanelWbu(geP¨[XY R6Çgev„]ò‹¿•îQ˜uv„vî_UT 0<br>Y‚gœOu(vø[ùï_„ÿ ROvø[ùNŽ‘Mnvî_Uv„ï_„ÛˆLYt0‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWQ˜uP¨[Xvî_UT Web page store directory nameconfgui::ConfBeaglePanelWeàlÕQ™Qe‘Mne‡NöCan't write configuration fileconfgui::ConfIndexW béChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWQh\@Globalconfgui::ConfSubPanelW|Y‚gœ‹¾nT¯ÙN*P<ÿN {INŽ-1ÿ ÿ Re‡g,e‡NöOˆ«RRrbÙNHY'v„WWÿ ^vNÛˆL}"_0 Ùf/u(ged}"Y'W‹e‡g,e‡Növ„ÿO‹Y‚‹°_Ue‡Nöÿ 0¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWS‹)e‡NögY'\:[øÿKBÿ Max. compressed file size (KB)confgui::ConfSubPanelWÇnäVhv„g•bgˆLeö•ôÿSÿ Max. filter exec. time (S)confgui::ConfSubPanelWe‡g,e‡NögY'\:[øÿMBÿ Max. text file size (MB)confgui::ConfSubPanelWe‡g,e‡NöSU˜u\:[øÿKBÿ Text file page size (KB)confgui::ConfSubPanelWd\:[øY'NŽÙN*PW(l¡g [‰ˆÅaspellb€[ƒ]åO\N kc^8eöOu(ÙN* ˜y0†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWR7e°}"_v„•ô–”ÿ QF[W‚‚Index flush megabytes intervalconfgui::ConfTopPanelW ‹°_Ue‡NöT  Log file nameconfgui::ConfTopPanelW‹°_Uv„‹Ýuè~§R+Log verbosity levelconfgui::ConfTopPanelWN Ou(aspellNo aspell usageconfgui::ConfTopPanelW ueÇv„ï_„ Skipped pathsconfgui::ConfTopPanelW‹Íh9‹íŠStemming languagesconfgui::ConfTopPanelWTz ^“Qúv„mˆ`oOˆ«OÝ[XR0ÙN*e‡Nö0<br>Ou('stderr'Nåˆhy:\mˆ`o“QúR0~ÈzïPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW*\O”ˆ[ùÙN›‹íŠ<br>g„ ‹Íh9bi\U‹ÍQx0IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW:}"_NÎÙN*RˆhN-v„vî_U_YËÿ _RW0ÛˆL0žØ‹¤ÿO`v„[¶vî_U0LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWvÙN*P<Œetv„f/ÿ _Syï}/T¯Y\}"_epcneöÿ bM\epcnR7e°R0xlvØN S»0<br>u(gec§R6}"_Ûz v„Q…[XS`u(`ÅQµ0žØ‹¤N:10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWTÙN*P<Œetv„f/“Qúv„mˆ`ov„ep‘Ïÿ <br>Qv~§R+NÎNÅ“Qúb¥•Oá`oR0“QúNY'XŒ‹ÕOá`o0ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW˜v~§vî_UTop directoriesconfgui::ConfTopPanelW SÖmˆÿ&Cÿ &CanceluiPrefsDialogBase xn[šÿ&Oÿ &OKuiPrefsDialogBase’[ù[nÚ wó] (2N*‹Í‹í)v„d}"OSØb[nÚ or wó or (nÚ 2N*‹Í‹í wó)]0 [ùNŽ£N›d}"‹Í‹íW(QvN-c qgSŸh7Qús°v„~Ógœÿ QvOQH~§OšØNN›0ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBasedX‰N-v„rGkµv„R–”{&Abstract snippet separatoruiPrefsDialogBaseQhèoÀm; Activate AlluiPrefsDialogBasemûR }"_ Add indexuiPrefsDialogBase Oe9SØueH Apply changesuiPrefsDialogBase “Qezzh_ÙN›e9SØDiscard changesuiPrefsDialogBase4SsOe‡hcg,Ž«båg NN*dX‰ÿ bNìNÍq6êˆLTbdX‰Oá`oÿEDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseTf/T&‰Ou(gå‹â‹Í‹íThVôv„N N e‡geg„ ~ÓgœRˆhgavîN-v„dX‰ÿ [ùNŽY'v„e‡hcSï€ýO_ˆab0zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase R¨`g„ dX‰Dynamically build abstractsuiPrefsDialogBase ‘~Ógœ˜u—bv„htmlY4ècÒQe˜y#Edit result page html header insertuiPrefsDialogBase‘~Ógœkµ„=v„h<_[W{&N2#Edit result paragraph format stringuiPrefsDialogBaseT/u(EnableuiPrefsDialogBaseYè}"_External IndexesuiPrefsDialogBase¾Ùf/NN*˜‘s‡–P<ÿ …ÇÙN*PR0êR¨‹Í~ÄN-0 šØ˜‘‹Í‹íf/‹Í~ÄN-`'€ý•v„N;‰gen0 ueÇv„‹Í‹íOXžR ‹Í~Äv„zz:P<ÿ VàkdO–MONêR¨‹Í~ÄRŸ€ýv„eHs‡0 žØ‹¤Py:NN*0XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase0W(˜„‰ÈN-[ùQvÛˆLšØN®f>y:v„gY'e‡g,\:[øÿQF[W‚‚ÿ 5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseNN*~Ógœ˜u—bN-f>y:v„~Ógœgaep"Number of entries in a result pageuiPrefsDialogBase(bS_NN*[ù‹ÝhFÿ Nå béu(NŽ~ÓgœRˆhv„[WOS-Opens a dialog to select the result list fontuiPrefsDialogBase bS_NN*[ù‹ÝhFÿ Nå béh7_SUe‡Nö-Opens a dialog to select the style sheet fileuiPrefsDialogBase˜„‰ÈN-OQHOu(Html0&Prefer Html to plain text for preview.uiPrefsDialogBasegå‹â‹íŠy^YGe‡NöT T0(Query language magic file name suffixes.uiPrefsDialogBase‹°OOc’^r¶`0Remember sort activation state.uiPrefsDialogBase,NÎRˆhN-R –d0ÙN O[ùxlvØN v„}"_ bc_[³07Remove from list. This has no effect on the disk index.uiPrefsDialogBase R –d N-˜yRemove selecteduiPrefsDialogBaseSÖNãe‡hcN-ê^&v„dX‰ Replace abstracts from documentsuiPrefsDialogBase‘ÍnResetuiPrefsDialogBase"\~ÓgœRˆhN-v„[WOS‘Í‹¾N:|û~ߞ؋¤P<1Resets the result list font to the system defaultuiPrefsDialogBase\h7_SU‘ÍnN:žØ‹¤P<!Resets the style sheet to defaultuiPrefsDialogBase~ÓgœRˆh Result ListuiPrefsDialogBase ~ÓgœRˆh[WOSResult list fontuiPrefsDialogBased}"SÂepSearch parametersuiPrefsDialogBaseT/R¨eöbS_šØzïd}"[ù‹ÝhF0'Start with advanced search dialog open.uiPrefsDialogBase‹Íh9‹íŠStemming languageuiPrefsDialogBaseh7_SU Style sheetuiPrefsDialogBaseTbdX‰N N e‡ Synthetic abstract context wordsuiPrefsDialogBaseTbdX‰•^¦ÿ[W{&N*epÿ $Synthetic abstract size (characters)uiPrefsDialogBase4…ÇÙN*•^¦v„e‡g,N OW(˜„‰Èz—Sã‘ÌšØN®f>y:ÿY*abÿ 0CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase@ÙN*RˆhN-v„‹Í‹íOW(gå‹â‹íŠ“QehF‘ÌêR¨SØbext:xxx‹íSå0bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase Rcb N-˜yToggle selecteduiPrefsDialogBaseu(b7uL—bUser interfaceuiPrefsDialogBaseu(b7 ˜yUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_it.qm0000644000175000017500000006274113224431020014231 00000000000000<¸dÊÍ!¿`¡½ÝB+>ø-?%+;JFmb-}¨¥*MLô,Lô5€¬8‚EîZÉ$—.R'Hä-¢*Ð%"Ô*ì0#+Lô î1ø×G…ÔXGß%äH6ó6~H6õ6«J+‚ –J+‚0¾J6•âJ6•=ƒWÈÕãXÉÄYe® sºñ‘sºñ!Bv8“v®ÂÌv®Â!{zϳC€€£Oê0œA–Í<5Ðùƒ ¡Ðùƒ8ñÐùƒ<°Eµ±0,…A6>.c3XM¹TA‘vãM¯•ñ“ä£cê¯ÎxC êÞñƒbó LúþSI0ÿµ?ë ç£p#vå,‹w 5*yw 5/Üw 53gw 5:ŒU?‘©Ö³8¯ª6•6»f3#ÒͼuU(ì;U×úU júeî— ¬^‡&ÁS.‡NL?úd,ÔJUY‹JUY+ŒY ô73º™\ÝôLO”ìx@mþA¢)>Lƒ=·€ã‡N˜I¼ ˜I¼ f™n•Ø™n•5ãŸf•>È«$Ú«0óÚ#S¥ãX|?R -ZÁ-¼)Ž)ÖTY?BìS4žr?)*´rž©‹¦,(‡‹Üð7ŒÇ<$ ›ˆ˜2𛈘5µ¦AS@ªÃ¢i·¨ .·¨ 9Ô»œR6ØÇ¢•-Ø~CbðŒµ[t`³(-" 3 UKôYìp hMb—B ÇšKD6¦ %G¦öõô¶7-!ÊXÔZþHfCNÙFW#3¤F¯NQ>ŒÍwõn+“’žN²ð †Ɇt^,QçÇ }}A”ò“[á¨0ÎEHÄ2¯Ìí³ %ͳ,SÝÜI«äœcöö¨åB ú Ã^ß ´H" 9Zy2M K¨ó'Œ ®œ¯PA ü>V› äîZ Üc +<”C' 6 X `P} `ç£ c·E&‚ y ˜IœJ ²ëCà Äã+è âæç& ®% ®ù%‰ THF ŽÚ ` h¹° – ¨Î£&Ä »ïµ™ Û·å'Þ 'И$V 97Ãù PÖ™\ RVŽ 1 T# VüBf \iCXp `F¥ Ú÷8+ ÝøìM ö†À6F 8þJu FÁ/ y·;ˆ ‚±3W ‡u0\ ‡u:M ‰P$ ‰P j 5dU¬ ÕHh û£7Ù€S÷/¸.—<Þ] =Â#4G7Ò wJ›çbÙ"Szc-ízc9Ÿ‚3..¸‚3.1%“Ýè:µ›P¾ E¦Àè*ɾÑË“BÀ;>&Qá~WDY~s#v[žs(¹g3'EÕ FoÂ|“®Â|“Zbó l!¦ü©Üpü¶L´i_7Tutti i termini All clauses AdvSearch"Qualsiasi termine Any clause AdvSearchmultimedialimedia AdvSearch altriother AdvSearch fogli di calcolo spreadsheets AdvSearch testitexts AdvSearch<----- Tutti <----- All AdvSearchBase<----- Sel <----- Sel AdvSearchBase&Aggiungi condizione Add clause AdvSearchBase Ricerca avanzataAdvanced search AdvSearchBaseTutti ----> All ----> AdvSearchBaseEsploraBrowse AdvSearchBasePer categorie By categories AdvSearchBaselContrassegna per abilitare la ricerca sul tipo di file,Check this to enable filtering on file types AdvSearchBasetContrassegna per usare le categorie al posto dei tipi mime;Check this to use file categories instead of raw mime types AdvSearchBase ChiudiClose AdvSearchBase$Elimina condizione Delete clause AdvSearchBaseNScrivi la directory base per la ricercaEnter top directory for search AdvSearchBase8Ignora i file di questo tipoIgnored file types AdvSearchBase*Limita i tipi di fileRestrict file types AdvSearchBaseRLimita i risultati alla sotto-directory: %Restrict results to files in subtree: AdvSearchBase$Salva come defaultSave as default AdvSearchBaseHCerca i documenti<br>che contengono:'Search for
documents
satisfying: AdvSearchBase"Ricerca tipo fileSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase Cerca Start Search AdvSearchBaseAnnullaCancel EditTransBasepNessuna directory per il DB di base nella configurazione No db directory in configurationMain&Successivo&NextPreview&Precedente &PreviousPreview&Cerca: &Search for:Preview„Impossibile tradurre il documento per la rappresentazione interna 0Can't turn doc into internal representation for PreviewAnnullaCancelPreviewCancellaClearPreviewChiudi Tab Close TabPreviewFCreazione del testo per l'anteprimaCreating preview textPreviewVCaricamento anteprima del testo nell'editor Loading preview text into editorPreview:Rispetta &Maiuscole/minuscole Match &CasePreviewLManca il programma di filtro esterno: Missing helper program: Preview><b>Ramificazioni personalizzateCustomised subtreesQObjectè<i>I parametri che seguono sono postii al livello superiore, se niente <br> o una linea vuota è selezionata nella casella sovrastante, oppure al livello della cartella selezionata.<br> Puoi aggiungere/rimuovere cartelle cliccando i bottoni +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject.Segue il link simbolicoFollow symbolic linksQObjectÔSegue il link simbolico durante l'indicizzazione. Di default è no, per evitare la duplicazione dell'indiceTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Parametri globaliGlobal parametersQObject@Indicizza tutti i nomi dei filesIndex all file namesQObject&Indicizza il nome di quei files il cui contenuto non può essere identificato o processato (tipo mime non supportato). Di default è impostato a vero}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Parametri localiLocal parametersQObject0Parametri per la ricercaSearch parametersQObjectNomi saltati Skipped namesQObjectöLista delle sottocartelle nella gerarchia indicizzata<br>ove alcuni parametri devono essere ridefiniti. Predefinita: vuota.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject¼Questi sono modelli per i nomi delle cartelle e/o dei files che non devono vebire indicizzati.LThese are patterns for file or directory names which should not be indexed.QObject&Anteprima&PreviewQWidget.Copia il nome del &FileCopy &File NameQWidgetCopia l'&Url Copy &URLQWidget.Trova documenti &similiFind &similar documentsQWidgetAttenzioneWarningRTIToolW"(tutte le lingue)(all languages)RclMain((nessuna espansione) (no stemming)RclMain,Informazioni su Recoll About RecollRclMainRNon posso creare la finestra di anteprimaCan't create preview windowRclMainvNon posso estrarre il documento o creare il file temporaneo0Cannot extract document or create temporary fileRclMainxImpossibile caricare informazioni del documento dal database+Cannot retrieve document info from databaseRclMainChiusuraClosingRclMain0Cronologia dei documentiDocument historyRclMain Esecuzione di: [ Executing: [RclMain&Cronologia dei dati History dataRclMain4Indicizzazione in corso: Indexing in progress: RclMainPuliscoPurgeRclMain.Risultati della ricerca Query resultsRclMain&Database espansioniStemdbRclMainBQuesta ricerca non e' piu' attiva"This search is not active any moreRclMainSconosciutoUnknownRclMainAttenzioneWarningRclMainberrore nel recupero delle lingue per l'espansione#error retrieving stemming languagesRclMainmultimedialimediaRclMain altriotherRclMain.&Informazioni su Recoll &About Recoll RclMainBase"Ricerca &Avanzata&Advanced Search RclMainBaseJ&Cancella la cronologia dei documenti&Erase document history RclMainBase &File&File RclMainBase &Aiuto&Help RclMainBase&Preferenze &Preferences RclMainBase,&Parametri ordinamento&Sort parameters RclMainBase&Strumenti&Tools RclMainBase&Manuale utente &User manual RclMainBaseLMostra la finestra di Ricerca avanzataAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBaseLVisualizza la cronologia dei documentiDocument History RclMainBase*C&ronologia documentiDocument &History RclMainBase &EsciE&xit RclMainBase:Configurazione indici esterniExternal index dialog RclMainBasePrima pagina First page RclMainBaseFVai alla prima pagina dei risultatiGo to first page of results RclMainBasePagina seguente Next page RclMainBasePagina seguenteNext page of results RclMainBase"Pagina precedente Previous page RclMainBase"Pagina precedentePrevious page of results RclMainBase RecollRecoll RclMainBaseVConfigurazione dei parametri di ordinamentoSort parameters RclMainBase"&Esplora l'indiceTerm &explorer RclMainBase@Strumento di esplorazione indiceTerm explorer tool RclMainBase Aggiorna &indice Update &index RclMainBaseDataDate RecollModelNome file File name RecollModel: (mostra dettagli di ricerca) (show query)ResList<<p><b>Nessun risultato</b><br>

No results found
ResList0Cronologia dei documentiDocument historyResListRisultati DocumentsResListSuccessivoNextResListPrecedentePreviousResList Dettagli ricerca Query detailsResList&Lista dei risultati Result listResList,Documento inaccessibleUnavailable documentResListperforResList totale di almenoout of at leastResList Tutti All termsSSearchQualsiasiAny termSSearch:Stringa di ricerca malformataBad query stringSSearchÂInserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini.FEnter search terms here. Type ESC SPC for completions of current term.SSearchNome file File nameSSearch Memoria esaurita Out of memorySSearch8Linguaggio di interrogazioneQuery languageSSearchCancellaClear SSearchBase Ctrl+SCtrl+S SSearchBaseÂInserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase0Cancella voce di ricercaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase CercaSearch SSearchBaseInizia ricerca Start query SSearchBaseNome file File name SearchClauseWNumero di parole che possono frapporsi tra i termini di ricerca indicatiHNumber of additional words that may be interspersed with the chosen ones SearchClauseW‚Seleziona il tipo di ricerca da effettuare con i termini indicati>Select the type of query that will be performed with the words SearchClauseWSuccessivoNextSnippets CercaSearch SnippetsWEsploraBrowseSpecIdxW&Chiudi&Close SpellBase&Espandi &Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase0Esplorazione dei termini Term Explorer SpellBase0Nessun epansione trovataNo expansion foundSpellW(Espressione regolareRegexpSpellW&Ortografia/FoneticaSpelling/PhoneticSpellW.Espansione grammaticaleStem expansionSpellWTermineTermSpellWCaratteri jolly WildcardsSpellWpImpossibile formare la lista di espansione per la lingua#error retrieving stemming languagesSpellW Tutti All terms UIPrefsDialogQualsiasiAny term UIPrefsDialogNome file File name UIPrefsDialog8Linguaggio di interrogazioneQuery language UIPrefsDialogvLa directory selezionata non sembra essera un indice Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogXLa directory selezionata e' gia' nella lista3The selected directory is already in the index list UIPrefsDialog<Questo e' l'indice principale!This is the main/local index! UIPrefsDialogŽImpossibile formare la lista delle lingue per l'espansione grammaticale#error retrieving stemming languages UIPrefsDialog ChiudiCloseViewActionBase>Applicazione di visualizzazioneNative ViewersViewActionBase\Impossibile scrivere il file di configurazioneCan't write configuration fileconfgui::ConfIndexWÿÿÿÿChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWGlobaleGlobalconfgui::ConfSubPanelW Lingua di aspellAspell languageconfgui::ConfTopPanelW@Nome della cartella del databaseDatabase directory nameconfgui::ConfTopPanelW€Intervallo in megabite per il salvataggio intermedio dell'indiceIndex flush megabytes intervalconfgui::ConfTopPanelW(Nome del file di log Log file nameconfgui::ConfTopPanelW8Livello di verbosità del logLog verbosity levelconfgui::ConfTopPanelW Non usare aspellNo aspell usageconfgui::ConfTopPanelW"Indirizzi saltati Skipped pathsconfgui::ConfTopPanelW*Lingue per la radice Stemming languagesconfgui::ConfTopPanelW”Il file dove verranno scritti i messaggi.<br>Usa 'stderr' per il terminalePThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWžLingue per le quali verrà costruito<br>il dizionario delle espansioni radicali.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW°Lista delle cartelle in cui inizia lìindicizzazione recorsiva. Di default è la tua home.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW@Questo valore regola il volume di dati da indicizzare tra un salvataggio e l'altro.<br>Aiuta a controllare l'uso della memoria. Di default è post uguale a 10MbŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÀQuesto valore regola il numero dei messaggi,>br>dai soli errori a mole indicazioni per il debug.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW$Cartella superioreTop directoriesconfgui::ConfTopPanelW&Annulla&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase¦Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseSeleziona tutti Activate AlluiPrefsDialogBaseAggiungi indice Add indexuiPrefsDialogBase"Applica modifiche Apply changesuiPrefsDialogBase‚Inizia automaticamente una ricerca semplice digitando uno spazio.-Auto-start simple search on whitespace entry.uiPrefsDialogBasejAggiungi automaticamente frase alle ricerche semplici+Automatically add phrase to simple searchesuiPrefsDialogBase"Deseleziona tuttiDeactivate AlluiPrefsDialogBase"Annulla modificheDiscard changesuiPrefsDialogBase’Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase>Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti..zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBaseHCostruisci dinamicamente i riassuntiDynamically build abstractsuiPrefsDialogBaseIndici esterniExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBaseŒDimensione massima del testo da evidenziare nell'anteprima (megabytes)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase<Numero di risultati per pagina"Number of entries in a result pageuiPrefsDialogBaseœApre una finestra di dialogo per selezionare i fonts della lista dei risultati-Opens a dialog to select the result list fontuiPrefsDialogBasedRicorda lo stato dell'impostazione di ordinamento.Remember sort activation state.uiPrefsDialogBasetRimuovi dalla lista. Non ha effetto sull'indice del disco.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase&Rimuovi selezionatiRemove selecteduiPrefsDialogBaseJSostituisci i riassunti dei documenti Replace abstracts from documentsuiPrefsDialogBaseRipristinaResetuiPrefsDialogBaseVRipristina i font della lista dei risultati1Resets the result list font to the system defaultuiPrefsDialogBase@Fonts per la lista dei risultatiResult list fontuiPrefsDialogBase0Parametri per la ricercaSearch parametersuiPrefsDialogBase^Inizia aprendo la finestra di ricerca avanzata.'Start with advanced search dialog open.uiPrefsDialogBase6Linguaggio per l'espansioneStemming languageuiPrefsDialogBaseZNumero di parole di contesto per il riassunto Synthetic abstract context wordsuiPrefsDialogBaseBNumero caratteri per il riassunto$Synthetic abstract size (characters)uiPrefsDialogBase¶Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase&Commuta selezionatiToggle selecteduiPrefsDialogBase$Interfaccia utenteUser interfaceuiPrefsDialogBase"Preferenze utenteUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_tr.ts0000644000175000017500000036446713224431020014265 00000000000000 AdvSearch All clauses Tüm ifadeler Any clause İfadelerin herhangi biri texts metinler spreadsheets hesap tabloları presentations sunumlar media ortamlar messages iletiler other diÄŸer Bad multiplier suffix in size filter text spreadsheet presentation message AdvSearchBase Advanced search GeliÅŸmiÅŸ arama Search for <br>documents<br>satisfying: Uyan <br>belgeleri<br>ara: Delete clause İfadeyi sil Add clause İfade ekle Restrict file types Dosya tiplerini sınırlandır Check this to enable filtering on file types Dosya tipleri üzerinde filtreleme kullanmak için bunu iÅŸaretleyin By categories Kategorilere göre Check this to use file categories instead of raw mime types Dosya tipleri yerine ham mime tipleri üzerinde filtreleme kullanmak için bunu iÅŸaretleyin Save as default öntanımlı olarak kaydet Searched file types Aranan dosya tipleri All ----> Tümü ----> Sel -----> Seç -----> <----- Sel <----- Seç <----- All <----- Tümü Ignored file types Yoksayılan dosya tipleri Enter top directory for search Arama için en üst dizini girin Browse Gözat Restrict results to files in subtree: Arama sonuçlarını bu dizin ve aÅŸağısı ile sınırlandır: Start Search Aramayı BaÅŸlat Close Kapat All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog EditTrans Source path Local path Config error Original path EditTransBase Path Translations Setting path translations for Select one or several file types, then use the controls in the frame below to change how they are processed Add Delete Cancel İptal Save FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main Configuration problem (dynconf Yapılandırma sorunu No db directory in configuration Yapılandırma içerisinde veritabanı dizini yok Could not open database in Veritabanı açılamadı . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . İndekseleme baÅŸlamadan yapılandırmayı düzenlemek için İptal düğmesine basın ya da Tamam düğmesine basarak iÅŸleme izin verin. "history" file is damaged or un(read)writeable, please check or remove it: Preview Close Tab Sekmeyi Kapat Cannot create temporary directory Geçici dizin oluÅŸturulamadı Cancel İptal Missing helper program: Yardımcı program kayıp: Can't turn doc into internal representation for Åžunun için iç gösterim yapılamıyor Creating preview text Önizleme metni oluÅŸturuluyor Loading preview text into editor Önizleme metni düzenleyiciye yükleniyor &Search for: A&ra: &Next &Sonraki &Previous &Önceki Clear Temizle Match &Case EÅŸleÅŸme Åža&rtı Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Genel parametreler Local parameters Yerel parametreler <b>Customised subtrees <b>ÖzelleÅŸtirilmiÅŸ alt aÄŸaçlar The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. İndekslenmiÅŸ sıralama içerisindeki alt dizinlerin listesi <br>ki burada bazı parametrelerin yeniden tanımlanması gerekir. Öntanımlı: boÅŸ. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>AÅŸağıdaki parametreler, ya seçili alt dizin için uygulanır ya da üst düzeyde veya üstteki metin kutusunda hiçbir ÅŸey seçilmediÄŸinde yada boÅŸ bir satır seçildiÄŸinde uygulanır.<br>+/- düğmelerine tıklayarak dizinleri ekleyip çıkarabilirsiniz. Skipped names Atlanan isimler These are patterns for file or directory names which should not be indexed. Bu nitelikler insekslenmemesi gereken dosya ve dizinler içindir. Default character set Öntanımlı karakter seti This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Bu karakter seti, karakter kodlaması uygulama tarafından belirlenemeyen dosyalar için kulanılır, ÖrneÄŸin salt metin dosyaları.<br>Öntanımlı deÄŸer boÅŸtur ve NLS çevresel deÄŸiÅŸkeni kullanılır. Follow symbolic links Sembolik baÄŸlantıları izle Follow symbolic links while indexing. The default is no, to avoid duplicate indexing İndekslerken sembolik baÄŸlantıları izle. Aynı ögelerin yeniden indekslenmesinden kaçınmak için öntanımlı deÄŸer hayır Index all file names Tüm dosya isimlerini indeksle Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true İçeriÄŸi tanınmayan ya da iÅŸlenemeyen (ya da desteklenmeyen mime tipi) dosyaları indeksle. Öntanımlı evet Search parameters Arama parametreleri Web history Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &Önizle &Open Open With Run Script Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala &Write to File Save selection to files Preview P&arent document/folder &Open Parent document/folder Find &similar documents Benzer belgeleri &bul Open &Snippets window Show subdocuments / attachments QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Uyarı Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain (no stemming) (kök ayrıştırma kullanma) (all languages) (tüm diller) error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu Indexing in progress: İndeksleme devam ediyor: Files Dosyalar Purge Temizle Stemdb KökAyrıştırmaVeritabanı Closing Kapatılıyor Unknown Bilinmeyen Can't start query: Sorgu baÅŸlatılamadı: Query results Arama Sonuçları Cannot retrieve document info from database Veritabanından belge bilgileri alınamadı Warning Uyarı Can't create preview window Önizleme penceresi oluÅŸturulamıyor This search is not active any more Bu arama atrık etkin deÄŸil Bad viewer command line for %1: [%2] Please check the mimeconf file %1 için uygun olmayan komut: [%2] Lütfen mimeconf dosyasını kontrol edin Cannot extract document or create temporary file Belge açılamadı ya da geçici dosya oluÅŸturulamadı Executing: [ Çalıştırılıyor: [ About Recoll Recoll Hakkında History data GeçmiÅŸ verileri Document history Belge geçmiÅŸi Update &Index Stop &Indexing All media ortamlar message other diÄŸer presentation spreadsheet text sorted filtered No helpers found missing Missing helper programs No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Sorgu detayları Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index query error Content has been indexed for these mime types: Can't update index: indexer running Indexed MIME Types Bad viewer command line for %1: [%2] Please check the mimeview file Viewer command line for %1 specifies both file and parent file value: unsupported Cannot find parent document Indexing did not run yet External applications/commands needed for your file types and not found, as stored by the last indexing pass in Sub-documents and attachments Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents These Urls ( | ipath) share the same content: Bad desktop app spec for %1: [%2] Please check the desktop file Indexing interrupted The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll Recoll Search tools Arama araçları Result list Sonuç listesi &File &Dosya &Tools &Araçlar &Preferences &Tercihler &Help &Yardım E&xit &Çık Ctrl+Q Ctrl+Q Update &index İndeksi g&üncelle &Erase document history &Belge geçmiÅŸini temizle &About Recoll &Recoll Hakkında &User manual &Kullanıcı El Kitabı Document &History Belge &GeçmiÅŸi Document History Belge GeçmiÅŸi &Advanced Search &GeliÅŸmiÅŸ arama Advanced/complex Search GeliÅŸmiÅŸ/karmaşık Arama &Sort parameters &Sıralama Ölçütleri Sort parameters Sıralama ölçütleri Term &explorer İfade g&österici Term explorer tool İfade gösterme aracı Next page Sonraki sayfa Next page of results Sonuçların sonraki sayfası First page İlk sayfa Go to first page of results Sonuçların ilk sayfasına git Previous page Önceki sayfa Previous page of results Sonuçların önceki sayfası &Query configuration &Sorgu yapılandırması External index dialog Dış indeksler penceresi &Indexing configuration İ&ndeksleme yapılandırması PgDown PgUp &Full Screen F11 Full Screen &Erase search history Sort by dates from oldest to newest Sort by dates from newest to oldest Show Query Details &Rebuild index Shift+PgUp E&xternal index dialog &Index configuration &GUI configuration &Results Sort by date, oldest first Sort by date, newest first Show as table Show results in a spreadsheet-like table Save as CSV (spreadsheet) file Saves the result into a file which you can load in a spreadsheet Next Page Previous Page First Page Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel File name Dosya adı Mime type Mime Tipi Date Tarih Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Sonuç listesi <p><b>No results found</b><br> <p><b>Sonuç bulunamadı</b><br> (show query) (sorguyu göster) Unavailable document EriÅŸilemez belge Previous Önceki Next Sonraki &Preview &Önizle Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala Find &similar documents Benzer belgeleri &bul Query details Sorgu detayları Document history Belge geçmiÅŸi Preview Önizle Open <p><i>Alternate spellings (accents suppressed): </i> Documents out of at least for <p><i>Alternate spellings: </i> Result count (est.) Snippets ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Önizle Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala Find &similar documents Benzer belgeleri &bul &Save as CSV Add "%1" column ResTableDetailArea &Preview &Önizle Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala Find &similar documents Benzer belgeleri &bul ResultPopup &Preview &Önizle Copy &File Name &Dosya Adını Kopyala Copy &URL &Adresi Kopyala Find &similar documents Benzer belgeleri &bul SSearch Any term Sözcüklerin herhangi biri All terms Tüm sözcükler File name Dosya adı Query language Arama dili Bad query string Uygunsuz arama ifadesi Out of memory Yetersiz bellek Too many completions Çok fazla tamamlama Completions Tamamlamalar Select an item: Bir öge seçin: Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Aranacak ifadeleri buraya girin. Geçerli sözcüğün tamamlanması için ESC SPACE kullanın. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear Temizle Ctrl+S Ctrl+S Erase search entry Arama girdisini temizle Search Ara Start query Sorguyu baÅŸlat Enter search terms here. Type ESC SPC for completions of current term. Aranacak ifadeleri buraya girin. Geçerli sözcüğün tamamlanması için ESC SPACE kullanın. Choose search type. SearchClauseW SearchClauseW SearchClauseW Any of these Bunların herhangi biri All of these Bunların tümü None of these Bunların hiçbiri This phrase Tam olarak bu ifade Terms in proximity Yakın ifadeler File name matching Dosya adı eÅŸleÅŸen Select the type of query that will be performed with the words Sözcükler ile kullanılacak sorgu biçimini seç Number of additional words that may be interspersed with the chosen ones Seçilen sözcüklerin arasında yer alabilecek ek sözcüklerin sayısı No field Any All None Phrase Proximity File name Dosya adı Snippets Snippets Find: Next Sonraki Prev SnippetsW Search Ara <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SortForm Date Tarih Mime type Mime Tipi SortFormBase Sort Criteria Sıralama Ölçütü Sort the Sırala most relevant results by: en uygun sonuç veren: Descending Azalan Apply Uygula Close Kapat SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse Gözat Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer İfade Gösterici &Expand &GeniÅŸlet Alt+E Alt+G &Close &Kapat Alt+C Alt+K Term İfade No db info. Match Case Accents SpellW Wildcards Özel karakterler Regexp Düzenli ifade Stem expansion Kök ayrıştırma geniÅŸlemesi Spelling/Phonetic Heceleme/Fonetik error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu Aspell init failed. Aspell not installed? Aspell baÅŸlatılamadı. YüklenmemiÅŸ olabilir mi? Aspell expansion error. Aspell heceleme geniÅŸlemesi hatası. No expansion found Hiç geniÅŸleme bulunamadı Term İfade Doc. / Tot. Index: %1 documents, average length %2 terms.%3 results %1 results List was truncated alphabetically, some frequent terms may be missing. Try using a longer root. Show index statistics Number of documents Average terms per document Database directory size MIME types: Item Value Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog error retrieving stemming languages sözcük kökleri ayrıştırılabilir diller alınırken hata oluÅŸtu The selected directory does not appear to be a Xapian index Seçilen dizin bir Xapian indeks dizini gibi görünmüyor This is the main/local index! Bu ana/yerel veritabanı! The selected directory is already in the index list Seçilen dizin zaten indeks listesinde var Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Xapian indeks dizinini seç (/home/kullanıcı_adınız/.recoll/xapiandb gibi.) Choose Gözat Result list paragraph format (erase all to reset to default) Result list header (default is empty) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read At most one index should be selected Cant add index with different case/diacritics stripping option Default QtWebkit font Any term Sözcüklerin herhangi biri All terms Tüm sözcükler File name Dosya adı Query language Arama dili Value from previous program exit UIPrefsDialogBase User preferences Kullanıcı tercihleri User interface Kullanıcı arayüzü Number of entries in a result page Bir sonuç sayfasındaki sonuç sayısı Result list font Sonuç listesi yazıtipi Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Sonuç listesi yazıtipini seçmek için bir pencere açar Reset Sıfırla Resets the result list font to the system default Sonuç listesi yazıtipini sistem ayarlarına döndür Result paragraph<br>format string Sonuç paragrafı<br>biçimlendirme ifadesi Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Tüm sonuç listesi paragraflarını tanımlar. Qt html biçimini ve printf benzeri yer deÄŸiÅŸtiricileri kullanın:<br>%A Özet<br> %D Tarih<br> %I Simge resminin adı<br> %K Anahtar sözcükler (eÄŸer varsa)<br> %L Önizle ve Düzenle baÄŸlantıları<br> %M Mime tipi<br> %N Sonuç sayısı<br> %R Uyum yüzdesi<br> %S Boyut bilgileri<br> %T BaÅŸlık<br> %U Url<br> Texts over this size will not be highlighted in preview (too slow). Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yavaÅŸ). Maximum text size highlighted for preview (megabytes) Önizlemede vurgulanacak en fazla metin boyutu (MB) Auto-start simple search on whitespace entry. Beyaz alan girdisi olduÄŸunda basit aramayı otomatik olarak baÅŸlat. Start with advanced search dialog open. GeliÅŸmiÅŸ arama penceresi ile baÅŸla. Start with sort dialog open. Sıralama penceresi ile baÅŸla. Use desktop preferences to choose document editor. Belge düzenleyiciyi seçmek için masaüstü tercihlerini kullan. Remember sort activation state. Sıralama kurallarını hatırla. Search parameters Arama parametreleri Stemming language Kök ayrıştırma dili Automatically add phrase to simple searches Basit aramalara ifadeyi otomatik olarak ekle A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. [linux kernel] (2 sözcük) araması [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak deÄŸiÅŸtirilecektir. Bu, aranacak sözcüklerin tam olarak girildiÄŸi gibi görüntülendiÄŸi sonuçlara yüksek öncelik verilmesini saÄŸlayacaktır. Dynamically build abstracts Özetleri dinamik olarak oluÅŸtur Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Sorgu sözcükleri kullanılarak sonuç listesi girdileri için özet oluÅŸturulsun mu ? Büyük boyutlu belgelerde yavaÅŸ olabilir. Replace abstracts from documents Belgelerden özetleri kaldır Do we synthetize an abstract even if the document seemed to have one? Belgenin bir özeti varsa bile bir yapay özet oluÅŸturulsun mu? Synthetic abstract size (characters) Yapay özet boyutu (karakter sayısı) Synthetic abstract context words Yapay özet sözcükleri External Indexes Dış indeksler External indexes Dış indeksler Toggle selected Seç /Bırak Activate All Tümünü EtkinleÅŸtir Deactivate All Tümünü PasifleÅŸtir Remove selected Seçileni sil Remove from list. This has no effect on the disk index. Listeden sil. Bu diskteki indeksi etkilemez. Add index İndeks ekle Select the xapiandb directory for the index you want to add, then click Add Index İstediÄŸiniz indeksi eklemek için xapiandb (veritabanı) dizinini seçin ve İndeks Ekle düğmesine tıklayın Browse Gözat &OK &TAMAM Apply changes DeÄŸiÅŸiklikleri uygula &Cancel &İptal Discard changes DeÄŸiÅŸiklikleri sil ViewAction Changing actions with different current values Farklı deÄŸerlerle eylemler deÄŸiÅŸtiriliyor Mime type Mime Tipi Command MIME type Desktop Default Changing entries with different current values ViewActionBase Native Viewers DoÄŸal Göstericiler Select one or several file types, then click Change Action to modify the program used to open them Bir ya da birkaç dosya tipi seçin ve Eylemi DeÄŸiÅŸtir düğmesine tıklayarak hangi uygulama ile açılacağını deÄŸiÅŸtirin File type Dosya tipi Action Davranış Change Action Davranışı DeÄŸiÅŸtir Close Kapat Select one or several mime types then use the controls in the bottom frame to change how they are processed. Use Desktop preferences by default Select one or several file types, then use the controls in the frame below to change how they are processed Exception to Desktop preferences Action (empty -> recoll default) Apply to current selection Recoll action: current value Select same <b>New Values:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) Process the WEB history queue Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file Yapılandırma dosyası yazılamadı confgui::ConfParamFNW Browse Gözat Choose Gözat confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. Automatic character case sensitivity <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. Maximum term expansion count <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. Maximum Xapian clauses count <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. confgui::ConfSubPanelW Global Genel Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories Üst dizinler The list of directories where recursive indexing starts. Default: your home. Özyinelemeli indesklemenin baÅŸlayacağı dizinlerin listesi. Öntanımlı: ev dizininiz. Skipped paths Atlanan yollar These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Bunlar indekslemenin girmeyeceÄŸi dizinlerin adlarıdır.<br> * gibi özel karakterler içerebilir. İndeksleyici tarafından görülen yollar ile eÅŸleÅŸmelidir (örneÄŸin: eÄŸer en üst dizinler '/home/ben' ve '/home' içeriyorsa ve home '/usr/home' dizinine baÄŸlantılı ise atlanacak dizin yolu '/home/me/tmp*' olmalıdır, '/usr/home/me/tmp*' deÄŸil) Stemming languages Sözcük kökleri ayrıştırılabilir diller The languages for which stemming expansion<br>dictionaries will be built. Kök ayrıştırma geniÅŸlemesi için sözlükleri<br>inÅŸa edilecek olan diller. Log file name Günlük dosyasının adı The file where the messages will be written.<br>Use 'stderr' for terminal output İletilerin yazılacağı dosya.<br>Uçbirim çıktısı için 'stderr' kullanın Log verbosity level Günlük dosyası ayrıntı düzeyi This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Bu deÄŸer ileti boyutunu ayarlar,<br>sadece hatalardan hata ayıklama verilerine kadar. Index flush megabytes interval İndex düzeltme MB aralığı This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Bu deÄŸer diske gönderilecek indekslenmiÅŸ veri miktarını ayarlar.<br>Bu indeksleyicinin bellek kullanımını kontrol etmeye yarar. Öntanımlı 10MB Max disk occupation (%) En yüksek disk kullanımı (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Bu disk kullanımının yüzdesidir ki bu orana eriÅŸildiÄŸinde indeksleme durdurulur (diskin doldurulmasını engellemek için).<br>0 kısıtlama yok demektir (Öntanımlı). No aspell usage Aspell kullanımı yok Aspell language Aspell dili The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Aspell sözlükleri için dil. Bu 'en' ya da 'fr' gibi olmalıdır ...<br>EÄŸer bu deÄŸer ayarlanmazsa ÅŸimdi kullandığnız NLS çevresel deÄŸiÅŸkeni kullanılacaktır. Sisteminizde neyin yüklü olduÄŸu hakkında bilgi almak için 'aspell config' yazıp 'data-dir' içerisindeki .dat dosyalarına bakın. Database directory name Veritabanı dizininin adı The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. İndeksin duracağı dizinin adı<br>EÄŸer tam yol verilmezse yol yapılandırma dizinine göre belirlenecek. Öntanımlı dizin adı 'xapiandb'. Use system's 'file' command Sistemdeki 'file' komutunu kullan Use the system's 'file' command if internal<br>mime type identification fails. İç mime tipi belirleme iÅŸlemi baÅŸarısız olursa<br> sistemdeki 'file' komutunu kullan. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Unac exceptions <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Kullanıcı tercihleri User interface Kullanıcı arayüzü Number of entries in a result page Bir sonuç sayfasındaki sonuç sayısı If checked, results with the same content under different names will only be shown once. Hide duplicate results. Result list font Sonuç listesi yazıtipi Opens a dialog to select the result list font Sonuç listesi yazıtipini seçmek için bir pencere açar Helvetica-10 Helvetica-10 Resets the result list font to the system default Sonuç listesi yazıtipini sistem ayarlarına döndür Reset Sıfırla Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Tüm sonuç listesi paragraflarını tanımlar. Qt html biçimini ve printf benzeri yer deÄŸiÅŸtiricileri kullanın:<br>%A Özet<br> %D Tarih<br> %I Simge resminin adı<br> %K Anahtar sözcükler (eÄŸer varsa)<br> %L Önizle ve Düzenle baÄŸlantıları<br> %M Mime tipi<br> %N Sonuç sayısı<br> %R Uyum yüzdesi<br> %S Boyut bilgileri<br> %T BaÅŸlık<br> %U Url<br> Result paragraph<br>format string Sonuç paragrafı<br>biçimlendirme ifadesi Texts over this size will not be highlighted in preview (too slow). Bu boyuttan büyük metinler önizlemede vurgulanmayacak (çok yavaÅŸ). Maximum text size highlighted for preview (megabytes) Önizlemede vurgulanacak en fazla metin boyutu (MB) Use desktop preferences to choose document editor. Belge düzenleyiciyi seçmek için masaüstü tercihlerini kullan. Choose editor applications Auto-start simple search on whitespace entry. Beyaz alan girdisi olduÄŸunda basit aramayı otomatik olarak baÅŸlat. Start with advanced search dialog open. GeliÅŸmiÅŸ arama penceresi ile baÅŸla. Start with sort dialog open. Sıralama penceresi ile baÅŸla. Remember sort activation state. Sıralama kurallarını hatırla. Prefer Html to plain text for preview. Search parameters Arama parametreleri Stemming language Kök ayrıştırma dili A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. [linux kernel] (2 sözcük) araması [linux veya kernel veya (linux ifadesi 2 tane kernel)] olarak deÄŸiÅŸtirilecektir. Bu, aranacak sözcüklerin tam olarak girildiÄŸi gibi görüntülendiÄŸi sonuçlara yüksek öncelik verilmesini saÄŸlayacaktır. Automatically add phrase to simple searches Basit aramalara ifadeyi otomatik olarak ekle Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Sorgu sözcükleri kullanılarak sonuç listesi girdileri için özet oluÅŸturulsun mu ? Büyük boyutlu belgelerde yavaÅŸ olabilir. Dynamically build abstracts Özetleri dinamik olarak oluÅŸtur Do we synthetize an abstract even if the document seemed to have one? Belgenin bir özeti varsa bile bir yapay özet oluÅŸturulsun mu? Replace abstracts from documents Belgelerden özetleri kaldır Synthetic abstract size (characters) Yapay özet boyutu (karakter sayısı) Synthetic abstract context words Yapay özet sözcükleri The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Dış indeksler Toggle selected Seç /Bırak Activate All Tümünü EtkinleÅŸtir Deactivate All Tümünü PasifleÅŸtir Remove from list. This has no effect on the disk index. Listeden sil. Bu diskteki indeksi etkilemez. Remove selected Seçileni sil Add index İndeks ekle Apply changes DeÄŸiÅŸiklikleri uygula &OK &TAMAM Discard changes DeÄŸiÅŸiklikleri sil &Cancel &İptal Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Gözat Resets the style sheet to default Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage Plain text to HTML line style Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. <BR> <PRE> <PRE> + wrap Disable Qt autocompletion in search entry. Search as you type. Paths translations Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Snippets window CSS file Opens a dialog to select the Snippets window CSS style sheet file Resets the Snippets window style Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_uk.qm0000644000175000017500000006657613224431020014246 00000000000000<¸dÊÍ!¿`¡½ÝBˆ+A˜-AÅ+;O¤H,3H,7Qmb1–¨¥.ELô/éLô9[f¾0¬;ø¬ôˬô%´Eîa°$—2q'Hä1¹*Ð%&Þ*ì0' +Lô â1ø ó:Îd$DG…Ô_8Gß)ÄH6ó:]J+‚‚J+‚4ÜJ6•\J6•@AWÈÕ!˜XÉÄ`e®òsºñ{sºñ$~v8“!Év®Âñv®Â$äzϳ÷€€£UŒ0œGÂÍ?IÐùƒ#ËÐùƒ.cìXM¹[LnÚó‘vãRõ•ñ“›£cê ÕÎxCWÞñƒ÷ó L÷þSI3ôÿµDÎ çTp#¼vå0²w 5.qw 53»w 57|w 5=†ŒUD~©Ö³ìxFíþA¢-2çÞ4ƒLƒ@wXË4 e€ã‡X˜I¼ -˜I¼N™n•„™n•9¼Ÿf•=NŸf•AXŸf•T «(æ«5 Ú#YãX|Aò -Z ï-¼-†)ÖT`XB9€E.BìS8‘r?).®rž°‹¦,,©‹Üð;0ŒÇ<( ›ˆ˜6Ü›ˆ˜9Œ¦AS rªÃ¢"·¨ 21·¨ =»œR:ŠÇ¢•<Ø~C ’ðŒµbY`³,5" 7UKô`óp hR¬–T#¦—B¯šKJ<¦ %9¦öõ¦¶71@ÊXÔ €þNCSõFW#7»F¯NVÈŒÍwŒÏ—0In.ö“’žSJ¦š´%K²ð “Ót\Ót%Ɇtdñ:uî]HQçÇ™}}*”ò“b¬¨0ÎK.Ä6›Ìí³ Í³0|ÝÜOäœc Jö¨åH&ú Ãe’ ´H&! 9Zy67 K¨ó+v ]#—!* ®œ¯Uß ²9B5 ü>]ø äîà Üc§ +<”IO 6  `P  `ç£ c·E*^ yß ˜IœOg ²ëCÔ Äã/² âæç)õ ®) ®ù)m THè ŽÚ N h¹° † ¨Î£*¤ »ïµ‡ Û·å+ä ÛÓTÜ 'И(v /¥ Á 97Ó PÖ™q RVŽ# T#’ VüH’ \iC_ `F¥‘ Ú÷;© ÝøìRb é—~Yþ ö†À:# 8þOÓ FÁ× y·>² y¹~t ‚±3 ‡u4C ‡u=Å ‰P5 ‰P# 5d\“ ÕHÚ û£;a€YW/¸.5<ÞcÈ=Â'BG7ÒYJ››bÙ&ozc1úzc<Ë‚3.2Ç‚3.5?“Ýè> ›P¾ g¦Àè-øÆÀè#Gɾ.Ë“Hê;@ÊQá~^uY~s'ˆ[žs,Ûg3++Õ L?Â|“EÂ|“aYÎÁ'"Nó l%Þü©Ü&ü¶LfieÜAV ?>;O All clauses AdvSearchC4L-O:5 ?>;5 Any clause AdvSearch<C;LB8<54V0media AdvSearch?>2V4><;5==Omessage AdvSearchV=H5other AdvSearch?@575=B0FVW presentation AdvSearchB01;8FV spreadsheet AdvSearchB01;8FV spreadsheets AdvSearch B5:ABtext AdvSearch B5:AB8texts AdvSearch<----- AV <----- All AdvSearchBase<----- 81 <----- Sel AdvSearchBase>40B8 ?>;5 Add clause AdvSearchBase!:;04=89 ?>HC:Advanced search AdvSearchBaseAV -----> All ----> AdvSearchBaseÞAV =5?CABV ?>;O 1C45 >1'T4=0=> 70 4>?><>3>N  ("CAV A;>20") 01> " ("1C4L-O:V A;>20").<br>>;O B8?C "1C4L-O:V A;>20", "CAV A;>20" B0 "157 F8E A;V2" ?@89<0NBL AC<VH A;V2 B0 D@07 C ?>42V9=8E ;0?:0E.<br>>;O 157 40=8E =5 15@CBLAO 4> C2038.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase5@53;O4Browse AdvSearchBase> :0B53>@VOE By categories AdvSearchBaseT8:>@8AB>2C20B8 DV;LB@0FVN ?> B8?0E D09;V2,Check this to enable filtering on file types AdvSearchBaseX8:>@8AB>2C20B8 :0B53>@VW 70<VABL B8?V2 MIME;Check this to use file categories instead of raw mime types AdvSearchBase0:@8B8Close AdvSearchBase@81@0B8 ?>;5 Delete clause AdvSearchBase0(C:0B8 BV;L:8 C :0B0;>7VEnter top directory for search AdvSearchBase3=>@>20=VIgnored file types AdvSearchBase(1<568B8 B8?8 D09;V2Restrict file types AdvSearchBaseJ1<568B8 ?>HC: ?> D09;0E 7 ?V445@520:%Restrict results to files in subtree: AdvSearchBase$15@53B8 O: B8?>2VSave as default AdvSearchBaseT(C:0B8<br>4>:C<5=B8,</br>I> 704>2V;L=ONBL:'Search for
documents
satisfying: AdvSearchBase 060=VSearched file types AdvSearchBase81 -----> Sel -----> AdvSearchBase (C:0B8 Start Search AdvSearchBaseV4<V=8B8Cancel EditTransBaseB :>=DV3C@0FVW =5<0T :0B0;>3C   No db directory in configurationMain&0ABC?=5&NextPreview&>?5@54=T &PreviousPreview&(C:0B8: &Search for:Preview|5<>6;82> ?5@5B2>@8B8 4>:C<5=B =0 2=CB@VH=T ?@54AB02;5==O 4;O 0Can't turn doc into internal representation for PreviewV4<V=8B8CancelPreview !B5@B8ClearPreview0:@8B8 2:;04:C Close TabPreview6!B2>@NN B5:AB 4;O ?5@53;O4CCreating preview textPreviewJ020=B06CN B5:AB ?5@53;O4C 2 @540:B>@ Loading preview text into editorPreview,&'CB;82VABL 4> @5TAB@C Match &CasePreview@5 7=0945=> 4>?><V6=C ?@>3@0<C: Missing helper program: Preview>:07C20B8 ?>;O Show fieldsPreviewTextEdit2>:07C20B8 >A=>2=89 B5:ABShow main textPreviewTextEdit:<b>V445@520 7 =0;0HBC20==O<8Customised subtreesQObjecth<i>86G5=02545=V ?0@0<5B@8 7<V=NNBLAO 01> =0 25@E=L><C @V2=V, O:I><br>=5 281@0=> =VG>3> 01> ?CAB89 @O4>:, 01> 4;O 281@0=>W B5:8.<br>8 <>65B5 4>40B8 01> ?@81@0B8 B5:8 :=>?:0<8 +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject> >7:@820B8 A8<2>;VG=V ?>A8;0==OFollow symbolic linksQObject’%>48B8 ?> A8<;V=:0E ?@8 V=45:A0FVW. "8?>2> "=V" 4;O C=8:=5==O 4C1;V:0BV2TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$030;L=V ?0@0<5B@8Global parametersQObject8=45:AC20B8 2AV =0728 D09;V2Index all file namesQObject =45:AC20B8 B0:>6 =0728 D09;V2, 2<VAB O:8E =5 <>65 1CB8 2?V7=0=> G8 >1@>1;5=> (=52V4><89 01> =5?V4B@8<C20=89 B8? MIME). "8?>2> "B0:"}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"VAF52V ?0@0<5B@8Local parametersQObject 0@0<5B@8 ?>HC:CSearch parametersQObject @>?CA:0B8 =0728 Skipped namesQObjectÄ!?8A>: B5: C V=45:A>20=V9 VT@0@EVW,<br>4;O O:8E 45O:V ?0@0<5B@8 ?>B@V1=> 7<V=8B8. "8?>2>: ?CAB89.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectj(01;>=8 =072 D09;V2 01> B5:, O:V =5 1C45 V=45:A>20=>.LThese are patterns for file or directory names which should not be indexed.QObject&5@53;O=CB8&PreviewQWidget,>?VN20B8 &=072C D09;0Copy &File NameQWidget>?VN20B8 &URL Copy &URLQWidget.=09B8 &AE>6V 4>:C<5=B8Find &similar documentsQWidget>?5@5465==OWarningRTIToolW(2AV <>28)(all languages)RclMain(157 A;>2>D>@<) (no stemming)RclMain@> Recoll About RecollRclMain2AVAllRclMain@5 <>6C AB2>@8B8 2V:=> ?5@53;O4CCan't create preview windowRclMainl5<>6;82> 74>1CB8 4>:C<5=B G8 AB2>@8B8 B8<G0A>289 D09;0Cannot extract document or create temporary fileRclMainJ5 <>6C 74>1CB8 4>:C<5=B 7 1078 40=8E+Cannot retrieve document info from databaseRclMain0:@820NClosingRclMain$AB>@VO 4>:C<5=BV2Document historyRclMain8:>=CN: [ Executing: [RclMain0=V VAB>@VW History dataRclMain=45:ACTBLAO: Indexing in progress: RclMain,=45:AC20==O ?5@5@20=>Indexing interruptedRclMain6V4ACB=V 4>40B:>2V ?@>3@0<8Missing helper programsRclMain:AV 4>40B:>2V ?@>3@0<8 =0O2=VNo helpers found missingRclMainG8AB8B8PurgeRclMain" 57C;LB0B8 70?8BC Query resultsRclMain070 :>@5=V2StemdbRclMain.5&@5@20B8 V=45:AC20==OStop &IndexingRclMain0&59 ?>HC: 265 =50:B82=89"This search is not active any moreRclMain52V4><>UnknownRclMain >=>28B8 &V=45:A Update &IndexRclMain>?5@5465==OWarningRclMain:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languagesRclMainDV;LB@>20=5filteredRclMain <54V0mediaRclMain?>2V4><;5==OmessageRclMainV=H5otherRclMain?@575=B0FVW presentationRclMainA>@B>20=5sortedRclMainB01;8FV spreadsheetRclMain B5:ABtextRclMain@> &Recoll &About Recoll RclMainBase&!:;04=89 ?>HC:&Advanced Search RclMainBase8&G8AB8B8 VAB>@VN 4>:C<5=BV2&Erase document history RclMainBase &$09;&File RclMainBase&>2V4:0&Help RclMainBase&0;0HBC20==O &Preferences RclMainBase*&0@0<5B@8 A>@BC20==O&Sort parameters RclMainBase&=AB@C<5=B8&Tools RclMainBase*&>2V4=8: :>@8ABC20G0 &User manual RclMainBase8!:;04=89 (?>3;81;5=89) ?>HC:Advanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$AB>@VO 4>:C<5=BV2Document History RclMainBase&&AB>@VO 4>:C<5=BV2Document &History RclMainBase &8EV4E&xit RclMainBase4V0;>3 7>2=VH=L>3> V=45:ACExternal index dialog RclMainBase5@H0 AB>@V=:0 First page RclMainBaseL5@59B8 4> ?5@H>W AB>@V=:8 @57C;LB0BV2Go to first page of results RclMainBase"0ABC?=0 AB>@V=:0 Next page RclMainBase:0ABC?=0 AB>@V=:0 @57C;LB0BV2Next page of results RclMainBase$>?5@54=O AB>@V=:0 Previous page RclMainBase<>?5@54=O AB>@V=:0 @57C;LB0BV2Previous page of results RclMainBase RecollRecoll RclMainBase(0@0<5B@8 A>@BC20==OSort parameters RclMainBase&&02V‘0B>@ B5@<V=V2Term &explorer RclMainBase@=AB@C<5=B 4;O 282G0==O B5@<V=V2Term explorer tool RclMainBase &>=>28B8 V=45:A Update &index RclMainBase0B0Date RecollModel<'O D09;C File name RecollModel (?>:070B8 70?8B) (show query)ResList2<p><b>5 7=0945=></b><br>

No results found
ResList$AB>@VO 4>:C<5=BV2Document historyResList>:C<5=B8 DocumentsResList0ABC?=0NextResListV4:@8B8OpenResList5@53;O4PreviewResList>?5@54=OPreviousResList5B0;V 70?8BC Query detailsResList$!?8A>: @57C;LB0BV2 Result listResList&>:C<5=B =54>AO6=89Unavailable documentResList?>forResList7 ?@8=09<=Vout of at leastResList#AV A;>20 All termsSSearchC4L-O:5 A;>2>Any termSSearch*52V@=89 @O4>: 70?8BCBad query stringSSearch’254VBL ?>HC:>2V A;>20. >6=0 28:>@8AB>2C20B8 Esc-?@>1V; 4;O 4>?>2=5==O.FEnter search terms here. Type ESC SPC for completions of current term.SSearch<'O D09;C File nameSSearch&54>AB0B=L> ?0<'OBV Out of memorySSearch>20 70?8BCQuery languageSSearch&15@VBL B8? ?>HC:C.Choose search type. SSearchBase !B5@B8Clear SSearchBase Ctrl+SCtrl+S SSearchBase’254VBL ?>HC:>2V A;>20. >6=0 28:>@8AB>2C20B8 Esc-?@>1V; 4;O 4>?>2=5==O.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase2!B5@B8 2<VAB @O4:0 70?8B0Erase search entry SSearchBaseSSearchBase SSearchBase SSearchBase =09B8Search SSearchBase>G0B8 70?8B Start query SSearchBase2AVAll SearchClauseW<'O D09;C File name SearchClauseWlV;L:VABL 4>40B:>28E A;V2, I> <>6CBL 1CB8 <V6 >1@0=8<8HNumber of additional words that may be interspersed with the chosen ones SearchClauseWj815@VBL B8? 70?8BC, O:89 1C45 7@>1;5=> ?> F8E A;>20E>Select the type of query that will be performed with the words SearchClauseW0ABC?=0NextSnippets =09B8Search SnippetsW5@53;O4BrowseSpecIdxW&0:@8B8&Close SpellBase& >7:@8B8 &Expand  SpellBase Alt+CAlt+C SpellBase$02V‘0B>@ B5@<V=V2 Term Explorer SpellBase* >7:@8BBO =5 7=0945=5No expansion foundSpellW 5328@07RegexpSpellW0?8A/72CG0==OSpelling/PhoneticSpellW& >7:@8BBO A;>2>D>@<Stem expansionSpellW !;>2>TermSpellW(01;>=8 WildcardsSpellW:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languagesSpellW#AV A;>20 All terms UIPrefsDialogC4L-O:5 A;>2>Any term UIPrefsDialog5@53;O4Choose UIPrefsDialog<'O D09;C File name UIPrefsDialog>20 70?8BCQuery language UIPrefsDialogJ1@0=0 B5:0 =5 AE>60 =0 V=45:A Xapian;The selected directory does not appear to be a Xapian index UIPrefsDialogB1@0=0 B5:0 265 C A?8A:C V=45:AV23The selected directory is already in the index list UIPrefsDialog:&5 >A=>2=89/;>:0;L=89 V=45:A!This is the main/local index! UIPrefsDialog:?><8;:0 74>1C20==O A?8A:C <>2#error retrieving stemming languages UIPrefsDialog0:@8B8CloseViewActionBase" V4=V ?5@53;O40GVNative ViewersViewActionBaseH5<>6;82> 70?8A0B8 D09; :>=DV‘C@0FVWCan't write configuration fileconfgui::ConfIndexW5@53;O4Chooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW;>10;L=VGlobalconfgui::ConfSubPanelWD560 @>7<V@C AB8A=5=8E D09;V2 (KB)Max. compressed file size (KB)confgui::ConfSubPanelW &5 7=0G5==O 2AB0=>2;NT ?>@V3 @>7<V@C AB8A=5=8E D09;V2, 1V;LHV 70 =L>3> =5 1C45 >?@0FL>20=>. -1 28<8:0T ;V<VB, 0 28<8:0T 45:><?@5AVN.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW>20 aspellAspell languageconfgui::ConfTopPanelW"5:0 1078 40=8EDatabase directory nameconfgui::ConfTopPanelW8<8:0T 28:>@8AB0==O aspell 4;O 35=5@0FVW =01;865=L C =0?8A0==O 2 =02V‘0B>@V B5@<V=V2.<br>>@8A=5, :>;8 aspell 2V4ACB=V9 01> 7;0<0=89. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW<=B5@20; A:840==O V=45:AC (1)Index flush megabytes intervalconfgui::ConfTopPanelW$09; 6C@=0;C Log file nameconfgui::ConfTopPanelW&>:;04=VABL 6C@=0;CLog verbosity levelconfgui::ConfTopPanelW25 28:>@8AB>2C20B8 aspellNo aspell usageconfgui::ConfTopPanelW @>?CA:0B8 H;OE8 Skipped pathsconfgui::ConfTopPanelW(>28 7V A;>2>D>@<0<8Stemming languagesconfgui::ConfTopPanelWr$09;, :C48 ?V4CBL ?>2V4><;5==O.<br>'stderr' 4;O B5@<V=0;CPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW~>28, 4;O O:8E 1C45 ?>1C4>20=><br>A;>2=8:8 @>7:@8BBO A;>2>D>@<.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWš!?8A>: B5:, 7 O:8E ?>G8=0TBLAO @5:C@A82=5 V=45:AC20==O. "8?>2>: 4><0H=O B5:0.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW!:V;L:8 40=8E 1C45 ?@>V=45:A>20=> <V6 A:840==O<8 V=45:AC =0 48A:.<br>>?><030T :>=B@>;N20B8 28:>@8AB0==O ?0<'OBV V=45:A0B>@><. "8?>2>: 101 ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW„AB0=>28B8 >1AO3 ?>2V4><;5=L,<br>2V4 ?><8;>: 4> 40=8E 7=520465==O.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW5@E=V B5:8Top directoriesconfgui::ConfTopPanelW&V4<V=0&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase˜>HC: [rolling stones] (2 A;>20) 1C45 7<V=5=> =0 [rolling or stones or (rolling phrase 2 stones)]. &5 <>65 ?V4=OB8 @57C;LB0B8, 2 O:8E ?>HC:>2V A;>20 7CAB@VG0NBLAO A0<5 2 B0:V9 ?>A;V4>2=>ABV, O: 2 70?8BV.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase:;NG8B8 2A5 Activate AlluiPrefsDialogBase>40B8 V=45:A Add indexuiPrefsDialogBase"0AB>AC20B8 7<V=8 Apply changesuiPrefsDialogBaseX>G8=0B8 ?@>AB89 ?>HC: ?@8 22545==V ?@>1V;C.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseZ2B><0B8G=> 4>4020B8 D@07C 4> ?@>AB8E ?>HC:V2+Automatically add phrase to simple searchesuiPrefsDialogBase5@53;O4ChooseuiPrefsDialogBase"15@VBL @540:B>@8Choose editor applicationsuiPrefsDialogBase8:;NG8B8 2A5Deactivate AlluiPrefsDialogBaseV4<V=8B8 7<V=8Discard changesuiPrefsDialogBase~'8 @>18B8 =>289 :>=A?5:B, =02VBL O:I> O:89AL 265 T 2 4>:C<5=BV?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase '8 =0<030B8AO 1C4C20B8 :>=A?5:B8 4;O @57C;LB0BV2 ?>HC:C, 28:>@8AB>2CNGV :>=B5:AB 7=0945=8E A;V2? >65 ?@0FN20B8 ?>2V;L=> 4;O 25;8:8E 4>:C<5=BV2.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase88=0<VG=> 1C4C20B8 :>=A?5:B8Dynamically build abstractsuiPrefsDialogBase >2=VH=V V=45:A8External IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase %>20B8 4C1;V:0B8Hide duplicate results.uiPrefsDialogBaseÐ/:I> C2V<:=5=5, @57C;LB0B8 A B0:8< A0<8< 7<VAB>< B0 @V7=8<8 =0720<8 1C45 ?>:070=> =5 1V;LH5 >4=>3> @07C.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseb0:A8<0;L=89 @>7<V@ B5:ABC V7 ?V4A2VGC20==O< (1)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseBV;L:VABL @57C;LB0BV2 =0 AB>@V=:C"Number of entries in a result pageuiPrefsDialogBasebV4:@820T 4V0;>3 281>@C H@8DBC A?8A:C @57C;LB0BV2-Opens a dialog to select the result list fontuiPrefsDialogBasedV44020B8 ?5@5203C HTML =04 B5:AB>< 4;O ?5@53;O4C.&Prefer Html to plain text for preview.uiPrefsDialogBase80?0<'OB0B8 AB0= A>@BC20==O.Remember sort activation state.uiPrefsDialogBasef840;8B8 7V A?8A:C. 5 2?;820T =0 48A:>289 V=45:A.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase 840;8B8 281@0=5Remove selecteduiPrefsDialogBaseL0<V=OB8 =0O2=V C 4>:C<5=B0E :>=A?5:B8 Replace abstracts from documentsuiPrefsDialogBase!:8=CB8ResetuiPrefsDialogBaseD>25@B0T H@8DB C B8?>289 A8AB5<=891Resets the result list font to the system defaultuiPrefsDialogBase0(@8DB A?8A:C @57C;LB0BV2Result list fontuiPrefsDialogBase 0@0<5B@8 ?>HC:CSearch parametersuiPrefsDialogBase\V4:@820B8 4V0;>3 A:;04=>3> ?>HC:C ?@8 AB0@BV.'Start with advanced search dialog open.uiPrefsDialogBase>20 A;>2>D>@<Stemming languageuiPrefsDialogBase8>=B5:AB=8E A;V2 C :>=A?5:BV Synthetic abstract context wordsuiPrefsDialogBaseT >7<V@ A8=B5B8G=>3> :>=A?5:BC (C A8<2>;0E)$Synthetic abstract size (characters)uiPrefsDialogBaseÀ"5:AB8 V7 @>7<V@><, 1V;LH8< 70 2:070=89, =5 1C45 ?V4A2VG5=> C ?>?5@54=L><C ?5@53;O4V (?>2V;L=>).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase&5@5:;NG8B8 281@0=5Toggle selecteduiPrefsDialogBase=B5@D59AUser interfaceuiPrefsDialogBase?>4>10==OUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_cs.ts0000644000175000017500000047462413224431020014242 00000000000000 AdvSearch All clauses VÅ¡echny výrazy Any clause NÄ›který z výrazů texts Texty spreadsheets Tabulky presentations PÅ™edstavení media Multimedia messages Zprávy other Jiné Bad multiplier suffix in size filter Å patná přípona násobitele ve filtru velikosti text Text spreadsheet Tabulky presentation PÅ™edstavení message Zpráva AdvSearchBase Advanced search PokroÄilé hledání Restrict file types Omezit souborových typů Save as default Uložit jako výchozí Searched file types Hledané souborové typy All ----> VÅ¡e ----> Sel -----> VýbÄ›r -----> <----- Sel <----- VýbÄ›r <----- All <----- VÅ¡e Ignored file types PÅ™ehlížené souborové typy Enter top directory for search Zadejte základní adresář pro hledání Browse Procházet Restrict results to files in subtree: Omezit výsledky na soubory v následujícím podadresáři: Start Search Spustit hledání Search for <br>documents<br>satisfying: Hledat <br>dokumenty<br>, které splňují následující hlediska: Delete clause Smazat poslední výraz Add clause PÅ™idat nový výraz Check this to enable filtering on file types ZaÅ¡krtnÄ›te pro zapnutí filtrování podle souborových typů By categories Podle skupin Check this to use file categories instead of raw mime types ZaÅ¡krtnÄ›te pro používání skupin souborů místo MIME typů Close Zavřít All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. VÅ¡echna pole napravo, která nejsou prázdná, budou spojována spojeními AND (volba "VÅ¡echny výrazy") nebo OR (volba "NÄ›který z výrazů"). <br>Typy polí "Jakékoli" "VÅ¡e" a "Žádné" mohou pÅ™ijmout smÄ›s jednoduchých slov, a vÄ›ty uzavÅ™ené dvojitými uvozovkami.<br>Pole bez dat jsou pÅ™ehlížena. Invert Obrátit Minimum size. You can use k/K,m/M,g/G as multipliers Nejmenší velikost: Můžete použít k/K,m/M,g/G jako násobitele Min. Size Nejmenší velikost Maximum size. You can use k/K,m/M,g/G as multipliers NejvÄ›tší velikost: Můžete použít k/K,m/M,g/G jako násobitele Max. Size NejvÄ›tší velikost Select Vybrat Filter Filtrovat From Od To Do Check this to enable filtering on dates ZaÅ¡krtnÄ›te pro zapnutí filtrování podle dat Filter dates Filtrovat data Find Najít Check this to enable filtering on sizes ZaÅ¡krtnÄ›te pro zapnutí filtrování podle velikostí Filter sizes Filtrovat velikosti CronToolW Cron Dialog Dialog Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> dávkový rejstříkovací rozvrh (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Každé pole může obsahovat zástupný symbol (*), jednoduchou Äíselnou hodnotu, Äárkou oddÄ›lené seznamy (1,3,5) a rozsahy (1-7). ObecnÄ›ji, pole se budou používat <span style=" font-style:italic;">jak je</span> uvnitÅ™ souboru crontab, a lze použít úplnou stavbu crontab, podívejte se na crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Například, zadání <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Dny, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> a <span style=" font-family:'Courier New,courier';">15</span> v <span style=" font-style:italic;">Minuty</span> spustí rejstříkování (recollindex) každý den v 12:15 dopoledne a 7:15 odpoledne</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozvrh s velmi Äastým spuÅ¡tÄ›ním je pravdÄ›podobnÄ› ménÄ› úÄinný než je rejstříkování ve skuteÄném Äase.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Dny v týdnu (* nebo 0-7, 0 nebo 7 je nedÄ›le) Hours (* or 0-23) Hodiny (* nebo 0-23) Minutes (0-59) Minuty (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">KlepnÄ›te na <span style=" font-style:italic;">Zakázat</span> pro zastavení automatického dávkového rejstříkování, <span style=" font-style:italic;">Povolit</span> pro jeho zapnutí, <span style=" font-style:italic;">ZruÅ¡it</span>, aby vÅ¡e zůstalo beze zmÄ›ny.</p></body></html> Enable Povolit Disable Zakázat It seems that manually edited entries exist for recollindex, cannot edit crontab Zdá se, že pro recollindex existují ruÄnÄ› upravené záznamy, nelze upravit crontab Error installing cron entry. Bad syntax in fields ? Chyba pÅ™i instalaci záznamu cron. Å patná skladba v polích? EditDialog Dialog Dialog EditTrans Source path Cesta ke zdroji Local path Místní cesta Config error Chyba v nastavení Original path Původní cesta EditTransBase Path Translations PÅ™eklady cest Setting path translations for Nastavení pÅ™ekladů cest pro Select one or several file types, then use the controls in the frame below to change how they are processed Vyberte jeden nebo více datových typů a použijte ovládací prvky v rámeÄku níže pro zmÄ›nu způsobu, jakým jsou zpracovány Add PÅ™idat Delete Smazat Cancel ZruÅ¡it Save Uložit FirstIdxDialog First indexing setup První nastavení rejstříkování <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zdá se, že rejstřík pro toto nastavení neexistuje.</span><br /><br />Pokud chcete pouze zrejstříkovat svůj domovský adresář sadou rozumných výchozích nastavení, stisknÄ›te tlaÄítko <span style=" font-style:italic;">Spustit rejstříkování nyní</span>. Podrobnosti budete moci upravit pozdÄ›ji. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pokud chcete mít vÄ›tší dohled, použijte následující odkazy pro upravení nastavení rejstříkování a rozvrhu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">K tÄ›mto nástrojům lze pÅ™istupovat pozdÄ›ji v nabídce <span style=" font-style:italic;">Nastavení</span>.</p></body></html> Indexing configuration Nastavení rejstříkování This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Toto vám umožní nastavit adresáře, které chcete rejstříkovat, a další parametry, jako jsou cesty pro vylouÄené soubory, výchozí znakové sady atd. Indexing schedule Rozvrh rejstříkování This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Toto vám umožní zvolit mezi dávkovým rejstříkováním a rejstříkováním ve skuteÄném Äase, a nastavit automatický rozvrh pro dávkové rejstříkování (za použití cronu). Start indexing now Spustit rejstříkování nyní FragButs %1 not found. %1 nenalezen. %1: %2 %1: %2 Query Fragments Kousky hledání IdxSchedW Index scheduling setup Nastavení rozvrhu rejstříkování <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstříkování může běžet nepÅ™etržitÄ›, soubory se rejstříkují pÅ™i jejich zmÄ›nÄ›, nebo běžet v samostatných intervalech. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ÄŒetba příruÄky vám může pomoci pÅ™i rozhodování se mezi tÄ›mito přístupy (stisknÄ›te F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Tento nástroj vám může pomoci s nastavením rozvrhu pro automatizaci bÄ›hů dávkového rejstříkování, nebo spustit rejstříkování ve skuteÄném Äase, když se pÅ™ihlásíte (nebo obojí, což zřídkakdy dává smysl). </p></body></html> Cron scheduling Rozvrh cron The tool will let you decide at what time indexing should run and will install a crontab entry. Nástroj vám umožní rozhodnout se, kdy má rejstříkování běžet, a nainstaluje záznam crontab. Real time indexing start up SpuÅ¡tÄ›ní rejstříkování ve skuteÄném Äase Decide if real time indexing will be started when you log in (only for the default index). RozhodnÄ›te, zda se rejstříkování ve skuteÄném Äase spustí, když se pÅ™ihlásíte (pouze pro výchozí rejstřík). ListDialog Dialog Dialog GroupBox Seskupovací okénko Main No db directory in configuration Nenastaven žádný databázový adresář Could not open database in NepodaÅ™ilo se otevřít databázi v . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . KlepnÄ›te na tlaÄítko ZruÅ¡it pro úpravu souboru s nastavením, pÅ™edtím než se zaÄne s rejstříkováním nebo na OK pro zapoÄetí s rejstříkováním. Configuration problem (dynconf Konfigurationsproblem (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: Soubor "history" je poÅ¡kozen nebo nezapisovatelný/neÄitelný. Prověřte jej, prosím, anebo jej odstraňte: Preview &Search for: &Hledat: &Next &Další &Previous &PÅ™edchozí Match &Case Dbát na &psaní velkých a malých písmen Clear Vyprázdnit Creating preview text Vytváří se náhledový text Loading preview text into editor Náhledový text se nahrává do editoru Cannot create temporary directory Nelze vytvoÅ™it doÄasný adresář Cancel ZruÅ¡it Close Tab Zavřít kartu Missing helper program: Chybí program s nápovÄ›dou: Can't turn doc into internal representation for Chyba pÅ™i rejstříkování dokumentu Cannot create temporary directory: Nelze vytvoÅ™it doÄasný adresář: Error while loading file Chyba pÅ™i nahrávání souboru PreviewTextEdit Show fields Ukázat pole Show main text Ukázat hlavní text Print Tisk Print Current Preview Vytisknout nynÄ›jší náhled Show image Ukázat obrázek Select All Vybrat vÅ¡e Copy Kopírovat Save document to file Uložit dokument do souboru Fold lines Zalomit řádky Preserve indentation Zachovat odsazení QObject Global parameters Celkové parametry Local parameters Místní parametry <b>Customised subtrees <b>Vlastní podstromy The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Seznam podadresářů v rejstříkované hierarchii <br>kde nÄ›které parametry je potÅ™eba novÄ› vymezit. Výchozí: prázdný. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Parametry, které následují, jsou nastaveny buÄ na nejvyšší úrovni, pokud nic<br>, nebo pokud je v seznamu výše vybrán prázdný řádek, nebo pro vybraný podadresář.<br>Adresáře můžete pÅ™idat anebo odebrat klepnutím na tlaÄítka +/-. Skipped names PÅ™eskoÄené názvy These are patterns for file or directory names which should not be indexed. Toto jsou vzory pro názvy souborů nebo adresářů, které se nemají rejstříkovat. Default character set Výchozí znaková sada This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Toto je znaková sada, která se používá pro Ätení souborů, které svou znakovou sadu vnitÅ™nÄ› neurÄují, napÅ™.. soubory s textem.<br>Výchozí hodnota je prázdná a používá se hodnota prostÅ™edí NLS. Follow symbolic links Sledovat symbolické odkazy Follow symbolic links while indexing. The default is no, to avoid duplicate indexing BÄ›hem rejstříkování sledovat symbolické odkazy. Výchozí nastavení je ne kvůli vyvarovaní se dvojitého rejstříkování Index all file names Rejstříkovat vÅ¡echny souborové názvy Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Rejstříkovat vÅ¡echny názvy souborů, jejichž obsah nelze urÄit nebo zpracovat (žádný nebo nepodporovaný MIME typ). Výchozí hodnota je ano Beagle web history Internetová historie Beagle Search parameters Parametry hledání Web history Historie webu Default<br>character set Výchozí<br>znaková sada Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Toto je znaková sada, která se používá pro Ätení souborů, které svou znakovou sadu vnitÅ™nÄ› neurÄují, napÅ™.. soubory s textem.<br>Výchozí hodnota je prázdná a používá se hodnota prostÅ™edí NLS. Ignored endings PÅ™ehlížená zakonÄení These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). Toto jsou zakonÄení souborů pro soubory, které se budou rejstříkovat výhradnÄ› podle svého názvu (žádné urÄování typu MIME, žádné rozbalování, žádné rejstříkování obsahu). QWidget Create or choose save directory VytvoÅ™it nebo vybrat ukládací adresář Choose exactly one directory Vybrat pÅ™esnÄ› jeden adresář Could not read directory: NepodaÅ™ilo se Äíst z adresáře: Unexpected file name collision, cancelling. NeoÄekávaný stÅ™et v souborovém názvu. Ruší se. Cannot extract document: Nelze vytáhnout dokument: &Preview &Náhled &Open &Otevřít Open With Otevřít s Run Script Spustit skript Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Save selection to files Uložit výbÄ›r do souborů Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku Find &similar documents Najít &podobné dokumenty Open &Snippets window Otevřít okno s úr&yvky Show subdocuments / attachments Ukázat podřízené dokumenty/přílohy QxtConfirmationMessage Do not show again. Neukazovat znovu. RTIToolW Real time indexing automatic start Automatické spuÅ¡tÄ›ní rejstříkování ve skuteÄném Äase <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstříkování může být nastaveno tak, aby běželo jako démon. Soubory jsou aktualizovány pÅ™i jejich zmÄ›nÄ›, ve skuteÄném Äase. Získáte tak vždy nejnovÄ›jší rejstřík, ale prostÅ™edky systému se pÅ™i tom používají nepÅ™etržitÄ›.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Spustit rejstříkovacího démona s mým sezením pracovní plochy. Also start indexing daemon right now. Spustit rejstříkovacího démona ihned. Replacing: Nahrazení: Replacing file Nahrazení souboru Can't create: Nelze vytvoÅ™it: Warning Varování Could not execute recollindex NepodaÅ™ilo se spustit recollindex Deleting: Mazání: Deleting file Smazání souboru Removing autostart OdstranÄ›ní automatického spuÅ¡tÄ›ní Autostart file deleted. Kill current process too ? Soubor automatického spuÅ¡tÄ›ní smazán. Zabít i souÄasný proces? RclMain About Recoll O programu Recoll Executing: [ Provádí se: [ Cannot retrieve document info from database Žádné informace o dokumentu v databázi Warning Varování Can't create preview window Nelze vytvoÅ™it náhledové okno Query results Výsledky hledání Document history Historie dokumentu History data Historická data Indexing in progress: Rejstříkuje se: Files Soubory Purge VyÄistit Stemdb Kmeny slov Closing ZavÅ™ení Unknown Neznámý This search is not active any more Toto hledání už není Äinné Can't start query: Nelze spustit hledání: Bad viewer command line for %1: [%2] Please check the mimeconf file Chybový příkaz pro prohlížeÄ pro %1: [%2] Prověřte soubor mimeconf Cannot extract document or create temporary file Nelze vytáhnout dokument nebo vytvoÅ™it doÄasný soubor (no stemming) Źádné rozšíření kmene slova (all languages) VÅ¡echny jazyky error retrieving stemming languages Chyba pÅ™i vyhledání jazyků s kmeny slov Update &Index Obnovit &rejstřík Indexing interrupted Rejstříkování pÅ™eruÅ¡eno Stop &Indexing Zastavit &rejstříkování All VÅ¡e media Multimedia message Zpráva other Jiné presentation PÅ™edstavení spreadsheet Tabulky text Text sorted TřídÄ›no filtered Filtrováno External applications/commands needed and not found for indexing your file types: Pro rejstříkování vaÅ¡ich MIME typů jsou potÅ™eba vnÄ›jší programy/příkazy, které ale nebyly nalezeny: No helpers found missing Nenalezeny žádné pomocné programy Missing helper programs Chybí pomocné programy Document category filter Filtr pro skupinu dokumentu No external viewer configured for mime type [ Žádný vnÄ›jší prohlížeÄ nebyl nastaven pro MIME typ [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? ProhlížeÄ stanovený v MIME zobrazení pro %1: %2 nenalezen. Chcete spustit dialog s nastavením? Can't access file: Nelze pÅ™istoupit k souboru: Can't uncompress file: Nelze rozbalit soubor: Save file Uložit soubor Result count (est.) PoÄet výsledků (odhad) Query details Podrobnosti o hledání Could not open external index. Db not open. Check external indexes list. NepodaÅ™ilo se otevřít vnÄ›jší rejstřík. Databáze neotevÅ™ena. Prověřte seznam vnÄ›jších rejstříků. No results found Nenalezeny žádné výsledky None Žádný Updating Obnova Done Hotovo Monitor Dohled Indexing failed Rejstříkování se nezdaÅ™ilo The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone NynÄ›jší rejstříkovací proces nebyl spuÅ¡tÄ›n z tohoto rozhraní. KlepnÄ›te na OK pro jeho zabití, nebo na ZruÅ¡it, aby byl ponechán sám Erasing index Smazání rejstříku Reset the index and start from scratch ? Nastavit rejstřík znovu a zaÄít od nuly? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Hledání běží.<br>Kvůli omezením rejstříkovací knihovny<br>zruÅ¡ení ukonÄí program Error Chyba Index not open Rejstřík neotevÅ™en Index query error Chyba pÅ™i hledání v rejstříku Indexed Mime Types Rejstříkované mime typy Content has been indexed for these mime types: Obsah byl rejstříkován pro tyto MIME typy: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Rejstřík není pro tento soubor nejnovÄ›jší. Odmítá se riziko, že by byl ukázán Å¡patný záznam. KlepnÄ›te na OK pro obnovení rejstříku pro tento soubor, pak, až bude rejstříkování hotovo, spusÅ¥te dotaz znovu. Jinak klepnÄ›te na ZruÅ¡it. Can't update index: indexer running Nelze obnovit rejstřík: běží rejstříkovaÄ Indexed MIME Types Rejstříkované MIME typy Bad viewer command line for %1: [%2] Please check the mimeview file Chybový příkaz pro prohlížeÄ pro %1: [%2] Prověřte soubor mimeconf Viewer command line for %1 specifies both file and parent file value: unsupported Příkaz pro prohlížeÄ pro %1 stanovuje jak hodnotu souboru tak hodnotu rodiÄovského souboru: nepodporováno Cannot find parent document Nelze najít rodiÄovský dokument Indexing did not run yet Rejstříkování jeÅ¡tÄ› neběželo External applications/commands needed for your file types and not found, as stored by the last indexing pass in Pro vaÅ¡e souborové typy jsou potÅ™eba vnÄ›jší programy/příkazy, které ale nebyly nalezeny, jak byly uloženy pÅ™i posledním rejstříkování v Index not up to date for this file. Refusing to risk showing the wrong entry. Rejstřík není pro tento soubor nejnovÄ›jší. Ukázání nesprávného záznamu bylo zamítnuto. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. KlepnÄ›te na tlaÄítko pro aktualizaci rejstříku pro tento soubor, potom dotaz, až bude rejstříkování hotovo, spusÅ¥te znovu. Jinak klepnÄ›te na ZruÅ¡it. Indexer running so things should improve when it's done RejstříkovaÄ běží, takže vÄ›ci by se po dokonÄení rejstříkování mÄ›ly zlepÅ¡it Sub-documents and attachments Podřízené dokumenty a přílohy Document filter Filtr dokumentu Index not up to date for this file. Refusing to risk showing the wrong entry. Rejstřík není pro tento soubor nejnovÄ›jší. Ukázání nesprávného záznamu bylo zamítnuto. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. KlepnÄ›te na tlaÄítko pro aktualizaci rejstříku pro tento soubor, potom hledání, až bude rejstříkování hotovo, spusÅ¥te znovu. The indexer is running so things should improve when it's done. RejstříkovaÄ běží, takže vÄ›ci by se po dokonÄení rejstříkování mÄ›ly zlepÅ¡it. The document belongs to an external indexwhich I can't update. Dokument je souÄástí vnÄ›jšího rejstříku, který nelze aktualizovat. Click Cancel to return to the list. Click Ignore to show the preview anyway. KlepnÄ›te na tlaÄítko ZruÅ¡it pro návrat do seznamu. KlepnÄ›te na tlaÄítko PÅ™ehlížet, aby byl pÅ™esto ukázán náhled. Duplicate documents Zdvojené dokumenty These Urls ( | ipath) share the same content: Tyto adresy ( | ipath) sdílejí totožný obsah: Bad desktop app spec for %1: [%2] Please check the desktop file Chybná specifikace aplikace pro %1: [%2] Prověřte soubor pracovní plochy Index locked Rejstřík uzamknut The current indexing process was not started from this interface, can't kill it NynÄ›jší rejstříkovací proces nebyl spuÅ¡tÄ›n z tohoto rozhraní. Nelze jej ukonÄit Bad paths Å patné cesty Bad paths in configuration file: Å patné cesty v souboru s nastavením: Selection patterns need topdir VýbÄ›rové vzory potÅ™ebují poÄáteÄní adresář Selection patterns can only be used with a start directory VýbÄ›rové vzory lze použít jen s poÄáteÄním adresářem The document belongs to an external index which I can't update. Dokument je souÄástí vnÄ›jšího rejstříku, který nelze aktualizovat. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). KlepnÄ›te na tlaÄítko ZruÅ¡it pro návrat do seznamu. <br>KlepnÄ›te na tlaÄítko PÅ™ehlížet pro ukázání náhledu tak jako tak (zapamatovat si pro toto sezení). No search Žádné hledání No preserved previous search Žádné zachované pÅ™edchozí hledání Choose file to save Vybrat soubor k uložení Saved Queries (*.rclq) Uložené dotazy (*.rclq) Write failed NepodaÅ™ilo se zapsat Could not write to file NepodaÅ™ilo se zapsat do souboru Read failed NepodaÅ™ilo se pÅ™eÄíst Could not open file: NepodaÅ™ilo se otevřít soubor: Load error Chyba pÅ™i nahrávání Could not load saved query NepodaÅ™ilo se nahrát uložené hledání Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Otevírá se doÄasná kopie. Úpravy budou ztraceny, pokud je neuložíte<br/>do trvalého umístÄ›ní. Do not show this warning next time (use GUI preferences to restore). Neukazovat toto varování příštÄ› (použít nastavení uživatelského rozhraní pro obnovení). Unknown indexer state. Can't access webcache file. Neznámý stav rejstříkovaÄe. Nelze pÅ™istupovat k souboru s internetovou vyrovnávací pamÄ›tí. Indexer is running. Can't access webcache file. RejstříkovaÄ běží. Nelze pÅ™istupovat k souboru s internetovou vyrovnávací pamÄ›tí. Index scheduling Rozvržení rejstříkování Sorry, not available under Windows for now, use the File menu entries to update the index Promiňte. Není nyní dostupné pod OS Windows. Použijte položek v nabídce Soubor k aktualizaci rejstříku Disabled because the real time indexer was not compiled in. Zakázáno protože rejstříkovaÄ ve skuteÄném Äase nebyl sestaven. This configuration tool only works for the main index. Tento nastavovací nástroj pracuje jen pro hlavní rejstřík. Can't set synonyms file (parse error?) Nelze nastavit soubor se slovy majícími stejný význam (synonyma). Chyba pÅ™i zpracování? with additional message: s dodateÄnou zprávou: Non-fatal indexing message: Nekritická zpráva o rejstříkování: Types list empty: maybe wait for indexing to progress? Píše seznam prázdný: Možná poÄkat na pokraÄování rejstříkování? RclMainBase Previous page PÅ™edchozí strana Next page Další strana &File &Soubor E&xit &UkonÄit &Tools &Nástroje &Help &NápovÄ›da &Preferences &Nastavení Search tools Nástroje pro hledání Result list Seznam s výsledky &About Recoll &O programu Recoll Document &History &Historie dokumentu Document History Historie dokumentu &Advanced Search &PokroÄilé hledání Advanced/complex Search PokroÄilé/Složené hledání &Sort parameters Parametry &třídÄ›ní Sort parameters Parametry třídÄ›ní Next page of results Další strana s výsledky Previous page of results PÅ™edchozí strana s výsledky &Query configuration Nastavení &hledání &User manual &Uživatelská příruÄka Recoll Recoll Ctrl+Q Ctrl+Q Update &index Obnovit &rejstřík Term &explorer Průzkumník &výrazů Term explorer tool Nástroj průzkumníka výrazů External index dialog Dialog pro vnÄ›jší rejstříkování &Erase document history &Vymazat historii dokumentu First page První strana Go to first page of results Jít na první stranu s výsledky &Indexing configuration Nastavení &rejstříkování All VÅ¡e &Show missing helpers &Ukázat chybÄ›jící pomocné programy PgDown O stranu dolů (PgDown) PgUp O stranu nahoru (PgUp) &Full Screen &Celá obrazovka F11 F11 Shift+Home Shift+Home Full Screen Na celou obrazovku &Erase search history &Vymazat historii hledání sortByDateAsc Třídit podle data vzestupnÄ› Sort by dates from oldest to newest Roztřídit podle data od nejstaršího po nejnovÄ›jší sortByDateDesc Třídit podle data sestupnÄ› Sort by dates from newest to oldest Roztřídit podle data od nejnovÄ›jšího po nejstarší Show Query Details Ukázat podrobnosti hledání Show results as table Ukázat výsledky jako tabulku &Rebuild index &Sestavit rejstřík znovu &Show indexed types &Ukázat rejstříkované typy Shift+PgUp Shift+PgUp &Indexing schedule Rozvrh &rejstříkování E&xternal index dialog Dialog pro &vnÄ›jší rejstříkování &Index configuration Nastavení &rejstříku &GUI configuration Nastavení uživatelského roz&hraní &Results &Výsledky Sort by date, oldest first Roztřídit podle data, nejprve nejstarší Sort by date, newest first Roztřídit podle data, nejprve nejnovÄ›jší Show as table Ukázat jako tabulku Show results in a spreadsheet-like table Ukázat výsledky v tabulce na způsob seÅ¡itu s listy v tabulkovém kalkulátoru Save as CSV (spreadsheet) file Uložit jako soubor CSV (tabulkový dokument) Saves the result into a file which you can load in a spreadsheet Uložit výsledek do souboru, jejž můžete nahrát jako seÅ¡it s listy v tabulkovém kalkulátoru Next Page Další strana Previous Page PÅ™edchozí strana First Page První strana Query Fragments Kousky hledání With failed files retrying S novým pokusem o zpracování selhavších souborů Next update will retry previously failed files Nová aktualizace rejstříku se pokusí znovu zpracovat nyní nezpracované soubory &View &Pohled Missing &helpers ChybÄ›jící &pomocné programy Indexed &MIME types Rejstříkované &MIME typy Indexing &schedule &Rozvrh rejstříkování Enable synonyms Povolit slova mající stejný význam Save last query Uložit poslední hledání Load saved query Nahrát uložené hledání Special Indexing Zvláštní rejstříkování Indexing with special options Rejstříkování se zvláštními volbami Index &statistics &Statistika rejstříku Webcache Editor Editor internetové vyrovnávací pamÄ›ti RclTrayIcon Restore Obnovit Quit UkonÄit RecollModel File name Název souboru Mime type Mime typ Date Datum Abstract Výtah Author Autor Document size Velikost dokumentu Document date Datum dokumentu File size Velikost souboru File date Datum souboru Ipath Ipath Keywords KlíÄová slova Original character set Původní znaková sada Relevancy rating Hodnocení závažnosti Title Název URL Adresa (URL) Mtime Mtime Date and time Datum a Äas Ipath Ipath MIME type Typ MIME ResList Result list Výsledky Unavailable document Nedostupný dokument Previous PÅ™edchozí Next Další <p><b>No results found</b><br> <p><b>Nebyly nalezeny žádné výsledky</b><br> &Preview &Náhled Copy &URL Kopírovat adresu (&URL) Find &similar documents Najít &podobné dokumenty Query details Podrobnosti o hledání (show query) (ukázat hledání) Copy &File Name Kopírovat název &souboru Document history Historie dokumentu Preview Náhled Open Otevřít <p><i>Alternate spellings (accents suppressed): </i> <p><i>Náhradní pravopis (přízvuky potlaÄeny): </i> &Write to File &Zapsat do souboru Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku &Open &Otevřít Documents Dokumenty out of at least mimo alespoň for pro <p><i>Alternate spellings: </i> <p><i>Náhradní pravopis: </i> Open &Snippets window Otevřít okno s úr&yvky Duplicate documents Zdvojené dokumenty These Urls ( | ipath) share the same content: Tyto adresy ( | ipath) sdílejí totožný obsah: Result count (est.) PoÄet výsledků (odhad) Snippets Úryvky ResTable &Reset sort Nastavit třídÄ›ní &znovu &Delete column &Smazat sloupec Add " PÅ™idat " " column " sloupec Save table to CSV file Uložit tabulku jako soubor CSV Can't open/create file: Nelze otevřít/vytvoÅ™it soubor: &Preview &Náhled &Open &Otevřít Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Find &similar documents Najít &podobné dokumenty Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku &Save as CSV &Uložit jako CSV Add "%1" column PÅ™idat sloupec "%1" ResTableDetailArea &Preview &Náhled &Open &Otevřít Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Find &similar documents Najít &podobné dokumenty Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku ResultPopup &Preview &Náhled &Open &Otevřít Copy &File Name Kopírovat název &souboru Copy &URL Kopírovat adresu (&URL) &Write to File &Zapsat do souboru Save selection to files Uložit výbÄ›r do souborů Preview P&arent document/folder Náhled na &rodiÄovský dokument/složku &Open Parent document/folder &Otevřít rodiÄovský dokument/složku Find &similar documents Najít &podobné dokumenty Open &Snippets window Otevřít okno s úr&yvky Show subdocuments / attachments Ukázat podřízené dokumenty/přílohy SSearch Any term Jakýkoli výraz All terms VÅ¡echny výrazy File name Název souboru Completions DoplnÄ›ní Select an item: Vyberte položku: Too many completions PříliÅ¡ mnoho doplnÄ›ní Query language Jazyk hledání Bad query string Å patný Å™etÄ›zec hledání Out of memory Není dostupná žádná další paměť Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Zadejte výraz jazyka hledání. Seznam:<br> <i>term1 term2</i> : 'term1' a 'term2' do kteréhokoli pole.<br> <i>field:term1</i> : 'term1' do pole 'field'.<br> Obvyklé názvy polí/synonyma:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudopole: dir, mime/format, type/rclcat, date.<br> Příklady intervalů dvou dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Nepovoleny žádné závorky.<br> <i>"term1 term2"</i> : vÄ›tný úsek (musí se objevit pÅ™esnÄ›). Možné modifikátory:<br> <i>"term1 term2"p</i> : neuspořádané hledání podle blízkosti s výchozí vzdáleností.<br> Použijte odkaz <b>Ukázat hledání</b>, když máte o výsledku pochybnost, a podívejte se do příruÄky (&lt;F1>) na další podrobnosti. Enter file name wildcard expression. Zadejte žolíkový výraz (zástupný symbol) pro název souboru. Enter search terms here. Type ESC SPC for completions of current term. Zde zadejte hledané výrazy. StisknÄ›te ESC SPC pro doplnÄ›ní souÄasného výrazu. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Zadejte výraz jazyka hledání. Seznam:<br> <i>term1 term2</i> : 'term1' a 'term2' do kteréhokoli pole.<br> <i>field:term1</i> : 'term1' do pole 'field'.<br> Obvyklé názvy polí/synonyma:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudopole: dir, mime/format, type/rclcat, date.<br> Příklady intervalů dvou dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Můžete použít kulaté závorky, aby byly vÄ›ci zÅ™etelnÄ›jší.<br> <i>"term1 term2"</i> : vÄ›tný úsek (musí se objevit pÅ™esnÄ›). Možné modifikátory:<br> <i>"term1 term2"p</i> : neuspořádané hledání podle blízkosti s výchozí vzdáleností.<br> Použijte odkaz <b>Ukázat hledání</b>, když máte o výsledku pochybnost, a podívejte se do příruÄky (&lt;F1>) na další podrobnosti. Stemming languages for stored query: Jazyky s kmeny slov pro uložená hledání: differ from current preferences (kept) liší se od nynÄ›jšího nastavení (ponecháno) Auto suffixes for stored query: Automatické přípony pro uložená hledání: External indexes for stored query: VnÄ›jší rejstříky pro uložená hledání: Autophrase is set but it was unset for stored query Automatické tvoÅ™ení slovních obratů je nastaveno, ale bylo zruÅ¡eno pro uložené hledání Autophrase is unset but it was set for stored query Automatické tvoÅ™ení slovních obratů je zruÅ¡eno, ale bylo nastaveno pro uložené hledání SSearchBase SSearchBase SSearchBase Clear Smazat Ctrl+S Ctrl+S Erase search entry Smazat hledaný záznam Search Hledat Start query Spustit hledání Enter search terms here. Type ESC SPC for completions of current term. Zde zadejte hledané výrazy. StisknÄ›te ESC SPC pro doplnÄ›ní souÄasného výrazu. Choose search type. Vyberte typ hledání. SearchClauseW SearchClauseW SearchClauseW Any of these jakýkoli z tÄ›chto All of these VÅ¡echny tyto None of these Žádný z tÄ›chto This phrase Tato slova Terms in proximity Podobné výrazy File name matching Odpovídající názvy souborů Select the type of query that will be performed with the words Vyberte druh hledání, se kterým se slova budou hledat Number of additional words that may be interspersed with the chosen ones PoÄet slov, která se smÄ›jí nacházet mezi hledanými No field Žádné pole Any Jakýkoliv All VÅ¡e None Žádný Phrase Tato slova Proximity Podobné výrazy File name Název souboru Snippets Snippets Úryvky about:blank about:blank Find: Hledat: Next Další Prev PÅ™edchozí X X SnippetsW Search Hledat <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> <p>V rámci omezení hledání nebyla bohužel nalezena žádná shoda. PravdÄ›podobnÄ› je dokument velice velký a vyvíjeÄ Ãºryvků se v nÄ›m ztratil (nebo skonÄil ve Å¡karpÄ›)...</p> SortForm Date Datum Mime type Mime Type SortFormBase Sort Criteria Sortierkriterium Sort the Zeige die most relevant results by: relevantesten Ergebnisse sortiert nach: Descending Absteigend Close Schließen Apply Übernehmen SpecIdxW Special Indexing Zvláštní rejstříkování Do not retry previously failed files. NezkouÅ¡et znovu soubory, které pÅ™edtím selhaly. Else only modified or failed files will be processed. Jinak jen zmÄ›nÄ›né nebo selhavší soubory budou zpracovány. Erase selected files data before indexing. Vymazat pÅ™ed rejstříkováním data vybraných souborů. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Adresář k rejstříkování vÄetnÄ› podadresářů. Musí být uvnitÅ™ rejstříkované oblasti<br>, jak je stanovena v souboru s nastavením (poÄáteÄní adresáře). Browse Procházet Start directory (else use regular topdirs): ZaÄáteÄní adresář (jinak použít poÄáteÄní adresáře): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Ponechat prázdné pro vybrání vÅ¡ech souborů. Můžete použít více vzorů oddÄ›lených mezerami.<br>Vzory s vloženými mezerami musejí být uzavÅ™eny ve dvojitých uvozovkách.<br>Lze použít, jen když je nastaven zaÄáteÄní cíl. Selection patterns: VýbÄ›rové vzory: Top indexed entity PÅ™edmÄ›t rejstříkovaný od spuÅ¡tÄ›ní SpellBase Term Explorer Průzkumník výrazů &Expand &Rozbalit Alt+E Alt+E &Close &Zavřít Alt+C Alt+C Term Ausdruck No db info. Žádné informace o databázi. Match Shoda Case RozliÅ¡ování velkých a malých písmen Accents Přízvuky SpellW Wildcards Zástupné symboly Regexp Regulární výraz Spelling/Phonetic Pravopis/Hláskosloví Aspell init failed. Aspell not installed? Chyba pÅ™i spuÅ¡tÄ›ní Aspellu. Aspell není nainstalován? Aspell expansion error. Chyba rozšíření Aspell. Stem expansion Rozšíření kmene slova error retrieving stemming languages Chyba pÅ™i vyhledání jazyka s kmeny slov No expansion found Nenalezeno žádné rozšíření Term Výraz Doc. / Tot. Dok. / Tot. Index: %1 documents, average length %2 terms Rejstřík: %1 dokumentů, průmÄ›rná délka %2 výrazy(ů) Index: %1 documents, average length %2 terms.%3 results Rejstřík: %1 dokumentů, průmÄ›rná délka %2 výrazy(ů). %3 výsledky(ů) %1 results %1 výsledky(ů) List was truncated alphabetically, some frequent Seznam byl zkrácen abecednÄ›, nÄ›které Äetné terms may be missing. Try using a longer root. pojmy mohou chybÄ›t. Zkuste použít delší koÅ™en. Show index statistics Ukázat statistiku rejstříku Number of documents PoÄet dokumentů Average terms per document PrůmÄ›rný poÄet výrazů na dokument Smallest document length Délka nejmenšího dokumentu Longest document length Délka nejdelšího dokumentu Database directory size Velikost adresáře s databází MIME types: Typy MIME: Item Položka Value Hodnota Smallest document length (terms) Nejmenší délka dokumentu (mez) Longest document length (terms) NejvÄ›tší délka dokumentu (mez) Results from last indexing: Výsledky posledního rejstříkování: Documents created/updated Dokumenty vytvoÅ™ené nebo aktualizované Files tested VyzkouÅ¡ené soubory Unindexed files Nezrejstříkované soubory List files which could not be indexed (slow) Vypsat soubory, které se nepodaÅ™ilo zrejstříkovat (pomalé) Spell expansion error. Chyba v pravopisných návrzích. UIPrefsDialog The selected directory does not appear to be a Xapian index Zdá se, že vybraný adresář není rejstříkem Xapian Index This is the main/local index! Toto je hlavní/místní rejstřík! The selected directory is already in the index list Vybraný adresář je již Äástí rejstříkového seznamu Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Vyberte adresář s rejstříkem Xapian Indexverzeichnis (napÅ™.: /home/benutzer/.recoll/xapiandb) error retrieving stemming languages Chyba pÅ™i vyhledání jazyka s kmeny slov Choose Vybrat Result list paragraph format (erase all to reset to default) Formát odstavce seznamu s výsledky (vymazat vÅ¡echny pro znovunastavení na výchozí) Result list header (default is empty) Záhlaví seznamu s výsledky (výchozí je prázdné) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Vyberte adresář s nastavením pro Recoll nebo rejstříkový adresář Xapianu (napÅ™.: /home/me/.recoll or /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Vybraný adresář vypadá jako adresář s nastavením pro Recoll, ale nastavení se nepodaÅ™ilo pÅ™eÄíst At most one index should be selected Je potÅ™eba vybrat alespoň jeden rejstřík Cant add index with different case/diacritics stripping option Nelze pÅ™idat rejstřík s odliÅ¡nou volbou pro velikost písma/diakritiku Default QtWebkit font Výchozí písmo QtWebkit Any term Jakýkoli výraz All terms VÅ¡echny výrazy File name Název souboru Query language Jazyk hledání Value from previous program exit Hodnota obdržená z posledního ukonÄení programu UIPrefsDialogBase User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite Result list font Schriftart für Ergebnisliste Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Reset Reset Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste zurück auf den Standardwert Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird. Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Search parameters Suchparameter Stemming language Stemming Sprache Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein). Replace abstracts from documents Ersetzen der Zusammenfassungen in den Dokumenten Do we synthetize an abstract even if the document seemed to have one? Festlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthält Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung External Indexes externe Indizes Add index Index hinzufügen Select the xapiandb directory for the index you want to add, then click Add Index Wählen Sie das xapiandb-Verzeichnis des zuzufügenden Indizes und klicken Sie auf Index hinzufügen Browse Auswahl &OK &OK Apply changes Änderungen übernehmen &Cancel &Abbrechen Discard changes Änderungen verwerfen Result paragraph<br>format string Formatstring für Ergebnisse Automatically add phrase to simple searches Automatisches Zufügen von Sätzen zu einfachen Suchen A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden. User preferences Benutzereinstellungen Use desktop preferences to choose document editor. Die Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen. External indexes Externe Indizes Toggle selected Auswahl umkehren Activate All Alle Auswählen Deactivate All Alle Abwählen Remove selected Ausgewählte entfernen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remember sort activation state. Speichern, ob Sortieren aktiviert ist. ViewAction Changing actions with different current values MÄ›ní se Äinnosti s odliÅ¡nými nynÄ›jšími hodnotami Mime type Mime typ Command Příkaz MIME type Typ MIME Desktop Default Výchozí plocha Changing entries with different current values MÄ›ní se záznamy s odliÅ¡nými nynÄ›jšími hodnotami ViewActionBase File type Dateityp Action Aktion Select one or several file types, then click Change Action to modify the program used to open them Vyberte jeden nebo více datových typů a klepnÄ›te na "ZmÄ›nit Äinnost" pro zmÄ›nu programu pÅ™iÅ™azeného k jejich otevÅ™ení Change Action ZmÄ›nit Äinnost Close Zavřít Native Viewers ProhlížeÄe Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Vyberte jeden nebo nÄ›kolik MIME typů a potom klepnÄ›te na "ZmÄ›nit Äinnost"<br>Taktéž můžete tento dialog zavřít a zaÅ¡krtnout "Použít nastavení pracovní plochy"<br>v hlavním panelu, aby se tento seznam pÅ™ehlížel a pracovní plocha se použila jako výchozí. Select one or several mime types then use the controls in the bottom frame to change how they are processed. Vyberte jeden nebo více MIME typů a použijte ovládací prvky v rámeÄku s tlaÄítky pro zmÄ›nu způsobu, jakým jsou zpracovány. Use Desktop preferences by default Použít nastavení pracovní plochy jako výchozí Select one or several file types, then use the controls in the frame below to change how they are processed Vyberte jeden nebo více datových typů a použijte ovládací prvky v rámeÄku níže pro zmÄ›nu způsobu, jakým jsou zpracovány Exception to Desktop preferences Výjimka pro nastavení pracovní plochy Action (empty -> recoll default) ÄŒinnost (prázdné -> výchozí pro Recoll) Apply to current selection Použít na nynÄ›jší výbÄ›r Recoll action: Aktion current value current value Select same Vybrat stejný <b>New Values:</b> <b>Nové hodnoty:</b> Webcache Webcache editor Editor internetové vyrovnávací pamÄ›ti Search regexp Hledat regulární výraz WebcacheEdit Copy URL Kopírovat adresu (URL) Unknown indexer state. Can't edit webcache file. Neznámý stav rejstříkovaÄe. Nelze upravovat soubor s internetovou vyrovnávací pamÄ›tí. Indexer is running. Can't edit webcache file. RejstříkovaÄ běží. Nelze upravovat soubor s internetovou vyrovnávací pamÄ›tí. Delete selection Smazat výbÄ›r Webcache was modified, you will need to run the indexer after closing this window. Internetová vyrovnávací paměť byla zmÄ›nÄ›na. Po zavÅ™ení tohoto okna budete muset spustit rejstříkovaÄ. WebcacheModel MIME MIME Url URL confgui::ConfBeaglePanelW Steal Beagle indexing queue Ukrást rejstříkovací Å™adu Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NESMÇ běžet. Povolí zpracování Å™ady Beagle pro rejstříkování internetové historie Firefoxu.<br>(také byste mÄ›l nainstalovat přídavný modul Beagle pro Firefox) Entries will be recycled once the size is reached Záznamy budou opÄ›tnÄ› použity, jakmile bude velikost dosažena Web page store directory name Název adresáře pro ukládání internetové stránky The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Název pro adresář, kam se mají ukládat kopie navÅ¡tívených internetových stránek.<br>Neabsolutní cesta je vzata relativnÄ› k adresáři s nastavením. Max. size for the web store (MB) NejvÄ›tší velikost pro ukládání internetových stránek (MB) Process the WEB history queue Zpracovat Å™adu historie WEBu Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Povolí rejstříkování Firefoxem navÅ¡tívených stránek.<br>(také je potÅ™eba, abyste nainstalovali přídavný modul Recollu pro Firefox) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). Záznamy budou po dosažení velikosti vráceny do původního stavu.<br>SkuteÄnÄ› dává smysl jen zvÄ›tÅ¡ení velikosti, protože zmenÅ¡ení hodnoty neoseká stávající soubor (na konci jen plýtvání místem). confgui::ConfIndexW Can't write configuration file Nelze zapsat soubor s nastavením confgui::ConfParamFNW Choose Vybrat confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Automaticky rozliÅ¡ovat diakritická znaménka <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>Zapnout automaticky rozliÅ¡ování diakritických znamének, když hledaný pojem obsahuje znaky a akcenty (ne v unac_except_trans). Jinak pro musíte použít jazyk dotazu a modifikátor <i>D</i>. Automatic character case sensitivity Automaticky rozliÅ¡ovat velká a malá písmena <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>Zapnout automaticky rozliÅ¡ování velkých a malých písmen, když záznam obsahuje velká písmena (mimo na prvním místÄ›). Jinak pro musíte použít jazyk dotazu a modifikátor <i>C</i>. Maximum term expansion count NejvÄ›tší poÄet rozšíření výrazu <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>NejvÄ›tší poÄet rozšíření pro jeden výraz (napÅ™. pÅ™i použití žolíků). Standardní výchozí hodnota 10 000 je rozumná a zabrání tomu, aby se hledaný pojem jevil jako zamrzlý, zatímco je procházen seznam pojmů. Maximum Xapian clauses count NejvÄ›tší poÄet výrazů Xapian <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>NejvÄ›tší poÄet základních výrazů, které pÅ™idáme do jednoho dotazu Xapian. V nÄ›kterých případech se mohou výsledky rozšíření výrazu vynásobit, a my se chceme vyvarovat nadbyteÄné spotÅ™ebÄ› pamÄ›ti. Standardní výchozí hodnota 100 000 by mÄ›la ve vÄ›tÅ¡inÄ› případů naprosto postaÄovat a hodit se k typickému souÄasnému sestavení zařízení (hardware). confgui::ConfSubPanelW Global Celkové Max. compressed file size (KB) NejvÄ›tší velikost zabaleného souboru (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Tato hodnota nastavuje práh, za kterým nebudou zabalené soubory zpracovávány. Nastavte na -1 pro žádné omezení, na 0 pro vůbec žádné rozbalování. Max. text file size (MB) NejvÄ›tší velikost textového souboru (KB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Tato hodnota nastavuje práh, za kterým nebudou textové soubory zpracovávány. Nastavte na -1 pro žádné omezení. Je to kvůli vylouÄení obřích souborů se zápisem z rejstříkování. Text file page size (KB) Velikost stránky textového souboru (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Pokud je nastavena tato hodnota (nerovná se -1), textové soubory budou pro rejstříkování rozdÄ›leny na kousky o této velikosti. To pomůže pÅ™i prohledávání velmi velkých textových souborů (napÅ™. souborů se zápisem). Max. filter exec. time (S) NejvÄ›tší Äas na provedení filtru (s) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. VnÄ›jší filtry pracující déle než po tak dlouho budou pÅ™eruÅ¡eny. Je to pro ten zřídkavý případ (napÅ™. postscript), kdy by dokument mohl zapříÄinit filtr loopSet na -1 pro žádné omezení. External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. VnÄ›jší filtry pracující déle než po tak dlouhou dobu budou pÅ™eruÅ¡eny. Je to pro ten zřídkavý případ (napÅ™. postscript), kdy by dokument mohl zapříÄinit vejití filtru do smyÄky. Nastavte na -1 pro žádné omezení. Only mime types Pouze typy MIME An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Vybraný seznam rejstříkovaných typů MIME.<br>Nic jiného se nebude rejstříkovat. ObyÄejnÄ› je seznam prázdný a neÄinný Exclude mime types VylouÄené typy MIME Mime types not to be indexed Typy MIME, které se nemají rejstříkovat confgui::ConfTopPanelW Top directories PoÄáteÄní adresáře The list of directories where recursive indexing starts. Default: your home. Seznam adresářů, ve kterých zaÄíná rejstříkování vÄetnÄ› podsložek. Výchozí: adresář Home. Skipped paths PÅ™eskoÄené cesty These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Názvy adresářů, které se nebudou rejstříkovat.<br>Může obsahovat zástupné symboly (žolíky). Musí odpovídat cestám, které rejstříkovaÄ vidí (napÅ™. pokud v poÄáteÄních adresářích stojí '/home/me' a '/home' je ve skuteÄnosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*') Stemming languages Jazyky s kmeny slov The languages for which stemming expansion<br>dictionaries will be built. Jazyky, pro které se vytvoří <br>adresáře rozšíření kmenů slov. Log file name Název pro soubor se zápisem The file where the messages will be written.<br>Use 'stderr' for terminal output Soubor, do kterého se zapíše výstupní zpráva.<br>Pro výstupy na terminál použijte 'stderr' Log verbosity level Úroveň podrobnosti zápisu This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Tato hodnota upravuje množství zpráv,<br>od pouze chyb až po velké množství dat zajímavých pro ladÄ›ní. Index flush megabytes interval Interval v megabytech pro vymazání rejstříku This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Tato hodnota upravuje množství dat, která jsou rejstříkována mezi spláchnutími na disk.<br>Pomáhá to řídit použití pamÄ›ti rejstříkovaÄe. Výchozí je 10 MB Max disk occupation (%) NejvÄ›tší obsazení disku (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Jde o procentní podíl využívání disku, kdy rejstříkování selže a zastaví se (kvůli vyhnutí se zaplnÄ›ní vaÅ¡eho disku).<br>0 znamená žádné omezení (tato hodnota je nastavena jako výchozí). No aspell usage Nepoužívat aspell Aspell language Jazyk aspellu The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Jazyk pro adresář aspellu. MÄ›lo by to vypadat jako 'en' nebo 'fr' nebo 'cs'...<br>Pokud není tato hodnota nastavena, použije se pro její vypoÄítání prostÅ™edí NLS, což obvykle pracuje. Pro získání pÅ™edstavy o tom, co je ve vaÅ¡em systému nainstalováno, napiÅ¡te 'aspell config' a hledejte soubory .dat v adresáři 'data-dir'. Database directory name Název adresáře s databází The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Název pro adresář, v nÄ›mž se má ukládat rejstřík.<br>Neabsolutní cesta je vzata relativnÄ› k adresáři s nastavením. Výchozí je 'xapiandb'. Use system's 'file' command Použít příkaz 'file' Use the system's 'file' command if internal<br>mime type identification fails. Použít příkaz 'file', když vnitÅ™ní<br>rozpoznání MIME typu selže. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Zakáže používání aspellu pro vytvoÅ™ení pÅ™ibližné podoby pravopisu v nástroji průzkumníka výrazů.<br> UžiteÄné, pokud aspell není přítomen anebo nepracuje. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Jazyk pro adresář aspellu. MÄ›lo by to vypadat jako 'en' nebo 'fr' nebo 'cs'...<br>Pokud není tato hodnota nastavena, použije se pro její vypoÄítání prostÅ™edí NLS, což obvykle pracuje. Pro získání pÅ™edstavy o tom, co je ve vaÅ¡em systému nainstalováno, napiÅ¡te 'aspell config' a hledejte soubory .dat v adresáři 'data-dir'. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Název pro adresář, v nÄ›mž se má ukládat rejstřík.<br>Neabsolutní cesta je vzata relativnÄ› k adresáři s nastavením. Výchozí je 'xapiandb'. Unac exceptions Výjimky unac <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Toto jsou výjimky pro mechanismus unac, který ve výchozím nastavení odstraňuje vÅ¡echny diakritické znaky a nahrazuje je kanonickými obdobami. Toto odstraňování akcentů můžete (v závislosti na vaší Å™eÄi) pro nÄ›které znaky potlaÄit a zadat dodateÄná nahrazení, napÅ™. pro ligatury. V každém mezerou oddÄ›leném záznamu je první znak zdrojovým (výchozím) a zbytek je nahrazení. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Názvy názvy cest adresářů, které se nebudou rejstříkovat.<br>Může obsahovat zástupné symboly (žolíky). Musí odpovídat cestám, které rejstříkovaÄ vidí (napÅ™. pokud v poÄáteÄních adresářích stojí '/home/me' a '/home' je ve skuteÄnosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) NejvÄ›tší obsazení disku (%, 0 znamená bez omezení) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. Toto je procentní podíl využívání disku - celkové využití disku, ne velikost rejstříku , kdy rejstříkování selže a zastaví se (kvůli vyhnutí se zaplnÄ›ní vaÅ¡eho disku).<br>Výchozí hodnota 0 odstraní vÅ¡echna omezení, znamená žádné omezení. uiPrefsDialogBase User preferences Uživatelská nastavení User interface Uživatelské rozhraní Number of entries in a result page PoÄet výsledků na stranu If checked, results with the same content under different names will only be shown once. Je-li zaÅ¡krtnuto, budou výsledky se stejným obsahem pod jinými názvy ukázány jen jednou. Hide duplicate results. Skrýt zdvojené výsledky. Highlight color for query terms Zvýraznit barvu výrazů hledání Result list font Písmo pro seznam s výsledky Opens a dialog to select the result list font OtevÅ™e dialog pro výbÄ›r písma seznamu výsledků Helvetica-10 Helvetica-10 Resets the result list font to the system default Nastaví písmo pro seznam s výsledky znovu na výchozí hodnotu Reset Nastavit znovu Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Stanovuje formát pro každý odstavec seznamu s výsledky. Použijte qt nahrazení formátu html a printf:<br>%A pÅ™ehled<br> %D datum<br> %I název obrázku ikony<br> %K klíÄová slova (jsou-li)<br> %L odkazy na náhled a úpravy<br> %M mime typ<br> %N poÄet výsledků<br> %R procento významnosti<br> %S informace o velikosti<br> %T název<br> %U adresa (URL)<br> Result paragraph<br>format string ŘetÄ›zec formátu<br>pro výsledky Texts over this size will not be highlighted in preview (too slow). Texty nad tuto velikost nebudou v náhledu zvýrazňovány (příliÅ¡ pomalé). Maximum text size highlighted for preview (megabytes) NejvÄ›tší velikost textu zvýraznÄ›ného pro náhled (megabyty) Use desktop preferences to choose document editor. Použít nastavení pracovní plochy pro výbÄ›r editoru pro dokumenty. Choose editor applications Vybrat programy editorů Display category filter as toolbar instead of button panel (needs restart). Zobrazit skupinový filtr jako nástrojový pruh místo tlaÄítkového panelu (potÅ™ebuje spustit program znovu). Auto-start simple search on whitespace entry. Automaticky spustit jednoduché hledání, když je do zadávacího pole pro hledání zadáno prázdné místo (mezera). Start with advanced search dialog open. Po spuÅ¡tÄ›ní automaticky otevřít dialog pro rozšířené hledání Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Remember sort activation state. Zapamatovat si stav zapnutí hledání Prefer Html to plain text for preview. UpÅ™ednostňovat pro náhled HTML pÅ™ed prostým textem Search parameters Parametry hledání Stemming language Jazyk s kmeny slov A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Hledání [Ježíš Kristus] se zmÄ›ní na [Ježíš OR Kristus OR (Ježíš PHRASE 2 Kristus)]. Tímto by mÄ›ly být silnÄ›ji zváženy výsledky, které obsahují pÅ™esné shody s hledaným slovem. Automatically add phrase to simple searches Automatické pÅ™idání vÄ›t do jednoduchého hledání Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Stanovení, zda se má vytvoÅ™it pÅ™ehled pro výsledky v souvislosti s parametrem hledání. U velkých dokumentů může být pomalé. Dynamically build abstracts Vytvářet pÅ™ehledy dynamicky Do we synthetize an abstract even if the document seemed to have one? Stanovení, zda se má vytvoÅ™it pÅ™ehled i tehdy, když dokument již nÄ›jaký pÅ™ehled obsahuje. Replace abstracts from documents Nahradit pÅ™ehledy v dokumentech Synthetic abstract size (characters) Délka vytvoÅ™eného pÅ™ehledu (poÄet znaků) Synthetic abstract context words PoÄet souvisejících slov v pÅ™ehledu The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Slova v seznamu budou v záznamu jazyka hledání automaticky obrácena na vÄ›ty ext:xxx. Query language magic file name suffixes. Kouzelné přípony souborového názvu jazyka hledání Enable Povolit External Indexes VnÄ›jší rejstříky Toggle selected PÅ™epnout vybrané Activate All Zapnout vÅ¡e Deactivate All Vypnout vÅ¡e Remove from list. This has no effect on the disk index. Odstranit ze seznamu. Nemá to žádný úÄinek na uložený rejstřík. Remove selected Odstranit vybrané Click to add another index directory to the list Klepnout pro pÅ™idání dalšího rejstříkového adresáře do seznamu Add index PÅ™idat rejstřík Apply changes Použít zmÄ›ny &OK &OK Discard changes Zahodit zmÄ›ny &Cancel Z&ruÅ¡it Abstract snippet separator OddÄ›lovaÄ Ãºryvků Use <PRE> tags instead of <BR>to display plain text as html. Použít znaÄky <PRE> namísto <BR> pro zobrazení prostého textu jako HTML. Lines in PRE text are not folded. Using BR loses indentation. Řádky v textu PRE nejsou složeny. Použití BR povede ke ztrátÄ› odsazení. Style sheet Stylový list Opens a dialog to select the style sheet file OtevÅ™e dialog pro výbÄ›r souboru se stylovým listem Choose Vybrat Resets the style sheet to default Nastaví stylový list znovu na výchozí Lines in PRE text are not folded. Using BR loses some indentation. Řádky v textu PRE nejsou složeny. Použití BR povede ke ztrátÄ› odsazení. Use <PRE> tags instead of <BR>to display plain text as html in preview. Použít znaÄky <PRE> namísto <BR> pro zobrazení prostého textu formátovaného v náhledu jako HTML. Result List Seznam s výsledky Edit result paragraph format string Upravit Å™etÄ›zec formátu pro výsledky Edit result page html header insert Upravit záhlaví html na stranÄ› s výsledky Date format (strftime(3)) Formát data (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Práh Äetnosti (procento), od kterého se výrazy nepoužívají. Slovní obraty obsahující příliÅ¡ Äetné výrazy způsobují výkonnostní potíže. PÅ™eskoÄené výrazy zvÄ›tÅ¡ují vzdálenost slovního obratu a zmenÅ¡ují úÄinnost funkce automatického hledání slovního obratu. Výchozí hodnota je 2 (procenta). Autophrase term frequency threshold percentage ÄŒetnost výskytu výrazu (procento) pro automatické tvoÅ™ení slovních obratů Plain text to HTML line style Prostý text do stylu řádku HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Řádky v PRE textu nejsou zalomeny. PÅ™i použití BR dojde ke ztrátÄ› nÄ›kterých zalomení. Možná je to, co chcete styl PRE + zalomení. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + zalomení Exceptions Výjimky Mime types that should not be passed to xdg-open even when "Use desktop preferences" is set.<br> Useful to pass page number and search string options to, e.g. evince. MIME typy, jež nemají být pÅ™edány xdg-open, dokonce i když je nastaveno "Použít nastavení plochy".<br>UžiteÄné pro pÅ™edání Äísla strany a hledaného Å™etÄ›zce, napÅ™. Evince. Disable Qt autocompletion in search entry. Zakázat automatické doplňování Qt pÅ™i zadávání v poli pro hledání. Search as you type. Hledat pÅ™i psaní. Paths translations PÅ™eklady cest Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Klepnout pro pÅ™idání dalšího rejstříkového adresáře do seznamu. Můžete vybrat buÄ adresář s nastavením pro Recoll nebo rejstřík Xapian. Snippets window CSS file Soubor CSS okna s úryvky Opens a dialog to select the Snippets window CSS style sheet file OtevÅ™e dialog pro výbÄ›r souboru CSS se stylovým listem okna s úryvky Resets the Snippets window style Nastaví znovu styl okna s úryvky Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Rozhodnout, zda se dokumentové filtry ukazují jako kulatá tlaÄítka, rozbalovací seznamy v nástrojovém pruhu, nebo jako nabídka. Document filter choice style: Styl výbÄ›ru filtrů dokumentů: Buttons Panel Panel s tlaÄítky Toolbar Combobox Rozbalovací seznam v nástrojovém panelu Menu Nabídka Show system tray icon. Ukázat ikonu v oznamovací oblasti panelu. Close to tray instead of exiting. Zavřít do oznamovací oblasti panelu namísto ukonÄení. Start with simple search mode Spustit v jednoduchém vyhledávacím režimu Show warning when opening temporary file. Ukázat varování pÅ™i otevírání doÄasného souboru. User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Uživatelský styl k použití v oknÄ› s úryvky.<br>Poznámka: Záhlaví stránky s výsledky je zahrnuto i v záhlaví okna s úryvky. Synonyms file Soubor se slovy majícími stejný význam Highlight CSS style for query terms Zvýraznit styl CSS výrazů hledání recoll-1.23.7/qtgui/i18n/recoll_de.ts0000644000175000017500000045301713224431020014216 00000000000000 AdvSearch All clauses alle Ausdrücke Any clause irgendeinen Ausdruck texts Texte spreadsheets Tabellen presentations Präsentationen media Medien messages Nachrichten other Andere Bad multiplier suffix in size filter Ungültiger Multiplikator-Suffix im Größen-Filter text Text spreadsheet Tabelle presentation Präsentation message Nachricht AdvSearchBase Advanced search Erweiterte Suche Restrict file types Dateitypen einschränken Save as default Als Standard speichern Searched file types Durchsuchte Dateitypen All ----> Alle ----> Sel -----> Auswahl ----> <----- Sel <---- Auswahl <----- All <---- Alle Ignored file types Nicht durchsuchte Dateitypen Enter top directory for search Geben Sie das Basisverzeichnis für die Suche ein. Browse Durchsuchen Restrict results to files in subtree: Ergebnisse auf Dateien in folgendem Verzeichnisbaum einschränken: Start Search Suche starten Search for <br>documents<br>satisfying: Suche nach Dokumenten, <br>die Folgendes erfüllen: Delete clause Ausdruck entfernen Add clause Ausdruck hinzufügen Check this to enable filtering on file types Auswählen, um Filterung nach Dateitypen einzuschalten By categories Nach Kategorien Check this to use file categories instead of raw mime types Auswählen, um Dateikategorien statt Mime-Typen zu verwenden Close Schließen All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Alle nicht-leeren Felder rechts werden mit UND ("alle Ausdrücke") oder ODER ("irgendeinen Ausdruck") verknüpft. <br>Felder des Typs "Irgendeines", "Alle" und "Keines" können eine Mischung aus Wörtern und in Anführungszeichen eingeschlossenen Phrasen enthalten. <br>Nicht gefüllte Felder werden ignoriert. Invert Invertieren Minimum size. You can use k/K,m/M,g/G as multipliers Minimale Größe. Sie können k/K, m/M, g/G als Multiplikatoren verwenden. Min. Size Min. Größe: Maximum size. You can use k/K,m/M,g/G as multipliers Maximale Größe. Sie können k/K, m/M, g/G als Multiplikatoren verwenden. Max. Size Max. Größe: Filter Filtern From von To bis Check this to enable filtering on dates Auswählen, um Filterung nach Datum einzuschalten Filter dates Nach Datum filtern Find Finden Check this to enable filtering on sizes Auswählen, um Filterung nach Dateigröße einzuschalten Filter sizes Nach Größe filtern CronToolW Cron Dialog Cron-Zeitplan <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Zeitplan für periodische Indizierung (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jedes Feld kann eine Wildcard (*), eine einzelne Zahl, eine mit Kommata getrennte Liste (1,3,5) oder einen Bereich (1-7) enthalten. Die Felder werden <span style=" font-style:italic;">so wie sie sind</span> in der crontab-Datei verwendet und die gesamte crontab Syntax kann verwendet werden, siehe crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Beispielsweise startet die Eingabe <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Wochentage, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Stunden</span> und <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minuten</span> recollindex jeden Tag um 12:15 Uhr und 19:15 Uhr.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein Zeitplan mit sehr häufigen Aktivierungen ist wahrscheinlich weniger effizient als Echtzeit-Indizierung.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Wochentage (* oder 0-7, 0/7 ist Sonntag) Hours (* or 0-23) Stunden (* oder 0-23) Minutes (0-59) Minuten (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wählen Sie <span style=" font-style:italic;">Deaktivieren</span>, um die periodische Indizierung auszuschalten, <span style=" font-style:italic;">Aktivieren</span>, um sie einzuschalten, <span style=" font-style:italic;">Abbruch</span>, um nichts zu verändern.</p></body></html> Enable Aktivieren Disable Deaktivieren It seems that manually edited entries exist for recollindex, cannot edit crontab Offenbar gibt es manuelle Einträge für recollindex, crontab kann nicht angepasst werden. Error installing cron entry. Bad syntax in fields ? Fehler beim Erstellen des cron Eintrags. Falsche Syntax in Feldern? EditDialog Dialog Dialog EditTrans Source path Quellpfad Local path Lokaler Pfad Config error Konfigurationsfehler Original path Originalpfad EditTransBase Path Translations Pfadumwandlungen Setting path translations for Setze Pfadumwandlungen für Select one or several file types, then use the controls in the frame below to change how they are processed Wählen Sie einen oder mehrere Dateitypen aus. Nutzen Sie dann die Bedienelemente unten, um einzustellen wie sie verarbeitet werden. Add Hinzufügen Delete Entfernen Cancel Abbrechen Save Speichern FirstIdxDialog First indexing setup Einrichten für die erste Indizierung <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Es existiert noch kein Index für diese Konfiguration.</span><br /><br />Wenn Sie nur Ihr Home-Verzeichnis mit sinnvollen Voreinstellungen indizieren wollen, wählen Sie die Schaltfläche <span style=" font-style:italic;">Indizierung jetzt starten</span>. Sie können die Details später anpassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn Sie das Verhalten genauer festlegen wollen, verwenden Sie die folgenden Verknüpfungen, um Einstellungen und Zeitplan für die Indizierung anzupassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Werkzeuge können Sie später im Menü <span style=" font-style:italic;">Einstellungen</span> erreichen.</p></body></html> Indexing configuration Einstellungen für Indizierung This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Hier können Sie die zu indizierenden Verzeichnisse und andere Einstellungen (wie auszuschließende Dateipfade oder -namen, Standard-Zeichensatz usw.) anpassen. Indexing schedule Zeitplan für Indizierung This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Hier können Sie zwischen regelmäßiger Indizierung und Echtzeit-Indizierung wählen und einen automatischen Zeitplan für die regelmäßige Indizierung einrichten (mit cron). Start indexing now Indizierung jetzt starten FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup Einrichtung des Zeitplans für die Indizierung <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indizierung kann ständig laufen und Datein indizieren sobald sie verändert werden, oder aber nur zu bestimmten Zeitpunkten ablaufen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im Handbuch finden Sie Informationen, anhand derer Sie sich für einen der Ansätze entscheiden können (drücken Sie F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dieses Werkzeug hilft Ihnen, einen Zeitplan für periodische Indizierungs-Läufe einzurichten oder die Echtzeit-Indizierung zu starten, wenn Sie sich anmelden (oder beides, was aber selten sinnvoll sein dürfte). </p></body></html> Cron scheduling Cron-Zeitplan The tool will let you decide at what time indexing should run and will install a crontab entry. Mit diesem Werkzeug können Sie festlegen, zu welchen Zeiten die Indizierung laufen soll, und einen crontab Eintrag anlegen. Real time indexing start up Start der Echtzeit-Indizierung Decide if real time indexing will be started when you log in (only for the default index). Entscheiden Sie, ob die Echtzeit-Indizierung beim Anmelden gestartet wird (nur für den Standard-Index). ListDialog Dialog Dialog GroupBox GruppenBox Main No db directory in configuration Kein Datenbankverzeichnis konfiguriert Could not open database in Fehler beim Öffnen der Datenbank in . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . Drücken Sie Abbrechen, um die Konfigurationsdatei vor dem Start der Indizierung anzupassen oder OK um mit der Indizierung zu beginnen. Configuration problem (dynconf Konfigurationsproblem (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: "history" Datei ist beschädigt oder nicht les-/schreibbar, bitte überprüfen oder entfernen Sie sie: Preview &Search for: &Suche nach: &Next &Nächstes &Previous &Vorheriges Match &Case Groß-/Kleinschreibung &beachten Clear Leeren Creating preview text Erzeuge Vorschautext Loading preview text into editor Lade Vorschautext in den Editor Cannot create temporary directory Fehler beim Anlegen des temporären Verzeichnisses Cancel Abbrechen Close Tab Tab schließen Missing helper program: Fehlendes Hilfsprogramm: Can't turn doc into internal representation for Überführung in interne Darstellung nicht möglich für Cannot create temporary directory: Fehler beim Anlegen des temporären Verzeichnisses: Error while loading file Fehler beim Lesen der Datei PreviewTextEdit Show fields Felder zeigen Show main text Vorschautext zeigen Print Drucken Print Current Preview Aktuelle Vorschau drucken Show image Zeige Bild Select All Alles auswählen Copy Kopieren Save document to file Dokument in Datei sichern Fold lines Zeilen umbrechen Preserve indentation Einrückung erhalten QObject Global parameters Globale Parameter Local parameters Lokale Parameter <b>Customised subtrees <b>Angepasste<br> Unterverzeichnisse The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Die Liste der Unterverzeichnisse in der indizierten Hierarchie, in denen einige Parameter anders gesetzt werden müssen. Voreinstellung: leer. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Die folgenden Parameter werden entweder global gesetzt (wenn nichts oder eine leere<br> Zeile in der Liste oben ausgewählt ist) oder für das ausgewählte Unterverzeichnis.<br> Sie können Verzeichnisse durch Anklicken von +/- hinzufügen oder entfernen.<br> Skipped names Auszulassende Namen These are patterns for file or directory names which should not be indexed. Dies sind Muster für Dateien oder Verzeichnisse, die nicht indiziert werden sollen. Default character set Standard-Zeichensatz This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. DIes ist der Zeichensatz, der für Dateien benutzt wird, die ihren Zeichensatz nicht intern definieren, z.B. Textdateien. Der Standardwert ist leer und der Wert der NLS-Umgebung wird benutzt. Follow symbolic links Folge symbolischen Links Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Folge symbolischen Links bei der Indizierung. Der Standardwert ist "Nein", um doppelte Indizierung zu vermeiden. Index all file names Indiziere alle Dateinamen Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indiziere die Namen von Dateien, deren Inhalt nicht erkannt oder verarbeitet werden kann (kein oder nicht unterstützter Mime-Typ). Der Standardwert ist "Ja". Beagle web history Beagle Web-Chronik Search parameters Suchparameter Web history Web-Chronik Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &Vorschau &Open &Öffnen Open With Run Script Copy &File Name &Dateinamen kopieren Copy &URL &URL kopieren &Write to File &Schreibe in Datei Save selection to files Auswahl in Dateien sichern Preview P&arent document/folder Vorschau des &übergeordneten Dokuments/Ordners &Open Parent document/folder Ö&ffnen des übergeordneten Dokuments/Ordners Find &similar documents &Ähnliche Dokumente finden Open &Snippets window Öffne &Schnipsel-Fenster Show subdocuments / attachments Untergeordnete Dokumente / Anhänge anzeigen QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start Automatischer Start der Echtzeit-Indizierung <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indizierung kann im Hintergrund laufen und den Index in Echtzeit aktualisieren sobald sich Dateien ändern. Sie erhalten so einen Index, der stets aktuell ist, aber die System-Resourcen werden ununterbrochen beansprucht.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></htm Start indexing daemon with my desktop session. Indizierungs-Dämon mit Desktop-Sitzung starten Also start indexing daemon right now. Indizierungs-Dämon jetzt sofort starten Replacing: Ersetze: Replacing file Ersetze Datei Can't create: Fehler beim Erzeugen von: Warning Warnung Could not execute recollindex Fehler beim Ausführen von recollindex Deleting: Lösche: Deleting file Lösche Datei Removing autostart Autostart wird entfernt Autostart file deleted. Kill current process too ? Autotstart-Datei wurde entfernt. Soll auch der laufende Prozess beendet werden? RclMain About Recoll Über Recoll Executing: [ Ausführen: [ Cannot retrieve document info from database Keine Informationen zum Dokument in der Datenbank Warning Warnung Can't create preview window Fehler beim Erzeugen des Vorschaufensters Query results Suchergebnisse Document history Dokumenten-Chronik History data Chronik-Daten Indexing in progress: Indizierung läuft: Files Dateien Purge Säubern Stemdb Wortstämme Closing Schließen Unknown Unbekannt This search is not active any more Diese Suche ist nicht mehr aktiv Can't start query: Kann die Suche nicht starten: Bad viewer command line for %1: [%2] Please check the mimeconf file Fehlerhafter Anzeigebefehl für %1: [%2] Überprüfen Sie die Datei mimeconf. Cannot extract document or create temporary file Fehler beim Extrahieren des Dokuments oder beim Erzeugen der temporären Datei (no stemming) (kein Stemming) (all languages) (alle Sprachen) error retrieving stemming languages Fehler beim Holen der Stemming-Sprachen Update &Index Index &aktualisieren Stop &Indexing &Indizierung stoppen All Alle media Medien message Nachricht other Andere presentation Präsentation spreadsheet Tabelle text Text sorted sortiert filtered gefiltert External applications/commands needed and not found for indexing your file types: Externe Anwendungen/Befehle, die zur Indizierung Ihrer Dateitypen gebraucht werden und nicht gefunden wurden: No helpers found missing Keine fehlenden Hilfsprogramme Missing helper programs Fehlende Hilfsprogramme Document category filter Filter für Dokumenten-Kategorie No external viewer configured for mime type [ Kein externes Anzeigeprogramm konfiguriert für Mime-Typ [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Das in mimeview angegebene Anzeigeprogramm für %1: %2 wurde nicht gefunden. Wollen Sie den Einstellungs-Dialog starten? Can't access file: Fehler beim Zugriff auf Datei: Can't uncompress file: Fehler beim Dekomprimieren von Datei: Save file Datei sichern Result count (est.) Anzahl Ergebnisse (ca.) Query details Details zur Suchanfrage Could not open external index. Db not open. Check external indexes list. Externer Index konnte nicht geöffnet werden. Datenbank nicht offen. Überprüfen Sie die Liste der externen Indizes. No results found Keine Ergebnisse gefunden None Keine Updating Aktualisiere Done Fertig Monitor Überwachen Indexing failed Indizierung gescheitert The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Der laufende Indizierungs-Prozess wurde nicht aus diesem Programm gestartet. Drücken SIe OK, um ihn dennoch zu stoppen oder Abbrechen, um ihn unverändert zu lassen. Erasing index Lösche Index Reset the index and start from scratch ? Index zurücksetzen und ganz neu aufbauen? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Suche läuft.<br>Aufgrund von Einschränkungen der Indizierungs-Bibliothek<br>führt ein Abbruch zur Beendigung des Programms. Error Fehler Index not open Index nicht geöffnet Index query error Fehler beim Abfragen des Index Content has been indexed for these mime types: Inhalte mit diesen Mime-Typen wurden indiziert: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Der Index ist für diese Datei nicht auf dem neuesten Stand. Es soll nicht das Risiko eingegangen werden, den falschen Eintrag anzuzeigen. Drücken SIe OK, um den Index für diese Datei zu aktualisieren und starten Sie die Suchanfrage erneut, wenn die Indizierung abgeschlossen ist. Drücken Sie ansonsten Abbrechen. Can't update index: indexer running Fehler beim Aktualisieren des Index: Indizierung läuft Indexed MIME Types Indizierte Mime-Typen Bad viewer command line for %1: [%2] Please check the mimeview file Fehlerhafter Anzeigebefehl für %1: [%2] Überprüfen Sie die Datei mimeview. Viewer command line for %1 specifies both file and parent file value: unsupported Anzeigebefehl für %1 legt Datei und übergeordnete Datei fest: nicht unterstützt Cannot find parent document Übergeordnetes Dokument nicht gefunden Indexing did not run yet Indizierung ist noch nicht durchgeführt worden External applications/commands needed for your file types and not found, as stored by the last indexing pass in Externe Anwendungen/Befehle, die zur Indizierung Ihrer Dateitypen gebraucht werden und nicht gefunden wurden - vom letzten Indizierungslauf hinterlegt unter Index not up to date for this file. Refusing to risk showing the wrong entry. Der Index ist für diese Datei nicht mehr aktuell. Einträge könnten fehlerhaft sein und werden nicht angezeigt. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Drücken Sie Ok, um den Index für diese Datei zu aktualisieren und die Suche daraufhin zu wiederholen. Ansonsten drücken Sie auf Abbrechen. Indexer running so things should improve when it's done Indizierung ist im Gange. Die Resultate sollten sich nach der Fertigstelltung verbessert haben Sub-documents and attachments Untergeordnete Dokumente und Anhänge Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents Doppelte Dokumente These Urls ( | ipath) share the same content: Diese URLs ( | ipath) sind inhaltsgleich: Bad desktop app spec for %1: [%2] Please check the desktop file Indexing interrupted The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Previous page Vorherige Seite Next page Nächste Seite &File &Datei E&xit &Beenden &Tools &Werkzeuge &Help &Hilfe &Preferences &Einstellungen Search tools Suchwerkzeuge Result list Ergebnisliste &About Recoll &Über Recoll Document &History &Dokumenten-Chronik Document History Dokumenten-Chronik &Advanced Search &Erweiterte Suche Advanced/complex Search Erweiterte/komplexe Suche &Sort parameters &Sortierparameter Sort parameters Sortierparameter Next page of results Nächste Ergebnisseite Previous page of results Vorherige Ergebnisseite &Query configuration Einstellungen für &Suche &User manual &Benutzerhandbuch Recoll Recoll Ctrl+Q Ctrl+Q Update &index &Index aktualisieren Term &explorer &Ausdruck-Explorer Term explorer tool Ausdruck-Explorer-Werkzeug External index dialog Dialog für externe Indizes &Erase document history Lösche &Dokumenten-Chronik First page Erste Seite Go to first page of results Gehe zur ersten Ergebnisseite &Indexing configuration &Einstellungen für Indizierung All Alle &Show missing helpers Zeige fehlende &Hilfsprogramme PgDown PgDown PgUp PgUp &Full Screen &Vollbild F11 F11 Full Screen Vollbild &Erase search history Lösche &Such-Chronik sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Nach Datum sortieren (von alt nach neu) sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Nach Datum sortieren (von neu nach alt) Show Query Details Zeige Details zur Suchanfrage Show results as table Zeige Ergebnisse als Tabelle &Rebuild index Index &neu aufbauen &Show indexed types Zeige indizierte &Typen Shift+PgUp Shift+PgUp &Indexing schedule &Zeitplan für Indizierung E&xternal index dialog Dialog für externe &Indizes &Index configuration &Index-Einstellungen &GUI configuration &GUI-Einstellungen &Results &Ergebnisse Sort by date, oldest first Nach Datum sortieren (von alt nach neu) Sort by date, newest first Nach Datum sortieren (von neu nach alt) Show as table Als Tabelle anzeigen Show results in a spreadsheet-like table Zeigt Ergebnisse als Tabelle an Save as CSV (spreadsheet) file Tabelle als CSV Datei speichern Saves the result into a file which you can load in a spreadsheet Speichert Resultate als Tabellenkalkulations-kompatible CSV-Datei ab Next Page Nächste Seite Previous Page Vorherige Seite First Page Erste Seite Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel File name Dateiname Mime type Mime Type Date Datum Abstract Auszug Author Autor Document size Größe des Dokuments Document date Datum des Dokuments File size Größe der Datei File date Datum der Datei Keywords Schlagworte Original character set Ursprünglicher Zeichensatz Relevancy rating Relevanz-Bewertung Title Titel URL URL Mtime Änderungszeitpunkt Date and time Datum und Uhrzeit Ipath Interner Pfad MIME type Mime-Typ ResList Result list Ergebnisliste Unavailable document Dokument nicht verfügbar Previous Zurück Next Weiter <p><b>No results found</b><br> <p><b>Keine Ergebnisse gefunden</b><br> &Preview &Vorschau Copy &URL &URL kopieren Find &similar documents &Ähnliche Dokumente finden Query details Suchdetails (show query) (Suchanfrage zeigen) Copy &File Name &Dateinamen kopieren Document history Dokumenten-Chronik Preview Vorschau Open Öffnen <p><i>Alternate spellings (accents suppressed): </i> <p><i>Alternative Schreibweisen (Akzente unterdrückt): </i> &Write to File &Schreibe in Datei Preview P&arent document/folder Vorschau des &übergeordneten Dokuments/Ordners &Open Parent document/folder Ö&ffnen des übergeordneten Dokuments/Ordners &Open &Öffnen Documents Dokumente out of at least von mindestens for für <p><i>Alternate spellings: </i> <p><i>Alternative Schreibweisen: </i> Open &Snippets window Öffne &Schnipsel-Fenster Duplicate documents Doppelte Dokumente These Urls ( | ipath) share the same content: ipath? Diese URLs ( | ipath) sind inhaltsgleich: Result count (est.) Anzahl Ergebnisse (ca.) Snippets Schnipsel ResTable &Reset sort Sortierung &zurücksetzen &Delete column Spalte &löschen Save table to CSV file Tabelle als CSV Datei speichern Can't open/create file: Fehler beim Öffnen/Erzeugen von Datei: &Preview &Vorschau &Open &Öffnen Copy &File Name &Dateinamen kopieren Copy &URL &URL kopieren &Write to File &Schreibe in Datei Find &similar documents &Ähnliche Dokumente finden Preview P&arent document/folder Vorschau des &übergeordneten Dokuments/Ordners &Open Parent document/folder Ö&ffnen des übergeordneten Dokuments/Ordners &Save as CSV Als CSV &speichern Add "%1" column Spalte "%1" hinzufügen ResTableDetailArea &Preview &Vorschau &Open &Öffnen Copy &File Name &Dateinamen kopieren Copy &URL &URL kopieren &Write to File &Schreibe in Datei Find &similar documents &Ähnliche Dokumente finden Preview P&arent document/folder Vorschau des &übergeordneten Dokuments/Ordners &Open Parent document/folder Ö&ffnen des übergeordneten Dokuments/Ordners ResultPopup &Preview &Vorschau &Open &Öffnen Copy &File Name &Dateinamen kopieren Copy &URL &URL kopieren &Write to File &Schreibe in Datei Save selection to files Auswahl in Dateien sichern Preview P&arent document/folder Vorschau des &übergeordneten Dokuments/Ordners &Open Parent document/folder Ö&ffnen des übergeordneten Dokuments/Ordners Find &similar documents &Ähnliche Dokumente finden Open &Snippets window Öffne &Schnipsel-Fenster Show subdocuments / attachments Untergeordnete Dokumente / Anhänge anzeigen SSearch Any term Irgendein Ausdruck All terms Alle Ausdrücke File name Dateiname Completions Vervollständigungen Select an item: Wählen Sie ein Element: Too many completions Zu viele Vervollständigungen Query language Suchsprache Bad query string Fehlerhafte Suchanfrage Out of memory Kein Speicher mehr verfügbar Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Geben Sie einen Suchsprachen-Ausdruck ein. Spickzettel:<br> <i>Begriff1 Begriff2</i> : 'Begriff1' und 'Begriff2' in irgendeinem Feld.<br> <i>field:Begriff1</i> : 'Begriff1' im Feld 'field'.<br> Standard-Feldnamen/Synonyme:<br> title/subject/caption, author/from, recipient/to, filename, ext<br> Pseudo-Felder: dir, mime/format, type/rclcat, date<br> Zwei Beispiele für Datumsintervalle: 2009-03-01/2009-05-20 2009-03-01/P2M<br> <i>Begriff1 Begriff2 OR Begriff3</i> : Begriff1 AND (Begriff2 OR Begriff3)<br> Klammern sind nicht erlaubt.<br> <i>"Begriff1 Begriff2"</i> : Phrase (muss genaus so vorkommen). Mögliche Modifikatoren:<br> <i>"Begriff1 Begriff2"p</i> : ungeordnete Nähen-Suche mit voreingestelltem Abstand.<br> Im Zweifelsfalle verwenden Sie den Link <b>Suchanfrage zeigen</b> und finden im Handbuch (&lt;F1>) weitere Details. Enter file name wildcard expression. Geben Sie einen Wildcard-Ausdruck für Dateinamen ein. Enter search terms here. Type ESC SPC for completions of current term. Suchbegriffe hier eingeben. Drücken Sie ESC+Leerzeichen für Vervollständigungen des aktuellen Begriffs. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear Löschen Ctrl+S Ctrl+S Erase search entry Sucheintrag löschen Search Suchen Start query Suche starten Enter search terms here. Type ESC SPC for completions of current term. Suchbegriffe hier eingeben. Drücken Sie ESC+Leerzeichen für Vervollständigungen des aktuellen Begriffs. Choose search type. Wählen Sie die Art der Suche SearchClauseW SearchClauseW SearchClauseW Any of these Irgendeins dieser All of these Alle diese None of these Keins dieser This phrase diese Wörter Terms in proximity ähnliche Ausdrücke File name matching passende Dateinamen Select the type of query that will be performed with the words Wählen Sie die Art der Suche aus, die mit den Wörtern gestartet wird. Number of additional words that may be interspersed with the chosen ones Anzahl der Wörter, die sich zwischen den angegebenen befinden dürfen No field Kein Feld Any Irgendeines All Alle None Keines Phrase Phrase Proximity Nähe File name Dateiname Snippets Snippets Schnipsel about:blank about:blank Find: Finden: Next Weiter Prev Zurück X X SnippetsW Search Suchen <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SortForm Date Datum Mime type Mime Type SortFormBase Sort Criteria Sortierkriterium Sort the Zeige die most relevant results by: relevantesten Ergebnisse sortiert nach: Descending Absteigend Close Schließen Apply Übernehmen SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer Ausdruck-Explorer &Expand &Vervollständigen Alt+E Alt+V &Close &Schließen Alt+C Alt+S Term Ausdruck No db info. Keine Datenbank-Information Match Beachte Case Groß-/Kleinschreibung Accents Betonungszeichen SpellW Wildcards Wildcards Regexp Regulärer Ausdruck Spelling/Phonetic Phonetisch Aspell init failed. Aspell not installed? Fehler bei der Initialisierung von Aspell. Ist Aspell nicht installiert? Aspell expansion error. Aspell Vervollständigungsfehler Stem expansion Wortstamm-Erweiterung error retrieving stemming languages Fehler beim Holen der Stemming-Sprachen No expansion found Keine Erweiterung gefunden Term Begriff Doc. / Tot. Dok. / Ges. Index: %1 documents, average length %2 terms Index: %1 Dokumente mit durchschnittlicher Länge von %2 Begriffen Index: %1 documents, average length %2 terms.%3 results Index: %1 Dokumente mit durchschnittlicher Länge von %2 Begriffen. %3 Ergebnisse %1 results %1 Ergebnisse List was truncated alphabetically, some frequent Liste wurde alphabetisch abgeschnitten, einige häufige Begriffe terms may be missing. Try using a longer root. können fehlen. Versuchen Sie es mit einer längeren Wurzel. Show index statistics Indexstatistiken anzeigen Number of documents Dokumentenzahl Average terms per document Durchschnittliche Zahl von Ausdrücken pro Dokument Smallest document length Minimale Zahl von Ausdrücken Longest document length Maximale Zahl von Ausdrücken Database directory size Größe des Datenbankordners MIME types: Mime-Typen: Item Eintrag Value Wert Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog The selected directory does not appear to be a Xapian index Das ausgewählte Verzeichnis scheint kein Xapian-Index zu sein. This is the main/local index! Das ist der Hauptindex! The selected directory is already in the index list Das ausgewählte Verzeichnis ist bereits in der Indexliste. Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Wählen Sie das Xapian-Indexverzeichnis (z.B. /home/benutzer/.recoll/xapiandb) error retrieving stemming languages Fehler beim Holen der Stemming-Sprachen Choose Auswählen Result list paragraph format (erase all to reset to default) Format für Ergebnis-Absatz (alles löschen, um auf Standard zurück zu setzen) Result list header (default is empty) Header der Ergebnisliste (Standard ist leer) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Wählen Sie den Recoll-Konfigurationsordner oder das Xapian-Indexverzeichnis aus (z.B. /home/ich/.recoll oder /home/ich/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Der ausgewählten Ordner handelt scheint Recoll-Konfigurationsordner zu sein, aber die Konfiguration konnte nicht ausgelesen werden At most one index should be selected Bitte wählen Sie maximal einen Index aus Cant add index with different case/diacritics stripping option Indices mit unterschiedlichen Einstellungen zum Umgang mit Groß/-Kleinschreibung und diakritischen Zeichen können nicht hinzugefügt werden Default QtWebkit font Any term Irgendein Ausdruck All terms Alle Ausdrücke File name Dateiname Query language Suchsprache Value from previous program exit UIPrefsDialogBase User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite Result list font Schriftart für Ergebnisliste Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Reset Reset Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste zurück auf den Standardwert Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner im Sucheingabefeld eingegeben wird. Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen. Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Search parameters Suchparameter Stemming language Stemming Sprache Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Festlegung ob Zusammenfassungen für Ergebnisse im Kontext der Suchparameter erzeugt werden (kann bei großen Dokumenten langsam sein). Replace abstracts from documents Ersetzen der Zusammenfassungen in den Dokumenten Do we synthetize an abstract even if the document seemed to have one? Festlegung ob eine Zusammenfassung auch dann erzeugt wird, wenn das Dokument schon eine Zusammenfassung enthält Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung External Indexes externe Indizes Add index Index hinzufügen Select the xapiandb directory for the index you want to add, then click Add Index Wählen Sie das xapiandb-Verzeichnis des zuzufügenden Indizes und klicken Sie auf Index hinzufügen Browse Auswahl &OK &OK Apply changes Änderungen übernehmen &Cancel &Abbrechen Discard changes Änderungen verwerfen Result paragraph<br>format string Formatstring für Ergebnisse Automatically add phrase to simple searches Automatisches Zufügen von Sätzen zu einfachen Suchen A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Jürgen Klinsmann] wird geändert nach [Jürgen OR Klinsmann OR (Jürgen PHRASE 2 Klinsmann)]. Dadurch sollten Ergebnisse, die exakte Übereinstimmungen der Suchworte enthalten, stärker gewichtet werden. User preferences Benutzereinstellungen Use desktop preferences to choose document editor. Die Einstellung des Dokumenteneditors erfolgt in den Desktopvoreinstellungen. External indexes Externe Indizes Toggle selected Auswahl umkehren Activate All Alle Auswählen Deactivate All Alle Abwählen Remove selected Ausgewählte entfernen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remember sort activation state. Speichern, ob Sortieren aktiviert ist ViewAction Changing actions with different current values Aktionen mit anderen Werten ändern Mime type Mime Type Command Befehl MIME type Mime-Typ Desktop Default Desktopvoreinstellung Changing entries with different current values Einträge mit anderen Werten ändern ViewActionBase File type Dateityp Action Aktion Select one or several file types, then click Change Action to modify the program used to open them Wählen Sie einen oder mehrere Dateitypen und klicken Sie auf "Ändere Aktion", um das Programm zum Öffnen anzupassen. Change Action Ändere Aktion Close Schließen Native Viewers Anzeigeprogramme Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Wählen Sie einen oder mehrere Mime-Typen und klicken Sie auf "Ändere Aktion".<br>Sie können diesen Dialog auch schließen und stattdessen "Die Einstellung des<br> Dokumenteneditors erfolgt in den Desktopeinstellungen" auswählen.<br> Die Liste wird dann igoriert und es werden die Desktopeinstellungen verwendet. Select one or several mime types then use the controls in the bottom frame to change how they are processed. Wählen Sie einen oder mehrere MIME-Typen aus und nutzen Sie dann die Bedienelemente unten, um das Programm zum Öffnen anzupassen. Use Desktop preferences by default Standardmäßig Desktopvoreinstellungen nutzen Select one or several file types, then use the controls in the frame below to change how they are processed Wählen Sie einen oder mehrere Dateitypen aus. Nutzen Sie dann die Bedienelemente unten, um das Programm zum Öffnen anzupassen Exception to Desktop preferences Von Desktopvoreinstellungen abweichende Ausnahme Action (empty -> recoll default) Aktion (leer → Recoll-Voreinstellung) Apply to current selection Auf aktuelle Auswahl anwenden Recoll action: Recoll-Aktion: current value aktueller Wert Select same Das Selbe wählen <b>New Values:</b> <b>Neuer Wert</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Steal Beagle indexing queue Indizierungs-Warteschlange von Beagle übernehmen Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle darf NICHT laufen. Ermöglicht die Abarbeitung der Beagle-Warteschlange, um die Firefox Web-Chronik zu indizieren.<br>(Sie sollten auch das Beagle-Plugin für Firefox installieren.) Entries will be recycled once the size is reached Einträge werden wiederverwendet sobald die Größe erreicht ist. Web page store directory name Verzeichnis zur Ablage von Webseiten The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Der Name eines Verzeichnisses, in dem Kopien der besuchten Webseiten gespeichert werden sollen.<br>Ein nicht-absoluter Pfad ist dabei relativ zum Konfigurationsverzeichnis. Max. size for the web store (MB) Maximale Größe für Ablage von Webseiten (MB) Process the WEB history queue Web-Chronik Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file Fehler beim Schreiben der Konfigurationsdatei confgui::ConfParamFNW Choose Auswählen confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Automatisch diakritische Zeichen beachten <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p> Automatisch die Beachtung von diakritischen Zeichen einschalten, wenn der Suchbegriff Zeichen mit Akzenten enthält (nicht in unac_except_trans). Ansonsten müssen Sie dafür die Suchsprache und den <i>D</i> Modifikator verwenden. Automatic character case sensitivity Automatisch Groß-/Kleinschreibung beachten <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p> Automatisch die Beachtung von Groß-/Kleinschreibung einschalten, wenn der Eintrag Großbuchstaben enthält (außer an erster Stelle). Ansonsten müssen Sie dafür die Suchsprache und den <i>C</i> Modifikator verwenden. Maximum term expansion count Maximale Anzahl von Ausdruck-Erweiterungen <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>Maximale Anzahl von Erweiterungen für einen einzelnen Ausdruck (z.B. bei der Verwendung von Wildcards). Der Standardwert 10 000 ist vernünftig und verhindert, dass Suchanfragen scheinbar einfrieren, während die Liste der Begriffe durchlaufen wird. Maximum Xapian clauses count Maximale Anzahl von Xapian-Ausdrücken <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>Maximale Anzahl von elementaren Ausdrücken, die wir zu einer einzelnen Xapian Abfrage hinzufügen. In manchen Fällen können die Ergebnisse von Ausdruck-Erweiterungen sich ausmultiplizieren, und wir wollen übermäßigen Speicherverbrauch vermeiden. Der Standardwert 100 000 sollte in den meisten Fällen hoch genug sein und zugleich zu typischen derzeitigen Hardware-Ausstattungen passen. confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Max. Größe kompr. Dateien (kB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Dies ist eine Obergrenze; komprimierte Dateien jenseits dieser Größe werden nicht verarbeitet. Auf -1 setzen, um keine Obergrenze zu haben, auf 0, um nie zu dekomprimieren. Max. text file size (MB) Max. Größe Textdateien (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Dies ist eine Obergrenze; Textdateien jenseits dieser Größe werden nicht verarbeitet Auf -1 setzen, um keine Obergrenze zu haben. Dies dient dazu, riesige Log-Dateien vom Index auszuschließen. Text file page size (KB) Seitengröße Textdateien (kB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Wenn dieser Wert gesetzt ist (ungleich -1), werden Textdateien zur Indizierung in Stücke dieser Größe aufgeteilt. Das hilft bei der Suche in sehr großen Textdateien (z.B. Log-Dateien). Max. filter exec. time (S) Max. Zeit für Filter (s) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Externe Filter, die länger als diese Zeit laufen, werden abgebrochen. Das ist für den seltenen Fall (Postscript), in dem ein Dokument eine unendliche Schleife auslöst. Auf -1 setzen, um keine Obergrenze zu haben. External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Externe Filter, die länger als diese Zeit laufen, werden abgebrochen. Das ist für den seltenen Fall (Postscript), in dem ein Dokument eine unendliche Schleife auslöst. Auf -1 setzen, um keine Obergrenze zu haben. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories Start-Verzeichnisse The list of directories where recursive indexing starts. Default: your home. Die Liste der Verzeichnisse, in denen die rekursive Indizierung startet. Standard: Home-Verzeichnis. Skipped paths Auszulassende Pfade These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Die Namen der Verzeichnisse, die nicht indiziert werden.<br>Kann Wildcards enthalten. Muss den Pfaden entsprechen, die der Indizierer sieht (d.h.. wenn '/home/me' in den Start-Verzeichnissen steht und '/home' eigentlich ein Link zu '/usr/home' ist, dann wäre ein korrekter Eintrag '/home/me/tmp*' und nicht '/usr/home/me/tmp*') Stemming languages Stemming-Sprachen The languages for which stemming expansion<br>dictionaries will be built. Die Sprachen, für die Worstammerweiterungsverzeichnisse erstellt werden. Log file name Log-Datei The file where the messages will be written.<br>Use 'stderr' for terminal output Die Datei, in die Ausgaben geschrieben werden.<br>Für Ausgaben auf dem Terminal 'stderr' benutzen. Log verbosity level Ausführlichkeit des Logs This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Dieser Wert steuert die Menge der Meldungen<br>(nur Fehler oder viele Debugging Ausgaben). Index flush megabytes interval Interval (MB) für Speicherleerung This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Dieser Wert steuert, wieviel Daten indiziert werden bevor die Indexinformationen auf Festplatte geschrieben werden.<br>Hierdurch kann der Speicherverbrauch des Indizierers gesteuert werden. Standardwert: 10MB Max disk occupation (%) Max. Festplattenbelegung (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Dies ist der Prozentsatz der Festplattenbelegung, ab dem die Indizierung gestoppt wird (um das Füllen der Festplatte zu vermeiden).<br>0 bedeutet keine Begrenzung (das ist der Standardwert). No aspell usage Aspell nicht benutzen Aspell language Sprache für Aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Die Sprache des Aspell-Wörterbuchs (z.B. 'en' oder 'de' ...)<br>Wenn dieser Wert nicht gesetzt ist, wird die NLS-Umgebung verwendet, um die Sprache festzustellen, was im Allgemeinen funktioniert. Um eine Vorstellung zu bekommen, was auf Ihrem System installiert ist, geben Sie 'aspell config' ein und schauen Sie nach .dat Dateien im Verzeichnis 'data-dir'. Database directory name Verzeichnis für Index-Datenbank The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Der Name eines Verzeichnisses, in dem der Index gespeichert werden soll.<br>Ein nicht-absoluter Pfad ist dabei relativ zum Konfigurationsverzeichnis. Der Standard ist 'xapiandb'. Use system's 'file' command 'file' Kommando benutzen Use the system's 'file' command if internal<br>mime type identification fails. Benutze das 'file' Kommando, wenn die interne Erkennung des Mime-Typs fehlschlägt. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Deaktiviert die Verwendung von Aspell für die Erzeugung von Schreibweisen-Näherungen im Ausdruck-Explorer-Werkzeug. <br>Nützlich, wenn Aspell nicht vorhanden ist oder nicht funktioniert. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Die Sprache des Aspell-Wörterbuchs (z.B. 'en' oder 'de' ...)<br>Wenn dieser Wert nicht gesetzt ist, wird die NLS-Umgebung verwendet, um die Sprache festzustellen, was im Allgemeinen funktioniert. Um eine Vorstellung zu bekommen, was auf Ihrem System installiert ist, geben Sie 'aspell config' ein und schauen Sie nach .dat Dateien im Verzeichnis 'data-dir'. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Der Name eines Verzeichnisses, in dem der Index gespeichert werden soll.<br>Ein nicht-absoluter Pfad ist dabei relativ zum Konfigurationsverzeichnis. Der Standard ist 'xapiandb'. Unac exceptions Unac Ausnahmen <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Dies sind Ausnahmen für den unac Mechanismus, der standardmäßig alle diakritischen Zeichen entfernt und sie durch kanonische Entsprechungen ersetzt. Sie können (abhängig von Ihrer Sprache) dieses Entfernen von Akzenten für einige Zeichen übersteuern und zusätzliche Ersetzungen angeben, z.B. für Ligaturen. Bei jedem durch Leerzeichen getrennten Eintrag ist das erste Zeichen das Ausgangszeichen und der Rest die Ersetzung. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Benutzereinstellungen User interface Benutzeroberfläche Number of entries in a result page Anzahl der Ergebnisse pro Seite If checked, results with the same content under different names will only be shown once. Bei Auswahl werden Ergebnisse mit dem gleichen Inhalt unter verschiedenen Namen nur einmal gezeigt. Hide duplicate results. Verstecke doppelte Ergebnisse Highlight color for query terms Farbe zur Hervorhebung von Suchbegriffen Result list font Schriftart für Ergebnisliste Opens a dialog to select the result list font Öffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste Helvetica-10 Helvetica-10 Resets the result list font to the system default Setzt die Schriftart für die Ergebnisliste auf den Standardwert zurück Reset Zurücksetzen Result paragraph<br>format string Formatstring für Ergebnisse Texts over this size will not be highlighted in preview (too slow). Texte über dieser Größe werden in der Vorschau nicht mit Hervorhebungen versehen (zu langsam). Maximum text size highlighted for preview (megabytes) Maximale Textgröße für Vorschau-Hervorhebung Use desktop preferences to choose document editor. Einstellung des Dokumenteneditors erfolgt in den Desktopeinstellungen Choose editor applications Standardanwendungen auswählen Display category filter as toolbar instead of button panel (needs restart). Kategorie-Filter in Werkzeugleiste statt als Radio-Buttons (Neustart erforderlich) Auto-start simple search on whitespace entry. Automatisch eine einfache Suche starten, wenn ein Worttrenner eingegeben wird Start with advanced search dialog open. Nach dem Start automatisch den Dialog für die erweiterte Suche öffnen Start with sort dialog open. Nach dem Start automatisch den Sortierdialog öffnen. Remember sort activation state. Speichern, ob Sortierung aktiviert ist Prefer Html to plain text for preview. Bei Vorschau HTML gegenüber reinem Text bevorzugen Search parameters Suchparameter Stemming language Stemming-Sprache A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Eine Suche nach [Rolling Stones] wird geändert zu [Rolling OR Stones OR (Rolling PHRASE 2 Stones)]. Dadurch sollten Ergebnisse, in denen die Suchworte genau wie eingegeben auftreten, stärker gewichtet werden. Automatically add phrase to simple searches Automatisches Hinzufügen von Phrasen zu einfachen Suchen Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Versuchen wir, Zusammenfassungen für Ergebnisse aus den Fundstellen zu erzeugen? Dies kann bei großen Dokumenten langsam sein. Dynamically build abstracts Zusammenfassungen dynamisch erzeugen Do we synthetize an abstract even if the document seemed to have one? Erzeugen wir eine Zusammenfassung auch dann, wenn das Dokument schon eine Zusammenfassung enthält? Replace abstracts from documents Ersetzen der Zusammenfassungen aus Dokumenten Synthetic abstract size (characters) Länge der erzeugten Zusammenfassung (in Zeichen) Synthetic abstract context words Anzahl der Kontextworte in der Zusammenfassung The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Die Worte in dieser Liste werden automatisch zu ext:xxx Ausdrücken im Suchsprachen-Eintrag umgewandelt. Query language magic file name suffixes. Magische Dateinamen-Erweiterungen für Suchsprache Enable Aktivieren External Indexes Externe Indizes Toggle selected Auswahl umkehren Activate All Alle auswählen Deactivate All Alle abwählen Remove from list. This has no effect on the disk index. Aus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index. Remove selected Ausgewählte entfernen Click to add another index directory to the list Anklicken, um ein weiteres Index-Verzeichnis zur Liste hinzuzufügen Add index Index hinzufügen Apply changes Änderungen übernehmen &OK &OK Discard changes Änderungen verwerfen &Cancel &Abbrechen Abstract snippet separator Trenner für Zusammenfassungs-Teile Style sheet Style Sheet Opens a dialog to select the style sheet file Öffnet einen Dialog zur Auswahl der Style Sheet Datei Choose Auswählen Resets the style sheet to default Setzt das Style Sheet auf den Standardwert zurück Lines in PRE text are not folded. Using BR loses some indentation. Zeilen in PRE-Text werden nicht umgebrochen. Bei Verwendung von BR gehen manche Einrückungen verloren. Use <PRE> tags instead of <BR>to display plain text as html in preview. <PRE> Tags statt <BR> verwenden, um Texte in der Vorschau als HTML anzuzeigen Result List Ergebnisliste Edit result paragraph format string Format-String für Ergebnis-Absatz editieren Edit result page html header insert HTML-Header der Ergebnisseite ergänzen Date format (strftime(3)) Datumsformat (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Häufigkeitsschwellwert in Prozent, über dem Begriffe nicht beim automatischen Hinzufügen von Phrasen verwendet werden. Häufige Begriffe beeinträchtigen die Performance bei Phrasen stark. Weggelassene Begriffe erhöhen den Phrasen-Slack und vermindern den Nutzender automatischen Phrasen. Der Standardwert ist 2. Autophrase term frequency threshold percentage Häufigkeitsschwellwert für automatische Phrasen Plain text to HTML line style Zeilen-Stil für Umwandlung von Text in HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Zeilen in PRE-Text werden nicht umgebrochen. Bei Verwendung von BR gehen manche Einrückungen verloren. Möglicherweise ist der Stil 'PRE + Umbruch' das, was Sie wollen. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + Umbruch Exceptions Ausnahmen Mime types that should not be passed to xdg-open even when "Use desktop preferences" is set.<br> Useful to pass page number and search string options to, e.g. evince. Mime-Typen, die nicht an xdg-open übergeben werden sollen, selbst wenn Desktopvoreinstellungen gewählt wurden.<br> Nützlich, um Seitenzahl und Suchstring zu übergebn, z.B. an evince. Disable Qt autocompletion in search entry. Qt-Autovervollständigung in Suchleiste deaktivieren. Search as you type. Suche beim Eintippen starten. Paths translations Pfadumwandlung Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Klicken Sie hier um einen weiteren Indexordner zur Liste hinzuzufügen. Sie können entweder einen Recoll-Konfigurationsordner oder einen Xapian-Index auswählen. Snippets window CSS file Schnipsel-Fenster CSS Datei Opens a dialog to select the Snippets window CSS style sheet file Öffnet einen Dialog zur Auswahl der Schnipsel-Fenster CSS Style Sheet Datei Resets the Snippets window style Setzt das Schnipsel-Fenster Style Sheet auf den Standardwert zurück Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_zh_CN.qm0000644000175000017500000023623513224431020014617 00000000000000<¸dÊÍ!¿`¡½ÝBh+ôl-ô™¯ +;ªG¤HH,±,H,ÛkHYÛ”IAÇyZlÑ£mbÕ>^ߘ•߈¦y‰°¨¥Îó¶Eµ{ÐD¸Ù]â ½á¹LôÓœLôÝÝVE¹ûVEÜ f¾ÓÂlÀÉHxÆÞ˜ÅH̬ãìôÓ¬ô Eî)j$—׃'HäÕo*Ð%ÃK*ì0Ãö+Lô†Ø+f¾’z1ø Ë:ÎdÀâAVŽG…Ô&GßƹH6óß.H6õß[J+‚ˆJ+‚ÙŒJ6•hJ6•íZL™b¶ MzݵPh¨ÐMSŠ˜ß°S¸¹çÌT°5ÐÙWTŠTWÈÕºXÉÄ&´Z0ƒ#Ò[ %Ñz\ƒµãæe®ˆ\gwî×ÁsºñÁsºñÁ v8“»v®Âv®ÂÁ^zϳù€€£ë„j®%Œ!þ '—¤´ëë0œ ÍꬪJ‚®½Þ-¯fSëV¶Êð­ðº°LÃÞÖ^ÐùƒÀ‘Ðùƒä2ÐùƒêÿãnÝýgt¿½:•$Õ ;Eµ¾Ûnô̧Â.ìSôÌW0,…Ì;¸sã>.cDo2·|N¼nXM¹!^X®©Eä`Þ^Òfhˆ¸G®lÿtÛînÚ‹²wñ…Шwñ…ì#€üÞô‘vãÖ•ñ“ŽÐ¢‰'£cê ÛÎxC‹îÞñƒ6ëͺýgó L°ôþSIØèÿµøÿØ…àà çIp#ZvåÔ7vå¥Ï¼w 5Ïíw 5ؽw 5Û½w 5ærwîÐŒU®Ÿ.¯Ý£¹Þòh©Ö³äª6•Þ£¯†”¯3»f3ÅYͼu!éÐgž>ÐgžÁƒÔÂõˆ׸~ù°ì;U³ï¡©FåúU‰núeî “ ¬,¡!D'´&Á¿.‡NÖ=úd(?údÔ«G$ß­wJUYµGJUYÓAY ôâ€[–uŠÊ_nẙ*›uD–Ê·²³¢ʨÊ—¥îÊ—¥Á7ÎÅå#_Ôä^jÝôL;æõÎöhìxmùJguþA¢ÍäþŠ¥"Mÿ%´å\ÿAîB „{<.­çÞÙKõÌ÷ëdÍR;[¾ß×<ÄöÖ!LƒíÝNB™ìže 2¸åvhÕó‰€ã‡²'…(P²nŒ¯bÎÉ’"3 µ’ZÓ n˜I¼H9˜I¼‡â™n•.™n•Þ|šß¤·óŸf•æFŸf•ô8Ÿf•[«Æ «Ùµ¬,¥He¯ƒWG!¯ƒW……Äy%EGÄy%Ö΄ռ³Ð: Ú#ãX|þçåõWDzÌ” NiÔÚiÞ+ -Z 5-¼Î$)ÖT';B9€FBìSÝ5k¶ÞÉoˆ•ÜÚr?)ÑÊrž°¹|ôòa„kå“+‹¦,Ê‹ÜðâíŒÇ<Å‹")›ˆ˜Û›ˆ˜ÞT¦AS LªÃ¢¼·¨ ×W·¨ å*»œRàÇ¢•“e×I^ÈØ~C ôèêȵØéã>„ÀðŒµ)Ñ`³ÉÚMðIÇ$³v" Û8UKô(Hp hŸu9h$v2ã‰Ü–T#‹E—Bˆ-šK `¦ %1¦©nÄ'¦öõލ«‡¿‘¶7Õ€FÄÅ^ôÆÄÖ[¹ÊXÔ žënD®äðw)ÝþC†!vôéÖ#+ä*7I^Ã|<ˆ~ä‚FW#ÜHF¯NËH:"’§_guf’apäü©f H‘|§N¯ŒÍw’ûŒÏ—ÓænÒ“’ž™Åóߦš´Á³²ð “¢¾l¯»@ÓtpÓtÁÛÈ௫Ɇt,bâ]8G~åÅ  üéŽ#ËnñâF3…Ý,öyðÍ:uî$uGñî(ŠJýnø%QçÇŽ,}}ï€;EÖá”ò“*G¨0Î þ©ÔÕ&㬨”ð<°cí†ÄÚÍÈ@ÃàGÊÁÄåÌí³‡Í³Ô ×°±êÝÜéäœc ä´¥¯tæí:´Gî?À¶fö¨å Zú Ã,Ý ´HÂw -(Gá 9ZyÚ ;´3·µ D©ûá K¨óÈÜ ]#—¹{ c‡C• k¨µ‹| lMˆ…° ‰Œî+š ŸÁò”e £qDàv «ƒÔÎ ­îó ®œ¯, ²9g ü>%? ä3µ¡ äîŒ6 íåõñ *NŠ :^å¶ Üc× *RF' +<” - 6 ´ >V…ð G.~fQ `P¸f `ç£ a·EÇ¢ c·EÇÒ d8ëÁ y‰5 ˜Iœq ¤žÿ ®VTý ²ëC“× ÄãÓu âæçÇ6 æõçÆê ®Æ? ®ùÆx Ô… ‚ yeE TH ŽÚ‡: ,xƒ+ =!i+ Kj×ÑD h¹°‡p ’þƒá5 ™÷¾f éÈ £Ü ‹ ¨Î£È1 ¬r” »ïµ³½ Ù·åÉt Û·åɧ ÛÓ‹ ?¾ m Vd¸3 ïúî 'ИÅÇ +bC”¼ /¥¸¢ 97á 9ɺB L*Õå PÖ™°t RVŽ¿1 T#Ÿ Vü ¦ \iC&Z ]æùñ¥ `F¥“ hôîÕª v—¥»× {l$Ù €!Y»˜ €!YÔl ‚WåËë Š±O Œïõ˰ ¬æà®³ ¶…ð— ¹iÉüM Óͽ” Ú÷ã’ Ýøìe é—~µ õ­Ní ö†ÀÞÓ m£Ðz 'RçfÒ -èôÑ 8þˆ FÁ·L OE°f ]„ÄHö ]„Äî[ uò0Ë0 y·ég y¹~0 ‚±3ü …È©Ú ‡uÙ ‡uæ£ ‰P°L ‰PÀj 5d"ä ¤š„¹Å ¬Š©D± ½ý7ƒR ÇòÞÙ ÊÕ’GL ÕHÊ ÛQ5ò û£ãX q©Ã€&%Ýn•P/¸.û8bóâ·9µÊN<Þ*ýJQá~%’W"ù’KY~sÅ[žsÍ­\НEoe3È~g3È­pû~ƒ‡Õ 㙳w!­c•»m€Ö˜¿­clÂ|“jÂ|“(ÙÎÁ'¼4ó lÂ2ü©Ü ü¶LVi-QhègaNö All clauses AdvSearchNûagaNö Any clause AdvSearche‡Nö\:[øÇnäVhv„TSUOMN kcxn$Bad multiplier suffix in size filter AdvSearch YZ’OSe‡Nömedia AdvSearch®Nömessage AdvSearchQv[ƒother AdvSearchoy:e‡hc presentation AdvSearchu5[Pˆhh< spreadsheet AdvSearchu5[Pˆhh< spreadsheets AdvSearche‡g,text AdvSearche‡g,texts AdvSearch !yûR¨Qhè <----- All AdvSearchBase !yûR¨ N-˜y <----- Sel AdvSearchBasemûR gaNö Add clause AdvSearchBasešØzïd}"Advanced search AdvSearchBase yûR¨Qhè!’ All ----> AdvSearchBaseÌSó¹v„b@g —^zz[WkµýOc qg;‘Nÿ QhègaNö  ˜yÿ b;‘bÿ NûagaNö  ˜yÿ ge~ÄT0<br> Nûa  Qhè TŒ eà N yÍ[Wkµ|{W‹ýc¥SדQe{€SU‹Í‹íTŒSÌ_S÷_u(v„‹Í~Äv„~ÄT0<br>zzv„“QehFOˆ«_ýue0All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBasemO‰ÈBrowse AdvSearchBase c Y'|{geÇnä By categories AdvSearchBase N-ÙN*ÿ NåO¿”ˆ[ùeågÛˆLÇnä'Check this to enable filtering on dates AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö|{W‹ÛˆLÇnä,Check this to enable filtering on file types AdvSearchBase" N-ÙN*ÿ NåO¿”ˆ[ùe‡Nö\:[øÛˆLÇnä'Check this to enable filtering on sizes AdvSearchBase4 N-ÙN*ÿ NåO¿Ou(ƒY'v„R|{ÿ € N Ou(QwOSv„e‡Nö|{W‹;Check this to use file categories instead of raw mime types AdvSearchBaseQs•íClose AdvSearchBaseR –dgaNö Delete clause AdvSearchBase“Qe‰d}"v„gN \Bvî_UEnter top directory for search AdvSearchBaseÇnäFilter AdvSearchBaseÇnäeåg Filter dates AdvSearchBaseÇnä\:[ø Filter sizes AdvSearchBasegåb~Find AdvSearchBaseNÎFrom AdvSearchBase‰_ýuev„e‡Nö|{W‹Ignored file types AdvSearchBase SÍlÇnägaNöInvert AdvSearchBasegY'\:[ø Max. Size AdvSearchBase0gY'\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseg\\:[ø Min. Size AdvSearchBase0g\\:[ø0O`SïOu(k/K0m/M0g/GO\N:SUOM4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase –P[še‡Nö|{W‹Restrict file types AdvSearchBase"\~ÓgœN-v„e‡Nö–P[šW(kd[Pvî_UhN-ÿ%Restrict results to files in subtree: AdvSearchBase OÝ[XN:žØ‹¤P<Save as default AdvSearchBase(d}"<br>ná³NåN gaNö<br>v„e‡hcÿ'Search for
documents
satisfying: AdvSearchBase\ˆ«d}"v„e‡Nö|{W‹Searched file types AdvSearchBase yûR¨ N-˜y!’ Sel -----> AdvSearchBase_YËd}" Start Search AdvSearchBaseR0To AdvSearchBase<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css"> @page { } table { border-collapse:collapse; border-spacing:0; empty-cells:show } td, th { vertical-align:top; font-size:12pt;} h1, h2, h3, h4, h5, h6 { clear:both } ol, ul { margin:0; padding:0;} li { list-style: none; margin:0; padding:0;} <!-- "li span.odfLiEnd" - IE 7 issue--> li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; } span.footnodeNumber { padding-right:1em; } span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000; margin:0; border:0; padding:0; } * { margin:0;} .P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; } .T1 { font-weight:bold; } .T3 { font-style:italic; } .T4 { font-family:Courier New,courier; } <!-- ODF styles with no properties representable as CSS --> { } </style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> by‘Ï}"_‹¡RNûR¡(cron) </p><p class="P1">kÏN*[WkµýSïNåSbìNN*‘M{&(*)0SUN*ep[WP<0S÷R–”v„Rˆh(1,3,5)TŒƒVô(1-7)0fôQÆxnW0‹ôÿ ÙN›[WkµOˆ«<span class="T3">c SŸh7</span>“QúR0crontab e‡NöN-ÿ VàkdÙ‘ÌSïNåOu(crontab v„b@g ‹ílÕÿ S€crontab(5)0</p><p class="P1"><br/>O‹Y‚ÿ W(<span class="T3">eåg</span>N-“Qe<span class="T4">*</span>ÿ <span class="T3">\eö</span>N-“Qe<span class="T4">12,19</span>ÿ <span class="T3">R”Ÿ</span>N-“Qe<span class="T4">15 </span>v„‹Ýÿ OW(kÏY)v„12:15 AM TŒ7:15 PMT/R¨recollindex0</p><p class="P1">NN*˜‘~AbgˆLv„‹¡RNûR¡ÿ Qv`'€ýSï€ýkÔN N [žeö}"_0</p></body></html> Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

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

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

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

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

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

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

Alternate spellings (accents suppressed): ResList"<p><i>Qv[ƒbüQ™_b_ÿ</i>

Alternate spellings: ResListe‡hcS†SòDocument historyResList{, DocumentsResListN NN*NextResListbS_OpenResList˜„‰ÈPreviewResListN NN*PreviousResList gå‹â‹íSå~Æ‚‚ Query detailsResList~ÓgœepÿO0‹¡P<ÿ Result count (est.)ResList~ÓgœRˆh Result listResListrGe­SnippetsResList eàlÕ‹¿•îe‡hcUnavailable documentResListN*e‡hcÿ gå‹âgaNöÿforResListN*e‡hcÿ g\Qqg out of at leastResListR –dkdRÿ&Dÿ &Delete columnResTable‘Ínc’^gaNöÿ&Rÿ  &Reset sortResTableOÝ[XN:CSVÿ&Sÿ  &Save as CSVResTablemûR "%1"RAdd "%1" columnResTableeàlÕbS_/R^úe‡NöÿCan't open/create file: ResTable\ˆhhSelect the type of query that will be performed with the words SearchClauseWgåb~ÿFind:SnippetsN NN*NextSnippetsN NN*PrevSnippetsrGe­SnippetsSnippetsd}"Search SnippetsWmO‰ÈBrowseSpecIdxW Qs•íÿ&Cÿ &Close SpellBase \U_ÿ&Eÿ &Expand  SpellBaseSã—óAccents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBaseY'\Q™Case SpellBaseS9‘MMatch SpellBaseg*b~R0epcn^“Oá`o0 No db info. SpellBase ‹Í‹íc¢}"Vh Term Explorer SpellBase %1N*~Ógœ %1 resultsSpellWkÏN*e‡hcN-v„^sWGSU‹ÍN*epAverage terms per documentSpellWepcn^“vî_U\:[øDatabase directory sizeSpellW e‡hcep/`;ep Doc. / Tot.SpellW2}"_ÿ%1N*e‡hcÿ ^sWG•^¦N:%2N*SU‹Í0%3N*~Ógœ7Index: %1 documents, average length %2 terms.%3 resultsSpellWgavîItemSpellWRˆh]òc [Wk͘z^b*e­ÿ gÐN*^8‰Á1List was truncated alphabetically, some frequent SpellWYZ’OSe‡hc|{W‹Rˆhÿ MIME types:SpellW g*b~R0bi\UNo expansion foundSpellWe‡hcN*epNumber of documentsSpellW kcRˆh¾_RegexpSpellWf>y:}"_~ß‹¡Oá`oShow index statisticsSpellWbüQ™/SÑ—óhÀgåSpelling/PhoneticSpellW‹Íh9bi\UStem expansionSpellW‹Í‹íTermSpellWP<ValueSpellW‘M{& WildcardsSpellWcÐSÖ‹Íh9‹íŠeöQú•#error retrieving stemming languagesSpellW,v„SU‹ÍSï€ýO:Y10‹÷\‹ÕOu(NN*fô•v„‹Íh90.terms may be missing. Try using a longer root.SpellWQhè‹Í‹í All terms UIPrefsDialogNûN‹Í‹íAny term UIPrefsDialoggY^”_S N-NN*}"_$At most one index should be selected UIPrefsDialog0eàlÕmûR ^&g N T v„Y'\Q™/‹Êe­Oá`oˆÁRje¹_v„}"_>Cant add index with different case/diacritics stripping option UIPrefsDialog béChoose UIPrefsDialoge‡NöT  File name UIPrefsDialoggå‹â‹íŠQuery language UIPrefsDialog~ÓgœRˆhˆhY4ÿžØ‹¤N:zzÿ %Result list header (default is empty) UIPrefsDialog4~ÓgœRˆhv„kµ„=h<_ÿR –dQhèQ…[¹SsSï‘ÍnN:žØ‹¤r¶`ÿ e°v„P<ÿ</b>New Values:ViewActionBase*R¨O\ÿzzv}Rˆhy:Ou(recollv„žØ‹¤P<ÿ  Action (empty -> recoll default)ViewActionBase^”u(R0_SRM N-˜yN Apply to current selectionViewActionBaseQs•íCloseViewActionBase”ˆ[ùhL—bžØ‹¤PÿY³Ø—‰[‰ˆÅpkrÐv„RecollcÒNöÿ \Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelWQ˜u[XP¨v„gY'\:[øÿMBÿ  Max. size for the web store (MB)confgui::ConfBeaglePanelWYtQ˜uS†Sò–RProcess the WEB history queueconfgui::ConfBeaglePanelWbu(geP¨[XY R6Çgev„]ò‹¿•îQ˜uv„vî_UT 0<br>Y‚gœOu(vø[ùï_„ÿ ROvø[ùNŽ‘Mnvî_Uv„ï_„ÛˆLYt0‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWQ˜uP¨[Xvî_UT Web page store directory nameconfgui::ConfBeaglePanelWeàlÕQ™Qe‘Mne‡NöCan't write configuration fileconfgui::ConfIndexW béChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW’<p>Y‚gœd}"‹íSåN-–d™–[WkÍNKYST+g Y'Q™[WkÍv„‹Ýÿ RêR¨‰æSÑY'\Q™v„R$e­0T&Rÿ Y³—‰Ou(gå‹â‹íŠTŒ<i>C</i>Oî™p{&gec[š[ùY'\Q™v„R$e­0â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelW´<p>Y‚gœd}"‹íSåN-ST+^&g Sã—óry_(N W(unac_except_transN-)v„‹Ýÿ RêR¨‰æSÑY'\Q™v„R$e­0T&Rÿ Y³—‰Ou(gå‹â‹íŠTŒ<i>D</i>Oî™p{&gec[š[ùY'\Q™v„R$e­0Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelWš<p>”ˆ[ùSUN*SU‹Ív„gY'‹Íh9bi\Uepvî(O‹Y‚ÿkd ˜yW(Ou(‘M{&eöOueH)0žØ‹¤v„10000f/NN*ràTtv„P<ÿ €ýYQM_S_dÎMS†‹Íh9Rˆheö_wgå‹âuL—bPGk{0Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelWÎ<p>bNìTSUN*Xapiangå‹â‹íSåN-R Qev„gY'v„[PSåepvî0gÐN›`ÅQµN ÿ ‹Íh9bi\Uv„~ÓgœOf/P Xžv„ÿ € bNì`ó‰QMOu(ÇYQ…[X0žØ‹¤v„100000^”_Seâ€ýná³eå^8v„Y'èR‰lBÿ SÈ€ýN_SRMv„QxW‹xlNö‘MnvøQ|[¹05

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWêR¨Œet[W{&v„Y'\Q™eOa`'$Automatic character case sensitivityconfgui::ConfSearchPanelWêR¨R$e­Y'\Q™ Automatic diacritics sensitivityconfgui::ConfSearchPanelWgY'v„Xapian[PSåepvîMaximum Xapian clauses countconfgui::ConfSearchPanelWgY'‹Íh9bi\UepvîMaximum term expansion countconfgui::ConfSearchPanelW¨]åO\eö•ô•NŽÙN*PÙf/”ˆ[ùunacg:R6v„O‹Yÿ žØ‹¤`ÅQµN ÿ ‹åg:R6OR –db@g v„R$e­Oá`oÿ ^vÛˆLkc‰Äv„R‰ã0Y³SïNåc qgê]ñv„‹íŠv„ryp¹”ˆ[ùgÐN*[W{&‰†vÖc‰Sã—ó‰ã–d‹¾nÿ NåSÊc[š˜Yv„R‰ãÿO‹Y‚ÿ ”ˆ[ùY epÿ 0W(kÏN*u1zzhThese are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelWAspell‹íŠAspell languageconfgui::ConfTopPanelW epcn^“vî_UT Database directory nameconfgui::ConfTopPanelWvykbW(‹Í‹íc¢}"VhN-Ou(aspellgeubbüQ™vøÑv„‹Í‹í0<br>W(l¡g [‰ˆÅaspellb€[ƒ]åO\N kc^8eöOu(ÙN* ˜y0†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWR7e°}"_v„•ô–”ÿ QF[W‚‚Index flush megabytes intervalconfgui::ConfTopPanelW ‹°_Ue‡NöT  Log file nameconfgui::ConfTopPanelW‹°_Uv„‹Ýuè~§R+Log verbosity levelconfgui::ConfTopPanelWN Ou(aspellNo aspell usageconfgui::ConfTopPanelW ueÇv„ï_„ Skipped pathsconfgui::ConfTopPanelW‹Íh9‹íŠStemming languagesconfgui::ConfTopPanelWTz ^“Qúv„mˆ`oOˆ«OÝ[XR0ÙN*e‡Nö0<br>Ou('stderr'Nåˆhy:\mˆ`o“QúR0~ÈzïPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWaspell‹ÍQxv„‹íŠ0ˆhy:e¹_f/'en'b'fr' & &<br>Y‚gœN ‹¾nÙN*P<ÿ ROOu(|û~ßs¯XƒN-v„êq6‹íŠ‹¾nOá`oÿ € £N*^8f/kcxnv„0‰`ógåw O`v„|û~ßN-[‰ˆÅT¯TêN›‹íŠv„‹Ýÿ \1bgˆL'aspell config'ÿ QW('data-dir'vî_UN-b~.date‡Nö03The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW*\O”ˆ[ùÙN›‹íŠ<br>g„ ‹Íh9bi\U‹ÍQx0IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW:}"_NÎÙN*RˆhN-v„vî_U_YËÿ _RW0ÛˆL0žØ‹¤ÿO`v„[¶vî_U0LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWtu(geP¨[X}"_epcnv„vî_Uv„T [W<br>Y‚gœOu(vø[ùï_„ÿ Rï_„Ovø[ùNŽ‘Mnvî_UÛˆL‹¡{—0žØ‹¤PA non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWvÙN*P<Œetv„f/ÿ _Syï}/T¯Y\}"_epcneöÿ bM\epcnR7e°R0xlvØN S»0<br>u(gec§R6}"_Ûz v„Q…[XS`u(`ÅQµ0žØ‹¤N:10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWTÙN*P<Œetv„f/“Qúv„mˆ`ov„ep‘Ïÿ <br>Qv~§R+NÎNÅ“Qúb¥•Oá`oR0“QúNY'XŒ‹ÕOá`o0ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW˜v~§vî_UTop directoriesconfgui::ConfTopPanelW UnacO‹YUnac exceptionsconfgui::ConfTopPanelW SÖmˆÿ&Cÿ &CanceluiPrefsDialogBase xn[šÿ&Oÿ &OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase<PRE>+cbˆL
 + wrapuiPrefsDialogBase’[ù[nÚ wó] (2N*‹Í‹í)v„d}"OSØb[nÚ or wó or (nÚ 2N*‹Í‹í wó)]0
[ùNŽ£N›d}"‹Í‹íW(QvN-c	qgSŸh7Qús°v„~ÓgœÿQvOQH~§OšØNN›0ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBasedX‰N-v„rGkµv„R–”{&Abstract snippet separatoruiPrefsDialogBaseQhèoÀm;Activate AlluiPrefsDialogBasemûR }"_	Add indexuiPrefsDialogBase
Oe9SØueH
Apply changesuiPrefsDialogBase “Qezzh_ÙN›e9SØDiscard changesuiPrefsDialogBase4SsOe‡hcg,Ž«båg	NN*dX‰ÿbNìNÍq6êˆLTbdX‰Oá`oÿEDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseTf/T&‰Ou(gå‹â‹Í‹íThVôv„N
Ne‡geg„ ~ÓgœRˆhgavîN-v„dX‰ÿ
[ùNŽY'v„e‡hcSï€ýO_ˆab0zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBaseR¨`g„ dX‰Dynamically build abstractsuiPrefsDialogBase ‘~Ógœ˜u—bv„htmlY4ècÒQe˜y#Edit result page html header insertuiPrefsDialogBase‘~Ógœkµ„=v„h<_[W{&N2#Edit result paragraph format stringuiPrefsDialogBaseT/u(EnableuiPrefsDialogBaseYè}"_External IndexesuiPrefsDialogBase¾Ùf/NN*˜‘s‡–P<ÿ…ÇÙN*PR0êR¨‹Í~ÄN-0
šØ˜‘‹Í‹íf/‹Í~ÄN-`'€ý•v„N;‰gen0
ueÇv„‹Í‹íOXžR ‹Í~Äv„zz:P<ÿVàkdO–MONêR¨‹Í~ÄRŸ€ýv„eHs‡0
žØ‹¤Py:NN*0XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBasebPREe‡g,N-v„£N›ˆLf/N
Oˆ«b˜Sàv„0Ou(BRON"Y1NN›)ÛOá`o0PRE+cbˆL˜Îhy:v„gY'e‡g,\:[øÿQF[W‚‚ÿ	5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseNN*~Ógœ˜u—bN-f>y:v„~Ógœgaep"Number of entries in a result pageuiPrefsDialogBase0bS_NN*[ù‹ÝhFÿNå	bérGe­z—Sãv„CSSh7_SUe‡NöAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBase(bS_NN*[ù‹ÝhFÿNå	béu(NŽ~ÓgœRˆhv„[WOS-Opens a dialog to select the result list fontuiPrefsDialogBase bS_NN*[ù‹ÝhFÿNå	béh7_SUe‡Nö-Opens a dialog to select the style sheet fileuiPrefsDialogBaseï_„SØcbPaths translationsuiPrefsDialogBase ~¯e‡g,lcbN:HTMLcbˆL{&v„˜Îh<Plain text to HTML line styleuiPrefsDialogBase˜„‰ÈN-OQHOu(Html0&Prefer Html to plain text for preview.uiPrefsDialogBasegå‹â‹íŠy^YGe‡NöT
T0(Query language magic file name suffixes.uiPrefsDialogBase‹°OOc’^r¶`0Remember sort activation state.uiPrefsDialogBase,NÎRˆhN-R –d0ÙN
O[ùxlvØN
v„}"_ bc_[³07Remove from list. This has no effect on the disk index.uiPrefsDialogBase
R –d	N-˜yRemove selecteduiPrefsDialogBaseSÖNãe‡hcN-ê^&v„dX‰ Replace abstracts from documentsuiPrefsDialogBase‘ÍnResetuiPrefsDialogBase‘ÍnrGe­z—Sãv„h7_ Resets the Snippets window styleuiPrefsDialogBase"\~ÓgœRˆhN-v„[WOS‘Í‹¾N:|û~ߞ؋¤P<1Resets the result list font to the system defaultuiPrefsDialogBase\h7_SU‘ÍnN:žØ‹¤P<!Resets the style sheet to defaultuiPrefsDialogBase~ÓgœRˆhResult ListuiPrefsDialogBase~ÓgœRˆh[WOSResult list fontuiPrefsDialogBaseW(“Qev„TeöÛˆLd}"0Search as you type.uiPrefsDialogBased}"SÂepSearch parametersuiPrefsDialogBaserGe­z—Sãv„CSSe‡NöSnippets window CSS fileuiPrefsDialogBaseT/R¨eöbS_šØzïd}"[ù‹ÝhF0'Start with advanced search dialog open.uiPrefsDialogBase‹Íh9‹íŠStemming languageuiPrefsDialogBaseh7_SUStyle sheetuiPrefsDialogBaseTbdX‰N
Ne‡ Synthetic abstract context wordsuiPrefsDialogBaseTbdX‰•^¦ÿ[W{&N*epÿ	$Synthetic abstract size (characters)uiPrefsDialogBase4…ÇÙN*•^¦v„e‡g,N
OW(˜„‰Èz—Sã‘ÌšØN®f>y:ÿY*abÿ	0CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase@ÙN*RˆhN-v„‹Í‹íOW(gå‹â‹íŠ“QehF‘ÌêR¨SØbext:xxx‹íSå0bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase
Rcb	N-˜yToggle selecteduiPrefsDialogBaseu(b7uL—bUser interfaceuiPrefsDialogBaseu(b7	˜yUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_lt.ts0000644000175000017500000040670113224431020014243 00000000000000



    AdvSearch
    
        All clauses
        Visos sÄ…lygos
    
    
        Any clause
        Bet kuri sÄ…lyga
    
    
        texts
        tekstai
    
    
        spreadsheets
        skaiÄiuoklÄ—s
    
    
        presentations
        prezentacijos
    
    
        media
        media
    
    
        messages
        žinutės
    
    
        other
        kita
    
    
        Bad multiplier suffix in size filter
        
    
    
        text
        tekstas
    
    
        spreadsheet
        skaiÄiuoklÄ—s
    
    
        presentation
        prezentacijos
    
    
        message
        pranešimas
    


    AdvSearchBase
    
        Advanced search
        Išsamesnė paieška
    
    
        Search for <br>documents<br>satisfying:
        IeÅ¡koti <br>dokumentų<br>tenkinanÄių:
    
    
        Delete clause
        Ištrinti sąlygą
    
    
        Add clause
        PridÄ—ti sÄ…lygÄ…
    
    
        Restrict file types
        Apriboti bylų tipus
    
    
        Check this to enable filtering on file types
        Pažymėti, jei norite filtruoti pagal bylų tipus
    
    
        By categories
        Pagal kategorijas
    
    
        Check this to use file categories instead of raw mime types
        Pažymėti, jei norite naudoti bylų kategorijas vietoje mime tipų
    
    
        Save as default
        Išsaugoti kaip numatytąjį
    
    
        Searched file types
        Ieškota bylų tipų
    
    
        All ---->
        Visi ---->
    
    
        Sel ----->
        Pas ----->
    
    
        <----- Sel
        <----- Pas
    
    
        <----- All
        <----- Visi
    
    
        Ignored file types
        Ignoruoti bylų tipai
    
    
        Enter top directory for search
        Įrašykite viršutinio lygio direktoriją paieškai
    
    
        Browse
        Naršyti
    
    
        Restrict results to files in subtree:
        Pateikti rezultatus byloms submedyje:
    
    
        Start Search
        Pradėti paiešką
    
    
        Close
        Uždaryti
    
    
        All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.
        Visi kairėje esantys netušti laukai bus sujungiami AND (visi) arba OR (bet kuris) pagalba. <br> "Bet kuris" "Visi" ir "Nei vienas" laukų tipai gali priimti paprastų žodžių mišinį ir frazes pažymėtas dvigubomis kabutėmis. <br> Tušti laukeliai ignoruojami.
    
    
        Invert
        
    
    
        Minimum size. You can use k/K,m/M,g/G as multipliers
        
    
    
        Min. Size
        
    
    
        Maximum size. You can use k/K,m/M,g/G as multipliers
        
    
    
        Max. Size
        
    
    
        Filter
        
    
    
        From
        
    
    
        To
        
    
    
        Check this to enable filtering on dates
        
    
    
        Filter dates
        
    
    
        Find
        
    
    
        Check this to enable filtering on sizes
        
    
    
        Filter sizes
        
    


    CronToolW
    
        Cron Dialog
        
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html>
        
    
    
        Days of week (* or 0-7, 0 or 7 is Sunday)
        
    
    
        Hours (* or 0-23)
        
    
    
        Minutes (0-59)
        
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html>
        
    
    
        Enable
        
    
    
        Disable
        
    
    
        It seems that manually edited entries exist for recollindex, cannot edit crontab
        
    
    
        Error installing cron entry. Bad syntax in fields ?
        
    


    EditDialog
    
        Dialog
        
    


    EditTrans
    
        Source path
        
    
    
        Local path
        
    
    
        Config error
        
    
    
        Original path
        
    


    EditTransBase
    
        Path Translations
        
    
    
        Setting path translations for 
        
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        
    
    
        Add
        
    
    
        Delete
        
    
    
        Cancel
        Atšaukti
    
    
        Save
        
    


    FirstIdxDialog
    
        First indexing setup
        
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html>
        
    
    
        Indexing configuration
        
    
    
        This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.
        
    
    
        Indexing schedule
        
    
    
        This will let you chose between batch and real-time indexing, and set up an automatic  schedule for batch indexing (using cron).
        
    
    
        Start indexing now
        
    


    FragButs
    
        %1 not found.
        
    
    
        %1:
 %2
        
    
    
        Query Fragments
        
    


    IdxSchedW
    
        Index scheduling setup
        
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html>
        
    
    
        Cron scheduling
        
    
    
        The tool will let you decide at what time indexing should run and will install a crontab entry.
        
    
    
        Real time indexing start up
        
    
    
        Decide if real time indexing will be started when you log in (only for the default index).
        
    


    ListDialog
    
        Dialog
        
    
    
        GroupBox
        
    


    Main
    
        Configuration problem (dynconf
        Nustatymų bėda (dynconf
    
    
        No db directory in configuration
        Nustatymuose nerandama duomenų bazės bylos
    
    
        Could not open database in 
        Nepavyko atidaryti duomenų bazės
    
    
        "history" file is damaged or un(read)writeable, please check or remove it: 
        
    


    Preview
    
        Close Tab
        Uždarykite auselę
    
    
        Cannot create temporary directory
        Nepavyksta sukurti laikinos direktorijos
    
    
        Cancel
        Atšaukti
    
    
        Missing helper program: 
        Trūksta pagalbinės programos:
    
    
        Can't turn doc into internal representation for 
        Nepavyksta pervesti dokumento į vidinę buseną
    
    
        Creating preview text
        Kuriamas peržvalgos tekstas
    
    
        Loading preview text into editor
        Įkeliamas į redaktorių peržvalgos tekstas
    
    
        &Search for:
        &Ieškoti:
    
    
        &Next
        &Sekantis
    
    
        &Previous
        &Ankstesnis
    
    
        Clear
        Išvalyti
    
    
        Match &Case
        Atitaikyti &Atvejį 
    
    
        Error while loading file
        
    


    PreviewTextEdit
    
        Show fields
        Rodyti laukus
    
    
        Show main text
        Rodyti pagrindinį tekstą
    
    
        Print
        Spausdinti
    
    
        Print Current Preview
        Spausdinti kaip matoma peržiūroje
    
    
        Show image
        
    
    
        Select All
        
    
    
        Copy
        
    
    
        Save document to file
        
    
    
        Fold lines
        
    
    
        Preserve indentation
        
    


    QObject
    
        Global parameters
        Globalūs parametrai
    
    
        Local parameters
        Lokalūs parametrai
    
    
        <b>Customised subtrees
        <b>Pritaikyti direktorijų<br> submedžiai
    
    
        The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty.
        Subdirektorijų, kuriose dalį parametrų reikia pakeisti, sÄ…raÅ¡as.<br> Numatytoji reikÅ¡mÄ—: tuÅ¡Äia.
    
    
        <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons.
        <i>Nurodyti parametrai taikomi arba visoms direktorijoms, arba subdirektorijoms,<br> jei kuri jų prieš tai pažymimos. Pridėti ir ištrinti direktorijų vardus galite<br> spausdami +/- mygtukus.
    
    
        Skipped names
        Neįtraukti vardai
    
    
        These are patterns for file or directory  names which should not be indexed.
        Bylų arba direktorijų, kurių nedera indeksuoti, vardų šablonai.
    
    
        Default character set
        Numatytoji simbolių aibė
    
    
        This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        Pasirinkta simbolių aibÄ— bus naudojama skaityti bylų, kurių simbolių aibÄ—s nepavyksta nustatyti, turiniui.<br>Numatytoji vertÄ— yra nepasirinkti konkreÄios simbolių aibÄ—s - tokiu atveju naudojama NLS aplinkos vertÄ—.
    
    
        Follow symbolic links
        Sekti simbolines nuorodas
    
    
        Follow symbolic links while indexing. The default is no, to avoid duplicate indexing
        Indeksavimo metu sekti simbolines nuorodas. Numatytasis elgesys yra nesekti, bandant išvengti dvigubo indeksavimo
    
    
        Index all file names
        Indeksuoti visų bylų vardus
    
    
        Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true
        Indeksuoti bylų, kurių turinio nepavyksta perskaityti, vardus. Numatytoji reikšmė: teisybė
    
    
        Beagle web history
        Beagle tinklo istorija
    
    
        Search parameters
        Paieškos parametrai
    
    
        Web history
        
    
    
        Default<br>character set
        
    
    
        Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        
    
    
        Ignored endings
        
    
    
        These are file name endings for files which will be indexed by name only 
(no MIME type identification attempt, no decompression, no content indexing).
        
    


    QWidget
    
        Create or choose save directory
        
    
    
        Choose exactly one directory
        
    
    
        Could not read directory: 
        
    
    
        Unexpected file name collision, cancelling.
        
    
    
        Cannot extract document: 
        
    
    
        &Preview
        &Peržiūra
    
    
        &Open
        
    
    
        Open With
        
    
    
        Run Script
        
    
    
        Copy &File Name
        Kopijuoti &Bylos vardÄ…
    
    
        Copy &URL
        Kopijuoti &URL
    
    
        &Write to File
        &Įrašyti į bylą
    
    
        Save selection to files
        
    
    
        Preview P&arent document/folder
        Peržiūrėti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Open Parent document/folder
        Atidaryti &Aukštesnio lygio dokumentus/direktorijas
    
    
        Find &similar documents
        Rasti &panašius dokumentus
    
    
        Open &Snippets window
        
    
    
        Show subdocuments / attachments
        
    


    QxtConfirmationMessage
    
        Do not show again.
        
    


    RTIToolW
    
        Real time indexing automatic start
        
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>
        
    
    
        Start indexing daemon with my desktop session.
        
    
    
        Also start indexing daemon right now.
        
    
    
        Replacing: 
        
    
    
        Replacing file
        
    
    
        Can't create: 
        
    
    
        Warning
        Įspėjimas
    
    
        Could not execute recollindex
        
    
    
        Deleting: 
        
    
    
        Deleting file
        
    
    
        Removing autostart
        
    
    
        Autostart file deleted. Kill current process too ?
        
    


    RclMain
    
        (no stemming)
        (no stemming)
    
    
        (all languages)
        (visos kalbos)
    
    
        error retrieving stemming languages
        error retrieving stemming languages
    
    
        Indexing in progress: 
        Indeksuojama:
    
    
        Files
        Failai
    
    
        Purge
        Išvalyti
    
    
        Stemdb
        Stemdb
    
    
        Closing
        Uždaroma
    
    
        Unknown
        Nežinoma
    
    
        Can't start query: 
        Nepavyksta pradėti vykdyti užklausą:
    
    
        Query results
        Užklausos rezultatai
    
    
        Cannot retrieve document info from database
        Nepavyksta išgauti iš duomenų bazės informacijos apie dokumentą 
    
    
        Warning
        Įspėjimas
    
    
        Can't create preview window
        Nepavyksta sukurti peržiūros lango
    
    
        This search is not active any more
        Ši paieška daugiau nevykdoma
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeconf file
        Netinkamos peržiūros komandinė eilutė  %1: [%2]
Prašome patikrinti mimeconf bylą
    
    
        Cannot extract document or create temporary file
        Nepavyksta perskaityti dokumento arba sukurti laikinos bylos
    
    
        Executing: [
        Vykdoma: [
    
    
        About Recoll
        Apie Recoll
    
    
        History data
        Istorijos duomenys
    
    
        Document history
        Dokumentų istorija
    
    
        Update &Index
        Atnaujinti &IndeksÄ…
    
    
        Indexing interrupted
        indeksavimas pertrauktas
    
    
        Stop &Indexing
        Sustabdyti &IndeksavimÄ…
    
    
        All
        Visi
    
    
        media
        media
    
    
        message
        pranešimas
    
    
        other
        kita
    
    
        presentation
        prezentacijos
    
    
        spreadsheet
        skaiÄiuoklÄ—s
    
    
        text
        tekstas
    
    
        sorted
        surūšiuota
    
    
        filtered
        filtruotas
    
    
        External applications/commands needed and not found for indexing your file types:


        Reikalingos pilnam indeksavimui, taÄiau nerandamos iÅ¡orinÄ—s programos/komandos: 


    
    
        No helpers found missing
        Randamos visos reikalingos pagalbinÄ—s programos
    
    
        Missing helper programs
        Trūksta pagalbinių programų
    
    
        Save file dialog
        Išsaugoti failą forma
    
    
        Choose a file name to save under
        Pasirinkite bylos vardą, kuriuo išsaugosite bylą
    
    
        Document category filter
        Dokumentų kategorijų filtras
    
    
        No external viewer configured for mime type [
        Nustatymuose nenumatyta jokia išorinė peržiūros programa šiam mime tipui [
    
    
        The viewer specified in mimeview for %1: %2 is not found.
Do you want to start the  preferences dialog ?
        Nurodyta peržiūros programa šiam mime tipui %1: %2 nerandama.
Ar norėtumete iššaukti nustatymų langą?
    
    
        Can't access file: 
        
    
    
        Can't uncompress file: 
        
    
    
        Save file
        
    
    
        Result count (est.)
        
    
    
        Query details
        Užklausos detalės
    
    
        Could not open external index. Db not open. Check external indexes list.
        
    
    
        No results found
        
    
    
        None
        
    
    
        Updating
        
    
    
        Done
        
    
    
        Monitor
        
    
    
        Indexing failed
        
    
    
        The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone
        
    
    
        Erasing index
        
    
    
        Reset the index and start from scratch ?
        
    
    
        Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program
        
    
    
        Error
        
    
    
        Index query error
        
    
    
        Content has been indexed for these mime types:
        
    
    
        Can't update index: indexer running
        
    
    
        Indexed MIME Types
        
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeview file
        
    
    
        Viewer command line for %1 specifies both file and parent file value: unsupported
        
    
    
        Cannot find parent document
        
    
    
        Indexing did not run yet
        
    
    
        External applications/commands needed for your file types and not found, as stored by the last indexing pass in 
        
    
    
        Sub-documents and attachments
        
    
    
        Document filter
        
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry. 
        
    
    
        Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. 
        
    
    
        The indexer is running so things should improve when it's done. 
        
    
    
        Duplicate documents
        
    
    
        These Urls ( | ipath) share the same content:
        
    
    
        Bad desktop app spec for %1: [%2]
Please check the desktop file
        
    
    
        The current indexing process was not started from this interface, can't kill it
        
    
    
        Bad paths
        
    
    
        Bad paths in configuration file:

        
    
    
        Selection patterns need topdir
        
    
    
        Selection patterns can only be used with a start directory
        
    
    
        No search
        
    
    
        No preserved previous search
        
    
    
        Choose file to save
        
    
    
        Saved Queries (*.rclq)
        
    
    
        Write failed
        
    
    
        Could not write to file
        
    
    
        Read failed
        
    
    
        Could not open file: 
        
    
    
        Load error
        
    
    
        Could not load saved query
        
    
    
        Index scheduling
        
    
    
        Sorry, not available under Windows for now, use the File menu entries to update the index
        
    
    
        Disabled because the real time indexer was not compiled in.
        
    
    
        This configuration tool only works for the main index.
        
    
    
        Can't set synonyms file (parse error?)
        
    
    
        The document belongs to an external index which I can't update. 
        
    
    
        Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session).
        
    
    
        Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location.
        
    
    
        Do not show this warning next time (use GUI preferences to restore).
        
    
    
        Index locked
        
    
    
        Unknown indexer state. Can't access webcache file.
        
    
    
        Indexer is running. Can't access webcache file.
        
    
    
         with additional message: 
        
    
    
        Non-fatal indexing message: 
        
    
    
        Types list empty: maybe wait for indexing to progress?
        
    


    RclMainBase
    
        Recoll
        Recoll
    
    
        Search tools
        Paieškos įrankiai
    
    
        Result list
        Rezultatų sąrašas
    
    
        &File
        &Byla
    
    
        &Tools
        &Įrankiai
    
    
        &Preferences
        &Nustatymai
    
    
        &Help
        &Pagalba
    
    
        E&xit
        I&šeiti
    
    
        Ctrl+Q
        Ctrl+Q
    
    
        Update &index
        Atnaujinti &IndeksÄ…
    
    
        &Erase document history
        &Ištrinti dokumentų istoriją
    
    
        &About Recoll
        &Apie Recoll
    
    
        &User manual
        &Vartotojo vadovas
    
    
        Document &History
        Dokumentų &Istorija
    
    
        Document  History
        Dokumentų Istorija
    
    
        &Advanced Search
        &Išsamesnė Paieška
    
    
        Advanced/complex  Search
        Išsamesnė Paieška
    
    
        &Sort parameters
        &Surūšiuoti parametrai
    
    
        Sort parameters
        Surūšiuoti parametrus
    
    
        Term &explorer
        Raktinių žodžių &tyrinėtojas
    
    
        Term explorer tool
        Raktinių žodžių tyrinėjimo įrankis
    
    
        Next page
        Sekantis puslapis
    
    
        Next page of results
        Sekantis rezultatų puslapis
    
    
        First page
        Pirmas puslapis
    
    
        Go to first page of results
        Pereiti į pirmą rezultatų puslapį
    
    
        Previous page
        Prieš tai buvęs puslapis
    
    
        Previous page of results
        Ankstesnis rezultatų puslapis
    
    
        &Query configuration
        &Užklausų nustatymai
    
    
        External index dialog
        Išorinių indeksų langas
    
    
        &Indexing configuration
        &Indeksavimo nustatymai
    
    
        All
        Visi
    
    
        &Show missing helpers
        &Trūkstamos pagalbinės programos
    
    
        PgDown
        
    
    
        PgUp
        
    
    
        &Full Screen
        
    
    
        F11
        
    
    
        Full Screen
        
    
    
        &Erase search history
        
    
    
        Sort by dates from oldest to newest
        
    
    
        Sort by dates from newest to oldest
        
    
    
        Show Query Details
        
    
    
        &Rebuild index
        
    
    
        Shift+PgUp
        
    
    
        E&xternal index dialog
        
    
    
        &Index configuration
        
    
    
        &GUI configuration
        
    
    
        &Results
        
    
    
        Sort by date, oldest first
        
    
    
        Sort by date, newest first
        
    
    
        Show as table
        
    
    
        Show results in a spreadsheet-like table
        
    
    
        Save as CSV (spreadsheet) file
        
    
    
        Saves the result into a file which you can load in a spreadsheet
        
    
    
        Next Page
        
    
    
        Previous Page
        
    
    
        First Page
        
    
    
        Query Fragments
        
    
    
            With failed files retrying
        
    
    
        Next update will retry previously failed files
        
    
    
        Indexing &schedule
        
    
    
        Enable synonyms
        
    
    
        Save last query
        
    
    
        Load saved query
        
    
    
        Special Indexing
        
    
    
        Indexing with special options
        
    
    
        &View
        
    
    
        Missing &helpers
        
    
    
        Indexed &MIME types
        
    
    
        Index &statistics
        
    
    
        Webcache Editor
        
    


    RclTrayIcon
    
        Restore
        
    
    
        Quit
        
    


    RecollModel
    
        File name
        Bylos vardas
    
    
        Mime type
        Mime tipas
    
    
        Date
        Data
    
    
        Abstract
        
    
    
        Author
        
    
    
        Document size
        
    
    
        Document date
        
    
    
        File size
        
    
    
        File date
        
    
    
        Keywords
        
    
    
        Original character set
        
    
    
        Relevancy rating
        
    
    
        Title
        
    
    
        URL
        
    
    
        Mtime
        
    
    
        Date and time
        
    
    
        Ipath
        
    
    
        MIME type
        
    


    ResList
    
        Result list
        Rezultatų sąrašas
    
    
        (show query)
        (rodyti užklausą)
    
    
        &Preview
        &Peržiūra
    
    
        Copy &File Name
        Kopijuoti &Bylos vardÄ…
    
    
        Copy &URL
        Kopijuoti &URL
    
    
        Find &similar documents
        Rasti &panašius dokumentus
    
    
        Query details
        Užklausos detalės
    
    
        filtered
        išfiltruota
    
    
        sorted
        surūšiuota
    
    
        Document history
        Dokumentų istorija
    
    
        <p><b>No results found</b><br>
        <p><b>Nerasta rezultatų</b><br>
    
    
        Previous
        Ankstesnis
    
    
        Next
        Kitas
    
    
        Unavailable document
        Neprieinamas dokumentas
    
    
        Preview
        Peržiūra
    
    
        Open
        Atidaryti
    
    
        <p><i>Alternate spellings (accents suppressed): </i>
        <p><i>Kiti galimi tarimai (be akcentų): </i>
    
    
        &Write to File
        &Įrašyti į bylą
    
    
        Preview P&arent document/folder
        Peržiūrėti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Open Parent document/folder
        Atidaryti &Aukštesnio lygio dokumentus/direktorijas
    
    
        Documents
        Dokumentai
    
    
        out of at least
        iš bent
    
    
        for
        
    
    
        <p><i>Alternate spellings: </i>
        
    
    
        Result count (est.)
        
    
    
        Snippets
        
    


    ResTable
    
        &Reset sort
        
    
    
        &Delete column
        
    
    
        Save table to CSV file
        
    
    
        Can't open/create file: 
        
    
    
        &Preview
        &Peržiūra
    
    
        Copy &File Name
        Kopijuoti &Bylos vardÄ…
    
    
        Copy &URL
        Kopijuoti &URL
    
    
        &Write to File
        &Įrašyti į bylą
    
    
        Find &similar documents
        Rasti &panašius dokumentus
    
    
        Preview P&arent document/folder
        Peržiūrėti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Open Parent document/folder
        Atidaryti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Save as CSV
        
    
    
        Add "%1" column
        
    


    ResTableDetailArea
    
        &Preview
        &Peržiūra
    
    
        Copy &File Name
        Kopijuoti &Bylos vardÄ…
    
    
        Copy &URL
        Kopijuoti &URL
    
    
        &Write to File
        &Įrašyti į bylą
    
    
        Find &similar documents
        Rasti &panašius dokumentus
    
    
        Preview P&arent document/folder
        Peržiūrėti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Open Parent document/folder
        Atidaryti &Aukštesnio lygio dokumentus/direktorijas
    


    ResultPopup
    
        &Preview
        &Peržiūra
    
    
        Copy &File Name
        Kopijuoti &Bylos vardÄ…
    
    
        Copy &URL
        Kopijuoti &URL
    
    
        &Write to File
        &Įrašyti į bylą
    
    
        Preview P&arent document/folder
        Peržiūrėti &Aukštesnio lygio dokumentus/direktorijas
    
    
        &Open Parent document/folder
        Atidaryti &Aukštesnio lygio dokumentus/direktorijas
    
    
        Find &similar documents
        Rasti &panašius dokumentus
    


    SSearch
    
        Any term
        Bet kuris raktinis žodis
    
    
        All terms
        Visi raktiniai žodžiai
    
    
        File name
        Bylos vardas
    
    
        Query language
        Užklausų kalba
    
    
        Bad query string
        Netinkamai pateikta užklausa
    
    
        Out of memory
        Nepakanka atminties
    
    
        Too many completions
        Per daug galimų užbaigimų
    
    
        Completions
        Užbaigimai
    
    
        Select an item:
        Pasirinkti įrašą:
    
    
        Enter file name wildcard expression.
        
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        Čia įveskite paieškos raktinius žodžius. Įrašykite ESC SPC rašomo termino užbaigimui.
    
    
        Enter query language expression. Cheat sheet:<br>
<i>term1 term2</i> : 'term1' and 'term2' in any field.<br>
<i>field:term1</i> : 'term1' in field 'field'.<br>
 Standard field names/synonyms:<br>
  title/subject/caption, author/from, recipient/to, filename, ext.<br>
 Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br>
 Two date interval exemples: 2009-03-01/2009-05-20  2009-03-01/P2M.<br>
<i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br>
  You can use parentheses to make things clearer.<br>
<i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br>
<i>"term1 term2"p</i> : unordered proximity search with default distance.<br>
Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail.

        
    
    
        Stemming languages for stored query: 
        
    
    
         differ from current preferences (kept)
        
    
    
        Auto suffixes for stored query: 
        
    
    
        External indexes for stored query: 
        
    
    
        Autophrase is set but it was unset for stored query
        
    
    
        Autophrase is unset but it was set for stored query
        
    


    SSearchBase
    
        SSearchBase
        SSearchBase
    
    
        Clear
        Išvalyti
    
    
        Ctrl+S
        Ctrl+S
    
    
        Erase search entry
        Ištrinti paieškos įrašą
    
    
        Search
        Ieškoti
    
    
        Start query
        Pradėti užklausą
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        Čia įveskite paieškos raktinius žodžius. Įrašykite ESC SPC rašomo termino užbaigimui.
    
    
        Choose search type.
        Pasirinkite paieškos tipą.
    


    SearchClauseW
    
        SearchClauseW
        SearchClauseW
    
    
        Any of these
        Bet kuris šių
    
    
        All of these
        Visi šie
    
    
        None of these
        Nei vienas šių
    
    
        This phrase
        Å i frazÄ—
    
    
        Terms in proximity
        Artimi raktiniai žodžiai
    
    
        File name matching
        Bylos vardÄ… atitinka
    
    
        Select the type of query that will be performed with the words
        Pasirinkite užklausos tipą atliekamą su žodžiais
    
    
        Number of additional words that may be interspersed with the chosen ones
        Papildomų žodžių skaiÄius kurie gali  interspersed with the chosen ones
    
    
        No field
        
    
    
        Any
        
    
    
        All
        Visi
    
    
        None
        
    
    
        Phrase
        
    
    
        Proximity
        
    
    
        File name
        Bylos vardas
    


    Snippets
    
        Snippets
        
    
    
        Find:
        
    
    
        Next
        Kitas
    
    
        Prev
        
    


    SnippetsW
    
        Search
        Ieškoti
    
    
        <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p>
        
    


    SortForm
    
        Date
        Data
    
    
        Mime type
        Mime tipas
    


    SortFormBase
    
        Sort Criteria
        Rūšiavimo kriterijus
    
    
        Sort the
        Rūšiuoti
    
    
        most relevant results by:
        tinkamiausi rezultatai pagal:
    
    
        Descending
        Mažėjimo tvarka
    
    
        Apply
        Pritaikyti
    
    
        Close
        Uždaryti
    


    SpecIdxW
    
        Special Indexing
        
    
    
        Do not retry previously failed files.
        
    
    
        Else only modified or failed files will be processed.
        
    
    
        Erase selected files data before indexing.
        
    
    
        Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs).
        
    
    
        Browse
        Naršyti
    
    
        Start directory (else use regular topdirs):
        
    
    
        Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set.
        
    
    
        Selection patterns:
        
    
    
        Top indexed entity
        
    


    SpellBase
    
        Term Explorer
        Raktinių žodžių tyrinėjimas
    
    
        &Expand 
        &Išplėsti
    
    
        Alt+E
        Alt+E
    
    
        &Close
        &Uždaryti
    
    
        Alt+C
        Alt+C
    
    
        Term
        Raktinis žodis
    
    
        No db info.
        
    
    
        Match
        
    
    
        Case
        
    
    
        Accents
        
    


    SpellW
    
        Wildcards
        Wildcards
    
    
        Regexp
        Regexp
    
    
        Stem expansion
        Stem expansion
    
    
        Spelling/Phonetic
        Tarimas/Fonetika
    
    
        error retrieving stemming languages
        error retrieving stemming languages
    
    
        Aspell init failed. Aspell not installed?
        Aspell iššaukimas nepavyko. Aspell programa neįdiegta?
    
    
        Aspell expansion error. 
        Aspell praplėtimų klaida.
    
    
        No expansion found
        Nerasta praplėtimų
    
    
        Term
        Raktinis žodis
    
    
        Doc. / Tot.
        
    
    
        Index: %1 documents, average length %2 terms.%3 results
        
    
    
        %1 results
        
    
    
        List was truncated alphabetically, some frequent 
        
    
    
        terms may be missing. Try using a longer root.
        
    
    
        Show index statistics
        
    
    
        Number of documents
        
    
    
        Average terms per document
        
    
    
        Database directory size
        
    
    
        MIME types:
        
    
    
        Item
        
    
    
        Value
        
    
    
        Smallest document length (terms)
        
    
    
        Longest document length (terms)
        
    
    
        Results from last indexing:
        
    
    
          Documents created/updated
        
    
    
          Files tested
        
    
    
          Unindexed files
        
    
    
        List files which could not be indexed (slow)
        
    
    
        Spell expansion error. 
        
    


    UIPrefsDialog
    
        error retrieving stemming languages
        error retrieving stemming languages
    
    
        The selected directory does not appear to be a Xapian index
        Atrodo, jog pasirinkta direktorija nÄ—ra Xapian indekso direktorija
    
    
        This is the main/local index!
        Pagrindinis/localus indekas!
    
    
        The selected directory is already in the index list
        Pasirinkta direktorija jau yra indekso sąraše
    
    
        Select xapian index directory (ie: /home/buddy/.recoll/xapiandb)
        Pasirinkite Xapian indekso direktorijÄ… (pav: /home/buddy/.recoll/xapiandb)
    
    
        Choose
        Naršyti
    
    
        Result list paragraph format (erase all to reset to default)
        
    
    
        Result list header (default is empty)
        
    
    
        Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb)
        
    
    
        The selected directory looks like a Recoll configuration directory but the configuration could not be read
        
    
    
        At most one index should be selected
        
    
    
        Cant add index with different case/diacritics stripping option
        
    
    
        Default QtWebkit font
        
    
    
        Any term
        Bet kuris raktinis žodis
    
    
        All terms
        Visi raktiniai žodžiai
    
    
        File name
        Bylos vardas
    
    
        Query language
        Užklausų kalba
    
    
        Value from previous program exit
        
    


    UIPrefsDialogBase
    
        User preferences
        Vartotojo nustatymai
    
    
        User interface
        Vartotoja aplinka
    
    
        Number of entries in a result page
        Ä®rašų skaiÄius rezultatų puslapyje
    
    
        Result list font
        Rezultatų sąrašo šriftas
    
    
        Helvetica-10
        Helvetica-10
    
    
        Opens a dialog to select the result list font
        Pasirinkite rezultatų sąrašo šriftą
    
    
        Reset
        Gražinti numatytąją formą
    
    
        Resets the result list font to the system default
        Gražina numatytąją rezultatų sąrašo srifto vertę
    
    
        Result paragraph<br>format string
        Rezultatų paragrafo<br>formatas
    
    
        Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br>
        ApibÅ«dina kiekvieno rezultatų įraÅ¡o formatÄ…:<br>%A Santrauka<br> %D Data<br> %I Ikona<br> %K Raktiniai žodžiai (jei yra)<br> %L PeržiÅ«ros ir Redagavimo nuorodos<br> %M Mime tipai<br> %N Rezultų skaiÄius<br> %R Tinkamumas procentais<br> %S Informacija apie dydį<br> %T Pavadinimas<br> %U Url<br>
    
    
        Texts over this size will not be highlighted in preview (too slow).
        Tekstai viršijantys šį dydį nebus nuspalvinami peržiūros metu (per didelė apkrova).
    
    
        Maximum text size highlighted for preview (megabytes)
        Didžiausia teksto, pažymėto peržiūrai, apimtis (megabaitai)
    
    
        Auto-start simple search on whitespace entry.
        PradÄ—ti paprastÄ…jÄ… paieÅ¡kÄ… įvedus tuÅ¡Äio tarpelio simoblį.
    
    
        Start with advanced search dialog open.
        Pradėti nuo išsamesnės paieškos lango.
    
    
        Start with sort dialog open.
        Pradėti su atidarytu rūšiavimo langu.
    
    
        Use desktop preferences to choose document editor.
        Naudoti darbalaukio nustatymus parenkant dokumentų redaktorių.
    
    
        Remember sort activation state.
        Įsiminti rūšiavimo pasirinkimus (nedings perkrovus).
    
    
        Search parameters
        Paieškos parametrai
    
    
        Stemming language
        Stemming kalba
    
    
        Automatically add phrase to simple searches
        Pridėti prie paprastos paieškos frazę
    
    
        A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.
        Paieška bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiški pirmenybė rezultatams kuriuose rasti raktiniai žodžiai atitinka įvestus.
    
    
        Dynamically build abstracts
        Dinamiškai sukurti santraukas
    
    
        Do we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.
        Ar pabandome sukurti santraukas remdamiesi užklausų raktinių žodžių kontekstu?
DidelÄ—s apimties dokumentams gali lÄ—tai veikti.
    
    
        Replace abstracts from documents
        Pakeisti dokumentuose randamas santraukas
    
    
        Do we synthetize an abstract even if the document seemed to have one?
        Ar sukuriame dirbtinÄ™ santraukÄ…, jei dokumente jau ji yra? 
    
    
        Synthetic abstract size (characters)
        DirbtinÄ—s santraukos dydis (simbolių skaiÄius)
    
    
        Synthetic abstract context words
        Dirbtinės santraukos konteksto žodžiai
    
    
        External Indexes
        Išoriniai indeksai
    
    
        External indexes
        Išoriniai indeksai
    
    
        Toggle selected
        Įjungti/Išjungti pasirinktą
    
    
        Activate All
        Visus aktyvuoti
    
    
        Deactivate All
        Visus deaktyvuoti
    
    
        Remove selected
        Pažymėtus pašalinti
    
    
        Remove from list. This has no effect on the disk index.
        Pašalinti iš sąrašo. Neturi jokio poveikio indeksui diske.
    
    
        Add index
        PridÄ—ti indeksÄ…
    
    
        Select the xapiandb directory for the index you want to add, then click Add Index
        Pasirinkti xapiandb direktorijÄ… kurios indekÄ… norite pridÄ—ti, tada paspauskite PridÄ—ti IndeksÄ…
    
    
        Browse
        Naršyti
    
    
        &OK
        &Gerai
    
    
        Apply changes
        Pritaikyti pakeitimus
    
    
        &Cancel
        &Atšaukti
    
    
        Discard changes
        Panaikinti pakeitimus
    
    
        Highlight color for query terms
        Užklausų raktinių žodžių žymėjimo spalvos
    
    
        Prefer Html to plain text for preview.
        Pirmenybę teikti Html formatui peržiūros metu.
    
    
        If checked, results with the same content under different names will only be shown once.
        PažymÄ—jus, bus rodoma tik viena iÅ¡ bylų su tuo paÄiu turiniu, taÄiau skirtingais vardais.
    
    
        Hide duplicate results.
        SlÄ—pti pasikartojanÄius rezultatus.
    
    
        Choose editor applications
        Pasirinkite redaktorių programas
    
    
        Display category filter as toolbar instead of button panel (needs restart).
        Kategorijų filtrą rodyti kaip įrankų juostą (reikalauja perkrovimo).
    


    ViewAction
    
        Changing actions with different current values
        Pakeisti veiksmus su skirtingomis dabartinÄ—mis vertÄ—mis
    
    
        Mime type
        Mime tipas
    
    
        Command
        
    
    
        MIME type
        
    
    
        Desktop Default
        
    
    
        Changing entries with different current values
        
    


    ViewActionBase
    
        Native Viewers
        Sistemos peržiūros programos
    
    
        Select one or several file types, then click Change Action to modify the program used to open them
        Pasirinkite vieną ar kelis bylų tipus, tada paspauskite Keisti Veiksmus norėdami keisti kaip programa juos atidaro
    
    
        File type
        Bylos tipas
    
    
        Action
        Veiksmas
    
    
        Change Action
        Pakeisti veiksmÄ…
    
    
        Close
        Uždaryti
    
    
        Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults.
        Pasirinkite vieną ar kelis mime tipus tada spauskite "Keisti Veiksmus"<br>Taip pat galite uždaryti šį langą ir patikrinti "Naudoti darbalaukio nustatymus"<br>pagrindinėje panelėje? norėdami ignoruoti šį sąrašą ir naudoti numatytasias darbalaukio.
    
    
        Select one or several mime types then use the controls in the bottom frame to change how they are processed.
        
    
    
        Use Desktop preferences by default
        
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        
    
    
        Exception to Desktop preferences
        
    
    
        Action (empty -> recoll default)
        
    
    
        Apply to current selection
        
    
    
        Recoll action:
        
    
    
        current value
        
    
    
        Select same
        
    
    
        <b>New Values:</b>
        
    


    Webcache
    
        Webcache editor
        
    
    
        Search regexp
        
    


    WebcacheEdit
    
        Copy URL
        
    
    
        Unknown indexer state. Can't edit webcache file.
        
    
    
        Indexer is running. Can't edit webcache file.
        
    
    
        Delete selection
        
    
    
        Webcache was modified, you will need to run the indexer after closing this window.
        
    


    WebcacheModel
    
        MIME
        
    
    
        Url
        
    


    confgui::ConfBeaglePanelW
    
        Steal Beagle indexing queue
        Įtraukti Beagle paruoštus duomenis
    
    
        Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin)
        BEAGLE programa TURI neveikti. Įgalina peržiūrėti beagle paruoštą medžiagą bandant indeksuoti Firefox naršymo<br> istoriją (papildomai reikia įdiegti Firefox Beagle priedą)
    
    
        Web cache directory name
        Naršymo tinkle cache direktorijos vardas
    
    
        The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory.
        Direktorijos, kurioje saugoma lankytų tinklo svetainių cache, vardas.<br>Santykinis kelias prasideda nuo nustatymų direktorijos.
    
    
        Max. size for the web cache (MB)
        Didžiausias tinklo naršymo cache dydis (MB)
    
    
        Entries will be recycled once the size is reached
        Įrašai bus trinami pasiekus nurodytą dydį
    
    
        Web page store directory name
        
    
    
        The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory.
        
    
    
        Max. size for the web store (MB)
        
    
    
        Process the WEB history queue
        
    
    
        Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin)
        
    
    
        Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).
        
    


    confgui::ConfIndexW
    
        Can't write configuration file
        Nepavyksta įrašyti nustatymų bylos
    


    confgui::ConfParamFNW
    
        Browse
        Naršyti
    
    
        Choose
        Naršyti
    


    confgui::ConfParamSLW
    
        +
        +
    
    
        -
        -
    


    confgui::ConfSearchPanelW
    
        Automatic diacritics sensitivity
        
    
    
        <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity.
        
    
    
        Automatic character case sensitivity
        
    
    
        <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity.
        
    
    
        Maximum term expansion count
        
    
    
        <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.
        
    
    
        Maximum Xapian clauses count
        
    
    
        <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.
        
    


    confgui::ConfSubPanelW
    
        Global
        Globalus
    
    
        Max. compressed file size (KB)
        Didžiausias suspaustų bylų dydis (KB)
    
    
        This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.
        Viršijus pasirinktą suspaustų bylų dydį, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos būtų indeksuojamos.
    
    
        Max. text file size (MB)
        Didžiausias tekstinės bylos dydis (MB)
    
    
        This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. 
This is for excluding monster log files from the index.
        Viršijus pasirinktą tekstinių bylų dydį, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos būtų indeksuojamos.
    
    
        Text file page size (KB)
        TekstinÄ—s bylos dydis (KB)
    
    
        If this value is set (not equal to -1), text files will be split in chunks of this size for indexing.
This will help searching very big text  files (ie: log files).
        Jei vertė nurodyta (nelgyi -1) tekstinės bylos bus suskaidytos į nurodyto dydžio bylas, kurios bus atskirai indeksuojamos. Naudinga atliekant paiešką labai dideliose tekstinėse bylose (pav. log bylose).
    
    
        Max. filter exec. time (S)
        Ilgiausias filtrų veikimo laikas (S)
    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit.

        IÅ¡orinių filtrų, dirbanÄių ilgiau nei numatyta, darbas bus nutraukiamas. Taikoma retiems atvejas (pav. postscript) kada dokumentas galÄ—tų priversti filtrÄ… kartoti veiksmus be galo ilgai. 
    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit.

        
    
    
        Only mime types
        
    
    
        An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive
        
    
    
        Exclude mime types
        
    
    
        Mime types not to be indexed
        
    


    confgui::ConfTopPanelW
    
        Top directories
        AukÅ¡Äiausio lygmens direktorijos<br>kuriose vykdomas indeksavimas
    
    
        The list of directories where recursive indexing starts. Default: your home.
        Direktorijų, kuriose pradedamas rekursinis indeksavimas, sąrašas. Numatytoji: namų direktorija.
    
    
        Skipped paths
        Direktorijų, kurių turinys nein-<br>deksuojamas, sąrašas
    
    
        These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        Direktorijų, kurių turinys nebus indeksuojamas, vardai.<br> Vardo dalis gali būti wildcards. Turi atitikti programos matomus kelius iki direktorijų (pav. jei indeksuoti pradedama nuo '/home/me', o '/home' yra nuoroda į '/usr/home', teisinga vertė bus '/home/me/tmp*', o ne '/usr/home/me/tm*')
    
    
        Stemming languages
        Kalbos naudojamos stemming<br> procesui
    
    
        The languages for which stemming expansion<br>dictionaries will be built.
        Kalbos, kurioms bus sukurti stemming <br>expansion žodynai.
    
    
        Log file name
        Log bylos vardas
    
    
        The file where the messages will be written.<br>Use 'stderr' for terminal output
        Byla, kurioje bus įrašomos žinutės.<br>Naudokite 'stderr' norėdami išvesti į terminalo langą
    
    
        Log verbosity level
        Log išsamumo lygmuo
    
    
        This value adjusts the amount of messages,<br>from only errors to a lot of debugging data.
        VertÄ— nustato žiniuÄių apimtį, nuo vien tik <br>klaidų fiksavimo iki didelÄ—s apimties duomenų skirtų debugging.
    
    
        Index flush megabytes interval
        Indekso dalių, įrašomų į diską, dydis (MB)
    
    
        This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB 
        Vertė nustato duomenų, kurie indeksuojami tarp įrašymo į diską, apimtį.<br>Padeda valdyti indeksavimo dalies atminties naudojimą. Numatyta vertė yra 10 MB
    
    
        Max disk occupation (%)
        Didžiausia disko atminties naudojimo dalis (%)
    
    
        This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default).
        Viršijus (procentine išraiška) disko atminties panaudojimą indeksavimas bus sustabdytas (vengiant pilnai užpildyti diską).<br>0 reiškia, jog ribos nėra (numatytoji vertė).
    
    
        No aspell usage
        Aspell nebus naudojama
    
    
        Aspell language
        Aspell kalba
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        Aspell žodyno kalba ('en', 'fr' ar kita).<br>Jei vertė nenurodyta NLS aplinka pabandys nustatyti tinkamą kalbą (paprastai teisingai). Norėdami sužinoti kas įrašyta Jūsų sistemoje įrašykite 'aspell-config' ir žiūrėkite į dat bylas 'data-dir' direktorijoje.
    
    
        Database directory name
        Duomenų bazės direktorijos vardas
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the  configuration directory. The default is 'xapiandb'.
        Direktorijos, kurioje bus saugomas indeksas, vardas<br>Laikoma, jog santykinio keliio iki direktorijos pradžia yra nustatymų direktorija. Numatytoji yra 'xapiandb'. 
    
    
        Use system's 'file' command
        Naudoti sistemos 'file' komandÄ…
    
    
        Use the system's 'file' command if internal<br>mime type identification fails.
        Jei nepavyks atpažinti mime tipo<br>naudoti sistemos 'file' komandą. 
    
    
        Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. 
        Nurodo nenaudoti aspell programos kuriant tarimo aproksimacijas raktinių žodžių tyrinėjimo įrankyje.<br>Naudinga, jei aspell neveikia arba neįdiegta.
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.
        
    
    
        Unac exceptions
        
    
    
        <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.
        
    
    
        These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        
    
    
        Max disk occupation (%, 0 means no limit)
        
    
    
        This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit.
        
    


    uiPrefsDialogBase
    
        User preferences
        Vartotojo nustatymai
    
    
        User interface
        Vartotoja aplinka
    
    
        Number of entries in a result page
        Ä®rašų skaiÄius rezultatų puslapyje
    
    
        If checked, results with the same content under different names will only be shown once.
        PažymÄ—jus, bus rodoma tik viena iÅ¡ bylų su tuo paÄiu turiniu, taÄiau skirtingais vardais.
    
    
        Hide duplicate results.
        SlÄ—pti pasikartojanÄius rezultatus.
    
    
        Highlight color for query terms
        Užklausų raktinių žodžių žymėjimo spalvos
    
    
        Result list font
        Rezultatų sąrašo šriftas
    
    
        Opens a dialog to select the result list font
        Pasirinkite rezultatų sąrašo šriftą
    
    
        Helvetica-10
        Helvetica-10
    
    
        Resets the result list font to the system default
        Gražina numatytąją rezultatų sąrašo srifto vertę
    
    
        Reset
        Gražinti numatytąją formą
    
    
        Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br>
        ApibÅ«dina kiekvieno rezultatų įraÅ¡o formatÄ…:<br>%A Santrauka<br> %D Data<br> %I Ikona<br> %K Raktiniai žodžiai (jei yra)<br> %L PeržiÅ«ros ir Redagavimo nuorodos<br> %M Mime tipai<br> %N Rezultų skaiÄius<br> %R Tinkamumas procentais<br> %S Informacija apie dydį<br> %T Pavadinimas<br> %U Url<br>
    
    
        Result paragraph<br>format string
        Rezultatų paragrafo<br>formatas
    
    
        Texts over this size will not be highlighted in preview (too slow).
        Tekstai viršijantys šį dydį nebus nuspalvinami peržiūros metu (per didelė apkrova).
    
    
        Maximum text size highlighted for preview (megabytes)
        Didžiausia teksto, pažymėto peržiūrai, apimtis (megabaitai)
    
    
        Use desktop preferences to choose document editor.
        Naudoti darbalaukio nustatymus parenkant dokumentų redaktorių.
    
    
        Choose editor applications
        Pasirinkite redaktorių programas
    
    
        Display category filter as toolbar instead of button panel (needs restart).
        Kategorijų filtrą rodyti kaip įrankų juostą (reikalauja perkrovimo).
    
    
        Auto-start simple search on whitespace entry.
        PradÄ—ti paprastÄ…jÄ… paieÅ¡kÄ… įvedus tuÅ¡Äio tarpelio simoblį.
    
    
        Start with advanced search dialog open.
        Pradėti nuo išsamesnės paieškos lango.
    
    
        Start with sort dialog open.
        Pradėti su atidarytu rūšiavimo langu.
    
    
        Remember sort activation state.
        Įsiminti rūšiavimo pasirinkimus (nedings perkrovus).
    
    
        Prefer Html to plain text for preview.
        Pirmenybę teikti Html formatui peržiūros metu.
    
    
        Search parameters
        Paieškos parametrai
    
    
        Stemming language
        Stemming kalba
    
    
        A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.
        Paieška bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiški pirmenybė rezultatams kuriuose rasti raktiniai žodžiai atitinka įvestus.
    
    
        Automatically add phrase to simple searches
        Pridėti prie paprastos paieškos frazę
    
    
        Do we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.
        Ar pabandome sukurti santraukas remdamiesi užklausų raktinių žodžių kontekstu?
DidelÄ—s apimties dokumentams gali lÄ—tai veikti.
    
    
        Dynamically build abstracts
        Dinamiškai sukurti santraukas
    
    
        Do we synthetize an abstract even if the document seemed to have one?
        Ar sukuriame dirbtinÄ™ santraukÄ…, jei dokumente jau ji yra? 
    
    
        Replace abstracts from documents
        Pakeisti dokumentuose randamas santraukas
    
    
        Synthetic abstract size (characters)
        DirbtinÄ—s santraukos dydis (simbolių skaiÄius)
    
    
        Synthetic abstract context words
        Dirbtinės santraukos konteksto žodžiai
    
    
        The words in the list will be automatically turned to ext:xxx clauses in the query language entry.
        
    
    
        Query language magic file name suffixes.
        
    
    
        Enable
        
    
    
        External Indexes
        Išoriniai indeksai
    
    
        Toggle selected
        Įjungti/Išjungti pasirinktą
    
    
        Activate All
        Visus aktyvuoti
    
    
        Deactivate All
        Visus deaktyvuoti
    
    
        Remove from list. This has no effect on the disk index.
        Pašalinti iš sąrašo. Neturi jokio poveikio indeksui diske.
    
    
        Remove selected
        Pažymėtus pašalinti
    
    
        Add index
        PridÄ—ti indeksÄ…
    
    
        Apply changes
        Pritaikyti pakeitimus
    
    
        &OK
        &Gerai
    
    
        Discard changes
        Panaikinti pakeitimus
    
    
        &Cancel
        &Atšaukti
    
    
        Abstract snippet separator
        
    
    
        Style sheet
        
    
    
        Opens a dialog to select the style sheet file
        
    
    
        Choose
        Naršyti
    
    
        Resets the style sheet to default
        
    
    
        Result List
        
    
    
        Edit result paragraph format string
        
    
    
        Edit result page html header insert
        
    
    
        Date format (strftime(3))
        
    
    
        Frequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). 
        
    
    
        Autophrase term frequency threshold percentage
        
    
    
        Plain text to HTML line style
        
    
    
        Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.
        
    
    
        <BR>
        
    
    
        <PRE>
        
    
    
        <PRE> + wrap
        
    
    
        Disable Qt autocompletion in search entry.
        
    
    
        Search as you type.
        
    
    
        Paths translations
        
    
    
        Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.
        
    
    
        Snippets window CSS file
        
    
    
        Opens a dialog to select the Snippets window CSS style sheet file
        
    
    
        Resets the Snippets window style
        
    
    
        Decide if document filters are shown as radio buttons, toolbar combobox, or menu.
        
    
    
        Document filter choice style:
        
    
    
        Buttons Panel
        
    
    
        Toolbar Combobox
        
    
    
        Menu
        
    
    
        Show system tray icon.
        
    
    
        Close to tray instead of exiting.
        
    
    
        Start with simple search mode
        
    
    
        User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header.
        
    
    
        Synonyms file
        
    
    
        Show warning when opening temporary file.
        
    
    
        Highlight CSS style for query terms
        
    


recoll-1.23.7/qtgui/i18n/recoll_el.qm0000644000175000017500000031610413224431020014210 00000000000000<¸dÊÍ!¿`¡½ÝB˜+!Â-!ﯛ+;Y4G¤;nH,¡"H,÷+HY÷VIAÌZlÝmbâž^Ym˜•þΦysz¨¥ÙɶE¬ÉÐDÙ]8
½3.c€ˆDo2±´Nº(XM¹uîX®©8`Þ^ÞXhˆ¸:àlÿt÷ÞnÚv‚wñ…Ü<wñ…‘€üÞÇ‘vã^&•ñ“ࢉ:$£cêÿÎxCvöÞñƒƒëͺ3vó
L ÒþSIó(ÿµF
ÿØ…¿
çKškp#6våàõvå¥Úòw5Û?w5òéw5÷‘wîÛ‚ŒUE®Ÿ.ŸS£¹Þ~©Ö³ª6•ýׯ†”žO»f3ÉGͼuvíÐgž¾ÐgžÃiÔÂõq׸~+rì;U¥ñï¡©9ÓúUrôúeî¬ŠÛ!DL&Ák.‡Nƒñ=údû?údá¿G$ß›}JUY¬]JUY߃Y ôL[–uu*_n3º™†Ûun–Ê·¥¢ÑóÊ—¥bÊ—¥ÃÎÅåy±Ôä^rÝôLe+æõÎ%|ìxHoùJglÑþA¢×¹þŠ¥wuÿ%´âÿAî@­B j_<.šáçÞóÓõÕúëdÖ­;[¾ÿ?<Äöã»Lƒ
NB™&XË4³¼e2´svhÕ QwT	æ€ã‡£þ…(P¤—Œ¯bÙ’"3S’ZÓŠ˜I¼;£˜I¼pN™n•ü™n•ý¢šß¤²ƒŸf•	®Ÿf•!‚Ÿf•a<«Ê#«ôy¬,¥;Ù¯ƒW:¯ƒWlMÄy%6õÄy%m€Å ä}=Íl£;@΄պ“Ð:Â
.Ú#m¸ãX|6åõW5¾Ì”ÔiâiûO
-Zí-¼Ø)ÖT€GB9€F”BìSùÏk¶ÞÏboˆ•ùbr?)ݨrž ‰|ôò„kå‰Û‹¦,Ñ1‹ÜðéŒÇ<É"„›ˆ˜öž›ˆ˜ýlŸ,tމ¦ASœªÃ¢¹ž·¨
å—·¨
–»œRÿÆÇ¢•‹×I^ÌÈØ~C~èêÈ­Déã>jîðŒµ…c`³ÐbMð>m$¦Ç"	öÖUKô‚Rp
h]Ñu9U’v2ãs´–T#u×—Bp³šKP ¦	%E¦©nÇŸ¦öõl¨«‡Ào¶7âF€YÔÃ’P°TÄÅ^"ÄÖ[´°ÊXÔžënD¸ðw)ù”þVÆC_N!vô¨#+ä…Ú7I^ÆÀ<ˆ~tFW#øPF¯Ni8H:"‰_guRŒapä0wf<piT:«|§NR÷ŒÍw‰›ŒÏ—à~nÝà“’ž^™ÅóþE¦š´Ã¥²ð‹}¾l¯¸6ÓtüÓtÃ߯>ÃΔÈàŸɆt‰îâ]8:šãÀûŠåÅ L~éŽ#ÓGñ3l¹*snc÷,öy§:uî{kGñî‚°J¢WíJýn(¡QçÇ~ }}}¯€;Eäï”ò“†¨0ÎQ¬©ÔÕ§¬¨”¦°cr¶¬hŠ]Äö]È@ÃʶÕÙÊÁÈ©Ìí³nûͳà»×°£“ÝÜX?äœcdä´¥žªæí:©îî?À®ö¨åJúË1	ÉNƒŠ	´HÅ?	-(;)	9Zyõ÷	;´3²'	D©/Q	K¨óÎ 	]#—µ[	c‡CN	k¨µv,	lMˆl‚	‰Œîˆ¢	ŸÁòô	£qDT	«ƒÔÙU	­î>I	®œ¯h!	°Ž`§ñ	²98ò	ÛC3	ü>|µ	ä3¬ó	äîwx	íåõ`		ûiéŒ@
	¢µ1
*Nt
:^ˆ
Üc
*R8c
+<”KM
6 ©»
>V…X
G.~R%
`P³Z
`ç£
a·EÌD
c·Ĕ
d8í
yr›
˜IœX÷
¤ž6K
¤s¾zi
®VT0ÿ
²ëCŒ×
Äãßï
âæçËÀ
æõçË@®ÊU®ùʰÔ…è^Õ	ye6´TH¶ŽÚo8,xƒXŸ=!XsKj×ÝX°ƒXX°ƒÐÚh¹°o~’þƒo™÷¾°é9£Üu‘¨Î£Í¬rD»ïµ§HÙ·åÏÀÛ·åÐÛÓav?¾s•–È»	Vd³4ò¬ïúh'ИÉÁ+bCŽÙ/¥´97ÃC9ɶ€L*ã_PÖ™ <RVŽ¿ãT#ƒ¦VüJh\iC~º]æù7`F¥Ehôîãv—¥¹M{l|€!Y¸â€!YáT‚WåÔ†|ð‹ÆŠ¢ ŒïõÓÃÒ¬`é¬æà¶…]¹iÉ/éÓͽJÚ÷òÝøì]}é—~r{õ­NÁö†Àþ

m£Ûø
'RçRø
-èôܨ
8þZ*
FÁ°
OE°Q¨
]„Ä<¦
]„Ĺ
uò0Ó	
y·õ
y¹~N
‚±3	D
…È©d¦
‡uó‡
‡u
_
‰P 

‰PÁÒ
5dxº
¤š„µÁ
¬Š©6
½ý7h
ÇiŠž
ÇòÞb.
ÊÕ’:L
ÕH’
ÛQ5á
û£ q©Æ€q¾%Ýn|/¸.6ˆ—ÄR8bó›9µÑc<Þ‡…>ñQá~}pW"ùˆ¡Y~sÈë[žs×`\Н71e3Í–g3ÍÛpû~hsÕ T×™³fê!]
­c»m€äf¿­c
BÂ|“ƒQÂ|“ƒ+ÉB®e…ÎÁ'¹Ìó
lÄèü©Üêü¶L*i‹‹Œ»µ ¿¹ Á®ÄÁµÂAll clauses	AdvSearch"ŸÀ¿¹±´®À¿Äµ Á®ÄÁ±
Any clause	AdvSearch^š±ºÌ µÀ¯¸µ¼± À¿»»±À»±Ã¹±ÃÄ® ÃÄ¿ Ư»ÄÁ¿ ¼µ³­¸¿ÅÂ$Bad multiplier suffix in size filter	AdvSearchÀ¿»Å¼­Ã±media	AdvSearch¼®½Å¼±message	AdvSearch¬»»±other	AdvSearchÀ±Á¿Åï±Ã·presentation	AdvSearch»¿³¹ÃĹºÌ ÆÍ»»¿spreadsheet	AdvSearchÆÍ»»± µÁ³±Ã¯±Âspreadsheets	AdvSearchºµ¯¼µ½¿text	AdvSearchºµ¯¼µ½±texts	AdvSearch<----- Œ»±
<----- All
AdvSearchBase<----- •À¹»
<----- Sel
AdvSearchBase Á¿Ã¸®º· Á®ÄÁ±Â
Add clause
AdvSearchBase* Á¿ÇÉÁ·¼­½· ±½±¶®Ä·Ã·Advanced search
AdvSearchBaseŒ»± ---->	All ---->
AdvSearchBase|Œ»± ı ¼· ºµ½¬ Àµ´¯± Ãı ´µ¾¹¬ ¸± ÃŽ´Å±ÃĿͽ ¼µ ­½± ÃŽ´Å±Ã¼Ì š‘™ (µÀ¹»¿³® «Œ»µ ¿¹ Á®ÄÁµ») ® ‰ (µÀ¹»¿³® «œ¹± ±ÀÌ Ä¹ Á®ÄÁµ»). <br> ¤± Àµ´¯± ĿŠÄÍÀ¿Å «œ¹± ±ÀÌ ±ÅÄ­ Ä¹ »­¾µ¹», «Œ»µ ¿¹ »­¾µ¹» º±¹ «š±¼¹¬ ±ÀÌ ±ÅÄ­ Ä¹ »­¾µ¹» ´­Ç¿½Ä±¹ ­½± ±½±º¬Äµ¼± »­¾µÉ½ º±¹ ÆÁ¬ÃµÉ½ õ µ¹Ã±³É³¹º¬. <br>¤± ºµ½¬ Àµ´¯± ±³½¿¿Í½Ä±¹.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. 
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase µÁ¹®³·Ã·Browse AdvSearchBase‘½¬ º±Ä·³¿Á¯± By categories AdvSearchBase|•À¹»­¾Äµ ±ÅÄÌ ³¹± ½± µ½µÁ³¿À¿¹®ÃµÄµ Ä¿ Ư»ÄÁ¿ ÃĹ ·¼µÁ¿¼·½¯µÂ'Check this to enable filtering on dates AdvSearchBase°•½µÁ³¿À¿¹®Ãĵ ±ÅÄ® Ä·½ µÀ¹»¿³® ³¹± ½± ÇÁ·Ã¹¼¿À¿¹·¸µ¯ Ä¿ ƹ»ÄÁ¬Á¹Ã¼± ÃĿŠÄÍÀ¿Å ±Áǵ¯É½,Check this to enable filtering on file types AdvSearchBaseŒ•À¹»­¾Äµ ±ÅÄÌ ³¹± ½± µ½µÁ³¿À¿¹®ÃµÄµ Ä¿ ƹ»ÄÁ¬Á¹Ã¼± ÃÄ¿ ¼­³µ¸¿ ±Áǵ¯É½'Check this to enable filtering on sizes AdvSearchBaseš•À¹»­¾Äµ Ä¿ ³¹± ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ Ĺ º±Ä·³¿Á¯µ ±Áǵ¯É½ ±½Ä¯ Äɽ ÄÍÀɽ mime;Check this to use file categories instead of raw mime types AdvSearchBaseš»µ¯Ã¹¼¿Close AdvSearchBase”¹±³Á±Æ® Á®ÄÁ±Â Delete clause AdvSearchBase\•¹Ã¬³µÄµ Ä¿½ º±Ä¬»¿³¿ µºº¯½·Ã· Ä· ±½±¶®Ä·Ã·ÂEnter top directory for search AdvSearchBase ¦¯»ÄÁ¿Filter AdvSearchBase$¦¯»ÄÁ¿ ·¼µÁ¿¼·½¯±Â Filter dates AdvSearchBase¦¯»ÄÁ¿ ¼µ³­¸¿Å Filter sizes AdvSearchBase‘½±¶®Ä·Ã·Find AdvSearchBase‘ÀÌFrom AdvSearchBase<¤ÍÀ¿¹ ±Áǵ¯É½ À¿Å ¸± ±³½¿·¸¿Í½Ignored file types AdvSearchBase‘½Ä¹ÃÄÁ¿Æ®Invert AdvSearchBaseœ­³. ¼­³µ¸¿Â Max. Size AdvSearchBaseœœ­³¹ÃÄ¿ ¼­³µ¸¿Â: œÀ¿Áµ¯Äµ ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ ı k/K,m/M,g/G É À¿»»±À»±Ã¹±ÃÄ­Â4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase•»±Ç. ¼­³µ¸¿Â Min. Size AdvSearchBasež•»¬Ç¹ÃÄ¿ ¼­³µ¸¿Â: œÀ¿Áµ¯Äµ ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ ı k/K,m/M,g/G É À¿»»±À»±Ã¹±ÃÄ­Â4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase: µÁ¹¿Á¹Ã¼Ì Ä¿Å ÄÍÀ¿Å ±Áǵ¯É½Restrict file types AdvSearchBasej µÁ¹¿Á¹Ã¼Ì Äɽ ±À¿Äµ»µÃ¼¬Äɽ Ãı ±Áǵ¯± ĿŠ´­½ÄÁ¿Å:%Restrict results to files in subtree: AdvSearchBase0‘À¿¸®ºµÅ÷ É ÀÁ¿µÀ¹»¿³®Save as default AdvSearchBaseT‘½±¶®Ä·Ã· <br>µ³³Á¬ÆÉ½<br>À¿Å ¹º±½¿À¿¹¿Í½:'Search for
documents
satisfying: AdvSearchBase6‘½±¶·Ä¿Í¼µ½¿¹ ÄÍÀ¿¹ ±Áǵ¯É½Searched file types AdvSearchBase•À¹» ----> Sel -----> AdvSearchBase&•ºº¯½·Ã· ±½±¶®Ä·Ã·Â Start Search AdvSearchBaseˆÉÂTo AdvSearchBase <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> ÀÁ¿³Á±¼¼±Ä¹Ã¼Ì ķ ÀµÁ¹¿´¹º®Â µÅÁµÄ·Á¯±Ã·Â (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">𬏵 Àµ´¯¿ ¼À¿Áµ¯ ½± ÀµÁ¹­Çµ¹ ­½± DZÁ±ºÄ®Á± ÅÀ¿º±Ä¬Ãı÷ (*), ¼¹± ±À»® ±Á¹¸¼·Ä¹º® Ĺ¼®, »¯Ãĵ ´¹±ÇÉÁ¹Ã¼­½µÂ ¼µ ºÌ¼± (1,3,5) º±¹ µÍÁ· (1-7). “µ½¹ºÌĵÁ±, ı Àµ´¯± ¸± ÇÁ·Ã¹¼¿À¿¹·¸¿Í½ <span style=" font-style:italic;">É ­Ç¿Å½</span> ÃÄ¿ ±Áǵ¯¿ crontab, º±¹ · ³µ½¹º® Ãͽı¾· crontab ¼À¿Áµ¯ ½± ÇÁ·Ã¹¼¿À¿¹·¸µ¯, ´µ¯Äµ ÃÄ· õ»¯´± Ŀе³Çµ¹Á¹´¯¿Å crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />“¹± À±Á¬´µ¹³¼±, µ¹Ã¬³¿½Ä±Â <span style=" font-family:'Courier New,courier';">*</span> ÃĹ <span style=" font-style:italic;">—¼­ÁµÂ, </span><span style=" font-family:'Courier New,courier';">12,19</span> ÃĹ <span style=" font-style:italic;">ÁµÂ</span> º±¹ <span style=" font-family:'Courier New,courier';">15</span> Ãı <span style=" font-style:italic;">›µÀĬ</span>, Ä¿ recollindex ¸± ¾µº¹½¬ º¬¸µ ¼­Á± ÃĹ 12:15 AM º±¹ 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ÿ ÀÁ¿³Á±¼¼±Ä¹Ã¼Ì ¼µ À¿»Í ÃÅǽ­Â µ½µÁ³¿À¿¹®Ãµ¹Â µ¯½±¹ À¹¸±½Î »¹³ÌĵÁ¿ ±À¿Äµ»µÃ¼±Ä¹ºÌ ±ÀÌ Ä·½ µÅÁµÄ·Á¯±Ã· õ ÀÁ±³¼±Ä¹ºÌ ÇÁ̽¿.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

 CronToolW¾<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">š¬½Äµ º»¹º ÃÄ¿ <span style=" font-style:italic;">‘Àµ½µÁ³¿À¿¯·Ã·</span> ³¹± ½± ´¹±ºÌȵĵ Ä·½ ÀµÁ¹¿´¹º® ±ÅÄ̼±Ä· µÅÁµÄ·Á¯±Ã·, ÃÄ¿ <span style=" font-style:italic;">•½µÁ³¿À¿¯·Ã·</span> ³¹± ½± Ä·½ µ½µÁ³¿À¿¹®ÃµÄµ, º±¹ <span style=" font-style:italic;">‘ºÍÁÉ÷</span> ³¹± ½± ¼·½ ±»»¬¾µ¹ įÀ¿Ä±.</p></body></html>š

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

 CronToolW”¹¬»¿³¿ Cron Cron Dialog CronToolWl—¼­Áµ Ä· µ²´¿¼¬´± (* ® 0-7, 0 ® 7 ÷¼±¯½µ¹ šÅÁ¹±º®))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolW‘Àµ½µÁ³¿À¿¯·Ã·Disable CronToolW•½µÁ³¿À¿¯·Ã·Enable CronToolW”£Æ¬»¼± º±Ä¬ Ä·½ µ³º±Ä¬Ãı÷ Ä· º±Ä±ÇÎÁ·Ã· cron. š±º® Ãͽı¾· Äɽ Àµ´¯É½;3Error installing cron entry. Bad syntax in fields ? CronToolWÁµ (* ® 0-23)Hours (* or 0-23) CronToolW¦±¯½µÄ±¹ ÌĹ ÅÀ¬ÁǿŽ º±Ä±ÇÉÁ®Ãµ¹ ´·¼¹¿ÅÁ³·¼­½µ Çµ¹Á¿º¯½·Ä± ³¹± Ä¿ recollindex. — µÀµ¾µÁ³±Ã¯± ĿбÁǵ¯¿Å Cron ´µ½ µ¯½±¹ ´Å½±Ä®PIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolW›µÀĬ (0-59)Minutes (0-59) CronToolW”¹¬»¿³¿ÂDialog EditDialog$£Æ¬»¼± ´¹±¼ÌÁÆÉ÷ Config error EditTrans¤¿À¹º® ´¹±´Á¿¼® Local path EditTrans‘Áǹº® ´¹±´Á¿¼® Original path EditTrans”¹±´Á¿¼® À·³®Â Source path EditTrans Á¿Ã¸®º·Add EditTransBase‘ºÍÁÉ÷Cancel EditTransBase”¹±³Á±Æ®Delete EditTransBase(”¹±´Á¿¼® ¼µÄ±ÆÁ¬ÃµÉ½Path Translations EditTransBase‘À¿¸®ºµÅ÷Save EditTransBase:•À¹»­¾Äµ ­½±½ ¿¹ ÀµÁ¹ÃÃÌĵÁ¿Å ÄÍÀ¿Å ±Áǵ¯É½, º±¹ ÃÄ· ÃŽ­Çµ¹± ÇÁ·Ã¹¼¿À¿¹®Ãĵ ı º¿Å¼À¹¬ µ»­³Ç¿Å ÃÄ¿ À±Á±º¬ÄÉ À»±¯Ã¹¿ ³¹± ½± ±»»¬¾µÄµ Ä¿½ ÄÁÌÀ¿ µÀµ¾µÁ³±Ã¯±ÂkSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBaseDŸÁ¹Ã¼Ì ´¹±´Á¿¼® ¼µÄ±ÆÁ¬ÃµÉ½ ³¹± Setting path translations for  EditTransBase ª<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">¦±¯½µÄ±¹ ÌĹ Ä¿ µÅÁµÄ®Á¹¿ ³¹± ±ÅÄ®½ Ä· ´¹±¼ÌÁÆÉ÷ ´µ½ ÅÀ¬Áǵ¹ ±ºÌ¼±..</span><br /><br />‘½ ¸­»µÄµ ±À»¬ ½± ´µ¹ºÄ¿´¿Ä®ÃµÄµ Ä¿½ ÀÁ¿ÃÉÀ¹ºÌ ñ º±Ä¬»¿³¿ ¼µ ­½± ¹º±½¿À¿¹·Ä¹ºÌ Ãͽ¿»¿y ÀÁ¿µÀ¹»¿³Î½, À±Ä®Ãĵ Ä¿ º¿Å¼À¯ <span style=" font-style:italic;">«ˆ½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· ÄÎÁ±»</span>. œÀ¿Áµ¯Äµ ½± ÁŸ¼¯ÃµÄµ Ĺ »µÀÄ¿¼­Áµ¹µ ±Á³ÌĵÁ±. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">‘½ µÀ¹¸Å¼µ¯Äµ ÀµÁ¹ÃÃÌĵÁ¿ ­»µ³Ç¿, ÇÁ·Ã¹¼¿À¿¹®Ãĵ ĿŠÀ±Á±º¬ÄÉ ÃŽ´­Ã¼¿Å ³¹± ½± ÁŸ¼¯ÃµÄµ Ä· ´¹±¼ÌÁÆÉ÷ Ä· µÅÁµÄ·Á¯±Ã· º±¹ ĿŠÀÁ¿³Á±¼¼±Ä¹Ã¼¿Í.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">œÀ¿Áµ¯Äµ ½± ­ÇµÄµ ÀÁÌò±Ã· Ãı µÁ³±»µ¯± ±ÅĬ ±Á³ÌĵÁ± ±ÀÌ Ä¿ ¼µ½¿Í <span style=" font-style:italic;"> Á¿Ä¹¼®Ãµ¹Â</span>.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

FirstIdxDialogF”¹±¼ÌÁÆÉ÷ Ä· ÀÁÎÄ· ´µ¹ºÄ¿´Ìķ÷ÂFirst indexing setupFirstIdxDialog.”¹±¼ÌÁÆÉ÷ µÅÁµÄ·Á¯±Ã·ÂIndexing configurationFirstIdxDialog8 Á¿³Á±¼¼±Ä¹Ã¼Ì µÅÁµÄ·Á¯±Ã·ÂIndexing scheduleFirstIdxDialog8ˆ½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· ÄÎÁ±Start indexing nowFirstIdxDialogz£± µÀ¹ÄÁ­Àµ¹ Ä· Á͸¼¹Ã· Äɽ º±Ä±»Ì³É½ À¿Å µÀ¹¸Å¼µ¯Äµ ½± ´µ¹ºÄ¿´¿Ä®ÃµÄµ, º±¹ ¬»»É½ À±Á±¼­ÄÁɽ ÌÀÉ ¿¹ µ¾±¹Á¿Í¼µ½µ ´¹±´Á¿¼­ ±Áǵ¯É½ ® ¿½¿¼¬Äɽ, Äɽ ÀÁ¿º±¸¿Á¹Ã¼­½É½ ÃŽ̻ɽ DZÁ±ºÄ®Áɽ, º»À.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogj£± µÀ¹ÄÁ­Àµ¹ Ä·½ µÀ¹»¿³® ¼µÄ±¾Í Ä· ÀÁ¿³Á±¼¼±Ä¹Ã¼­½· µÅÁµÄ·Á¯±Ã· º±¹ ±ÅÄ® Ãµ ÀÁ±³¼±Ä¹ºÌ ÇÁ̽¿, º±¹ Ä¿½ º±¸¿Á¹Ã¼Ì ĿŠÀÁ¿³Á±¼¼±Ä¹Ã¼¿Í ³¹± Ä·½ ÀÁÎÄ· (²±Ã¹Ã¼­½· ÃÄ¿ µÁ³±»µ¯¿ cron).€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog$”µ½ ²Á­¸·ºµ Ä¿ %1. %1 not found.FragButs%1: %2%1: %2FragButs(˜Á±Íü±Ä± µÁÉÄ®¼±Ä¿ÂQuery FragmentsFragButs Î<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">— µÅÁµÄ·Á¯±Ã· ĿŠ<span style=" font-weight:600;">Recoll</span> ¼À¿Áµ¯ ½± ²Á¯ÃºµÄ±¹ ¼Ì½¹¼± õ »µ¹Ä¿ÅÁ³¯±, µÀµ¾µÁ³¬¶¿½Ä± Ä± ±Áǵ¯± ±¼­ÃÉ ¼µÄ¬ ±Æ¿Í ÄÁ¿À¿À¿¹·¸¿Í½, ® ½± µºÄµ»µ¯Ä±¹ õ ÀÁ¿º±¸¿Á¹Ã¼­½µ ÃĹ³¼­Â. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">œ¹± ±½¬³½É÷ Ŀе³Çµ¹Á¹´¯¿Å ¼À¿Áµ¯ ½± ñ ²¿·¸®Ãµ¹ ½± µÀ¹»­¾µÄµ ¼µÄ±¾Í ±ÅÄν Äɽ ÀÁ¿Ãµ³³¯ÃµÉ½ (À±Ä®Ãĵ F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">‘ÅÄÌ Ä¿ µÁ³±»µ¯¿ ¼À¿Áµ¯ ½± ñ ²¿·¸®Ãµ¹ ½± ´¹±¼¿ÁÆÎõĵ Ä·½ ÀÁ¿³Á±¼¼±Ä¹Ã¼­½· µÅÁµÄ·Á¯±Ã· ® ½± ¿Á¯ÃµÄµ ¼¹± ±ÅÄ̼±Ä· ­½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· Ãµ ÀÁ±³¼±Ä¹ºÌ ÇÁ̽¿ º±Ä¬ Ä· Ãͽ´µÃ® ñ (® º±¹ ı ´Í¿, º¬Ä¹ À¿Å ÃÀ¬½¹± ÇÁµ¹¬¶µÄ±¹). </p></body></html>¿

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

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

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

 IdxSchedW( Á¿³Á±¼¼±Ä¹Ã¼Ì CronCron scheduling IdxSchedWê Á¿Ã´¹¿Á¯Ãĵ ±½ · µÅÁµÄ·Á¯±Ã· õ ÀÁ±³¼±Ä¹ºÌ ÇÁ̽¿ ¸± ¾µº¹½¬ ¼µ Ä· Ãͽ´µÃ® ñ (¼Ì½¿ ³¹± Ä¿ ÀÁ¿º±¸¿Á¹Ã¼­½¿ µÅÁµÄ®Á¹¿).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWV”¹±¼ÌÁÆÉ÷ ĿŠÀÁ¿³Á±¼¼±Ä¹Ã¼¿Í µÅÁµÄ·Á¯±Ã·ÂIndex scheduling setup IdxSchedWVˆ½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· Ãµ ÀÁ±³¼±Ä¹ºÌ ÇÁ̽¿Real time indexing start up IdxSchedW⟠´¹¬»¿³¿ Ã± µÀ¹ÄÁ­Àµ¹ ½± ÀÁ¿Ã´¹¿Á¯ÃµÄµ Ä·½ ÎÁ± ­½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· º±¹ ¸± µ¹Ã¬³µ¹ ¼¹± º±Ä±ÇÎÁ·Ã· crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW”¹¬»¿³¿ÂDialog ListDialogGroupBoxGroupBox ListDialogꤿ ±Áǵ¯¿ ¹ÃÄ¿Á¹º¿Í µ¯Äµ µ¯½±¹ º±ÄµÃÄÁ±¼¼­½¿ µ¯Äµ ´µ½ µ¯½±¹ ±½±³½Îù¼¿/µ³³Á¬È¹¼¿, À±Á±º±»Î µ»­³¾Äµ Ä¿ ® ´¹±³Á¬Èĵ Ä¿:K"history" file is damaged or un(read)writeable, please check or remove it: MainŠ”µ½ ­Çµ¹ ÀÁ¿Ã´¹¿Á¹Ãĵ¯ ¿ º±Ä¬»¿³¿ Ä· ²¬Ã· ´µ´¿¼­½É½ ÃÄ· ´¹±¼ÌÁÆÉ÷ No db directory in configurationMain&•À̼µ½¿&NextPreview& Á¿·³¿Í¼µ½¿ &PreviousPreview&‘½±¶®Ä·Ã· ³¹±: &Search for:Preview„‘´Í½±Ä· · ¼µÄ±³»ÎÄĹ÷ Ŀе³³Á¬Æ¿Å õ µÃÉĵÁ¹º® ±½±À±Á¬Ãı÷ ³¹± 0Can't turn doc into internal representation for Preview‘ºÍÁÉ÷CancelPreview𱏱Á¹Ã¼ÌÂClearPreview*š»µ¯Ã¹¼¿ Ä· º±ÁÄ­»±Â Close TabPreviewL”·¼¹¿ÅÁ³¯± ĿŠºµ¹¼­½¿Å ÀÁ¿µÀ¹ÃºÌÀ·Ã·ÂCreating preview textPreviewD£Æ¬»¼± º±Ä¬ Ä· ÆÌÁÄÉ÷ ĿбÁǵ¯¿ÅError while loading filePreviewh¦ÌÁÄÉ÷ ĿŠºµ¹¼­½¿Å ÀÁ¿µÀ¹ÃºÌÀ·Ã· ÃÄ¿½ µÀµ¾µÁ³±ÃÄ® Loading preview text into editorPreview2”¹¬ºÁ¹Ã· &Àµ¶Î½/ºµÆ±»±¯É½ Match &CasePreviewR•»»µ¯À¿½Ä± µ¾ÉĵÁ¹º¬ ÀÁ¿³Á¬¼¼±Ä± Ư»ÄÁ¿Å:Missing helper program: Preview‘½Ä¹³Á±Æ®CopyPreviewTextEdit,‘½±´¯À»É÷ Äɽ ³Á±¼¼Î½ Fold linesPreviewTextEdit(”¹±Ä®Á·Ã· Ä· µÃ¿Ç®ÂPreserve indentationPreviewTextEdit•ºÄÍÀÉ÷PrintPreviewTextEditJ•ºÄÍÀÉ÷ ĿŠÀ±Á±¸ÍÁ¿Å ÀÁ¿µÀ¹ÃºÌÀ·Ã·ÂPrint Current PreviewPreviewTextEdit.‘À¿¸®ºµÅ÷ Ŀе³³Á¬Æ¿ÅSave document to filePreviewTextEdit•À¹»¿³® ̻ɽ Select AllPreviewTextEdit&•¼Æ¬½¹Ã· Äɽ Àµ´¯É½ Show fieldsPreviewTextEdit(•¼Æ¬½¹Ã· Ä· µ¹ºÌ½±Â Show imagePreviewTextEditB•¼Æ¬½¹Ã· ĿŠÃμ±Ä¿ Ä¿Å ºµ¹¼­½¿ÅShow main textPreviewTextEditP<b>š±Ä¬»¿³¿¹ ¼µ ÀÁ¿Ã±Á¼¿Ã¼­½µ ÁŸ¼¯Ãµ¹ÂCustomised subtreesQObjectò<i>Ÿ¹ À±Á¬¼µÄÁ¿¹ À¿Å ±º¿»¿Å¸¿Í½ ­Ç¿Å½ º±¸¿Á¹Ãĵ¯ µ¯Äµ º±¸¿»¹º¬, ±½ · µÀ¹»¿³® ÃÄ·½ À±Á±À¬½É »¯Ãı<br>µ¯½±¹ ºµ½® ® ¼¹± ºµ½® ³Á±¼¼®, µ¯Äµ ³¹± Ä¿½ µÀ¹»µ³¼­½¿ º±Ä¬»¿³¿.<br>œÀ¿Áµ¯Äµ ½± ÀÁ¿Ã¸­ÃµÄµ º±¹ ½± ±Æ±¹Á­ÃµÄµ º±Ä±»Ì³¿Å º¬½¿½Ä± º»¹º Ãı º¿Å¼À¹¬ +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectò¤¿ Ãͽ¿»¿ Äɽ DZÁ±ºÄ®Áɽ À¿Å ÇÁ·Ã¹¼¿À¿¹µ¯Ä±¹ ³¹± Ä·½ ±½¬³½É÷ Äɽ ±Áǵ¯É½ À¿Å ´µ½ ­Ç¿Å½ µÃÉĵÁ¹ºÌ ±½±³½ÉÁ¹ÃĹºÌ Äɽ DZÁ±ºÄ®Áɽ, ³¹± À±Á¬´µ¹³¼± ±Áǵ¯± ±À»¿Í ºµ¹¼­½¿Å: <br>— Ĺ¼® µ¾ ¿Á¹Ã¼¿Í µ¯½±¹ ºµ½®, º±¹ ÇÁ·Ã¹¼¿À¿¹µ¯Ä±¹ · Ĺ¼® ĿŠÀµÁ¹²¬»»¿½Ä¿Â NLS.ÆCharacter set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject>£Í½¿»¿ DZÁ±ºÄ®Áɽ<br>µ¾ ¿Á¹Ã¼¿ÍDefault
character setQObject@‘º¿»¿Í¸·Ã· Äɽ Ãż²¿»¹ºÎ½ ´µÃ¼Î½Follow symbolic linksQObjectP± ´·¼¹¿ÅÁ³·¸µ¯ µÅÁµÄ®Á¹¿ ³¹± ±Áǵ¯± º±¹ º±Ä±»Ì³¿Å À¿Å ÅÀ¿´µ¹º½Í¿½Ä±¹ ±ÀÌ Ãż²¿»¹º¿Í ´µÃ¼¿ÍÂ. — ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® µ¯½±¹ Ìǹ, ³¹± Ä·½ ±À¿ÆÅ³® ´¹À»ÌÄÅÀ·Â µÅÁµÄ·Á¯±Ã·ÂTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject&š±¸¿»¹º­Â ÁŸ¼¯Ãµ¹ÂGlobal parametersQObject*‘³½¿·¼­½µÂ º±Ä±»®¾µ¹ÂIgnored endingsQObjectH•ÅÁµÄ®Á¹¿ ³¹± Ì»± ı ¿½Ì¼±Ä± ±Áǵ¯É½Index all file namesQObjectj•ÅÁµÄ®Á¹¿ ³¹± ı ¿½Ì¼±Ä± Äɽ ±Áǵ¯É½ Äɽ ¿À¿¯É½ Ä¿ ÀµÁ¹µÇ̼µ½¿ ´µ½ ­Çµ¹ ±½±³½ÉÁ¹Ãĵ¯ ® µÀµ¾µÁ³±Ãĵ¯ (ÇÉÁ¯Â ÄÍÀ¿ mime, ® ¼· ÅÀ¿ÃÄ·Á¹¶Ì¼µ½¿Â ÄÍÀ¿Â). — ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® µ¯½±¹ ±»·¸­Â}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"¤¿À¹º­Â ÁŸ¼¯Ãµ¹ÂLocal parametersQObject(¡Å¸¼¯Ãµ¹Â ±½±¶®Ä·Ã·ÂSearch parametersQObject"‘³½¿·¼­½± ¿½Ì¼±Ä± Skipped namesQObjectæ— »¯Ãı Äɽ ÅÀ¿º±Ä±»Ì³É½ Ä·Â ¶Î½·Â ¼µ µÅÁµÄ®Á¹¿<br>ÌÀ¿Å ­Ç¿Å½ ÀÁ¿º±¸¿Á¹Ãĵ¯ ¿Á¹Ã¼­½µÂ À±Á¬¼µÄÁ¿¹.  Á¿µÀ¹»¿³®: ºµ½Ì.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject|‘ÅÄ­ µ¯½±¹ º±Ä±»®¾µ¹ ±Áǵ¯É½ Ãı ¿À¿¯± · µÅÁµÄ·Á¯±Ã· ¸± ³¯½µ¹ ¼Ì½¿ ²¬Ãµ¹ ĿŠ¿½Ì¼±Ä¿ (ÇÉÁ¯ ÀÁ¿ÃÀ¬¸µ¹± ±½±³½ÎÁ¹Ã· Ä¿Å ÄÍÀ¿Å MIME, ÇÉÁ¯ ±À¿ÃżÀ¯µÃ·, ÇÉÁ¯ ´µ¹ºÄ¿´Ìķ÷ ĿŠÀµÁ¹µÇ¿¼­½¿Å).—These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing).QObject¤œ¿Ä¯²± À¿Å º±¸¿Á¯¶¿Å½ ı ±Áǵ¯± ® º±Ä±»Ì³¿Å À¿Å ´µ½ ¸± ÀÁ­Àµ¹ ½± ­Ç¿Å½ µÅÁµÄ®Á¹¿.LThese are patterns for file or directory names which should not be indexed.QObject™ÃÄ¿Á¹ºÌ ¹ÃÄ¿Í Web historyQObject†&½¿¹³¼±&OpenQWidgetN&†½¿¹³¼± Ŀг¿½¹º¿Í µ³³Á¬Æ¿Å/º±Ä±»Ì³¿Å&Open Parent document/folderQWidget& Á¿µÀ¹ÃºÌÀ·Ã·&PreviewQWidget$&•³³Á±Æ® õ ±Áǵ¯¿&Write to FileQWidget@‘´Í½±Ä· · µ¾±³É³® Ŀе³³Á¬Æ¿Å: Cannot extract document: QWidget6•À¹»­¾Äµ ¼Ì½¿ ­½±½ º±Ä¬»¿³¿Choose exactly one directoryQWidgetF‘½Ä¹³Á±Æ® ĿŠ¿½Ì¼±Ä¿ Ä¿Å ±&Áǵ¯¿ÅCopy &File NameQWidget$‘½Ä¹³Á±Æ® ĿŠ&URL Copy &URLQWidgetD‘´Í½±Ä· · ±½¬³½É÷ ĿŠº±Ä±»Ì³¿Å: Could not read directory: QWidget\”·¼¹¿ÅÁ³¯± ® µÀ¹»¿³® ĿŠº±Ä±»Ì³¿Å ±À¿¸®ºµÅ÷ÂCreate or choose save directoryQWidget:‘½±¶®Ä·Ã· À±ÁÌ&¼¿¹É½ µ³³Á¬ÆÉ½Find &similar documentsQWidgetF†½¿¹³¼± ĿŠÀ±Á±¸ÍÁ¿Å ±À¿&ÃÀ±Ã¼¬ÄɽOpen &Snippets windowQWidget†½¿¹³¼± ¼µ Open WithQWidgetZ Á¿µÀ¹ÃºÌÀ·Ã· ĿŠ&³¿½¹º¿Í µ³³Á¬Æ¿Å/º±Ä±»Ì³¿ÅPreview P&arent document/folderQWidget*•ºÄ­»µÃ· ¼±ºÁ¿µ½Ä¿»®Â Run ScriptQWidgetB‘À¿¸®ºµÅ÷ Ä· µÀ¹»¿³® Ãµ ±Áǵ¯±Save selection to filesQWidgetL•¼Æ¬½¹Ã· Äɽ ÅÀ¿-µ³³Á¬ÆÉ½ / ÃŽ·¼¼­½É½Show subdocuments / attachmentsQWidget`‘ÀÁ¿Ã´Ìº·Ä· ÃͳºÁ¿Å÷ ¿½¿¼¬Äɽ ±Áǵ¯É½, ±ºÍÁÉ÷.+Unexpected file name collision, cancelling.QWidget<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">— µÅÁµÄ·Á¯±Ã· ĿŠ<span style=" font-weight:600;">Recoll</span> ¼À¿Áµ¯ ½± ­Çµ¹ ÁŸ¼¹Ãĵ¯ ½± µºÄµ»µ¯Ä±¹ ÃÄ¿ À±Á±Ãº®½¹¿, µ½·¼µÁνɽı Ä¿ µÅÁµÄ®Á¹¿ Ãı´¹±º¬ º±Ä¬ Ä·½ ÄÁ¿À¿À¿¯·Ã· ĿбÁǵ¯¿Å. •ÀÉÆµ»µ¯Ãĵ ±ÀÌ ­½± µÅÁµÄ®Á¹¿ À¬½Ä± µ½·¼µÁɼ­½¿, ±»»¬ º±Ä±½±»Ì½É½Ä±¹ ÃŽ­Çµ¹± ÀÌÁ¿¹ ĿŠÃÅÃÄ®¼±Ä¿ (¼½®¼· º±¹ µÀµ¾µÁ³±ÃÄ®Â).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

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

RTIToolWZ•À¯Ã· ½± ³¯½µ¹ ­½±Á¾· Ä· µÅÁµÄ·Á¯±Ã· ÄÎÁ±.%Also start indexing daemon right now.RTIToolWޤ¿ ±Áǵ¯¿ autostart ´¹±³Á¬ÆÄ·ºµ. ¤µÁ¼±Ä¹Ã¼Ì Ä· ´¹µÁ³±Ã¯± Ãµ µ¾­»¹¾·;2Autostart file deleted. Kill current process too ?RTIToolW*‘´Å½±¼¯± ´·¼¹¿ÅÁ³¯±Â:Can't create: RTIToolWD‘´Å½±¼¯± µºÄ­»µÃ· Ä¿Å recollindexCould not execute recollindexRTIToolW(”¹±³Á±Æ® ĿбÁǵ¯¿Å Deleting fileRTIToolW”¹±³Á±Æ®: Deleting: RTIToolWX‘ÅÄ̼±Ä· ­½±Á¾· µÅÁµÄ·Á¯±Ã· Ãµ ÀÁ±³¼. ÇÁ̽¿"Real time indexing automatic startRTIToolW,‘Ʊ¯ÁµÃ· ĿŠautostartRemoving autostartRTIToolW2‘½Ä¹º±Ä¬Ãı÷ ĿбÁǵ¯¿ÅReplacing fileRTIToolW$‘½Ä¹º±Ä¬Ãı÷ Ä¿Å: Replacing: RTIToolWl•ºº¯½·Ã· ĿŠ´±¯¼¿½± µÅÁµÄ·Á¯±Ã· º±Ä¬ Ä· Ãͽ´µÃ® ¼¿Å..Start indexing daemon with my desktop session.RTIToolW Á¿Ã¿Ç®WarningRTIToolW"(Ì»µ ¿¹ ³»ÎÃõÂ)(all languages)RclMain (ÇÉÁ¯ µÀ­ºÄ±Ã·) (no stemming)RclMain(£ÇµÄ¹º¬ ¼µ Ä¿ Recoll About RecollRclMainŒ»±AllRclMainþš±º¿´¹±ÄÅÀɼ­½¿ ÀÁ¿Ã´¹¿Á¹Ã¼Ì µÆ±Á¼¿³® µÀ¹Æ¬½µ¹± µÁ³±Ã¯± ³¹± Ä¿ %1: [%2]  ±Á±º±»Î µ»­³¾Äµ Ä¿ ±Áǵ¯¿ Ä· µÀ¹Æ¬½µ¹± µÁ³±Ã¯±Â?Bad desktop app spec for %1: [%2] Please check the desktop fileRclMain”›±½¸±Ã¼­½· ³Á±¼¼® µ½Ä¿»® ³¹± %1: [%2]  ±Á±º±»Î µ»­³¾Äµ Ä¿ ±Áǵ¯¿ mimeviewCBad viewer command line for %1: [%2] Please check the mimeview fileRclMain<‘´Í½±Ä· · ÀÁÌò±Ã· ÃÄ¿ ±Áǵ¯¿:Can't access file: RclMainb‘´Í½±Ä· · ´·¼¹¿ÅÁ³¯± ĿŠÀ±Á±¸ÍÁ¿Å ÀÁ¿µÀ¹ÃºÌÀ·Ã·ÂCan't create preview windowRclMainF‘´Í½±Ä· · ±À¿ÃżÀ¯µÃ· ĿбÁǵ¯¿Å: Can't uncompress file: RclMain¢‘´Í½±Ä· · µ½·¼­ÁÉ÷ ĿеÅÁµÄ·Á¯¿Å: ¼¹± µÁ³±Ã¯± µÅÁµÄ·Á¯±Ã· ²Á¯ÃºµÄ±¹ õ µ¾­»¹¾·#Can't update index: indexer runningRclMainŠ‘´Í½±Ä· · µ¾±³É³® Ŀе³³Á¬Æ¿Å ® · ´·¼¹¿ÅÁ³¯± µ½Ì ÀÁ¿ÃÉÁ¹½¿Í ±Áǵ¯¿Å0Cannot extract document or create temporary fileRclMainJ‘´Í½±Ä· · µÍÁµÃ· Ŀг¿½¹º¿Í µ³³Á¬Æ¿ÅCannot find parent documentRclMainb‘´Í½±Ä· · ÀÁÌò±Ã· ÃÄ¿ ­³³Á±Æ¿ ÃÄ· ²¬Ã· ´µ´¿¼­½É½+Cannot retrieve document info from databaseRclMainDš¬½Äµ º»¹º ÃÄ¿ •½Ä¬¾µ¹ ³¹± ½± µ½·¼µÁÎõĵ Ä¿ µÅÁµÄ®Á¹¿ ³¹± ±ÅÄÌ Ä¿ ±Áǵ¯¿, ÃÄ· ÃŽ­Çµ¹± ¸± ÀÁ­Àµ¹ ½± µºÄµ»­ÃµÄµ µº ½­¿Å Ä¿ µÁÎÄ·¼± ¼µÄ Ä¿ À­Á± Ä· ´µ¹ºÄ¿´Ìķ÷Â.jClick Ok to update the index for this file, then you will need to re-run the query when indexing is done. RclMainš»µ¯Ã¹¼¿ClosingRclMain|¤¿ ÀµÁ¹µÇ̼µ½¿ ­Çµ¹ ´µ¹ºÄ¿´¿Ä·¸µ¯ ³¹± ±ÅĿ͠ĿŠÄÍÀ¿Å MIME:.Content has been indexed for these mime types:RclMainü‘´Í½±Ä¿ Ä¿ ¬½¿¹³¼± µ½Ì µ¾ÉĵÁ¹º¿Í µÅÁµÄ·Á¯¿Å. — ²¬Ã· ´µ´¿¼­½É½ ´µ½ µ¯½±¹ ±½¿¹ÇÄ®. •»­³¾Äµ Ä· »¯Ãı Äɽ µ¾ÉĵÁ¹ºÎ½ µÅÁµÄ·Á¯É½.HCould not open external index. Db not open. Check external indexes list.RclMain¦¯»ÄÁ¿ µ³³Á¬Æ¿ÅDocument filterRclMain@™ÃÄ¿Á¹ºÌ Äɽ ±½¿¹³¼­½É½ µ³³Á¬ÆÉ½Document historyRclMain ˆ³¹½µDoneRclMain"”¹À»ÌÄÅÀ± ­³³Á±Æ±Duplicate documentsRclMain.”¹±³Á±Æ® ĿеÅÁµÄ·Á¯¿Å Erasing indexRclMain £Æ¬»¼±ErrorRclMain•ºÄ­»µÃ· Ä¿Å: [ Executing: [RclMainf•¾ÉĵÁ¹º­ µÆ±Á¼¿³­ º±¹ µ½Ä¿»­ ±À±Á±¯Ä·Äµ ³¹± ĿŠÄÍÀ¿Å Äɽ µ³³Á¬ÆÉ½ ñÂ, º±¹ À¿Å ´µ½ ­Ç¿Å½ ²Áµ¸µ¯, ÌÀÉ ­Ç¿Å½ ı¾¹½¿¼·¸µ¯ ±ÀÌ Ä·½ ĵ»µÅı¯± ´µ¹ºÄ¿´Ìķ÷ À¿Å ­»±²µ ÇÎÁ± ÃĹ pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMain,”µ´¿¼­½± ĿйÃÄ¿Á¹º¿Í History dataRclMainö¤¿ µÅÁµÄ®Á¹¿ ´µ½ µ¯½±¹ µ½·¼µÁɼ­½¿ ³¹± ±ÅÄÌ Ä¿ ±Áǵ¯¿. †Á½·Ã· Ä· ´¹±º¹½´Å½µÅ¼­½· µ¼Æ¬½¹Ã· ¼¹± »±½¸±Ã¼­½· º±Ä±ÇÎÁ·Ã·Â. NIndex not up to date for this file. Refusing to risk showing the wrong entry. RclMainF£Æ¬»¼± ÃÄ·½ ±½±¶®Ä·Ã· ÃÄ¿ µÅÁµÄ®Á¹¿Index query errorRclMain.¤ÍÀ¿¹ MIME ¼µ µÅÁµÄ®Á¹¿Indexed MIME TypesRclMainN— ´µ¹ºÄ¿´Ìķ÷ ´µ½ ­Çµ¹ µºÄµ»µÃÄ® µºÌ¼±Indexing did not run yetRclMain*— µÅÁµÄ·Á¯±Ã· ±À­ÄÅǵIndexing failedRclMain0•ÅÁµÄ·Á¯±Ã· õ µ¾­»¹¾·: Indexing in progress: RclMain*— µÅÁµÄ·Á¯±Ã· ´¹µºÌÀ·Indexing interruptedRclMain*•ƱÁ¼¿³­ À¿Å »µ¯À¿Å½Missing helper programsRclMain ±Á±º¿»¿Í¸·Ã·MonitorRclMainbš±½­½± ÁŸ¼¹Ã¼­½¿ ÀÁ¿²¿»­± ³¹± Ä¿½ ÄÍÀ¿ MIME [-No external viewer configured for mime type [RclMain2”µ½ »µ¯Àµ¹ º±¼¹¬ µÆ±Á¼¿³®No helpers found missingRclMain2”µ½ ²Á­¸·º±½ ±À¿Äµ»­Ã¼±Ä±No results foundRclMain ¤¯À¿Ä±NoneRclMain𱏱Á¹Ã¼ÌÂPurgeRclMainÖ‘¯Ä·¼± õ µ¾­»¹¾·.<br>›Ì³É µÃÉĵÁ¹ºÎ½ ÀµÁ¹¿Á¹Ã¼Î½,<br>· ±ºÍÁÉ÷ ¸± ĵÁ¼±Ä¯Ãµ¹ Ä·½ µºÄ­»µÃ· ĿŠÀÁ¿³Á¬¼¼±Ä¿ÂeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain6‘À¿Äµ»­Ã¼±Ä± Ä· ±½±¶®Ä·Ã·Â Query resultsRclMainh”¹±³Á±Æ® ĿеÅÁµÄ·Á¯¿Å º±¹ µÀ±½­½±Á¾· ±ÀÌ Ä¿ ¼·´­½;(Reset the index and start from scratch ?RclMain<‘Á¹¸¼Ì ±À¿Äµ»µÃ¼¬Äɽ (µºÄ¯¼.)Result count (est.)RclMain,‘À¿¸®ºµÅ÷ ĿбÁǵ¯¿Å Save fileRclMain StemdbStemdbRclMain2”¹±º¿À® Ä· &µÅÁµÄ·Á¯±Ã·ÂStop &IndexingRclMain2¥À¿-­³³Á±Æ± º±¹ ÃŽ·¼¼­½±Sub-documents and attachmentsRclMainR— ´¹µÁ³±Ã¯± µÅÁµÄ·Á¯±Ã· Ãµ µ¾­»¹¾· ´µ½ ¾µº¯½·Ãµ ±ÀÌ ±ÅÄ® Ä· ´¹µÀ±Æ®. š¬½Äµ º»¹º ÃÄ¿ •½Ä¬¾µ¹ ³¹± ½± Ä· ú¿ÄÎõĵ ÌÀÉ º±¹ ½± 'ǵ¹, ® ÃÄ¿ ‘ºÍÁÉ÷ ³¹± ½± Ä·½ ±Æ®ÃµÄµ ®ÃÅÇ·yThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMaint¤± ÀÁ¬³¼±Ä± ¸± ²µ»Ä¹É¸¿Í½ ¼µÄ¬ Ä¿ À­Á± Ä· ´µ¹ºÄ¿´Ìķ÷Â.@The indexer is running so things should improve when it's done. RclMain⟠º±¸¿Á¹Ã¼­½¿ ÀÁ¿²¿»­± ÃÄ¿ mimeview ³¹± %1: %2 ´µ½ ²Á­¸·ºµ. ˜­»µÄµ ½± ¾µº¹½®ÃµÄµ Ä¿ ´¹¬»¿³¿ ¼µ Ĺ ÀÁ¿Ä¹¼®Ãµ¹Â;hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainl‘ÅĬ ı Url (| ipath) ¼¿¹Á¬¶¿½Ä±¹ Ä¿ ¯´¹¿ ÀµÁ¹µÇ̼µ½¿:-These Urls ( | ipath) share the same content:RclMain@— ±½±¶®Ä·Ã· ´µ½ µ¯½±¹ µ½µÁ³® À¹±"This search is not active any moreRclMain†³½ÉÃÄ¿UnknownRclMain2•½·¼­ÁÉ÷ ĿŠ&µÅÁµÄ·Á¯¿Å Update &IndexRclMain•½·¼­ÁÉ÷UpdatingRclMainÀ— ³Á±¼¼® µ½Ä¿»® ³¹± %1 º±¸¿Á¯¶µ¹ Ä·½ ¯´¹± ÃĹ³¼® Ä¿ ±Áǵ¯¿ º±¹ Ä¿½ ³¿½­± Ä¿Å: ´µ½ ÅÀ¿ÃÄ·Á¯¶µÄ±¹QViewer command line for %1 specifies both file and parent file value: unsupportedRclMain Á¿Ã¿Ç®WarningRclMain`ÃÆ¬»¼± ÃÄ· »®È· Ä· »¯Ãı Äɽ ³»ÉÃÃν µÀ­ºÄ±Ã·Â#error retrieving stemming languagesRclMainƹ»ÄÁ±Á¹Ã¼­½¿filteredRclMainÀ¿»Å¼­Ã±mediaRclMain ¼®½Å¼±messageRclMain¬»»±otherRclMainÀ±Á¿Åï±Ã· presentationRclMainı¾¹½¿¼·¼­½¿sortedRclMain»¿³¹ÃĹºÌ ÆÍ»»¿ spreadsheetRclMainºµ¯¼µ½¿textRclMainX  Á¿ÃÀ¬¸µ¹± µº ½­¿Å ¼µ ±À¿ÄÅÇ·¼­½± ±Áǵ¯± With failed files retrying RclMainBase*&£ÇµÄ¹º¬ ¼µ Ä¿ Recoll &About Recoll RclMainBase,& Á¿ÇÉÁ·¼­½· ±½±¶®Ä·Ã·&Advanced Search RclMainBase@&”¹±³Á±Æ® ĿйÃÄ¿Á¹º¿Í µ³³Á¬ÆÉ½&Erase document history RclMainBaseF”¹±&³Á±Æ® ĿйÃÄ¿Á¹º¿Í ±½±¶·Ä®ÃµÉ½&Erase search history RclMainBase&‘Áǵ¯¿&File RclMainBase &»®Á· ¿¸Ì½· &Full Screen RclMainBase2”¹±¼ÌÁÆÉ÷ & µÁ¹²¬»»¿½Ä¿Â&GUI configuration RclMainBase&’¿®¸µ¹±&Help RclMainBase,”¹±¼ÌÁÆÉ÷ &•ÅÁµÄ·Á¯¿Å&Index configuration RclMainBase& Á¿Ä¹¼®Ãµ¹Â &Preferences RclMainBase8‘&½±º±Ä±ÃºµÅ® ĿеÅÁµÄ·Á¯¿Å&Rebuild index RclMainBase‘À¿Äµ&»­Ã¼±Ä±&Results RclMainBase,&¡Å¸¼¯Ãµ¹ Ä±¾¹½Ì¼·Ã·Â&Sort parameters RclMainBase&•Á³±»µ¯±&Tools RclMainBase•&³Çµ¹Á¯´¹¿ &User manual RclMainBase* Á¿ÇÉÁ·¼­½· ±½±¶®Ä·Ã·Advanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase*™ÃÄ¿Á¹ºÌ Äɽ µ³³Á¬ÆÉ½Document History RclMainBase,&™ÃÄ¿Á¹ºÌ Äɽ µ³³Á¬ÆÉ½Document &History RclMainBaseˆ&¾¿´¿ÂE&xit RclMainBaseJ”¹±&¼ÌÁÆÉ÷ Äɽ µ¾ÉĵÁ¹ºÎ½ µÅÁµÄ·Á¯É½E&xternal index dialog RclMainBase&•¾ÉĵÁ¹º¬ µÅÁµÄ®Á¹±External index dialog RclMainBaseF11F11 RclMainBase ÁÎÄ· õ»¯´± First Page RclMainBase ÁÎÄ· õ»¯´± First page RclMainBase »®Á· ¿¸Ì½· Full Screen RclMainBasePœµÄ¬²±Ã· ÃÄ·½ ÀÁÎÄ· õ»¯´± ±À¿Äµ»µÃ¼¬ÄɽGo to first page of results RclMainBase•À̼µ½· õ»¯´± Next Page RclMainBase•À̼µ½· õ»¯´± Next page RclMainBase@•À̼µ½· õ»¯´± Äɽ ±À¿Äµ»µÃ¼¬ÄɽNext page of results RclMainBase€— µÀ̼µ½· µ½·¼­ÁÉ÷ ¸± µÀ¹Çµ¹Á®Ãµ¹ ¾±½¬ ¼µ ı ±À¿ÄÅÇ·¼­½± ±Áǵ¯±.Next update will retry previously failed files RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBase$ Á¿·³¿Í¼µ½· õ»¯´± Previous Page RclMainBase$ Á¿·³¿Í¼µ½· õ»¯´± Previous page RclMainBase@ Á¿·³¿Í¼µ½· õ»¯´± ±À¿Äµ»µÃ¼¬ÄɽPrevious page of results RclMainBase(˜Á±Íü±Ä± µÁÉÄ®¼±Ä¿ÂQuery Fragments RclMainBase RecollRecoll RclMainBaseR‘À¿¸®ºµÅ÷ É ±Áǵ¯¿ CVS (ÆÍ»»¿ µÁ³±Ã¯±Â)Save as CSV (spreadsheet) file RclMainBase¶‘À¿¸·ºµÍµ¹ Ä¿ ±À¿Ä­»µÃ¼± õ ­½± ±Áǵ¯¿ Ä¿ ¿À¿¯¿ ¼À¿Áµ¯Äµ ½± Æ¿ÁÄÎõĵ õ ­½± ÆÍ»»¿ µÁ³±Ã¯±Â@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift+PgUp Shift+PgUp RclMainBaseJ•¼Æ¬½¹Ã· Ä· ±½±¶®Ä·Ã· »µÀÄ¿¼µÁµ¹±º¬Show Query Details RclMainBase&•¼Æ¬½¹Ã· É À¯½±º±Â Show as table RclMainBasev•¼Æ¬½¹Ã· Äɽ ±À¿Äµ»µÃ¼¬Äɽ õ ­½±½ À¯½±º± É ÆÍ»»¿ µÁ³±Ã¯±Â(Show results in a spreadsheet-like table RclMainBaseV¤±¾¹½Ì¼·Ã· ±½¬ ·¼µÁ¿¼·½¯±, ı ½µÌĵÁ± ÀÁÎıSort by date, newest first RclMainBase\¤±¾¹½Ì¼·Ã· ±½¬ ·¼µÁ¿¼·½¯±, ı À±»±¹ÌĵÁ± ÀÁÎıSort by date, oldest first RclMainBasep¤±¾¹½Ì¼·Ã· ±½¬ ·¼µÁ¿¼·½¯± ±ÀÌ Ä· ½µÌĵÁ· ÃÄ·½ À±»±¹ÌĵÁ·#Sort by dates from newest to oldest RclMainBasep¤±¾¹½Ì¼·Ã· ±½¬ ·¼µÁ¿¼·½¯± ±ÀÌ Ä·½ À±»±¹ÌĵÁ· ÃÄ· ½µÌĵÁ·#Sort by dates from oldest to newest RclMainBase*¡Å¸¼¯Ãµ¹ Ä±¾¹½Ì¼·Ã·ÂSort parameters RclMainBase6•&¾µÁµÅ½·Ä® Ä¿Å µÅÁµÄ·Á¯¿ÅTerm &explorer RclMainBaseF•Á³±»µ¯¿ µ¾µÁµÍ½·Ã· Ä¿Å µÅÁµÄ·Á¯¿ÅTerm explorer tool RclMainBase*•&½·¼­ÁÉ÷ µÅÁµÄ·Á¯¿Å Update &index RclMainBase ˆ¾¿´¿ÂQuit RclTrayIcon•À±½±Æ¿Á¬Restore RclTrayIcon‘ÀÌÃÀ±Ã¼±Abstract RecollModel£Å³³Á±Æ­±ÂAuthor RecollModel—¼µÁ¿¼·½¯±Date RecollModel$—¼µÁ¿¼·½¯± º±¹ ÎÁ± Date and time RecollModel&—¼µÁ¿¼·½¯± µ³³Á¬Æ¿Å Document date RecollModel œ­³µ¸¿ µ³³Á¬Æ¿Å Document size RecollModel$—¼µÁ¿¼·½¯± ±Áǵ¯¿Å File date RecollModelŒ½¿¼± ±Áǵ¯¿Å File name RecollModelœ­³µ¸¿ ±Áǵ¯¿Å File size RecollModel IpathIpath RecollModel›­¾µ¹ º»µ¹´¹¬Keywords RecollModel¤ÍÀ¿ MIME MIME type RecollModel MtimeMtime RecollModel0‘ÁǹºÌ Ãͽ¿»¿ DZÁ±ºÄ®ÁɽOriginal character set RecollModel•³³ÍķıRelevancy rating RecollModel ¤¯Ä»¿ÂTitle RecollModelURLURL RecollModel(±¯Ä·¼±) (show query)ResList><p><b>š±½­½± ±À¿Ä­»µÃ¼±</b><br>

No results found
ResListd<p><i> Á¿Äµ¹½Ì¼µ½· ¿Á¸¿³Á±Æ¯± (ÇÉÁ¯Â Ä̽¿ÅÂ): </i>4

Alternate spellings (accents suppressed): ResList<<p><i>•½±»»±ºÄ¹º¬ »µ¾¹º¬: </i>

Alternate spellings: ResList@™ÃÄ¿Á¹ºÌ Äɽ ±½¿¹³¼­½É½ µ³³Á¬ÆÉ½Document historyResListˆ³³Á±Æ± DocumentsResList•À̼µ½¿NextResList†½¿¹³¼±OpenResList Á¿µÀ¹ÃºÌÀ·Ã·PreviewResList Á¿·³¿Í¼µ½¿PreviousResList6›µÀÄ¿¼­Áµ¹µ Ä· ±½±¶®Ä·Ã·Â Query detailsResList<‘Á¹¸¼Ì ±À¿Äµ»µÃ¼¬Äɽ (µºÄ¯¼.)Result count (est.)ResList&›¯Ãı ±À¿Äµ»µÃ¼¬Äɽ Result listResList‘À¿ÃÀ¬Ã¼±Ä±SnippetsResList(œ· ´¹±¸­Ã¹¼¿ ­³³Á±Æ¿Unavailable documentResList³¹±forResList±ÀÌ Ä¿Å»¬Ç¹ÃÄ¿½out of at leastResList(&‘Ʊ¯ÁµÃ· Ä· ÃÄ®»·Â&Delete columnResTable4&•À±½±Æ¿Á¬ Ä· Ä±¾¹½Ì¼·Ã·Â &Reset sortResTable$&‘À¿¸®ºµÅ÷ É CSV &Save as CSVResTable2 Á¿Ã¸®º· ¼¹± ÃÄ®»· «%1»Add "%1" columnResTableT‘´Í½±Ä¿ Ä¿ ¬½¿¹³¼±/´·¼¹¿ÅÁ³¯± ĿбÁǵ¯¿Å:Can't open/create file: ResTable8‘À¿¸®ºµÅ÷ õ ­½± ±Áǵ¯¿ CSVSave table to CSV fileResTableŒ»¿¹ ¿¹ ÌÁ¿¹ All termsSSearch"ŸÀ¿¹¿Ã´®À¿Äµ ÌÁ¿ÂAny termSSearch0œ· ±½±³½ÉÁ¹Ã¼­½¿ µÁÎÄ·¼±Bad query stringSSearchˆ•¹Ã¬³µÄµ ­½± ̽¿¼± ±Áǵ¯¿Å (µÀ¹ÄÁ­À¿½Ä±¹ º±¹ Ãͼ²¿»± ÅÀ¿º±Ä¬Ãı÷Â).$Enter file name wildcard expression.SSearch~•¹Ã±³É³® ­ºÆÁ±Ã· ³»ÎÃñ µÁÉÄ®¼±Ä¿Â. «£º¿½¬º¹»:<br> <i>ÌÁ¿Â1 ÌÁ¿Â2</i> : 'ÌÁ¿Â1' º±¹ 'ÌÁ¿Â2' õ ¿À¿¹¿´®À¿Äµ Àµ´¯¿.<br> <i>Àµ´¯¿:ÌÁ¿Â1</i> : 'ÌÁ¿Â1' ÃÄ¿ Àµ´¯¿ 'Àµ´¯¿'.<br> ¤ÅÀ¹ºÌ Àµ´¯¿ ¿½Ì¼±Ä±/ÃŽνż±:<br> įĻ¿Â/¸­¼±/ÅÀ̼½·¼±, Ãų³Á±Æ­±Â/±ÀÌ, À±Á±»®ÀÄ·Â/ÀÁ¿Â, ̽¿¼± ±Áǵ¯¿Å, µÀ­ºÄ±Ã·.<br> ¨µÅ´¿-Àµ´¯±: º±Ä¬»¿³¿Â, mime/¼¿ÁÆ®, ÄÍÀ¿Â/rclcat, ·¼µÁ¿¼·½¯±, ¼­³µ¸¿Â.<br>  ±Á±´µ¯³¼±Ä± ´Å¿ ´¹±ÃÄ·¼¬Äɽ ·¼µÁ¿¼·½¹Î½: 2009-03-01/2009-05-20 2009-03-01/ 2œ.<br> <i>ÌÁ¿Â1 ÌÁ¿Â2 OR ÌÁ¿Â3</i> : ÌÁ¿Â1 AND (ÌÁ¿Â2 OR ÌÁ¿Â3).<br> œÀ¿Áµ¯Äµ ½± ÇÁ·Ã¹¼¿À¿¹µ¯Äµ À±Áµ½¸­Ãµ¹ ³¹± À¹¿ µÅ±½¬³½ÉÃĵ µºÆÁ¬Ãµ¹Â.<br> <i>"ÌÁ¿Â1 ÌÁ¿Â2"</i> : ÆÁ¬Ã· (ÀÁ­Àµ¹ ½± ±½Ä¹ÃÄ¿¹Çµ¯ ±ºÁ¹²ÎÂ).  ¹¸±½¿¯ ÄÁ¿À¿À¿¹·Ä­Â:<br> <i>"ÌÁ¿Â1 ÌÁ¿Â2"p</i> : ±Ä±¾¹½Ì¼·Ä· º±¹ º±Ä¬ ÀÁ¿Ã­³³¹Ã· ±½±¶®Ä·Ã· ¼µ ÀÁ¿º±¸¿Á¹Ã¼­½· ±ÀÌÃı÷.<br> §Á·Ã¹¼¿À¿¹®Ãĵ Ä¿½ ´µÃ¼Ì <b>•¼Æ¬½¹Ã· µÁÉÄ®¼±Ä¿Â</b> õ ÀµÁ¯ÀÄÉ÷ ±¼Æ¹²¿»¯± ÃǵĹº¬ ¼µ Ä¿ ±À¿Ä­»µÃ¼± º±¹ ±½±ÄÁ­¾Äµ ÃÄ¿ µ³Çµ¹Á¯´¹¿ ÇÁ®Ã· (&lt;F1>) ³¹± ÀµÁ¹ÃÃÌĵÁµ »µÀÄ¿¼­Áµ¹µÂ. Enter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date, size.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
You can use parentheses to make things clearer.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearch앹쳵ĵ µ´Î ĿŠÌÁ¿Å Ä· ±½±¶®Ä·Ã·Â.  ±Ä®Ãĵ ESC SPC ³¹± ½± µ¼Æ±½¯ÃµÄµ Ĺ »­¾µ¹ À¿Å ±Áǯ¶¿Å½ ¼µ Ä¿½ ÄÁ­Ç¿½Ä± ÌÁ¿.FEnter search terms here. Type ESC SPC for completions of current term.SSearchŒ½¿¼± ±Áǵ¯¿Å File nameSSearch6”µ½ ÅÀ¬Áǵ¹ ´¹±¸­Ã¹¼· ¼½®¼· Out of memorySSearch"“»ÎÃñ µÁÉÄ·¼¬ÄɽQuery languageSSearch:•À¹»¿³® ĿŠÄÍÀ¿Å ±½±¶®Ä·Ã·Â.Choose search type. SSearchBase𱏱Á¹Ã¼ÌÂClear SSearchBase Ctrl+SCtrl+S SSearchBase敹쳵ĵ µ´Î ĿŠÌÁ¿Å ±½±¶®Ä·Ã·Â.  ±Ä®Ãĵ ESC SPC ³¹± ½± µ¼Æ±½¯ÃµÄµ Ĺ »­¾µ¹ À¿Å ±Áǯ¶¿Å½ ±ÀÌ Ä¿½ ÄÁ­Ç¿½Ä± ÌÁ¿.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase4𱏱Á¹Ã¼Ì Ä· º±Ä±ÇÎÁ·Ã·ÂErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase‘½±¶®Ä·Ã·Search SSearchBase*ˆ½±Á¾· Ä· ±½±¶®Ä·Ã·Â Start query SSearchBaseŒ»±All SearchClauseWŸÀ¿¹¿´®À¿ÄµAny SearchClauseW"Œ½¿¼± ĿбÁǵ¯¿Å File name SearchClauseW§ÉÁ¯ Àµ´¯¿No field SearchClauseW š±½­½±None SearchClauseW¨‘Á¹¸¼Ì Äɽ µÀ¹ÀÁÌøµÄɽ »­¾µÉ½ À¿Å ¼À¿Á¿Í½ ½± ²Áµ¸¿Í½ ¼µÄ±¾Í Äɽ ±½±¶·Ä·¸­½Äɽ ÌÁɽHNumber of additional words that may be interspersed with the chosen ones SearchClauseW ¦Á¬Ã·Phrase SearchClauseW•³³Íķı Proximity SearchClauseWŠ•À¹»­¾Äµ Ä¿½ ÄÍÀ¿ ĿеÁÉÄ®¼±Ä¿ À¿Å ¸± ÀÁ±³¼±Ä¿À¿¹·¸µ¯ ¼µ Ĺ »­¾µ¹Â>Select the type of query that will be performed with the words SearchClauseW•ÍÁµÃ·:Find:Snippets•À̼µ½¿NextSnippets Á¿·³¿Í¼µ½¿PrevSnippets‘À¿ÃÀ¬Ã¼±Ä±SnippetsSnippets<<p>›ÅÀ¬¼±¹, ´µ½ ²Á­¸·ºµ ¼¹± ±ºÁ¹²® ±½Ä¹ÃÄ¿¹Ç¯± µ½ÄÌ ¿Á¯É½.  ¹¸±½Î Ä¿ ­³³Á±Æ¿ ½± µ¯½±¹ ¿³ºÎ´µ º±¹ ¿ ´·¼¹¿ÅÁ³Ì ±À¿ÃÀ±Ã¼¬Äɽ Ǭ¸·ºµ õ ­½±½ »±²ÍÁ¹½¸¿...</p>ˆ

Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...

 SnippetsW‘½±¶®Ä·Ã·Search SnippetsW µÁ¹®³·Ã·BrowseSpecIdxW&š»µ¯Ã¹¼¿&Close SpellBase&‘½¬ÀÄž·&Expand  SpellBase ¤Ì½¿¹Accents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase µ¶¬/ºµÆ±»±¯±Case SpellBase¤±¯Á¹±Ã¼±Match SpellBase^”µ½ ÅÀ¬ÁǿŽ À»·Á¿Æ¿Á¯µ ³¹± Ä· ²¬Ã· ´µ´¿¼­½É½. No db info. SpellBase •¾µÁµÅ½·Ä® ÌÁɽ Term Explorer SpellBase%1 ±À¿Äµ»­Ã¼±Ä± %1 resultsSpellW6œ­Ã¿ ÌÁ¿ ÌÁɽ ±½¬ ­³³Á±Æ¿Average terms per documentSpellWBœ­³µ¸¿ º±Ä±»Ì³¿Å ²¬Ã· ´µ´¿¼­½É½Database directory sizeSpellWDoc. / Tot. Doc. / Tot.SpellWr•ÅÁµÄ®Á¹¿: %1 ­³³Á±Æ±, ¼­Ã¿ ¼®º¿ %2 ÌÁ¿¹.%3 ±À¿Äµ»­Ã¼±Ä±7Index: %1 documents, average length %2 terms.%3 resultsSpellW‘½Ä¹ºµ¯¼µ½¿ItemSpellW\— »¯Ãı ­Çµ¹ º¿Àµ¯ ±»Æ±²·Ä¹º¬, ¼µÁ¹º¿¯ ÃÅǽ¿¯ 1List was truncated alphabetically, some frequent SpellW¤ÍÀ¿¹ MIME: MIME types:SpellW"š±½­½± ±À¿Ä­»µÃ¼±No expansion foundSpellW ‘Á¹¸¼Ì µ³³Á¬ÆÉ½Number of documentsSpellW š±½¿½¹º® ­ºÆÁ±Ã·RegexpSpellWF•¼Æ¬½¹Ã· ÃıĹÃĹºÎ½ ĿеÅÁµÄ·Á¯¿ÅShow index statisticsSpellW&ŸÁ¸¿³Á±Æ¯±/¦É½·Ä¹ºÌSpelling/PhoneticSpellW&“Á±¼¼±Ä¹º® µÀ­ºÄ±Ã·Stem expansionSpellWŒÁ¿ÂTermSpellW¤¹¼®ValueSpellW0§±Á±ºÄ®Áµ ÅÀ¿º±Ä¬Ãı÷ WildcardsSpellWRÃÆ¬»¼± º±Ä¬ Ä· »®È· Äɽ ³»ÉÃÃν µÀ­ºÄ±Ã·Â#error retrieving stemming languagesSpellW–ÌÁ¿¹ ¼À¿Áµ¯ ½± »µ¯À¿Å½.  Á¿ÃÀ±¸®Ãĵ ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ ¼¹± À¹¿ ¼±ºÁ¹¬ Á¯¶±..terms may be missing. Try using a longer root.SpellWŒ»¿¹ ¿¹ ÌÁ¿¹ All terms UIPrefsDialog"ŸÀ¿¹¿Ã´®À¿Äµ ÌÁ¿ÂAny term UIPrefsDialog`ˆ½± ÀµÁ¹ÃÃÌĵÁ¿ µÅÁµÄ®Á¹¿ ¸± ÀÁ­Àµ¹ ½± µÀ¹»µÇ¸µ¯$At most one index should be selected UIPrefsDialogÆ‘´Í½±Ä· · ÀÁ¿Ã¸®º· µÅÁµÄ·Á¯¿Å ¼µ ´¹±Æ¿ÁµÄ¹º­ µÀ¹»¿³­ ´¹¬ºÁ¹Ã· Àµ¶Î½ / ºµÆ±»±¯É½ º±¹ ±À¿ÃÀ±Ã¼¬Äɽ>Cant add index with different case/diacritics stripping option UIPrefsDialog•À¹»­¾ÄµChoose UIPrefsDialogB“Á±¼¼±Ä¿Ãµ¹Á¬ µ¾ ¿Á¹Ã¼¿Í QtWebkitDefault QtWebkit font UIPrefsDialog"“»ÎÃñ µÁÉÄ·¼¬ÄɽQuery language UIPrefsDialogv•À¹ºµÆ±»¯´± »¯Ãı ±À¿Äµ»µÃ¼¬Äɽ (· µ¾' ¿Á¹Ã¼¿Í µ¯½±¹ ºµ½®)%Result list header (default is empty) UIPrefsDialog¨œ¿ÁÆ® »¯Ãı À±Á±³Á¬Æ¿Å ±À¿Äµ»µÃ¼¬Äɽ (´¹±³Á±Æ® ̻ɽ ³¹± µÀ±½±Æ¿Á¬ ÃÄ·½ µ¾' ¿Á¹Ã¼¿Í)­µ Ä¹¼­Â:</b>New Values:ViewActionBaseX•½­Á³µ¹± (ºµ½Ì -> ÀÁ¿º±¸¿Á¹Ã¼­½· ĿŠrecoll) Action (empty -> recoll default)ViewActionBase<•ƱÁ¼¿³® ÃÄ·½ ÄÁ­Ç¿Åñ µÀ¹»¿³®Apply to current selectionViewActionBaseš»µ¯Ã¹¼¿CloseViewActionBaseX•¾±¯ÁµÃ· Äɽ ÀÁ¿Ä¹¼®ÃµÉ½ •À¹Æ¬½µ¹± µÁ³±Ã¯±Â Exception to Desktop preferencesViewActionBase*•ƱÁ¼¿³­ ±Àµ¹ºÌ½¹Ã·ÂNative ViewersViewActionBase •½­Á³µ¹± Recoll:Recoll action:ViewActionBase:•À¹»­¾Äµ ­½±½ ¿¹ ÀµÁ¹ÃÃÌĵÁ¿Å ÄÍÀ¿Å ±Áǵ¯É½, º±¹ ÃÄ· ÃŽ­Çµ¹± ÇÁ·Ã¹¼¿À¿¹®Ãĵ ı º¿Å¼À¹¬ µ»­³Ç¿Å ÃÄ¿ À±Á±º¬ÄÉ À»±¯Ã¹¿ ³¹± ½± ±»»¬¾µÄµ Ä¿½ ÄÁÌÀ¿ µÀµ¾µÁ³±Ã¯±ÂkSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseH•À¹»­¾Äµ ­½±½ ¿¹ ÀµÁ¹ÃÃÌĵÁ¿Å ÄÍÀ¿Å ±Áǵ¯É½, º±¹ ÃÄ· ÃŽ­Çµ¹± ÇÁ·Ã¹¼¿À¿¹®Ãĵ ı º¿Å¼À¹¬ µ»­³Ç¿Å ÃÄ¿ À»±¯Ã¹¿ ÃÄ¿ º¬ÄÉ ¼­Á¿ ³¹± ½± ±»»¬¾µÄµ Ä¿½ ÄÁÌÀ¿ µÀµ¾µÁ³±Ã¯±Â.lSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBase •À¹»¿³® ±½¬ Ĺ¼® Select sameViewActionBaser§Á®Ã· µ¾' ¿Á¹Ã¼¿Í Äɽ ÀÁ¿Ä¹¼®ÃµÉ½ Ä· •À¹Æ¬½µ¹± µÁ³±Ã¯±Â"Use Desktop preferences by defaultViewActionBaseÄÁ­Ç¿Åñ Ĺ¼® current valueViewActionBase•½µÁ³¿À¿¹µ¯ Ä· ´µ¹ºÄ¿´Ìķ÷ Äɽ µÀ¹ÃºµÀÄ̼µ½É½ õ»¯´É½ ÃÄ¿½ Firefox.<br>(¸± ÀÁ­Àµ¹ ½± µ³º±Ä±ÃĮõĵ º±¹ Ä¿ ÀÁÌøµÄ¿ Firefox Recoll)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelW\œ­³. ¼­³µ¸¿ Ä· »±½¸¬½¿Åñ ¼½®¼· ¹ÃÄ¿Í (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelWR•Àµ¾µÁ³±Ã¯± Ä· ¿ÅÁ¬ ¹ÃÄ¿Á¹º¿Í ĿŠ™ÃÄ¿ÍProcess the WEB history queueconfgui::ConfBeaglePanelW¤¿ ̽¿¼± ĿŠº±Ä±»Ì³¿Å ±À¿¸®ºµÅ÷ ±½Ä¹³Á¬ÆÉ½ Äɽ µÀ¹ÃºµÆ¸­½Äɽ ¹ÃĿõ»¯´É½.<br>œ¹± ÃǵĹº® ´¹±´Á¿¼® ±½±ÆµÁ̼µ½· ÃÄ· ´¹±´Á¿¼® ´¹±¼ÌÁÆÉ÷Â.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWNŒ½¿¼± º±Ä±»Ì³¿Å ±À¿¸®ºµÅ÷ ¹ÃĿõ»¯´É½Web page store directory nameconfgui::ConfBeaglePanelWR‘´Í½±Ä· · µ³³Á±Æ® ĿбÁǵ¯¿Å ´¹±¼ÌÁÆÉ÷ÂCan't write configuration fileconfgui::ConfIndexW•À¹»­¾ÄµChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWP<p>‘ÅÄ̼±Ä· µ½±»»±³® µÅ±¹Ã¸·Ã¯± ´¹¬ºÁ¹Ã· Àµ¶Î½/ºµÆ±»±¯É½ ±½ · ¿ ÌÁ¿ ±½±¶®Ä·Ã· ´¹±¸­Äµ¹ ºµÆ±»±¯± ³Á¬¼¼±Ä± (µºÄ̠ĿŠÀÁÎĿгÁ¬¼¼±Ä¿Â). ”¹±Æ¿ÁµÄ¹º¬ ¸± ÀÁ­Àµ¹ ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ Ä· ³»ÎÃñ Ä· ±½±¶®Ä·Ã· º±¹ Ä¿½ ÄÁ¿À¿À¿¹·Ä® <i>C</i> ³¹± Ä¿½ º±¸¿Á¹Ã¼Ì Ä· µÅ±¹Ã¸·Ã¯± ´¹¬ºÁ¹Ã· Àµ¶Î½ / ºµÆ±»±¯É½.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelW<p>‘ÅÄ̼±Ä· µ½±»»±³® µÅ±¹Ã¸·Ã¯±Â Ä¿½¹Ã¼¿Í ±½ ¿ ÌÁ¿Â ±½±¶®Ä·Ã·Â ´¹±¸­Äµ¹ Ä¿½¹Ã¼­½¿Å DZÁ±ºÄ®ÁµÂ (µºÄÌ ±ÅÄν ĿŠunac_except_trans). ”¹±Æ¿ÁµÄ¹º¬ ¸± ÀÁ­Àµ¹ ½± ÇÁ·Ã¹¼¿À¿¹®ÃµÄµ Ä· ³»ÎÃñ Ä·Â ±½±¶®Ä·Ã·Â º±¹ Ä¿½ ÄÁ¿À¿À¿¹·Ä® <i>D</i> ³¹± Ä¿½ º±¸¿Á¹Ã¼Ì Ä·Â µÅ±¹Ã¸·Ã¯±Â Ä¿½¹Ã¼Î½.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelWà<p>œ­³¹ÃÄ¿ ±Á¹¸¼Ì µÀ­ºÄ±Ã· ³¹± ­½±½ ÌÁ¿ (À.Ç.: º±Ä¬ Ä· ÇÁ®Ã· DZÁ±ºÄ®Áɽ ÅÀ¿º±Ä¬Ãı÷Â). — ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® 10000 µ¯½±¹ »¿³¹º® º±¹ ¸± ±À¿ÆÍ³µ¹ µÁÉÄ®¼±Ä± À¿Å µ¼Æ±½¯¶¿½Ä±¹ ñ½ À±³É¼­½± Ä·½ ¯´¹± ÃĹ³¼® À¿Å · ¼·Ç±½® ´¹±ÀµÁ½¬ Ä· »¯Ãı ÌÁɽ.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelW|<p>œ­³¹ÃÄ¿ ±Á¹¸¼Ì ÃÄ¿¹Çµ¹É´Î½ Á·ÄÁν À¿Å ÀÁ¿Ã¸­Ä¿Å¼µ õ ­½± ±À»Ì µÁÎÄ·¼± Xapian. £µ ¼µÁ¹º­ ÀµÁ¹ÀÄÎõ¹Â, Ä¿ ±À¿Ä­»µÃ¼± Ä· µÀ­ºÄ±Ã· Äɽ ÌÁɽ ¼À¿Áµ¯ ½± µ¯½±¹ À¿»»±À»±Ã¹±ÃĹºÌ, º±¹ ¸± ÇÁ·Ã¹¼¿À¿¹¿Íõ ÅÀµÁ²¿»¹º® ¼½®¼·. — ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® 100000 ¸± ÀÁ­Àµ¹ ½± µ¯½±¹ µÀ±Áº® º±¹ Ãż²±Ä® ¼µ ¼¹± ÄÅÀ¹º® ´¹±¼ÌÁÆÉ÷ Å»¹º¿Í.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWF‘ÅÄ̼±Ä· µÅ±¹Ã¸·Ã¯± Àµ¶Î½/ºµÆ±»±¯É½$Automatic character case sensitivityconfgui::ConfSearchPanelW@‘ÅÄ̼±Ä· µÅ±¹Ã¸·Ã¯± ÃĿŠÄ̽¿Å Automatic diacritics sensitivityconfgui::ConfSearchPanelW>œ­³¹ÃÄ¿ ±Á¹¸¼Ì Á·ÄÁν Xapian Maximum Xapian clauses countconfgui::ConfSearchPanelWFœ­³¹ÃÄ¿ ¼­³µ¸¿ µÀ­ºÄ±Ã· µ½Ì ÌÁ¿ÅMaximum term expansion countconfgui::ConfSearchPanelW蜹± ±À¿º»µ¹ÃĹº® »¯Ãı ´µ¹ºÄ¿´¿Ä·¼­½É½ ÄÍÀɽ mime.<br>”µ½ ¸± ´µ¹ºÄ¿´¿Ä·¸µ¯ įÀ¿Ä± ¬»»¿. ¦Åù¿»¿³¹º¬ ºµ½Ì º±¹ ±´Á±½­ÂeAn exclusive list of indexed mime types.
Nothing else will be indexed. Normally empty and inactiveconfgui::ConfSubPanelW2‘À¿º»µ¹Ã¼Ì ÄÍÀɽ ±Áǵ¯É½Exclude mime typesconfgui::ConfSubPanelWÀ¤± µ¾ÉĵÁ¹º¬ Ư»ÄÁ± õ »µ¹Ä¿ÅÁ³¯± ¼µ³±»ÍĵÁ· ±ÀÌ ±ÅÄÌ ¸± ´¹±ºÌÀÄ¿½Ä±¹. §Á®Ã¹¼¿ ³¹± Ä· ÃÀ¬½¹± ÀµÁ¯ÀÄÉ÷ (À.Ç. postscript) ÌÀ¿Å ­½± ­³³Á±Æ¿ ¼À¿Áµ¯ ½± ÀÁ¿º±»­Ãµ¹ ­½± ²Á̳ǿ ÃÄ¿ Ư»ÄÁ¿. ŸÁ¯Ãĵ Ä¿ õ -1 ³¹± ½± ±Æ±¹Á­ÃµÄµ Ä¿ ÌÁ¹¿.­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW “µ½¹º¬Globalconfgui::ConfSubPanelWØ‘½ ±ÅÄ® · Ĺ¼® ­Çµ¹ ¿Á¹Ãĵ¯ º±¹ µ¯½±¹ ¸µÄ¹º®, ı ±Áǵ¯± ºµ¹¼­½¿Å ¸± º¿À¿Í½ õ º¿¼¼¬Ä¹± ±ÅÄ¿Í Ä¿Å ¼µ³­¸¿Å ³¹± Ä·½ µÅÁµÄ·Á¯±Ã·. ‘ÅÄÌ ²¿·¸¬ ÃÄ· ¼µ¯É÷ Äɽ º±Ä±½±»É¼­½É½ ÀÌÁɽ ±ÀÌ Ä·½ µÅÁµÄ·Á¯±Ã· º±¹ ²¿·¸¬ Ä· ÆÌÁÄÉ÷ ³¹± Ä·½ ÀÁ¿µÀ¹ÃºÌÀ·Ã·.¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWTœµ³.¼­³µ¸¿ ³¹± ı ÃżÀ¹µÃ¼­½± ±Áǵ¯± (KB)Max. compressed file size (KB)confgui::ConfSubPanelWPœµ³. ÇÁ̽¿ µºÄ­»µÃ· ³¹± ­½± Ư»ÄÁ¿ (S)Max. filter exec. time (S)confgui::ConfSubPanelWDœµ³. ¼­³µ¸¿ ±Áǵ¯É½ ºµ¹¼­½¿Å (MB)Max. text file size (MB)confgui::ConfSubPanelWNŸ¹ ÄÍÀ¿¹ Mime À¿Å ´µ½ ¸± ´µ¹ºÄ¿´¿Ä·¸¿Í½Mime types not to be indexedconfgui::ConfSubPanelW$œÌ½¿ ¿¹ ÄÍÀ¿¹ MIMEOnly mime typesconfgui::ConfSubPanelWRœ­³µ¸¿ º¿À® ³¹± ı ±Áǵ¯± ºµ¹¼­½¿Å (KB)Text file page size (KB)confgui::ConfSubPanelWd‘ÅÄ® · Ĺ¼® º±¸¿Á¯¶µ¹ ­½± ÌÁ¹¿ À­Á±½ ĿŠ¿À¿¯¿Å ı ÃżÀ¹µÃ¼­½± ±Áǵ¯± ´µ½ ¸± µÀµ¾µÁ³¬¶¿½Ä±¹. §Á·Ã¹¼¿À¿¹®Ãĵ -1 ³¹± º±½­½± ÌÁ¹¿, 0 ³¹± ½± ¼·½ µÀµ¾µÁ³¬¶¿½Ä±¹ ı ÃżÀ¹µÃ¼­½± ±Áǵ¯±.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelWž‘ÅÄ® · Ĺ¼® ¿Á¯¶µ¹ ­½± ÌÁ¹¿ À­Á±½ ĿŠ¿À¿¯¿Å ´µ½ ¸± ³¯½µÄ±¹ µÅÁµÄ·Á¯±Ã· ³¹± ı ±Áǵ¯± ºµ¹¼­½¿Å. ŸÁ¯Ãĵ -1 ³¹± º±½­½± ÌÁ¹¿. ‘ÅÄÌ ÇÁ·Ã¹¼µÍµ¹ ³¹± Ä¿½ ±À¿º»µ¹Ã¼Ì ±ÀÌ Ä·½ µÅÁµÄ·Á¯±Ã· ĵÁ¬ÃĹɽ ±Áǵ¯É½ º±Ä±³Á±ÆÎ½.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWj<p>‘ÅÄ­ µ¯½±¹ µ¾±¹Á­Ãµ¹ ³¹± Ä¿½ ¼·Ç±½¹Ã¼Ì unac, ¿ ¿À¿¯¿ µ¾' ¿Á¹Ã¼¿Í, ±Æ±¹Áµ¯ Ì»¿Å Ä¿Å Ä¿½¹Ã¼¿ÍÂ, º±¹ ÀÁ±³¼±Ä¿À¿¹µ¯ º±½¿½¹º® ±À¿Ãͽ¸µÃ·. œÀ¿Áµ¯Äµ ½± ±½±¹Á­ÃµÄµ Ä·½ ±Æ±¯ÁµÃ· Äɽ Ä¿½¹Ã¼Î½ ³¹± ¿Á¹Ã¼­½¿Å Ç±Á±ºÄ®ÁµÂ, ±½¬»¿³± ¼µ Ä· ³»ÎÃñ ñÂ, º±¹ ´¹µÅºÁ¹½¯Ãĵ ¬»»¿Å ±À¿Ãޏ­Ãµ¹Â, ³¹± À±Á¬´µ¹³¼± ÃżÀ»µ³¼­½¿Å Ç±Á±ºÄ®ÁµÂ. £Ä· »¯Ãı ´¹±ÇÉÁ¹Ã¼­½· ¼µ ºµ½¬, ¿ ÀÁÎÄ¿ Ç±Á±ºÄ®Á± µ½Ì ±½Ä¹ºµ¹¼­½¿Å µ¯½±¹ · À·³®, Ä¿ ÅÀÌ»¿¹À¿ µ¯½±¹ · ¼µÄ¬ÆÁ±Ã·.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelW"“»ÎÃñ ĿŠaspellAspell languageconfgui::ConfTopPanelWHš±Ä¬»¿³¿Â ±À¿¸®ºµÅ÷ ĿеÅÁµÄ·Á¯¿ÅDatabase directory nameconfgui::ConfTopPanelW*‘Àµ½µÁ³¿À¿¹µ¯ Ä· ÇÁ®Ã· ĿŠaspell ³¹± Ä· ´·¼¹¿ÅÁ³¯± Äɽ ¿Á¸¿³Á±Æ¹ºÎ½ ÀÁ¿Ãµ³³¯ÃµÉ½.<br>§Á®Ã¹¼¿ ±½ Ä¿ aspell ´µ½ µ¯½±¹ µ³º±ÄµÃÄ·¼­½¿ ® ´µ½ »µ¹Ä¿ÅÁ³µ¯. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW^š±¸ÅÃÄ­Á·Ã· µ³³Á±Æ® Ä¿Å µÅÁµÄ·Á¯¿Å õ megabyteIndex flush megabytes intervalconfgui::ConfTopPanelW8Œ½¿¼± ĿбÁǵ¯¿Å º±Ä±³Á±ÆÎ½ Log file nameconfgui::ConfTopPanelW>•À¯Àµ´¿ ±½¬»Å÷ Äɽ º±Ä±³Á±ÆÎ½Log verbosity levelconfgui::ConfTopPanelW,§ÉÁ¯ ÇÁ®Ã· ĿŠaspellNo aspell usageconfgui::ConfTopPanelW0 ±Á±»µ¹À̼µ½µ ´¹±´Á¿¼­Â Skipped pathsconfgui::ConfTopPanelW@“»ÎÃñ ³¹± Ä·½ µÀ­ºÄ±Ã· Äɽ ÌÁɽStemming languagesconfgui::ConfTopPanelW¶¤¿ ±Áǵ¯¿ À¿Å ¸± µ³³Á±Æ¿Í½ ı ¼·½Í¼±Ä±.<br>§Á·Ã¹¼¿À¿¹®Ãĵ 'stderr' ³¹± Ä·½ ­¾¿´¿ ĵÁ¼±Ä¹º¿ÍPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWÄ— ³»ÎÃñ ³¹± Ä¿ »µ¾¹ºÌ aspell. ‘ÅÄÌ ¸± ÀÁ­Àµ¹ ½± µ¯½±¹ ĿŠÄÍÀ¿Å «en» ® «el» ...<br> ‘½ ±ÅÄ® · Ĺ¼® ´µ½ ¿Á¹Ãĵ¯, ÇÁ·Ã¹¼¿À¿¹µ¯Ä±¹ Ä¿ µ¸½¹ºÌ ÀµÁ¹²¬»»¿½ NLS ³¹± ½± Ä·½ ÅÀ¿»¿³¯Ãµ¹, À¿Å ÃŽ®¸É ´¿Å»µÍµ¹. “¹± ½± À¬ÁµÄµ ¼¹± ¹´­± ĿŠĹ µ¯½±¹ µ³º±ÄµÃÄ·¼­½¿ ÃÄ¿ ÃÍÃÄ·¼¬ ñÂ, À»·ºÄÁ¿»¿³®Ãĵ «aspell config» º±¹ À±Á±Ä·Á®Ãĵ ı ±Áǵ¯± .dat ÃÄ¿½ º±Ä¬»¿³¿ «data-dir». 3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW˜Ÿ¹ ³»ÎÃõ ³¹± Ĺ ¿À¿¯µÂ ¸± ´·¼¹¿ÅÁ³·¸¿Í½ ı »µ¾¹º¬ µÀµºÄ¬ÃµÉ½<br>Äɽ ÌÁɽ.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÔ— »¯Ãı Äɽ º±Ä±»Ì³É½ ³¹± Ä·½ ­½±Á¾· Ä· ±½±´Á¿¼¹º® µÅÁµÄ·Á¯±Ã·Â.  Á¿µÀ¹»¿³®: ¿ ÀÁ¿ÃÉÀ¹ºÌ Ã± º±Ä¬»¿³¿Â.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW ¤¿ ̽¿¼± ĿŠº±Ä±»Ì³¿Å ±À¿¸®ºµÅ÷ Ä¿Å µÅÁµÄ·Á¯¿Å<br>œ¹± ÃǵĹº® ´¹±´Á¿¼® ±½±ÆµÁ̼µ½· ÃÄ· ´¹±´Á¿¼® ´¹±¼ÌÁÆÉ÷Â. — µ¾' ¿Á¹Ã¼¿Í µ¯½±¹ «xapiandb». •The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW8‘ÅÄ® · Ĺ¼® ÁŸ¼¯¶µ¹ Ä·½ À¿ÃÌķı Äɽ ´µ´¿¼­½É½ À¿Å ´µ¹ºÄ¿´¿Ä¿Í½Ä±¹ ¼µÄ±¾Í Äɽ µ³³Á±ÆÎ½ ÃÄ¿ ´¯Ãº¿.<br>’¿·¸¬ ÃÄ¿½ ­»µ³Ç¿ ÇÁ®Ã·Â Ä·Â ¼½®¼·Â.  Á¿µÀ¹»¿³®: 10MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWô‘ÅÄ® · Ĺ¼® ÁŸ¼¯¶µ¹ Ä·½ À¿ÃÌķı Äɽ ±ÀµÃı»¼­½É½ ¼·½Å¼¬Äɽ,<br>±ÀÌ ¼Ì½¿ ı ÃÆ¬»¼±Ä± ¼­ÇÁ¹ À¿»»¬ ´µ´¿¼­½± ±À¿ÃƱ»¼¬ÄÉ÷Â.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW&š±Ä¬»¿³¿¹ µºº¯½·Ã·ÂTop directoriesconfgui::ConfTopPanelW•¾±¹Á­Ãµ¹Â unacUnac exceptionsconfgui::ConfTopPanelW&‘ºÍÁÉ÷&CanceluiPrefsDialogBase&•½Ä¬¾µ¹&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase$<PRE> + ±½±´¯À»É÷
 + wrapuiPrefsDialogBase윹± ±½±¶®Ä·Ã· ³¹± [ÇÉÁ¹¬Ä¹º· ñ»¬Ä±] (2 ÌÁ¿¹) ¸± ÃżÀ»·Áɸµ¯ É [ÇÉÁ¹¬Ä¹º· ‰ ñ»¬Ä± ‰ (ÇÉÁ¹¬Ä¹º· ¦¡‘£— 2 ñ»¬Ä±)].<br>
‘ÅÄÌ ¸± ÀÁ­Àµ¹ ½± ±À¿´Îõ¹ ¼¹± º±»ÍĵÁ· µ³³Íķı Äɽ ±À¿Äµ»µÃ¼¬Äɽ ÌÀ¿Å ¿¹ ±½±¶·Ä¿Í¼µ½¿¹ ÌÁ¿¹ µ¼Æ±½¯¶¿½Ä±¹ ±ºÁ¹²Î ¼µ Ä· õ¹Á¬.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase0”¹±ÇÉÁ¹ÃĮ ±À¿ÃÀ¬Ã¼±Ä¿ÂAbstract snippet separatoruiPrefsDialogBase"•½µÁ³¿À¿¯·Ã· ̻ɽActivate AlluiPrefsDialogBase& Á¿Ã¸®º· µÅÁµÄ·Á¯¿Å	Add indexuiPrefsDialogBase(•ƱÁ¼¿³® Äɽ ±»»±³Î½
Apply changesuiPrefsDialogBasez‘ÅÄ̼±Ä· ­½±Á¾· ¼¹± ±À»® ±½±¶®Ä·Ã· Ìı½ µ¹Ã±Ç¸µ¯ ­½± ºµ½Ì.-Auto-start simple search on whitespace entry.uiPrefsDialogBasej Á¿Ã¸®º· ±ÅÄ̼±Ä± ¼¹± ÆÁ¬Ã· ÃĹ ±À»­ ±½±¶·Ä®Ãµ¹ +Automatically add phrase to simple searchesuiPrefsDialogBaseŒŒÁ¹¿ ÃÅǽÌķı Ä¿Å ÌÁ¿Å (À¿Ã¿ÃÄÌ) ³¹± Ä·½ ±ÅÄ̼±Ä· ´·¼¹¿ÅÁ³¯± ÆÁ¬ÃµÉ½.Autophrase term frequency threshold percentageuiPrefsDialogBase  ¯½±º± º¿Å¼À¹Î½
Buttons PaneluiPrefsDialogBase•À¹»¿³®ChooseuiPrefsDialogBasex•À¹»­¾Äµ ĿеÀµ¾µÁ³±ÃÄ­ ³¹± ĿŠ´¹¬Æ¿Á¿Å ÄÍÀ¿Å ±Áǵ¯É½Choose editor applicationsuiPrefsDialogBase(š¬½Äµ º»¹º ³¹± ½± ÀÁ¿Ã¸­ÃµÄµ ­½±½ º±Ä¬»¿³¿ µÅÁµÄ·Á¯¿Å ÃÄ· »¯Ãı. œÀ¿Áµ¯Äµ ½± µÀ¹»­¾µÄµ µ¯Äµ ­½±½ º±Ä¬»¿³¿ ´¹±¼ÌÁÆÉ÷ Recoll ® ­½± µÅÁµÄ®Á¹¿ Xapian.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBaseh‘½Ä¯ ³¹± ­¾¿´¿, º±Ä±Çν¹±Ã¼± ÃÄ¿ À»±¯Ã¹¿ ÃÅÃÄ®¼±Ä¿Â.!Close to tray instead of exiting.uiPrefsDialogBaseFœ¿ÁÆ® Ä· ·¼µÁ¿¼·½¯± (strftime(3))Date format (strftime(3))uiPrefsDialogBase&‘Àµ½µÁ³¿À¿¯·Ã· ̻ɽDeactivate AlluiPrefsDialogBaseîš±¸¿Á¯¶µ¹ ±½ ı Ư»ÄÁ± Äɽ µ³³Á¬ÆÉ½ ¸± µ¼Æ±½¯¶¿½Ä±¹ É º¿Å¼À¹¬ µÀ¹»¿³Î½, ³Á±¼¼® µÁ³±»µ¯É½ À»±¹Ã¯É½ ÃŽ´Å±Ã¼Î½, ® ¼µ½¿Í.QDecide if document filters are shown as radio buttons, toolbar combobox, or menu.uiPrefsDialogBaseŠ‘Àµ½µÁ³¿À¿¯·Ã· Ä· ±ÅÄ̼±Ä· ÃżÀ»®ÁÉ÷ Qt ÃÄ·½ µ¹Ã±³É³® ±½±¶®Ä·Ã·Â.*Disable Qt autocompletion in search entry.uiPrefsDialogBase(‘ÀÌÁÁ¹È· Äɽ ±»»±³Î½Discard changesuiPrefsDialogBase¬˜± ÀÁ­Àµ¹ ½± ³¯½µÄ±¹ Ãͽ¸µÃ· ¼¹± Ãͽ¿È· ±ºÌ¼± º±¹ ±½ Ä¿ ±ÁǹºÌ ­³³Á±Æ¿ ´¹±¸­Äµ¹ ¼¹±;EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase(‘À¿Æ±Ã¯¶µ¹ ±½ ¸± ´·¼¹¿ÅÁ³¿Í½Ä±¹ ±À¿ÃÀ¬Ã¼±Ä± ±ÀÌ Ä¿ ÀµÁ¹µÇ̼µ½¿ Äɽ ÌÁɽ ±½±¶®Ä·Ã·Â.
œÀ¿Áµ¯ ½± µÀ¹²Á±´Í½µ¹ Ä·½ ±Àµ¹ºÌ½¹Ã· ±½ ı ­³³Á±Æ± µ¯½±¹ ¼µ³¬»±.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBaseL¤µÇ½¿ÄÁ¿À¯± µÀ¹»¿³® Æ¯»ÄÁ¿Å µ³³Á¬ÆÉ½:Document filter choice style:uiPrefsDialogBaseH”ޱ¼¹º® ´·¼¹¿ÅÁ³¯± Äɽ ±À¿ÃÀ±Ã¼¬ÄɽDynamically build abstractsuiPrefsDialogBasep•Àµ¾µÁ³±Ã¯± ĿŠļ®¼±Ä¿ ³¹± µ¹Ã±³É³® ÃÄ·½ ºµÆ±»¯´± HTML#Edit result page html header insertuiPrefsDialogBasef•Àµ¾µÁ³±Ã¯± Ä· ¼¿ÁÆ® Ä· À±Á±³Á¬Æ¿Å ±À¿Äµ»µÃ¼¬Äɽ#Edit result paragraph format stringuiPrefsDialogBase•½µÁ³ÌEnableuiPrefsDialogBase&•¾ÉĵÁ¹º¬ µÅÁµÄ®Á¹±External IndexesuiPrefsDialogBase†ŒÁ¹¿ ÃÅǽÌķı (À¿Ã¿ÃÄÌ) À­Á±½ ĿŠ¿À¿¯¿Å ¿¹ ÌÁ¿¹ ´µ½ ¸± ÇÁ·Ã¹¼¿À¿¹¿Í½Ä±¹.
Ÿ¹ ÆÁ¬Ãµ¹Â À¿Å ÀµÁ¹­Ç¿Å½ À¿»Í ÃÅǽ¿Í ÌÁ¿Å ´·¼¹¿ÅÁ³¿Í½ ÀÁ¿²»®¼±Ä± ÃÄ·½ ±ÀÌ´¿Ã·.
Ÿ¹ ±³½¿·¼­½¿¹ ÌÁ¿¹ ±Å¾¬½¿Å½ Ä·½ ±ÀÌÃı÷ Ä·Â ÆÁ¬Ã·Â, º±¹ ¼µ¹Î½¿Å½ Ä·½ ±À¿Äµ»µÃ¼±Ä¹ºÌķı Ä·Â »µ¹Ä¿ÅÁ³¯±Â ±½±¶®Ä·Ã·Â ±ÅÄ̼±Ä·Â ÆÁ¬Ã·Â.
— ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® µ¯½±¹ 2%. þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase6‘À̺ÁÅÈ· Äɽ ´¹À»¿µ³³Á±ÆÎ½.Hide duplicate results.uiPrefsDialogBaseœ•¼Æ±½¯¶µ¹ ¼¹± ¼Ì½¿ º±Ä±ÇÎÁ·Ã· ³¹± ı ±À¿Äµ»­Ã¼±Ä± ¼µ À±½¿¼¿¹ÌÄÅÀ¿ ÀµÁ¹µÇ̼µ½¿.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseÊŸ¹ ³Á±¼¼­ À¿Å µ¯½±¹ ­³º»µ¹Ãĵ Ãı PRE ´µ½ ±½±´¹À»Î½¿½Ä±¹. — ÇÁ®Ã· BR ¿´·³µ¯ õ ±Àλµ¹± ¿Á¹Ã¼­½É½ µÃ¿Çν. ¤¿ ÃÄÅ» PRE + ±½±´¯À»É÷ Ʊ¯½µÄ±¹ ½± µ¯½±¹ · º±»ÍĵÁ· µÀ¹»¿³® ±»»¬ · ÃÉÃÄ® ĿŠ»µ¹Ä¿ÅÁ³¯± µ¾±ÁĬı¹ ±ÀÌ Ä·½ ­º´¿Ã· Ä· Qt.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBasepœµ³. ¼­³µ¸¿ Ä¿½¹Ã¼­½É½ ºµ¹¼­½É½ ÀÁ¿ ÀÁ¿µÀ¹ÃºÌÀ·Ã· (MB)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase
œµ½¿ÍMenuuiPrefsDialogBase@‘Á¹¸¼Ì ±À¿Äµ»µÃ¼¬Äɽ ±½¬ õ»¯´±"Number of entries in a result pageuiPrefsDialogBaseÞ‘½¿¯³µ¹ ­½±½ ´¹¬»¿³¿ À¿Å ñ µÀ¹ÄÁ­Àµ¹ Ä·½ µÀ¹»¿³® ĿбÁǵ¯¿Å ÃÄÅ» CSS ³¹± Ä¿ ±½±´Å̼µ½¿ À±Á¬¸ÅÁ¿ ±À¿ÃÀ±Ã¼¬ÄɽAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBase¤‘½¿¯³µ¹ ­½±½ ´¹¬»¿³¿ ³¹± Ä·½ µÀ¹»¿³® Ä· ³Á±¼¼±Ä¿Ãµ¹Á¬ ³¹± Ä· »¯Ãı ±À¿Äµ»µÃ¼¬Äɽ-Opens a dialog to select the result list fontuiPrefsDialogBasez‘½¿¯³µ¹ ­½±½ ´¹¬»¿³¿ ³¹± Ä·½ µÀ¹»¿³® µ½Ì ±Áǵ¯¿Å ÆÍ»»¿Å ÃÄÅ»-Opens a dialog to select the style sheet fileuiPrefsDialogBase*”¹±´Á¿¼­ ¼µÄ±ÆÁ¬ÃµÉ½Paths translationsuiPrefsDialogBaseH£ÄÅ» ¼µÄ¬ÆÁ±Ã· ±À»Ì ºµ¯¼µ½¿ õ HTMLPlain text to HTML line styleuiPrefsDialogBaseX§Á®Ã· Ä· ¼¿ÁÆ® HTML ³¹± Ä·½ ÀÁ¿µÀ¹ÃºÌÀ·Ã·.&Prefer Html to plain text for preview.uiPrefsDialogBaseX‘ÅÄ̼±Ä± µÀ¹¸®¼±Ä± ³¹± Ä· ³»ÎÃñ µÁÉÄ·¼¬Äɽ.(Query language magic file name suffixes.uiPrefsDialogBasev‘À¿¼½·¼Ì½µÅ÷ Ä· º±Ä¬Ãı÷ µ½µÁ³¿À¿¯·Ã· Ä· Ä±¾¹½Ì¼·Ã·Â.Remember sort activation state.uiPrefsDialogBaseˆ‘Ʊ¯ÁµÃ· ±ÀÌ Ä· »¯Ãı. ”µ½ ­Çµ¹ µÀ¯ÀÄÉ÷ ÃÄ¿ ±À¿¸·ºµÅ¼­½¿ µÅÁµÄ®Á¹¿.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase0‘Ʊ¯ÁµÃ· Äɽ µÀ¹»µ³¼­½É½Remove selecteduiPrefsDialogBasej‘½Ä¹º±Ä¬Ãı÷ Äɽ ÅÀ±ÁÇ̽Äɽ ±À¿ÃÀ±Ã¼¬Äɽ Ãı ­³³Á±Æ± Replace abstracts from documentsuiPrefsDialogBase•À±½±Æ¿Á¬ResetuiPrefsDialogBaseZ•À±½±Æ¿Á¬ ĿŠÃÄÅ» ĿŠÀ±Á±¸ÍÁ¿Å ±À¿ÃÀ±Ã¼¬Äɽ Resets the Snippets window styleuiPrefsDialogBase®•À±½±Æ­Áµ¹ Ä· ³Á±¼¼±Ä¿Ãµ¹Á¬ Ä· »¯Ãı ±À¿Äµ»µÃ¼¬Äɽ ÃÄ·½ ÀÁ¿º±¸¿Á¹Ã¼­½· ĿŠÃÅÃÄ®¼±Ä¿Â1Resets the result list font to the system defaultuiPrefsDialogBaseh•À±½±Æ­Áµ¹ Ä·½ ÀÁ¿º±¸¿Á¹Ã¼­½· Ĺ¼® ³¹± Ä¿ ÆÍ»»¿ ÃÄÅ»!Resets the style sheet to defaultuiPrefsDialogBase&›¯Ãı ±À¿Äµ»µÃ¼¬ÄɽResult ListuiPrefsDialogBase(“Á±¼¼±Ä¿Ãµ¹Á¬ »¯ÃıÂResult list fontuiPrefsDialogBaseB‘½±¶®Ä·Ã· º±Ä¬ Ä·½ À»·ºÄÁ¿»Ì³·Ã·.Search as you type.uiPrefsDialogBase(¡Å¸¼¯Ãµ¹ ±½±¶®Ä·Ã·ÂSearch parametersuiPrefsDialogBaseX•¼Æ¬½¹Ã· Ŀе¹º¿½¹´¯¿Å À»±¹Ã¯¿Å ÃÅÃÄ®¼±Ä¿Â.Show system tray icon.uiPrefsDialogBaseB‘Áǵ¯¿ CSS À±Á±¸ÍÁ¿Å ±À¿ÃÀ¬Ã¼±Ä¿ÂSnippets window CSS fileuiPrefsDialogBasex•ºº¯½·Ã· ¼µ Ä¿½ ´¹¬»¿³¿ Ä· ÀÁ¿ÇÉÁ·¼­½· ±½±¶®Ä·Ã· ±½¿¹ÇÄÌ.'Start with advanced search dialog open.uiPrefsDialogBase@“»ÎÃñ ³¹± Ä·½ ±½¬ÀÄž· Äɽ ÌÁɽStemming languageuiPrefsDialogBase¦Í»»¿ ÃÄÅ»Style sheetuiPrefsDialogBasev‘Á¹¸¼Ì ÃǵĹºÎ½ »­¾µÉ½ ±½¬ µ¼Æ¬½¹Ã· ĿŠÌÁ¿Å ÃÄ¿ ±ÀÌÃÀ±Ã¼± Synthetic abstract context wordsuiPrefsDialogBase`œ­³µ¸¿ Ä¿Å ÃŽ¸µÄ¹º¿Í ±À¿ÃÀ¬Ã¼±Ä¿ (DZÁ±ºÄ®ÁµÂ)$Synthetic abstract size (characters)uiPrefsDialogBase´¤± ºµ¯¼µ½± ¼µ³±»ÍĵÁ± ±ÀÌ ±ÅÄÌ Ä¿ ¼­³µ¸¿ ´µ½ ¸± Ä¿½¹ÃĿͽ ÃÄ·½ ÀÁ¿µÀ¹ÃºÌÀ·Ã· (À¿»Í ±Á³Ì).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseÄŸ¹ »­¾µ¹ ÃÄ· »¯Ãı ¸± ±»»¬¾¿Å½ ±ÅÄ̼±Ä± õ Á®ÄÁµ ext:xxx ÃĹ º±Ä±ÇÉÁ®Ãµ¹ Ãµ ³»ÎÃñ µÁÉÄ·¼¬Äɽ.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase:‘»»±³® º±Ä¬Ãı÷ µÀ¹»µ³¼­½É½Toggle selecteduiPrefsDialogBaseH“Á±¼¼® µÁ³±»µ¯É½ À»±¹Ã¯É½ ÃŽ´Å±Ã¼Î½Toolbar ComboboxuiPrefsDialogBase" µÁ¹²¬»»¿½ ÇÁ®ÃÄ·User interfaceuiPrefsDialogBase$ Á¿Ä¹¼®Ãµ¹ ÇÁ®ÃÄ·User preferencesuiPrefsDialogBaseˆrecoll-1.23.7/qtgui/i18n/recoll_cs.qm0000644000175000017500000034307513224431020014224 00000000000000<¸dÊÍ!¿`¡½ÝBx+?e-?’¯+;€áG¤88H,—+H,UHY€IAÒWZlæä\Œ6±mbëÑYÕg^˜•Ó¦yl:¨¥ãJ¶E§ºÐDÐÙ]

½†6ƒÄœ1øÑ:ÎdÈhAVŽBG…Ô£~GßÐÆH6óyH6õ¦J+‚iœJ+‚ÿÚJ6•
äJ6•,†L™b¨„Mz…Ph¨å&SŠ˜;S¸¹#ÀT°5åÐWTmWÈÕ´þXÉĤYZ0ƒŸå[%æµ\ƒµCe®jgwîòKj^¨²	sºñ)sºñÈ v8“¶Pv®Â‘v®ÂÉzϳ•€€£Ž{„j’DŒ!þE—¤´*«0œd9Í(¤f©¢ÀªJ|®½Þ+¯fS)ζÊð‘ùº°2ÃÞí!Ä≸ÐùƒÇÛÐùƒµÐùƒ);ÓnU—PãnXýgtÆ:• 7ÕáEµÃ)nôÞ‚–€¿ŠÂ.+-Ò3Ô%ôÝø(ß	+1Ž|0,…cË;¸s&>.cwŒDo2¬ƒN»“XM¹œX®©5B`Þ^çùhˆ¸7¬lÿtünÚnðwOãÓÊwñ…å—wñ…*õ€üÞÌŠH™Œ‘vã…•ñ“vê—–³ ¢‰Uï£cêi§á¸x°ü4KÎxCoFÞñƒy­ëͺO‘ó
L–á÷ÚÎzþSIþAÿµ`ÏÿØ…
çxKš‘}p#Êvåêfvå¥äWw5äšw5þw5·w5!ŠwîäÝŒU`{Ÿ.”Þ£¹Þ<¦;UÔˆ©Ö³qª6•د†”“ä»f3νÇWÞËÂî«ͼuÐgž¼ÐgžÉ-ÓHÞ¨‡ÔÂõjq׸~GMì;Uœšï¡©6©úUkÒúeîgÙsÎ¬°G!D¥õ&Á‘ú.‡Nz‘/ÄÇ‹7Îwã=úd¦†?údëG$ß‘.JUY§jJUYé"Y ôÀ[–um²_nr|„Ä–º™¬­u”-–Ê·œ	¢ÛÊ—¥`Ê—¥ÈÕÎÅåŸ.Ôä^—ÙÙc¤ÍÝôL‹èã¿€æõÎB7ìxc*ùJg“û=cÔäþA¢áþŠ¥ÿ%´sÿAî[øB dUVùîU<.¢çÞÿõß
ëd߯1MªÓ;[¾h<ÄöìØLƒ-GNB™+ŠXË4¯ªe2°³lðP¾¨vhÕ=úwT!'€ã‡šG…(P›¨Œ¯bã’"3’ZÓ.˜I¼8i˜I¼in™n•™n•jšß¤®Ÿf• óŸf•?)Ÿf•ˆq«Ï諬,¥8¯ƒW6﯃WfµÝþ†>¾óÕÃÄy%4KÄy%“Å	¹š¸Å ätÍÍl£W΄սÐ:ÂøÚ#“×ãX|RåõW3:Ì”
iëKi
-Z_zÏã-¼áS"5ò¹6)ÖT¥&>j¬B9€aCBìS»k¶Þ×÷oˆ•8r?)çrž–‚|ôòƒÿpïo„kå€1Š‘¿Ã›‹¦,Ùì‹ÜðmŒÇ<ÎõŽÔ°þì"©6›ˆ˜Ú›ˆ˜:Ÿ,t„y¦AS,ªÃ¢»·¨
ï/·¨
-»œRÇÇ¢•V×I^ÓØ~CüÞž±èêȨ9éã>dÞðŒµªþp#ã`³Ù3Mð:Ë$P"	-Ö…žXUKô¦Ùi®°p
h„ÄsÞžµu9Pªv2ãltvƒ˜;{^Ì2Ç–T#na—BiÑšKlŸUÔ¶™¦	%E¦©nÍ5¦öõF¨«‡Åé¶7ë{€wÃ’P«kÄÅ^?¿ÄÖ[°âÊXÔënD“=ðw)tþ~¥C†‰³¬ê!vô&Ò#+ä«Y+õ^Âc3¿7I^Ì@<ˆ~ACj³ÈFW#jF¯NçH:"_guNapäL¬f8ÑpiTV‚|§NnŒÍwÿŒÏ—ênçg“’ž…\™ÅóD›.
d›Ýˆ²áŸž¦¦š´Ék²ð±¾l¯¶ê¿|ÙgÁæn5FÓtüÓtÉ›Æ>Ã×
Èà”¢Ɇt¯nâ]87lã )³ãÀDåÅ héŽ#Üañ†.º·3fEnŸ%<Ùïý*snŠÆ,öy6Ü:uî ¸Gñî§EJ¢R×JýnD¼QçÇu”YŒÎ­ }}u/€;Eíæ”ò“¬!¨0Îló©ÔÕ¤ ¬¨”1°c,º¶¬h¯ÃÄ™È@Ã?ʶÕâ³ÊÁÎ/Ìí³hmͳê0×°™àÝÜöäœc
*ä´¥”Uæí:¢"î?À¨ñö¨åeÙúð£	õT	k³˜F	ÈJ˜x	ÉN§ù	´HÊå	-(7ñ	7Àþu	9Zy=	;´3­D	D©K`	K¨óÖ«	]#—±“	c‡C…	k¨µn¦	lMˆfB	…ÿä¼	‰Œî®>	ŸÁòƒô	£qD‘	«ƒÔâè	­îYÔ	®œ¯ŽÊ	°Ž` q	²9TÇ	ÛCO.	ü>¢	ãÉðø	ä3§æ	äîo 	èe£Ñq	íåõ‡8	ûié‚x
	¢µM¶
*Nl¼
͹ڲ
:^ 	
Üc

*R5™
+<”fð
6 ¡ñ
>V…0È
G.~M©
S§`•×
`P¯X
`ç£
a·EÒ€
c·EÒÂ
d8*y
yk_
˜Iœ€¦
¤žRN
¤s¾rm
¥ýw
®VTM.
²ëC‚ý
Äãér
âæçÑä
æõçÐû®Ð®ùÐoÔ…
Æè^…›	ye4TH”ŽÚh¦,xƒ€T=!SQKj׿]X°ƒS	X°ƒÙ¡h¹°hÞtÓ9oî’þƒ®™÷ÁÀéUb£Ün¨Î£ÓS¬rƒ`»ïµÅÙ·åØ™Û·åØæÛÓˆ©?¾š€–ȃ½	Vd®ù4ò§!ïú-ŒY'ИÏ~+bC„».Ê¢â/¥°T97Ã39ɵ/L*ì‚PÖ™–;RVŽÄkT#zHVüf5\iC£Õ]æù:Ö`F¥hôîì9v—¥·Ù{l¡h€!Y·~€!Yê¹‚WåÝ†|ð‚Š˜ýŒïõÜÇÒ¬ˆ }À¤`¬æà“¶…1±¹iÉLÓÍÀ€Ú÷ÇÝøì„|é—~™Rò鈹Äõ­N,ö†À

m£åU
#ùD(›
'RçNl
-èôåÿ
7Qþ¥>
8þÉ
FÁª
OE°M8
XÅ^È
]„Ä9P
]„Ä-É
^®à¥
^®^
m†C˜Ñ
uò0Ü#
y·&
y¹~$
‚±3°
…È©‹w
‡uþ¨
‡u!Ï
‰P•£
‰PÇX
5dž
¤š„²ƒ
¬Š©3y
½ý7bR
Çi€è
ÇòÞ‰
ÊÕ’7 
ÕHp
ÛQ5;–
û£sq©Ë¦€—Ѿ8j{þ3%Ýn†.Ê¢2Q/¸.ç3U1û6ˆ—Éø8bó!9µÚ<Þ­GR„ÇmGTå’ÀbÙË9cxÀcãzcîîzcæ‚3.ü{‚3.=‹íPn“Ýè%N›P¾gÁ¦Àèá¹¶éd©ÆÀèŞɾ~Ë6YWoέnè­×ôXÍÑØozóã‰"¾æšÞNÕíÚuãxò.R“Ë“f0€€î/Eo”’q"cw95^y";>£=>;CQá~¢£S«•«¢W"ùY~sÎi[žsàT\Н4}e3Ö)g3Öjhx5ªipû~b•Õ |º™³§!„­c»m€ís¿­c	nÂ|“yùÂ|“§ ÉB®Œ2ÎÁ'»;ó
lÊ”ü©ÜÂü¶LÿÙ)e!i² Vaechny výrazyAll clauses	AdvSearch Nkterý z výrazo
Any clause	AdvSearchZ`patná pYípona násobitele ve filtru velikosti$Bad multiplier suffix in size filter	AdvSearchMultimediamedia	AdvSearchZprávamessage	AdvSearchJinéother	AdvSearchPYedstavenípresentation	AdvSearchTabulkyspreadsheet	AdvSearchTabulkyspreadsheets	AdvSearchTexttext	AdvSearch
Textytexts	AdvSearch<----- Vae
<----- All
AdvSearchBase<----- Výbr
<----- Sel
AdvSearchBase"PYidat nový výraz
Add clause
AdvSearchBase"Pokro
ilé hledáníAdvanced search
AdvSearchBaseVae ---->	All ---->
AdvSearchBase:Vaechna pole napravo, která nejsou prázdná, budou spojována spojeními AND (volba "Vaechny výrazy") nebo OR (volba "Nkterý z výrazo"). <br>Typy polí "Jakékoli" "Vae" a "}ádné" mohou pYijmout sms jednoduchých slov, a vty uzavYené dvojitými uvozovkami.<br>Pole bez dat jsou pYehlí~ena.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. 
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseProcházetBrowse AdvSearchBasePodle skupin By categories AdvSearchBaseVZaakrtnte pro zapnutí filtrování podle dat'Check this to enable filtering on dates AdvSearchBasepZaakrtnte pro zapnutí filtrování podle souborových typo,Check this to enable filtering on file types AdvSearchBasebZaakrtnte pro zapnutí filtrování podle velikostí'Check this to enable filtering on sizes AdvSearchBasenZaakrtnte pro pou~ívání skupin souboro místo MIME typo;Check this to use file categories instead of raw mime types AdvSearchBase ZavYítClose AdvSearchBase*Smazat poslední výraz Delete clause AdvSearchBaseHZadejte základní adresáY pro hledáníEnter top directory for search AdvSearchBaseFiltrovatFilter AdvSearchBaseFiltrovat data Filter dates AdvSearchBase&Filtrovat velikosti Filter sizes AdvSearchBase NajítFind AdvSearchBaseOdFrom AdvSearchBase2PYehlí~ené souborové typyIgnored file types AdvSearchBaseObrátitInvert AdvSearchBase"Nejvtaí velikost Max. Size AdvSearchBasexNejvtaí velikost: Mo~ete pou~ít k/K,m/M,g/G jako násobitele4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase"Nejmenaí velikost Min. Size AdvSearchBasexNejmenaí velikost: Mo~ete pou~ít k/K,m/M,g/G jako násobitele4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase.Omezit souborových typoRestrict file types AdvSearchBaselOmezit výsledky na soubory v následujícím podadresáYi:%Restrict results to files in subtree: AdvSearchBase&Ulo~it jako výchozíSave as default AdvSearchBasezHledat <br>dokumenty<br>, které splHují následující hlediska:'Search for
documents
satisfying: AdvSearchBase,Hledané souborové typySearched file types AdvSearchBaseVýbr -----> Sel -----> AdvSearchBaseSpustit hledání Start Search AdvSearchBaseDoTo AdvSearchBaseÚ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> dávkový rejstYíkovací rozvrh (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ka~dé pole mo~e obsahovat zástupný symbol (*), jednoduchou  íselnou hodnotu,  árkou oddlené seznamy (1,3,5) a rozsahy (1-7). Obecnji, pole se budou pou~ívat <span style=" font-style:italic;">jak je</span> uvnitY souboru crontab, a lze pou~ít úplnou stavbu crontab, podívejte se na crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />NapYíklad, zadání <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Dny, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> a <span style=" font-family:'Courier New,courier';">15</span> v <span style=" font-style:italic;">Minuty</span> spustí rejstYíkování (recollindex) ka~dý den v 12:15 dopoledne a 7:15 odpoledne</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Rozvrh s velmi  astým spuatním je pravdpodobn mén ú inný ne~ je rejstYíkování ve skute ném  ase.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

 CronToolWDialog Cron Cron Dialog CronToolWXDny v týdnu (* nebo 0-7, 0 nebo 7 je nedle))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWZakázatDisable CronToolWPovolitEnable CronToolWtChyba pYi instalaci záznamu cron. `patná skladba v polích?3Error installing cron entry. Bad syntax in fields ? CronToolW(Hodiny (* nebo 0-23)Hours (* or 0-23) CronToolW¢Zdá se, ~e pro recollindex existují ru n upravené záznamy, nelze upravit crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinuty (0-59)Minutes (0-59) CronToolW DialogDialog EditDialog"Chyba v nastavení Config error EditTransMístní cesta Local path EditTransPovodní cesta Original path EditTransCesta ke zdroji Source path EditTrans PYidatAdd EditTransBase ZruaitCancel EditTransBase SmazatDelete EditTransBasePYeklady cestPath Translations EditTransBase Ulo~itSave EditTransBaseîVyberte jeden nebo více datových typo a pou~ijte ovládací prvky v ráme ku ní~e pro zmnu zposobu, jakým jsou zpracoványkSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBase8Nastavení pYeklado cest pro Setting path translations for  EditTransBase è<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Zdá se, ~e rejstYík pro toto nastavení neexistuje.</span><br /><br />Pokud chcete pouze zrejstYíkovat svoj domovský adresáY sadou rozumných výchozích nastavení, stisknte tla ítko <span style=" font-style:italic;">Spustit rejstYíkování nyní</span>. Podrobnosti budete moci upravit pozdji. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Pokud chcete mít vtaí dohled, pou~ijte následující odkazy pro upravení nastavení rejstYíkování a rozvrhu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">K tmto nástrojom lze pYistupovat pozdji v nabídce <span style=" font-style:italic;">Nastavení</span>.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

 IdxSchedWRozvrh cronCron scheduling IdxSchedWÖRozhodnte, zda se rejstYíkování ve skute ném  ase spustí, kdy~ se pYihlásíte (pouze pro výchozí rejstYík).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedW>Nastavení rozvrhu rejstYíkováníIndex scheduling setup IdxSchedWPSpuatní rejstYíkování ve skute ném  aseReal time indexing start up IdxSchedW¶Nástroj vám umo~ní rozhodnout se, kdy má rejstYíkování b~et, a nainstaluje záznam crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW DialogDialog ListDialog$Seskupovací okénkoGroupBox ListDialogÐSoubor "history" je poakozen nebo nezapisovatelný/ne itelný. ProvYte jej, prosím, anebo jej odstraHte: K"history" file is damaged or un(read)writeable, please check or remove it: MainFNenastaven ~ádný databázový adresáY No db directory in configurationMain &Dalaí&NextPreview&PYedchozí &PreviousPreview&Hledat: &Search for:PreviewDChyba pYi rejstYíkování dokumentu 0Can't turn doc into internal representation for Preview ZruaitCancelPreviewVyprázdnitClearPreviewZavYít kartu Close TabPreview2VytváYí se náhledový textCreating preview textPreview6Chyba pYi nahrávání souboruError while loading filePreviewHNáhledový text se nahrává do editoru Loading preview text into editorPreviewLDbát na &psaní velkých a malých písmen Match &CasePreview4Chybí program s nápovdou:Missing helper program: PreviewKopírovatCopyPreviewTextEditZalomit Yádky Fold linesPreviewTextEdit"Zachovat odsazeníPreserve indentationPreviewTextEditTiskPrintPreviewTextEdit2Vytisknout nynjaí náhledPrint Current PreviewPreviewTextEdit4Ulo~it dokument do souboruSave document to filePreviewTextEditVybrat vae Select AllPreviewTextEditUkázat pole Show fieldsPreviewTextEditUkázat obrázek Show imagePreviewTextEdit$Ukázat hlavní textShow main textPreviewTextEdit(<b>Vlastní podstromyCustomised subtreesQObjectÎ<i>Parametry, které následují, jsou nastaveny bu na nejvyaaí úrovni, pokud nic<br>, nebo pokud je v seznamu výae vybrán prázdný Yádek, nebo pro vybraný podadresáY.<br>AdresáYe mo~ete pYidat anebo odebrat klepnutím na tla ítka +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject~Toto je znaková sada, která se pou~ívá pro  tení souboro, které svou znakovou sadu vnitYn neur ují, napY.. soubory s textem.<br>Výchozí hodnota je prázdná a pou~ívá se hodnota prostYedí NLS.ÆCharacter set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject.Výchozí<br>znaková sadaDefault
character setQObject4Sledovat symbolické odkazyFollow symbolic linksQObjectæBhem rejstYíkování sledovat symbolické odkazy. Výchozí nastavení je ne kvoli vyvarovaní se dvojitého rejstYíkováníTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Celkové parametryGlobal parametersQObject(PYehlí~ená zakon eníIgnored endingsQObjectHRejstYíkovat vaechny souborové názvyIndex all file namesQObjectRejstYíkovat vaechny názvy souboro, jejich~ obsah nelze ur it nebo zpracovat (~ádný nebo nepodporovaný MIME typ). Výchozí hodnota je ano}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Místní parametryLocal parametersQObject"Parametry hledáníSearch parametersQObject PYesko ené názvy Skipped namesQObjectäSeznam podadresáYo v rejstYíkované hierarchii <br>kde nkteré parametry je potYeba nov vymezit. Výchozí: prázdný.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectTToto jsou zakon ení souboro pro soubory, které se budou rejstYíkovat výhradn podle svého názvu (~ádné ur ování typu MIME, ~ádné rozbalování, ~ádné rejstYíkování obsahu).—These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing).QObjectœToto jsou vzory pro názvy souboro nebo adresáYo, které se nemají rejstYíkovat.LThese are patterns for file or directory names which should not be indexed.QObjectHistorie webu Web historyQObject&OtevYít&OpenQWidgetF&OtevYít rodi ovský dokument/slo~ku&Open Parent document/folderQWidget&Náhled&PreviewQWidget$&Zapsat do souboru&Write to FileQWidget4Nelze vytáhnout dokument: Cannot extract document: QWidget6Vybrat pYesn jeden adresáYChoose exactly one directoryQWidget0Kopírovat název &souboruCopy &File NameQWidget.Kopírovat adresu (&URL) Copy &URLQWidget>NepodaYilo se  íst z adresáYe: Could not read directory: QWidgetJVytvoYit nebo vybrat ukládací adresáYCreate or choose save directoryQWidget0Najít &podobné dokumentyFind &similar documentsQWidget,OtevYít okno s úr&yvkyOpen &Snippets windowQWidgetOtevYít s Open WithQWidgetJNáhled na &rodi ovský dokument/slo~kuPreview P&arent document/folderQWidgetSpustit skript Run ScriptQWidget.Ulo~it výbr do souboroSave selection to filesQWidgetDUkázat podYízené dokumenty/pYílohyShow subdocuments / attachmentsQWidget\Neo ekávaný stYet v souborovém názvu. Ruaí se.+Unexpected file name collision, cancelling.QWidget"Neukazovat znovu.Do not show again.QxtConfirmationMessageº<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> rejstYíkování mo~e být nastaveno tak, aby b~elo jako démon. Soubory jsou aktualizovány pYi jejich zmn, ve skute ném  ase. Získáte tak v~dy nejnovjaí rejstYík, ale prostYedky systému se pYi tom pou~ívají nepYetr~it.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

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

RTIToolWJSpustit rejstYíkovacího démona ihned.%Also start indexing daemon right now.RTIToolW|Soubor automatického spuatní smazán. Zabít i sou asný proces?2Autostart file deleted. Kill current process too ?RTIToolW Nelze vytvoYit: Can't create: RTIToolWBNepodaYilo se spustit recollindexCould not execute recollindexRTIToolWSmazání souboru Deleting fileRTIToolWMazání: Deleting: RTIToolWhAutomatické spuatní rejstYíkování ve skute ném  ase"Real time indexing automatic startRTIToolWBOdstranní automatického spuatníRemoving autostartRTIToolW"Nahrazení souboruReplacing fileRTIToolWNahrazení: Replacing: RTIToolWzSpustit rejstYíkovacího démona s mým sezením pracovní plochy..Start indexing daemon with my desktop session.RTIToolWVarováníWarningRTIToolW. s dodate nou zprávou:  with additional message: RclMainVaechny jazyky(all languages)RclMain6yádné rozaíYení kmene slova (no stemming)RclMain"O programu Recoll About RecollRclMainVaeAllRclMainChybná specifikace aplikace pro %1: [%2] ProvYte soubor pracovní plochy?Bad desktop app spec for %1: [%2] Please check the desktop fileRclMain`patné cesty Bad pathsRclMainH`patné cesty v souboru s nastavením:!Bad paths in configuration file: RclMain„Chybový pYíkaz pro prohlí~e pro %1: [%2] ProvYte soubor mimeconfCBad viewer command line for %1: [%2] Please check the mimeview fileRclMain8Nelze pYistoupit k souboru: Can't access file: RclMain:Nelze vytvoYit náhledové oknoCan't create preview windowRclMain®Nelze nastavit soubor se slovy majícími stejný význam (synonyma). Chyba pYi zpracování?&Can't set synonyms file (parse error?)RclMain.Nelze rozbalit soubor: Can't uncompress file: RclMainRNelze obnovit rejstYík: b~í rejstYíkova #Can't update index: indexer runningRclMainjNelze vytáhnout dokument nebo vytvoYit do asný soubor0Cannot extract document or create temporary fileRclMain>Nelze najít rodi ovský dokumentCannot find parent documentRclMainL}ádné informace o dokumentu v databázi+Cannot retrieve document info from databaseRclMain.Vybrat soubor k ulo~eníChoose file to saveRclMain0Klepnte na tla ítko Zruait pro návrat do seznamu. <br>Klepnte na tla ítko PYehlí~et pro ukázání náhledu tak jako tak (zapamatovat si pro toto sezení).pClick Cancel to return to the list.
Click Ignore to show the preview anyway (and remember for this session).RclMainúKlepnte na tla ítko pro aktualizaci rejstYíku pro tento soubor, potom hledání, a~ bude rejstYíkování hotovo, spusete znovu. jClick Ok to update the index for this file, then you will need to re-run the query when indexing is done. RclMainZavYeníClosingRclMainTObsah byl rejstYíkován pro tyto MIME typy:.Content has been indexed for these mime types:RclMainHNepodaYilo se nahrát ulo~ené hledáníCould not load saved queryRclMain¾NepodaYilo se otevYít vnjaí rejstYík. Databáze neotevYena. ProvYte seznam vnjaích rejstYíko.HCould not open external index. Db not open. Check external indexes list.RclMain<NepodaYilo se otevYít soubor: Could not open file: RclMain>NepodaYilo se zapsat do souboruCould not write to fileRclMain~Zakázáno proto~e rejstYíkova ve skute ném  ase nebyl sestaven.;Disabled because the real time indexer was not compiled in.RclMain®Neukazovat toto varování pYíat (pou~ít nastavení u~ivatelského rozhraní pro obnovení).DDo not show this warning next time (use GUI preferences to restore).RclMainFiltr dokumentuDocument filterRclMain$Historie dokumentuDocument historyRclMain HotovoDoneRclMain$Zdvojené dokumentyDuplicate documentsRclMain"Smazání rejstYíku Erasing indexRclMain ChybaErrorRclMainProvádí se: [ Executing: [RclMainPro vaae souborové typy jsou potYeba vnjaí programy/pYíkazy, které ale nebyly nalezeny, jak byly ulo~eny pYi posledním rejstYíkování v pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMainHistorická data History dataRclMain"RejstYík uzamknut Index lockedRclMain$RejstYík neotevYenIndex not openRclMain®RejstYík není pro tento soubor nejnovjaí. Ukázání nesprávného záznamu bylo zamítnuto. NIndex not up to date for this file. Refusing to risk showing the wrong entry. RclMain:Chyba pYi hledání v rejstYíkuIndex query errorRclMain.Rozvr~ení rejstYíkováníIndex schedulingRclMain.RejstYíkované MIME typyIndexed MIME TypesRclMain¢RejstYíkova b~í. Nelze pYistupovat k souboru s internetovou vyrovnávací pamtí./Indexer is running. Can't access webcache file.RclMain8RejstYíkování jeat neb~eloIndexing did not run yetRclMain4RejstYíkování se nezdaYiloIndexing failedRclMain RejstYíkuje se: Indexing in progress: RclMain.RejstYíkování pYeruaenoIndexing interruptedRclMain&Chyba pYi nahrávání Load errorRclMain,Chybí pomocné programyMissing helper programsRclMain DohledMonitorRclMainh}ádný vnjaí prohlí~e nebyl nastaven pro MIME typ [-No external viewer configured for mime type [RclMainBNenalezeny ~ádné pomocné programyNo helpers found missingRclMainB}ádné zachované pYedchozí hledáníNo preserved previous searchRclMain2Nenalezeny ~ádné výsledkyNo results foundRclMain}ádné hledání No searchRclMainFNekritická zpráva o rejstYíkování: Non-fatal indexing message: RclMain }ádnýNoneRclMainºOtevírá se do asná kopie. Úpravy budou ztraceny, pokud je neulo~íte<br/>do trvalého umístní.`Opening a temporary copy. Edits will be lost if you don't save
them to a permanent location.RclMainVy istitPurgeRclMain Hledání b~í.<br>Kvoli omezením rejstYíkovací knihovny<br>zruaení ukon í programeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain Výsledky hledání Query resultsRclMain*NepodaYilo se pYe íst Read failedRclMainPNastavit rejstYík znovu a za ít od nuly?(Reset the index and start from scratch ?RclMain,Po et výsledko (odhad)Result count (est.)RclMainUlo~it soubor Save fileRclMain.Ulo~ené dotazy (*.rclq)Saved Queries (*.rclq)RclMainhVýbrové vzory lze pou~ít jen s po áte ním adresáYem:Selection patterns can only be used with a start directoryRclMainTVýbrové vzory potYebují po áte ní adresáYSelection patterns need topdirRclMainÌPromiHte. Není nyní dostupné pod OS Windows. Pou~ijte polo~ek v nabídce Soubor k aktualizaci rejstYíkuYSorry, not available under Windows for now, use the File menu entries to update the indexRclMainKmeny slovStemdbRclMain.Zastavit &rejstYíkováníStop &IndexingRclMain:PodYízené dokumenty a pYílohySub-documents and attachmentsRclMainžNynjaí rejstYíkovací proces nebyl spuatn z tohoto rozhraní. Nelze jej ukon itOThe current indexing process was not started from this interface, can't kill itRclMainNynjaí rejstYíkovací proces nebyl spuatn z tohoto rozhraní. Klepnte na OK pro jeho zabití, nebo na Zruait, aby byl ponechán sámyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain†Dokument je sou ástí vnjaího rejstYíku, který nelze aktualizovat. @The document belongs to an external index which I can't update. RclMainšRejstYíkova b~í, tak~e vci by se po dokon ení rejstYíkování mly zlepait. @The indexer is running so things should improve when it's done. RclMain¼Prohlí~e stanovený v MIME zobrazení pro %1: %2 nenalezen. Chcete spustit dialog s nastavením?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainZTyto adresy ( | ipath) sdílejí toto~ný obsah:-These Urls ( | ipath) share the same content:RclMaintTento nastavovací nástroj pracuje jen pro hlavní rejstYík.6This configuration tool only works for the main index.RclMain4Toto hledání u~ není  inné"This search is not active any moreRclMain~Píae seznam prázdný: Mo~ná po kat na pokra ování rejstYíkování?6Types list empty: maybe wait for indexing to progress?RclMainNeznámýUnknownRclMain´Neznámý stav rejstYíkova e. Nelze pYistupovat k souboru s internetovou vyrovnávací pamtí.2Unknown indexer state. Can't access webcache file.RclMain"Obnovit &rejstYík Update &IndexRclMain ObnovaUpdatingRclMainÒPYíkaz pro prohlí~e pro %1 stanovuje jak hodnotu souboru tak hodnotu rodi ovského souboru: nepodporovánoQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainVarováníWarningRclMain(NepodaYilo se zapsat Write failedRclMainNChyba pYi vyhledání jazyko s kmeny slov#error retrieving stemming languagesRclMainFiltrovánofilteredRclMainMultimediamediaRclMain ZprávamessageRclMainJinéotherRclMainPYedstavení presentationRclMainTYídnosortedRclMainTabulky spreadsheetRclMainTexttextRclMain^S novým pokusem o zpracování selhavaích souboro With failed files retrying RclMainBase$&O programu Recoll &About Recoll RclMainBase$&Pokro ilé hledání&Advanced Search RclMainBase6&Vymazat historii dokumentu&Erase document history RclMainBase2&Vymazat historii hledání&Erase search history RclMainBase&Soubor&File RclMainBase&Celá obrazovka &Full Screen RclMainBaseBNastavení u~ivatelského roz&hraní&GUI configuration RclMainBase&Nápovda&Help RclMainBase(Nastavení &rejstYíku&Index configuration RclMainBase&Nastavení &Preferences RclMainBase0&Sestavit rejstYík znovu&Rebuild index RclMainBase&Výsledky&Results RclMainBase$Parametry &tYídní&Sort parameters RclMainBase&Nástroje&Tools RclMainBase*&U~ivatelská pYíru ka &User manual RclMainBase&Pohled&View RclMainBase2Pokro ilé/Slo~ené hledáníAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$Historie dokumentuDocument History RclMainBase&&Historie dokumentuDocument &History RclMainBase&Ukon itE&xit RclMainBase@Dialog pro &vnjaí rejstYíkováníE&xternal index dialog RclMainBaseDPovolit slova mající stejný významEnable synonyms RclMainBase>Dialog pro vnjaí rejstYíkováníExternal index dialog RclMainBaseF11F11 RclMainBasePrvní strana First Page RclMainBasePrvní strana First page RclMainBase$Na celou obrazovku Full Screen RclMainBase<Jít na první stranu s výsledkyGo to first page of results RclMainBase*&Statistika rejstYíkuIndex &statistics RclMainBase0RejstYíkované &MIME typyIndexed &MIME types RclMainBase*&Rozvrh rejstYíkováníIndexing &schedule RclMainBaseFRejstYíkování se zvláatními volbamiIndexing with special options RclMainBase,Nahrát ulo~ené hledáníLoad saved query RclMainBase6Chybjící &pomocné programyMissing &helpers RclMainBaseDalaí strana Next Page RclMainBaseDalaí strana Next page RclMainBase.Dalaí strana s výsledkyNext page of results RclMainBaseœNová aktualizace rejstYíku se pokusí znovu zpracovat nyní nezpracované soubory.Next update will retry previously failed files RclMainBase,O stranu dolo (PgDown)PgDown RclMainBase,O stranu nahoru (PgUp)PgUp RclMainBase PYedchozí strana Previous Page RclMainBase PYedchozí strana Previous page RclMainBase6PYedchozí strana s výsledkyPrevious page of results RclMainBaseKousky hledáníQuery Fragments RclMainBase RecollRecoll RclMainBaseVUlo~it jako soubor CSV (tabulkový dokument)Save as CSV (spreadsheet) file RclMainBase.Ulo~it poslední hledáníSave last query RclMainBase´Ulo~it výsledek do souboru, jej~ mo~ete nahrát jako seait s listy v tabulkovém kalkulátoru@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift+PgUp Shift+PgUp RclMainBase4Ukázat podrobnosti hledáníShow Query Details RclMainBase&Ukázat jako tabulku Show as table RclMainBase–Ukázat výsledky v tabulce na zposob seaitu s listy v tabulkovém kalkulátoru(Show results in a spreadsheet-like table RclMainBasePRoztYídit podle data, nejprve nejnovjaíSort by date, newest first RclMainBaseNRoztYídit podle data, nejprve nejstaraíSort by date, oldest first RclMainBasebRoztYídit podle data od nejnovjaího po nejstaraí#Sort by dates from newest to oldest RclMainBasebRoztYídit podle data od nejstaraího po nejnovjaí#Sort by dates from oldest to newest RclMainBase"Parametry tYídníSort parameters RclMainBase,Zvláatní rejstYíkováníSpecial Indexing RclMainBase$Prozkumník &výrazoTerm &explorer RclMainBase4Nástroj prozkumníka výrazoTerm explorer tool RclMainBase"Obnovit &rejstYík Update &index RclMainBaseJEditor internetové vyrovnávací pamtiWebcache Editor RclMainBaseUkon itQuit RclTrayIconObnovitRestore RclTrayIcon VýtahAbstract RecollModel AutorAuthor RecollModel DatumDate RecollModelDatum a  as Date and time RecollModelDatum dokumentu Document date RecollModel$Velikost dokumentu Document size RecollModelDatum souboru File date RecollModelNázev souboru File name RecollModel Velikost souboru File size RecollModel IpathIpath RecollModelKlí ová slovaKeywords RecollModelTyp MIME MIME type RecollModel MtimeMtime RecollModel(Povodní znaková sadaOriginal character set RecollModel(Hodnocení záva~nostiRelevancy rating RecollModel NázevTitle RecollModelAdresa (URL)URL RecollModel (ukázat hledání) (show query)ResListX<p><b>Nebyly nalezeny ~ádné výsledky</b><br>

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

Alternate spellings (accents suppressed): ResList:<p><i>Náhradní pravopis: </i>

Alternate spellings: ResList$Historie dokumentuDocument historyResListDokumenty DocumentsResList DalaíNextResListOtevYítOpenResList NáhledPreviewResListPYedchozíPreviousResList*Podrobnosti o hledání Query detailsResList,Po et výsledko (odhad)Result count (est.)ResListVýsledky Result listResList ÚryvkySnippetsResList&Nedostupný dokumentUnavailable documentResListproforResListmimo alespoHout of at leastResList&Smazat sloupec&Delete columnResTable.Nastavit tYídní &znovu &Reset sortResTable &Ulo~it jako CSV &Save as CSVResTable&PYidat sloupec "%1"Add "%1" columnResTable>Nelze otevYít/vytvoYit soubor: Can't open/create file: ResTable<Ulo~it tabulku jako soubor CSVSave table to CSV fileResTableV liaí se od nynjaího nastavení (ponecháno)' differ from current preferences (kept)SSearchVaechny výrazy All termsSSearchJakýkoli výrazAny termSSearchRAutomatické pYípony pro ulo~ená hledání:  Auto suffixes for stored query: SSearch¬Automatické tvoYení slovních obrato je nastaveno, ale bylo zruaeno pro ulo~ené hledání3Autophrase is set but it was unset for stored querySSearch¬Automatické tvoYení slovních obrato je zruaeno, ale bylo nastaveno pro ulo~ené hledání3Autophrase is unset but it was set for stored querySSearch,`patný Yetzec hledáníBad query stringSSearchvZadejte ~olíkový výraz (zástupný symbol) pro název souboru.$Enter file name wildcard expression.SSearch^Zadejte výraz jazyka hledání. Seznam:<br> <i>term1 term2</i> : 'term1' a 'term2' do kteréhokoli pole.<br> <i>field:term1</i> : 'term1' do pole 'field'.<br> Obvyklé názvy polí/synonyma:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudopole: dir, mime/format, type/rclcat, date.<br> PYíklady intervalo dvou dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Mo~ete pou~ít kulaté závorky, aby byly vci zYetelnjaí.<br> <i>"term1 term2"</i> : vtný úsek (musí se objevit pYesn). Mo~né modifikátory:<br> <i>"term1 term2"p</i> : neuspoYádané hledání podle blízkosti s výchozí vzdáleností.<br> Pou~ijte odkaz <b>Ukázat hledání</b>, kdy~ máte o výsledku pochybnost, a podívejte se do pYíru ky (&lt;F1>) na dalaí podrobnosti. Enter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date, size.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
You can use parentheses to make things clearer.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchšZde zadejte hledané výrazy. Stisknte ESC SPC pro doplnní sou asného výrazu.FEnter search terms here. Type ESC SPC for completions of current term.SSearchLVnjaí rejstYíky pro ulo~ená hledání: #External indexes for stored query: SSearchNázev souboru File nameSSearch>Není dostupná ~ádná dalaí pame Out of memorySSearchJazyk hledáníQuery languageSSearchRJazyky s kmeny slov pro ulo~ená hledání: %Stemming languages for stored query: SSearch(Vyberte typ hledání.Choose search type. SSearchBase SmazatClear SSearchBase Ctrl+SCtrl+S SSearchBasešZde zadejte hledané výrazy. Stisknte ESC SPC pro doplnní sou asného výrazu.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase*Smazat hledaný záznamErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase HledatSearch SSearchBaseSpustit hledání Start query SSearchBaseVaeAll SearchClauseWJakýkolivAny SearchClauseWNázev souboru File name SearchClauseW}ádné poleNo field SearchClauseW }ádnýNone SearchClauseWdPo et slov, která se smjí nacházet mezi hledanýmiHNumber of additional words that may be interspersed with the chosen ones SearchClauseWTato slovaPhrase SearchClauseWPodobné výrazy Proximity SearchClauseWjVyberte druh hledání, se kterým se slova budou hledat>Select the type of query that will be performed with the words SearchClauseWHledat:Find:Snippets DalaíNextSnippetsPYedchozíPrevSnippets ÚryvkySnippetsSnippetsP<p>V rámci omezení hledání nebyla bohu~el nalezena ~ádná shoda. Pravdpodobn je dokument velice velký a vyvíje úryvko se v nm ztratil (nebo skon il ve akarp)...</p>ˆ

Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...

 SnippetsW HledatSearch SnippetsWProcházetBrowseSpecIdxW(AdresáY k rejstYíkování v etn podadresáYo. Musí být uvnitY rejstYíkované oblasti<br>, jak je stanovena v souboru s nastavením (po áte ní adresáYe).€Directory to recursively index. This must be inside the regular indexed area
as defined in the configuration file (topdirs).SpecIdxW^Nezkouaet znovu soubory, které pYedtím selhaly.%Do not retry previously failed files.SpecIdxWrJinak jen zmnné nebo selhavaí soubory budou zpracovány.5Else only modified or failed files will be processed.SpecIdxWfVymazat pYed rejstYíkováním data vybraných souboro.*Erase selected files data before indexing.SpecIdxW®Ponechat prázdné pro vybrání vaech souboro. Mo~ete pou~ít více vzoro oddlených mezerami.<br>Vzory s vlo~enými mezerami musejí být uzavYeny ve dvojitých uvozovkách.<br>Lze pou~ít, jen kdy~ je nastaven za áte ní cíl.ÐLeave empty to select all files. You can use multiple space-separated shell-type patterns.
Patterns with embedded spaces should be quoted with double quotes.
Can only be used if the start target is set.SpecIdxWVýbrové vzory:Selection patterns:SpecIdxW,Zvláatní rejstYíkováníSpecial IndexingSpecIdxWhZa áte ní adresáY (jinak pou~ít po áte ní adresáYe):+Start directory (else use regular topdirs):SpecIdxWBPYedmt rejstYíkovaný od spuatníTop indexed entitySpecIdxW&ZavYít&Close SpellBase&Rozbalit &Expand  SpellBasePYízvukyAccents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBaseFRozliaování velkých a malých písmenCase SpellBase ShodaMatch SpellBase6}ádné informace o databázi. No db info. SpellBase"Prozkumník výrazo Term Explorer SpellBaseLDokumenty vytvoYené nebo aktualizované Documents created/updatedSpellW$Vyzkouaené soubory Files testedSpellW0NezrejstYíkované soubory Unindexed filesSpellW%1 výsledky(o) %1 resultsSpellW0Chyba rozaíYení Aspell. Aspell expansion error. SpellWjChyba pYi spuatní Aspellu. Aspell není nainstalován?)Aspell init failed. Aspell not installed?SpellWBPromrný po et výrazo na dokumentAverage terms per documentSpellW8Velikost adresáYe s databázíDatabase directory sizeSpellWDok. / Tot. Doc. / Tot.SpellW†RejstYík: %1 dokumento, promrná délka %2 výrazy(o). %3 výsledky(o)7Index: %1 documents, average length %2 terms.%3 resultsSpellWPolo~kaItemSpellWtVypsat soubory, které se nepodaYilo zrejstYíkovat (pomalé),List files which could not be indexed (slow)SpellWVSeznam byl zkrácen abecedn, nkteré  etné 1List was truncated alphabetically, some frequent SpellW<Nejvtaí délka dokumentu (mez)Longest document length (terms)SpellWTypy MIME: MIME types:SpellW4Nenalezeno ~ádné rozaíYeníNo expansion foundSpellWPo et dokumentoNumber of documentsSpellWRegulární výrazRegexpSpellWDVýsledky posledního rejstYíkování:Results from last indexing:SpellW6Ukázat statistiku rejstYíkuShow index statisticsSpellW<Nejmenaí délka dokumentu (mez) Smallest document length (terms)SpellW>Chyba v pravopisných návrzích. Spell expansion error. SpellW(Pravopis/HláskoslovíSpelling/PhoneticSpellW*RozaíYení kmene slovaStem expansionSpellW VýrazTermSpellWHodnotaValueSpellW Zástupné symboly WildcardsSpellWNChyba pYi vyhledání jazyka s kmeny slov#error retrieving stemming languagesSpellW\pojmy mohou chybt. Zkuste pou~ít delaí koYen..terms may be missing. Try using a longer root.SpellWVaechny výrazy All terms UIPrefsDialogJakýkoli výrazAny term UIPrefsDialogPJe potYeba vybrat alespoH jeden rejstYík$At most one index should be selected UIPrefsDialogŠNelze pYidat rejstYík s odlianou volbou pro velikost písma/diakritiku>Cant add index with different case/diacritics stripping option UIPrefsDialog VybratChoose UIPrefsDialog,Výchozí písmo QtWebkitDefault QtWebkit font UIPrefsDialogNázev souboru File name UIPrefsDialogJazyk hledáníQuery language UIPrefsDialog^Záhlaví seznamu s výsledky (výchozí je prázdné)%Result list header (default is empty) UIPrefsDialog¤Formát odstavce seznamu s výsledky (vymazat vaechny pro znovunastavení na výchozí)Toto je hlavní/místní rejstYík!This is the main/local index! UIPrefsDialog^Hodnota obdr~ená z posledního ukon ení programu Value from previous program exit UIPrefsDialogNChyba pYi vyhledání jazyka s kmeny slov#error retrieving stemming languages UIPrefsDialog^Mní se záznamy s odlianými nynjaími hodnotami.Changing entries with different current values ViewAction PYíkazCommand ViewActionVýchozí plochaDesktop Default ViewActionTyp MIME MIME type ViewAction(<b>Nové hodnoty:</b>New Values:ViewActionBaseN innost (prázdné -> výchozí pro Recoll) Action (empty -> recoll default)ViewActionBase.Pou~ít na nynjaí výbrApply to current selectionViewActionBase ZavYítCloseViewActionBaseJVýjimka pro nastavení pracovní plochy Exception to Desktop preferencesViewActionBaseProhlí~e eNative ViewersViewActionBase AktionRecoll action:ViewActionBaseîVyberte jeden nebo více datových typo a pou~ijte ovládací prvky v ráme ku ní~e pro zmnu zposobu, jakým jsou zpracoványkSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseôVyberte jeden nebo více MIME typo a pou~ijte ovládací prvky v ráme ku s tla ítky pro zmnu zposobu, jakým jsou zpracovány.lSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBaseVybrat stejný Select sameViewActionBaseZPou~ít nastavení pracovní plochy jako výchozí"Use Desktop preferences by defaultViewActionBasecurrent value current valueViewActionBase,Hledat regulární výraz Search regexpWebcacheJEditor internetové vyrovnávací pamtiWebcache editorWebcache,Kopírovat adresu (URL)Copy URL WebcacheEditSmazat výbrDelete selection WebcacheEdit˜RejstYíkova b~í. Nelze upravovat soubor s internetovou vyrovnávací pamtí.-Indexer is running. Can't edit webcache file. WebcacheEditªNeznámý stav rejstYíkova e. Nelze upravovat soubor s internetovou vyrovnávací pamtí.0Unknown indexer state. Can't edit webcache file. WebcacheEditÊInternetová vyrovnávací pame byla zmnna. Po zavYení tohoto okna budete muset spustit rejstYíkova .RWebcache was modified, you will need to run the indexer after closing this window. WebcacheEditMIMEMIME WebcacheModelURLUrl WebcacheModelPovolí rejstYíkování Firefoxem navatívených stránek.<br>(také je potYeba, abyste nainstalovali pYídavný modul Recollu pro Firefox)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelW€Záznamy budou po dosa~ení velikosti vráceny do povodního stavu.<br>Skute n dává smysl jen zvtaení velikosti, proto~e zmenaení hodnoty neoseká stávající soubor (na konci jen plýtvání místem).¾Entries will be recycled once the size is reached.
Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).confgui::ConfBeaglePanelWrNejvtaí velikost pro ukládání internetových stránek (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW8Zpracovat Yadu historie WEBuProcess the WEB history queueconfgui::ConfBeaglePanelW"Název pro adresáY, kam se mají ukládat kopie navatívených internetových stránek.<br>Neabsolutní cesta je vzata relativn k adresáYi s nastavením.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelW^Název adresáYe pro ukládání internetové stránkyWeb page store directory nameconfgui::ConfBeaglePanelW@Nelze zapsat soubor s nastavenímCan't write configuration fileconfgui::ConfIndexW VybratChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWh<p>Zapnout automaticky rozliaování velkých a malých písmen, kdy~ záznam obsahuje velká písmena (mimo na prvním míst). Jinak pro musíte pou~ít jazyk dotazu a modifikátor <i>C</i>.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelW|<p>Zapnout automaticky rozliaování diakritických znamének, kdy~ hledaný pojem obsahuje znaky a akcenty (ne v unac_except_trans). Jinak pro musíte pou~ít jazyk dotazu a modifikátor <i>D</i>.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelW <p>Nejvtaí po et rozaíYení pro jeden výraz (napY. pYi pou~ití ~olíko). Standardní výchozí hodnota 10 000 je rozumná a zabrání tomu, aby se hledaný pojem jevil jako zamrzlý, zatímco je procházen seznam pojmo.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelW°<p>Nejvtaí po et základních výrazo, které pYidáme do jednoho dotazu Xapian. V nkterých pYípadech se mohou výsledky rozaíYení výrazu vynásobit, a my se chceme vyvarovat nadbyte né spotYeb pamti. Standardní výchozí hodnota 100 000 by mla ve vtain pYípado naprosto posta ovat a hodit se k typickému sou asnému sestavení zaYízení (hardware).5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWVAutomaticky rozliaovat velká a malá písmena$Automatic character case sensitivityconfgui::ConfSearchPanelWVAutomaticky rozliaovat diakritická znaménka Automatic diacritics sensitivityconfgui::ConfSearchPanelW8Nejvtaí po et výrazo XapianMaximum Xapian clauses countconfgui::ConfSearchPanelW>Nejvtaí po et rozaíYení výrazuMaximum term expansion countconfgui::ConfSearchPanelWèVybraný seznam rejstYíkovaných typo MIME.<br>Nic jiného se nebude rejstYíkovat. Oby ejn je seznam prázdný a ne innýeAn exclusive list of indexed mime types.
Nothing else will be indexed. Normally empty and inactiveconfgui::ConfSubPanelW&Vylou ené typy MIMEExclude mime typesconfgui::ConfSubPanelW¦Vnjaí filtry pracující déle ne~ po tak dlouhou dobu budou pYeruaeny. Je to pro ten zYídkavý pYípad (napY. postscript), kdy by dokument mohl zapYí init vejití filtru do smy ky. Nastavte na -1 pro ~ádné omezení. ­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelWCelkovéGlobalconfgui::ConfSubPanelWªPokud je nastavena tato hodnota (nerovná se -1), textové soubory budou pro rejstYíkování rozdleny na kousky o této velikosti. To pomo~e pYi prohledávání velmi velkých textových souboro (napY. souboro se zápisem).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWRNejvtaí velikost zabaleného souboru (KB)Max. compressed file size (KB)confgui::ConfSubPanelWHNejvtaí  as na provedení filtru (s)Max. filter exec. time (S)confgui::ConfSubPanelWPNejvtaí velikost textového souboru (KB)Max. text file size (MB)confgui::ConfSubPanelWNTypy MIME, které se nemají rejstYíkovatMime types not to be indexedconfgui::ConfSubPanelWPouze typy MIMEOnly mime typesconfgui::ConfSubPanelWNVelikost stránky textového souboru (KB)Text file page size (KB)confgui::ConfSubPanelW"Tato hodnota nastavuje práh, za kterým nebudou zabalené soubory zpracovávány. Nastavte na -1 pro ~ádné omezení, na 0 pro vobec ~ádné rozbalování.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW^Tato hodnota nastavuje práh, za kterým nebudou textové soubory zpracovávány. Nastavte na -1 pro ~ádné omezení. Je to kvoli vylou ení obYích souboro se zápisem z rejstYíkování.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWì<p>Toto jsou výjimky pro mechanismus unac, který ve výchozím nastavení odstraHuje vaechny diakritické znaky a nahrazuje je kanonickými obdobami. Toto odstraHování akcento mo~ete (v závislosti na vaaí Ye i) pro nkteré znaky potla it a zadat dodate ná nahrazení, napY. pro ligatury. V ka~dém mezerou oddleném záznamu je první znak zdrojovým (výchozím) a zbytek je nahrazení.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelWJazyk aspelluAspell languageconfgui::ConfTopPanelW2Název adresáYe s databázíDatabase directory nameconfgui::ConfTopPanelW6Zaká~e pou~ívání aspellu pro vytvoYení pYibli~né podoby pravopisu v nástroji prozkumníka výrazo.<br> U~ite né, pokud aspell není pYítomen anebo nepracuje. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWXInterval v megabytech pro vymazání rejstYíkuIndex flush megabytes intervalconfgui::ConfTopPanelW6Název pro soubor se zápisem Log file nameconfgui::ConfTopPanelW2ÚroveH podrobnosti zápisuLog verbosity levelconfgui::ConfTopPanelW6Nejvtaí obsazení disku (%)Max disk occupation (%)confgui::ConfTopPanelWdNejvtaí obsazení disku (%, 0 znamená bez omezení))Max disk occupation (%, 0 means no limit)confgui::ConfTopPanelW"Nepou~ívat aspellNo aspell usageconfgui::ConfTopPanelW PYesko ené cesty Skipped pathsconfgui::ConfTopPanelW&Jazyky s kmeny slovStemming languagesconfgui::ConfTopPanelW´Soubor, do kterého se zapíae výstupní zpráva.<br>Pro výstupy na terminál pou~ijte 'stderr'PThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelW„Jazyk pro adresáY aspellu. Mlo by to vypadat jako 'en' nebo 'fr' nebo 'cs'...<br>Pokud není tato hodnota nastavena, pou~ije se pro její vypo ítání prostYedí NLS, co~ obvykle pracuje. Pro získání pYedstavy o tom, co je ve vaaem systému nainstalováno, napiate 'aspell config' a hledejte soubory .dat v adresáYi 'data-dir'. 3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW~Jazyky, pro které se vytvoYí <br>adresáYe rozaíYení kmeno slov.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW²Seznam adresáYo, ve kterých za íná rejstYíkování v etn podslo~ek. Výchozí: adresáY Home.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWNázev pro adresáY, v nm~ se má ukládat rejstYík.<br>Neabsolutní cesta je vzata relativn k adresáYi s nastavením. Výchozí je 'xapiandb'.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW’Názvy adresáYo, které se nebudou rejstYíkovat.<br>Mo~e obsahovat zástupné symboly (~olíky). Musí odpovídat cestám, které rejstYíkova vidí (napY. pokud v po áte ních adresáYích stojí '/home/me' a '/home' je ve skute nosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*')#These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelW¨Názvy názvy cest adresáYo, které se nebudou rejstYíkovat.<br>Mo~e obsahovat zástupné symboly (~olíky). Musí odpovídat cestám, které rejstYíkova vidí (napY. pokud v po áte ních adresáYích stojí '/home/me' a '/home' je ve skute nosti odkazem na '/usr/home', potom by byl správným zápisem skippedPath '/home/me/tmp*' a ne '/usr/home/me/tmp*')BThese are pathnames of directories which indexing will not enter.
Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelWtJde o procentní podíl vyu~ívání disku, kdy rejstYíkování sel~e a zastaví se (kvoli vyhnutí se zaplnní vaaeho disku).<br>0 znamená ~ádné omezení (tato hodnota je nastavena jako výchozí).—This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).confgui::ConfTopPanelWÚToto je procentní podíl vyu~ívání disku - celkové vyu~ití disku, ne velikost rejstYíku , kdy rejstYíkování sel~e a zastaví se (kvoli vyhnutí se zaplnní vaaeho disku).<br>Výchozí hodnota 0 odstraní vaechna omezení, znamená ~ádné omezení.œThis is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.
The default value of 0 removes any limit.confgui::ConfTopPanelW4Tato hodnota upravuje mno~ství dat, která jsou rejstYíkována mezi spláchnutími na disk.<br>Pomáhá to Yídit pou~ití pamti rejstYíkova e. Výchozí je 10 MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÌTato hodnota upravuje mno~ství zpráv,<br>od pouze chyb a~ po velké mno~ství dat zajímavých pro ladní.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW$Po áte ní adresáYeTop directoriesconfgui::ConfTopPanelWVýjimky unacUnac exceptionsconfgui::ConfTopPanelWZ&ruait&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase <PRE> + zalomení
 + wrapuiPrefsDialogBase\Hledání [Je~ía Kristus] se zmní na [Je~ía OR Kristus OR (Je~ía PHRASE 2 Kristus)].
Tímto by mly být silnji zvá~eny výsledky, které obsahují pYesné shody s hledaným slovem.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase Oddlova
 úryvkoAbstract snippet separatoruiPrefsDialogBaseZapnout vaeActivate AlluiPrefsDialogBasePYidat rejstYík	Add indexuiPrefsDialogBasePou~ít zmny
Apply changesuiPrefsDialogBaseÚAutomaticky spustit jednoduché hledání, kdy~ je do zadávacího pole pro hledání zadáno prázdné místo (mezera).-Auto-start simple search on whitespace entry.uiPrefsDialogBase^Automatické pYidání vt do jednoduchého hledání+Automatically add phrase to simple searchesuiPrefsDialogBase’etnost výskytu výrazu (procento) pro automatické tvoYení slovních obrato.Autophrase term frequency threshold percentageuiPrefsDialogBase Panel s tla
ítky
Buttons PaneluiPrefsDialogBaseVybratChooseuiPrefsDialogBase.Vybrat programy editoroChoose editor applicationsuiPrefsDialogBaseKlepnout pro pYidání dalaího rejstYíkového adresáYe do seznamu. Mo~ete vybrat bu adresáY s nastavením pro Recoll nebo rejstYík Xapian.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBasejZavYít do oznamovací oblasti panelu namísto ukon
ení.!Close to tray instead of exiting.uiPrefsDialogBase2Formát data (strftime(3))Date format (strftime(3))uiPrefsDialogBaseVypnout vaeDeactivate AlluiPrefsDialogBaseþRozhodnout, zda se dokumentové filtry ukazují jako kulatá tla
ítka, rozbalovací seznamy v nástrojovém pruhu, nebo jako nabídka.QDecide if document filters are shown as radio buttons, toolbar combobox, or menu.uiPrefsDialogBase„Zakázat automatické doplHování Qt pYi zadávání v poli pro hledání.*Disable Qt autocompletion in search entry.uiPrefsDialogBaseZahodit zmnyDiscard changesuiPrefsDialogBase²Stanovení, zda se má vytvoYit pYehled i tehdy, kdy~ dokument ji~ njaký pYehled obsahuje.EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseöStanovení, zda se má vytvoYit pYehled pro výsledky v souvislosti s parametrem hledání.
U velkých dokumento mo~e být pomalé.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBase:Styl výbru filtro dokumento:Document filter choice style:uiPrefsDialogBase6VytváYet pYehledy dynamickyDynamically build abstractsuiPrefsDialogBaseRUpravit záhlaví html na stran s výsledky#Edit result page html header insertuiPrefsDialogBaseHUpravit Yetzec formátu pro výsledky#Edit result paragraph format stringuiPrefsDialogBasePovolitEnableuiPrefsDialogBase Vnjaí rejstYíkyExternal IndexesuiPrefsDialogBase>Práh 
etnosti (procento), od kterého se výrazy nepou~ívají.
Slovní obraty obsahující pYília 
etné výrazy zposobují výkonnostní potí~e.
PYesko
ené výrazy zvtaují vzdálenost slovního obratu a zmenaují ú
innost funkce automatického hledání slovního obratu.
Výchozí hodnota je 2 (procenta).þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase0Skrýt zdvojené výsledky.Hide duplicate results.uiPrefsDialogBaseBZvýraznit styl CSS výrazo hledání#Highlight CSS style for query termsuiPrefsDialogBase<Zvýraznit barvu výrazo hledáníHighlight color for query termsuiPrefsDialogBase°Je-li zaakrtnuto, budou výsledky se stejným obsahem pod jinými názvy ukázány jen jednou.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseXádky v PRE textu nejsou zalomeny. PYi pou~ití BR dojde ke ztrát nkterých zalomení. Mo~ná je to, co chcete styl PRE + zalomení.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBasetNejvtaí velikost textu zvýraznného pro náhled (megabyty)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseNabídkaMenuuiPrefsDialogBase0Po
et výsledko na stranu"Number of entries in a result pageuiPrefsDialogBaseˆOtevYe dialog pro výbr souboru CSS se stylovým listem okna s úryvkyAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBase\OtevYe dialog pro výbr písma seznamu výsledko-Opens a dialog to select the result list fontuiPrefsDialogBasedOtevYe dialog pro výbr souboru se stylovým listem-Opens a dialog to select the style sheet fileuiPrefsDialogBasePYeklady cestPaths translationsuiPrefsDialogBase>Prostý text do stylu Yádku HTMLPlain text to HTML line styleuiPrefsDialogBasedUpYednostHovat pro náhled HTML pYed prostým textem&Prefer Html to plain text for preview.uiPrefsDialogBasebKouzelné pYípony souborového názvu jazyka hledání(Query language magic file name suffixes.uiPrefsDialogBaseFZapamatovat si stav zapnutí hledáníRemember sort activation state.uiPrefsDialogBase~Odstranit ze seznamu. Nemá to ~ádný ú
inek na ulo~ený rejstYík.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase"Odstranit vybranéRemove selecteduiPrefsDialogBase>Nahradit pYehledy v dokumentech Replace abstracts from documentsuiPrefsDialogBaseNastavit znovuResetuiPrefsDialogBase@Nastaví znovu styl okna s úryvky Resets the Snippets window styleuiPrefsDialogBasexNastaví písmo pro seznam s výsledky znovu na výchozí hodnotu1Resets the result list font to the system defaultuiPrefsDialogBaseJNastaví stylový list znovu na výchozí!Resets the style sheet to defaultuiPrefsDialogBase"Seznam s výsledkyResult ListuiPrefsDialogBase6Písmo pro seznam s výsledkyResult list fontuiPrefsDialogBase"Hledat pYi psaní.Search as you type.uiPrefsDialogBase"Parametry hledáníSearch parametersuiPrefsDialogBaseRUkázat ikonu v oznamovací oblasti panelu.Show system tray icon.uiPrefsDialogBase`Ukázat varování pYi otevírání do
asného souboru.)Show warning when opening temporary file.uiPrefsDialogBase0Soubor CSS okna s úryvkySnippets window CSS fileuiPrefsDialogBasexPo spuatní automaticky otevYít dialog pro rozaíYené hledání'Start with advanced search dialog open.uiPrefsDialogBaseRSpustit v jednoduchém vyhledávacím re~imuStart with simple search modeuiPrefsDialogBase$Jazyk s kmeny slovStemming languageuiPrefsDialogBaseStylový listStyle sheetuiPrefsDialogBaseLSoubor se slovy majícími stejný význam
Synonyms fileuiPrefsDialogBaseFPo
et souvisejících slov v pYehledu Synthetic abstract context wordsuiPrefsDialogBasePDélka vytvoYeného pYehledu (po
et znako)$Synthetic abstract size (characters)uiPrefsDialogBaseŽTexty nad tuto velikost nebudou v náhledu zvýrazHovány (pYília pomalé).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase¨Slova v seznamu budou v záznamu jazyka hledání automaticky obrácena na vty ext:xxx.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase PYepnout vybranéToggle selecteduiPrefsDialogBaseNRozbalovací seznam v nástrojovém paneluToolbar ComboboxuiPrefsDialogBase(U~ivatelské rozhraníUser interfaceuiPrefsDialogBase*U~ivatelská nastaveníUser preferencesuiPrefsDialogBaseôU~ivatelský styl k pou~ití v okn s úryvky.<br>Poznámka: Záhlaví stránky s výsledky je zahrnuto i v záhlaví okna s úryvky.ƒUser style to apply to the snippets window.
Note: the result page header insert is also included in the snippets window header.uiPrefsDialogBaseˆÿrecoll-1.23.7/qtgui/i18n/recoll_pl.ts0000644000175000017500000030107513125527323014251 00000000000000 AdvSearch All clauses Każdy warunek Any clause KtóryÅ› warunek media multimedia other pozostaÅ‚e Bad multiplier suffix in size filter Błędna jednostka we filtrze rozmiaru text tekstowe spreadsheet arkusze presentation prezentacje message wiadomoÅ›ci AdvSearchBase Advanced search DokÅ‚adne szukanie Search for <br>documents<br>satisfying:</br></br> Znajdź <br>dokumenty<br>speÅ‚niacjÄ…ce:</br></br> Delete clause UsuÅ„ warunek Add clause Dodaj warunek Restrict file types OkreÅ›l typ pliku Check this to enable filtering on file types Zaznacz, by okreÅ›lić typ pliku By categories Jako kategoria Check this to use file categories instead of raw mime types Zaznacz, by użyć kategorii Save as default ZapamiÄ™taj wybrane typy Searched file types Przeszukaj plik All ----> Wszystkie ----> Sel -----> Zaznaczone -----> <----- Sel <----- Zaznaczone <----- All <----- Wszystkie Ignored file types PomiÅ„ pliki Enter top directory for search Podaj szczyt katalogu szukania Browse PrzeglÄ…daj Restrict results to files in subtree: Tylko pliki LEŻĄCE W katalogu: Start Search Szukaj Close Zamknij All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.</br></br> Podane warunki (pola z prawej strony) bÄ™dÄ… użyte razem (dla zaznaczonego "Każdy warunek") lub oddzielnie (dla zaznaczonego "KtóryÅ› warunek"). <br>Pola "KtóreÅ›", "Wszystkie" i "Å»adne" przyjmujÄ… pojedyÅ„cze wyrazy lub frazy w cudzysÅ‚owiu.<br>Pola bez danych sÄ… ignorowane.</br></br> Invert LEŻĄCE POZA Minimum size. You can use k/K,m/M,g/G as multipliers Dopuszczalne jednostki: k/K, m/M, g/G Min. Size WiÄ™kszy od: Maximum size. You can use k/K,m/M,g/G as multipliers Dopuszczalne jednostki: k/K, m/M, g/G Max. Size Mniejszy od: Filter Filtry From Po: To Przed: Check this to enable filtering on dates Zaznacz, by okreÅ›lić datÄ™ Filter dates Po dacie Find Znajdź Check this to enable filtering on sizes Zaznacz, by okreÅ›lić rozmiar Filter sizes Po rozmiarze CronToolW Cron Dialog Ustaw cykl (CRON) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksuj cyklicznie (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Każde pole może zawierać wieloznacznik (*), pojdyÅ„czÄ… wartość, listÄ™ po przecinku (1,3,5) oraz zakres (1-7). Tak samo<span style=" font-style:italic;">jak</span>gdyby to byÅ‚ plik Crontab. Dlatego możliwe jest użycie skÅ‚adni Crontab. (zobacz crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />PrzykÅ‚adowo wpisujÄ…c <span style=" font-family:'Courier New,courier';">*</span> w <span style=" font-style:italic;">"Dni tygodnia", </span><span style=" font-family:'Courier New,courier';">12,19</span> w <span style=" font-style:italic;">"Godziny"</span> oraz <span style=" font-family:'Courier New,courier';">15</span> w <span style=" font-style:italic;">"Minuty"</span> uruchomili byÅ›my indeksowanie (recollindex) każdego dnia o 00:15 oraz 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indeksowanie cykliczne (nawet te bardzo czÄ™ste) jest mniej efektowne niż indeksowanie w czasie rzeczywistym.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Dni tygodnia (* or 0-7, 0 lub 7 to Niedziela) Hours (* or 0-23) Godziny (* lub 0-23) Minutes (0-59) Minuty (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kliknij <span style=" font-style:italic;">Wyłącz</span>, aby zatrzymać automatyczne indeksowanie. <span style=" font-style:italic;">Włącz</span>, aby je rozpocząć. <span style=" font-style:italic;">Anuluj</span>, aby utrzymać obecny stan.</p></body></html> Enable Włącz Disable Wyłącz It seems that manually edited entries exist for recollindex, cannot edit crontab Nie można zmienić crontab. WyglÄ…da na to, że istniejÄ… rÄ™czne wpisy dla recollindex. Error installing cron entry. Bad syntax in fields ? Błąd przy rejestrowaniu cyklu. Błędna skÅ‚adnia w polach? EditDialog Dialog Okno dialogowe EditTrans Source path Åšcieżka źródÅ‚owa Local path Åšcieżka lokalna Config error Błąd konfiguracji Original path Åšcieżka oryginalna EditTransBase Path Translations Åšcieżka tÅ‚umaczenia Setting path translations for Ustawienie Å›cieżki translacji dla Select one or several file types, then use the controls in the frame below to change how they are processed Wybierz jeden lub kilka typów pliku, nastÄ™pnie wskaż w ramce poniżej jak majÄ… zostać przetworzone Add Dodaj Delete UsuÅ„ Cancel Anuluj Save Zapisz FirstIdxDialog First indexing setup PoczÄ…tkowa konfiguracja indeksowania <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Indeks dla tej konfiguracji nie istnieje.</span><br /><br />JeÅ›li tylko chcesz indeksować swój katalog domowy użwyajÄ…c fabrcznych ustawieÅ„, wciÅ›nij przycisk <span style=" font-style:italic;">Rozpocznij indeksowanie </span>. Szczegóły możesz ustawić również później. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">JeÅ›li chesz mieć wiÄ™kszÄ… kontrolÄ™, użyj nastÄ™pujÄ…cych odnoÅ›ników w celu konfiguracji indeksowania oraz jego harmonogramu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To samo możesz również otrzymać poźniej wybierajÄ…c <span style=" font-style:italic;">Ustawienia</span> z menu.</p></body></html> Indexing configuration Konfiguracja indeksowania This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Tutaj możesz wybrać katalogi do indeksowania, oraz inne parametry tj. wyłączenie Å›cieżek plików czy ich nazw, domyÅ›lny zestaw znaków, etc. Indexing schedule Harmonogram indeksowania This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Tutaj możesz wybrać miÄ™dzy indeksowaniem w kolejce, a indeksowaniem nabierzÄ…co, jak i ustaleniem automatycznej kolejki indeksowania (dziÄ™ki Cron) Start indexing now Rozpocznij indeksowanie IdxSchedW Index scheduling setup Konfiguracja harmonogramu indeksowania <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indeksowanie <span style=" font-weight:600;">Recoll</span> może być uruchomione na staÅ‚e (indeksujÄ…c każdÄ… zmianÄ™) lub w okreÅ›lonych cyklach.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Instrukcja obsÅ‚ugi (EN) może pomóc wybrać rozwiÄ…zanie dla Ciebie (wciÅ›nij F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">NarzÄ™dzie to pomoże Ci zaplanować indeksowanie cykliczne lub wybierzesz indeksowanie "na bieżąco" po zalogowaniu (lub jedno i drugie, co rzadko jest sendowne).</p></body></html> Cron scheduling Planowanie z użyciem Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Tutaj zdecydujesz o jakim czasie indeksowanie ma być uruchamiane (po przez wpis do crontab). Real time indexing start up Uruchom indeksowanie "na bieżąco" Decide if real time indexing will be started when you log in (only for the default index). Pozwala uruchomić indeksowanie po zalogowaniu. ListDialog Dialog Okno dialogowe GroupBox Grupa Main No db directory in configuration Brak katalogu dla bazy danych w konfiguracji "history" file is damaged or un(read)writeable, please check or remove it: Plik "history" jest uszkodzony lub brak możliwoÅ›ci jego odczytu/zapisu, zmieÅ„ to lub go usuÅ„: Preview Close Tab Zamknij kartÄ™ Cancel Anuluj Missing helper program: Brak programu usprawniajÄ…cego: Can't turn doc into internal representation for Nie mogÄ™ przemienić dokumentu na wÅ‚adny format Creating preview text TworzÄ™ podglÄ…d tekstu Loading preview text into editor ÅadujÄ™ podglÄ…d tekstu do edytora &Search for: &Szukaj: &Next &NastÄ™pny &Previous &Poprzedni Clear Wyczyść Match &Case Sprawdzaj &wielkość liter Error while loading file Błąd Å‚adowania pliku PreviewTextEdit Show fields Pokaż pola Show main text Pokaż tekst główny Print Drukuj Print Current Preview Drukuj obecny podglÄ…d Show image Pokaż obraz Select All Zaznacz wszystko Copy Kopiuj Save document to file Zapisz dokument do pliku Fold lines ZwiÅ„ linie Preserve indentation Zachowaj wciÄ™cia QObject Global parameters Parametry globalne Local parameters Parametry lokalne <b>Customised subtrees</b> <b>Dostosowana gałąź</b> The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty.</br> Lista podkatalogów w zaindeksowanej hierarchii <br> dla których część parametrów musi być ustalona ponownie. DomyÅ›lnie: pusty.</br> <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons.</br></br></i> <i>Poniższe parametry tyczÄ… sÄ… podÅ›wietlonego katalogu z powyższej listy.<br> JeÅ›li powyższa lista jest pusta lub podÅ›wietla pustÄ… liniÄ™ poniższe ustawienia tyczÄ… siÄ™ najpÅ‚ytszego katalogu.<br>Możesz dodać lub usunąć katalog klikajÄ…c przyciski +/-</br></br></i> Skipped names Wykluczenia These are patterns for file or directory names which should not be indexed. Tutaj ustawiasz reguÅ‚y wykluczajÄ…ce indeksowanie plików i katalogów. Default character set DomyÅ›lny zestaw znaków This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.</br> To jest zestaw znaków sÅ‚użący do odczytu plików i nie jest tożsamy z ustawieniami wewnÄ™trznymi (np: czyste pliki tesktowe)<br>DomyÅ›lnie jest pusty, a użyta jest wartość ze Å›rodowiska NLS.</br> Follow symbolic links Idź za dowiÄ…zaniami symbolicznymi Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Follow symbolic links while indexing. The default is no, to avoid duplicate indexing IndeksujÄ…c, idź za dowiÄ…zaniami symbolicznymi. DomyÅ›lnia wartość to NIE, chroni przed zduplikowanymi indeksami. Index all file names Indeksuj wszystkie nazwy plików Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indeksuj nazwy plików dla których zawartość nie może być rozpoznana lub przetworzona (Nie lub nieobsÅ‚ugiwany typ MIME). DomyÅ›lnie Tak. Search parameters Parametry szukania Web history Historia sieci RTIToolW Real time indexing automatic start Automatyczny start indeksowania w czasie rzeczywistym <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksacja może być uruchomiona w tle (daemon), aktualizujÄ…c indeks nabierzÄ…co. Zyskujesz zawsze aktualny indeks, tracÄ…c część zasobów systemowych.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Uruchom indeksowanie w tle razem ze startem komputera. Also start indexing daemon right now. Dodatkowo natychmiast uruchom indeksowanie w tle. Replacing: Podmiana: Replacing file Podmiana pliku Can't create: Nie mogÄ™ utworzyć: Warning Ostrzeżenie Could not execute recollindex Nie można wykonać recollindex Deleting: Usuwanie: Deleting file Usuwanie pliku Removing autostart Usuwanie autostartu Autostart file deleted. Kill current process too ? UsuniÄ™to plik autostartu. Zamknąć również bieżący proces? RclMain (no stemming) wyłącz ciosanie (ang. stemming) (all languages) (każdy jÄ™zyk) error retrieving stemming languages Błąd pobierania "reguÅ‚ ciosania" (ang. stemming languages) Indexing in progress: Indeksowanie w tracie: Purge Wyczyść Stemdb Stemdb Closing Zamykanie Unknown Nieznane Query results Wynik zapytania Cannot retrieve document info from database Brak możliwoÅ›ci pobrania informacji o dokumencie z bazy danych Warning Ostrzeżenie Can't create preview window Nie można utworzyć okna podglÄ…du This search is not active any more To wyszukanie przestaÅ‚o być aktywne Cannot extract document or create temporary file Nie można wypakować dokumentu lub stworzyć plik tymczasowy Executing: [ WykonujÄ™: [ About Recoll Karta Recoll History data Historia danych Document history Historia dokumentów Update &Index OdÅ›wież &Indeks Stop &Indexing Zatrzymaj &Indeksowanie All Wszystko media multimedia message wiadomoÅ›ci other pozostaÅ‚e presentation prezentacje spreadsheet arkusze text tekstowe sorted posortowane filtered przefiltrowane No helpers found missing Wszystkie rozszerzenia znaleziono Missing helper programs BrakujÄ…ce rozszerzenia Document category filter Filtr kategorii dokumentu No external viewer configured for mime type [ Brak skonfigurowanej zewnÄ™trzenej przeglÄ…darki typów MIME [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Brak przeglÄ…darki dla typu MIME %1: %2 . Chcesz to ustawić teraz? Can't access file: Nie mogÄ™ uzyskać dostÄ™pu do pliku: Can't uncompress file: Nie mogÄ™ wypakować pliku: Save file Zapisz plik Result count (est.) Liczba wyników (szac.) Could not open external index. Db not open. Check external indexes list. Nie mogÄ™ otworzyc zewnÄ™trznego indeksu. Nie otwarta baza danych. Sprawdź listÄ™ zewnÄ™trznych indeksów. No results found Brak wyników None Nic Updating OdÅ›wieżanie Done ZakoÅ„czone Monitor Sprawdzanie Indexing failed Porażka indeksowania The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Obecny proces indeksowania uruchomiono z innego okna. Kliknij Ok, by zamknąć proces. Erasing index Usuwanie indeksu Reset the index and start from scratch ? Ponownie spisać indeks od zera? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program</br></br> Trwa odpytywanie.<br>z powodu ograniczeÅ„ biblioteki indeksowania,<br>anulowanie zamknie program</br></br> Error Błąd Index not open Indeks jest zamkniÄ™ty Index query error Błąd odpytania indeksu Content has been indexed for these mime types: Zawartość zostaÅ‚a zaindeksowana dla tych typów MIME: Can't update index: indexer running Nie mogÄ™ zaktualizować indeksu: pracujÄ…cy indekser Indexed MIME Types Zaindeksowane typy MIME Bad viewer command line for %1: [%2] Please check the mimeview file Błędna komenda przeglÄ…darki dla typu %1: [%2] Sprawdź plik widoku MIME Viewer command line for %1 specifies both file and parent file value: unsupported Polecenie czytnika dla %1 podaje zarówno plik jak i wartość pliku rodzica: niewspierane Cannot find parent document Nie można odszukać rodzica dokumentu Indexing did not run yet Indeksowanie nie zostaÅ‚o jeszcze uruchomione External applications/commands needed for your file types and not found, as stored by the last indexing pass in Brak zewnÄ™trznych aplikacji|komend wymaganych przez twoje typy plików. Index not up to date for this file. Refusing to risk showing the wrong entry. Indeks tego pliku jest nieaktualny. Odmawiam podania błędnych wyników. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Kliknij Ok by uaktualnić indeks tego pliku, po zakoÅ„czeniu ponów zapytanie lub Anuluj. Indexer running so things should improve when it's done Indeksowanie w trakcie, spodziewana poprawa po zakoÅ„czeniu. Sub-documents and attachments Poddokumenty i załączniki RclMainBase Recoll Recoll Search tools NarzÄ™dzia wyszukiwania Result list Wyniki &File &Plik &Tools &NarzÄ™dzia &Preferences &Ustawienia &Help &Pomoc E&xit &ZakoÅ„cz Ctrl+Q Ctrl+Q Update &index &Aktualizacja indeksu &Erase document history &UsuÅ„ historiÄ™ dokumentu &About Recoll &Karta Recoll &User manual &Instrukcja Document &History &Historia dokumentu Document History Historia Dokumentu &Advanced Search &Zaawansowane szukanie Advanced/complex Search ZÅ‚ożone szukanie &Sort parameters Parametry &sortowania Sort parameters Parametry sortowania Term &explorer Przejżyj &terminy Term explorer tool PrzeglÄ…danie terminów Next page NastÄ™pna strona Next page of results NastÄ™pna strona wyników First page Pierwsza strona Go to first page of results Przejdź do pierwszej strony wyników Previous page Poprzednia strona Previous page of results Poprzednia strona wyników External index dialog ZewnÄ™trzny indeks All Wszystko &Show missing helpers Pokaż &brakujÄ…cych pomocników PgDown PgDown PgUp PgUp &Full Screen PeÅ‚en &Ekran F11 F11 Full Screen PeÅ‚en ekran &Erase search history &UsuÅ„ historiÄ™ szukania Sort by dates from oldest to newest Sortuj po dacie: od najstarszego Sort by dates from newest to oldest Sortuj po dacie: od najnowszego Show Query Details Pokaż szczegóły zapytania &Rebuild index &Odnów indeks &Show indexed types Pokaż zaindeksowane &typy Shift+PgUp Shift+PgUp &Indexing schedule &Plan indeksowania E&xternal index dialog ZewnÄ™trzny indeks &Index configuration &Konfiguracja indeksu &GUI configuration Konfiguracja &GUI &Results &Wyniki Sort by date, oldest first Sortuj po dacie: od najstarszego Sort by date, newest first Sortuj po dacie: od najnowszego Show as table Pokaż jako tabela Show results in a spreadsheet-like table Pokaż wyniki jako arkusz Save as CSV (spreadsheet) file Zapisz jako plik CSV (arkusz) Saves the result into a file which you can load in a spreadsheet Zapisz wyniki do pliku czytelnego przez arkusz Next Page NastÄ™pna strona Previous Page Poprzednia strona First Page Pierwsza strona RecollModel Abstract Abstrakcja Author Autor Document size Rozmiar dokumentu Document date Data dokumentu File size Rozmiar pliku File name Nazwa pliku File date Data pliku Keywords SÅ‚owa klucze Original character set Oryginalny zestaw znaków Relevancy rating Trafność Title TytuÅ‚ URL URL Mtime Czas modyfikacji Date Data Date and time Data i czas Ipath Ipath MIME type Typ MIME ResList Result list Lista wyników (show query) (Pokaż zapytanie) Document history Historia dokumentu <p><b>No results found</b><br /></p> <p><b>Brak wyników</b><br /></p> Previous Poprzedni Next NastÄ™pny Unavailable document Dokument niedostÄ™pny Preview Poprzedni Open Otwórz <p><i>Alternate spellings (accents suppressed): </i></p> <p><i>Aleternatywna pisowania (ignorowane akcenty): </i></p> Documents Dokumenty out of at least z co najmniej for dla <p><i>Alternate spellings: </i></p> <p><i>Alternatywna pisownia: </i></p> Duplicate documents Duplikaty dokumentów These Urls ( | ipath) share the same content: Te URLe ( | ipath) majÄ… tÄ… samÄ… zawartość: Result count (est.) Liczba wyników (oszacowana) Query details Szczegóły zapytania ResTable &Reset sort &Reset sortowania &Delete column &UsuÅ„ kolumnÄ™ Save table to CSV file Zapisz tabelÄ™ jako plik CSV Can't open/create file: Nie można otworzyć|utworzyć pliku: &Save as CSV &Zapisz jako CSV Add "%1" column Dodaj "%1" kolumnÄ™ ResultPopup &Preview &Poprzedni &Open &Otwórz Copy &File Name &Kopiuj nazwÄ™ pliku Copy &URL Kopiuj &URL &Write to File Zapisz &do pliku Save selection to files Zapisz zaznaczenie do pliku Preview P&arent document/folder PodglÄ…d rodzica dokumentu|katalogu &Open Parent document/folder &Otwórz dokument|katalog rodzica Find &similar documents Znajdź &podobne dokumenty Open &Snippets window Otwórz okno &snipetów Show subdocuments / attachments Pokaż poddokumenty|załączniki SSearch Any term KtóryÅ› termin All terms Każdy termin File name Nazwa pliku Query language JÄ™zyk zapytaÅ„ Bad query string Błędne zapytanie Out of memory Brak pamiÄ™ci Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (<F1>) for more detail. </br></br></br></br></br></br></br></br></br></br></br> Wprowadź wyrażenie pytajÄ…ce. ÅšciÄ…ga:<br> <i>termin1 termin2</i> : 'termin1' i 'termin2' w którymÅ› polu.<br> <i>pole:termin1</i> : 'termin1' w polu 'pole'.<br> Standardowe pola nazwy|synonimy:<br> tytuÅ‚/przedmiot/napis, autor/od, odbiorca/do, nazwa pliku, ext.<br> Pseudo-pola: katalog, mime/format, typ/rclcat, data.<br> PrzykÅ‚ad przedziaÅ‚u dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>termin1 termin2 LUB termin3</i> : termin1 LUB (termin2 LUB termin3).<br> Nawiasy aktualnie niedozwolone.<br> <i>"termin1 termin2"</i> : fraza (wystÄ…pienie dokÅ‚adne). DostÄ™pne modyfikatory:<br> <i>"termin1 termin2"p</i> : nieuporzÄ…dkowane sÄ…siednie szukanie z domyÅ›lnÄ… odlegÅ‚oÅ›ciÄ….<br> Użyj <b>Pokaż zapytanie</b> jeÅ›li jesteÅ› niepewny wyników i sprawdź je z instrukcjÄ… (<F1>) . </br></br></br></br></br></br></br></br></br></br></br> Enter file name wildcard expression. Wprowadź wieloznakowe (wildcard) wyrażenie nazwy pliku Enter search terms here. Type ESC SPC for completions of current term. Wprowadź tutaj szkane terminy. Wpisz ESC SPC by uzupeÅ‚nić bieżący termin. SSearchBase SSearchBase SSearchBase Clear Wyczyść Ctrl+S Ctrl+S Erase search entry UsuÅ„ szukany wpis Search Szukaj Start query Start zapytania Enter search terms here. Type ESC SPC for completions of current term. Wprowadź tutaj szkane terminy. Wpisz ESC SPC by uzupeÅ‚nić bieżący termin. Choose search type. Wybierz typ szukania. SearchClauseW Select the type of query that will be performed with the words Wybierz typ zapytania, który bÄ™dzie użyty z wyrazami Number of additional words that may be interspersed with the chosen ones Liczba dodatkowych wyrazów, które mogÄ… być przeplatane z wybranymi No field Bez pola Any KtóryÅ› All Każdy None Å»aden Phrase Fraza Proximity SÄ…siedztwo File name Nazwa pliku Snippets Snippets Snipety Find: Znajdź: Next NastÄ™pny Prev Poprzedni SnippetsW Search Szukaj SpellBase Term Explorer PrzeglÄ…d terminów &Expand &Rozszerz Alt+E Alt+E &Close &Zamknij Alt+C Alt+C No db info. Brak informacji bd. Match Dopasowanie Case Wielkość znaków (Case) Accents Akcenty SpellW Wildcards Wieloznaczniki (wildcards) Regexp Wyrażenie reguÅ‚owe (regexp) Stem expansion Roszerzenie rdzenia (Stem expansion) Spelling/Phonetic Pisownia/Fonetyczność error retrieving stemming languages Błąd pobierania "reguÅ‚ ciosania" (ang. stemming languages) Aspell init failed. Aspell not installed? Nieudany start Aspell. Nie zainstalowano Aspell? Aspell expansion error. Błąd rozszerzenia Aspell. No expansion found Nieznalezione rozszerzenie Term Termin Doc. / Tot. Dok. / Razem Index: %1 documents, average length %2 terms.%3 results Indeks: %1 dokumenty, Å›rednia dÅ‚ugość %2 terminów.%3 wyników %1 results %1 wyników List was truncated alphabetically, some frequent Lista obciÄ™ta alfabetycznie, część czÄ™sta terms may be missing. Try using a longer root. Terminy mogÄ… zginąć. Użyj dÅ‚uższego rdzenia Show index statistics Pokaż statystyki indeksowania Number of documents Liczba dokumentów Average terms per document Åšrednia terminów na dokument Smallest document length Najmniejsza dÅ‚ugość dokumentu Longest document length NajwiÄ™ksza dÅ‚ugość dokumentu Database directory size Rozmiar katalogu bazy danych MIME types: Typy MIME: Item Element Value Wartość UIPrefsDialog error retrieving stemming languages Błąd pobierania "reguÅ‚ ciosania" (ang. stemming languages) The selected directory does not appear to be a Xapian index Wybrany katalog nie wyglÄ…da jak indeks Xapian This is the main/local index! To jest główny|lokalny indeks! The selected directory is already in the index list Wybrany sÅ‚ownik już należy do indeksu Choose Wybierz Result list paragraph format (erase all to reset to default) Format paragrafu listy wyników (usuÅ„ wszystko by wróćić do domyÅ›lnych) Result list header (default is empty) Nagłówek listy wyników (domyÅ›lnie pusty) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Wybierz katalog konfiguracji recoll lub katalog indeksu xapian (np.: /home/ja/.recoll lub /home/ja/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Wybrany katalog wyglÄ…da jak katalog konfiguracji Recoll, jednakże kofiguracja nie może być przeczytana At most one index should be selected Co najwyżej jeden indeks powinnien być wyberany Cant add index with different case/diacritics stripping option Nie można dodać indeksu z opcjÄ… różnej wielkoÅ›ci-liter/znakach-diakrytycznych ViewAction Command Komenda MIME type Typ Mime Desktop Default DomyÅ›lnie ustawienia pulpitu Changing entries with different current values Zmiana wpisów o różne obecne wartoÅ›ci ViewActionBase Native Viewers Systemowy czytnik Close Zamknij Select one or several mime types then use the controls in the bottom frame to change how they are processed. Wybierz jedno lub kilka typów MIME po czym okreÅ›l jak majÄ… być przetwarzane używajÄ…c kontrolek na dole ramki Use Desktop preferences by default Użyj domyÅ›lnie ustawieÅ„ Pulpitu Select one or several file types, then use the controls in the frame below to change how they are processed Wybierz jeden lub kilka typów pliku, nastÄ™pnie wskaż w ramce poniżej jak majÄ… zostać przetworzone Exception to Desktop preferences WyjÄ…tki dla ustawieÅ„ Pulpitu Action (empty -> recoll default) CzyÅ„ (pusty -> recoll domyÅ›lnie) Apply to current selection Użyj dla obecnego wyboru Recoll action: Recoll zachowanie: current value obecna wartość Select same Wybierz to samo <b>New Values:</b> <b>Nowa wartość:</b> confgui::ConfBeaglePanelW Entries will be recycled once the size is reached Wpisy bÄ™dÄ… odnowione gdy osiÄ…gnie rozmiar Web page store directory name Nazwa katalogu dla trzymania stron web The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory.</br> Nazwa katalogu w którym trzymane sÄ… kopie odwiedzonych stron.<br>Nieabsolutna Å›cieżka jest brana wzglÄ™dnie do katalogu konfiguracji.</br> Max. size for the web store (MB) Maks. rozmiar dla schowka webowego (MB) Process the WEB history queue Przejdź do kolejki historii web Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin)</br> Włącz ineksowanie odwiedzonych stron w Firefox.<br>(Wymagana instalacja dodatku Firefox Recoll)</br> confgui::ConfIndexW Can't write configuration file Nie można pisać w pliku konfiguracji confgui::ConfParamFNW Choose Wybierz confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Automatyczna czuÅ‚ość na diakrytyki <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity.</p> <p>Automatycznie uruchom czuÅ‚ość diakrytyków jeÅ›li szukana fraza zawiera "ogonki" (nie w unac_except_trans). Inaczej musisz użyć jÄ™zyka zapytaÅ„ oraz modyfikator<i>D</i> by wskazać czuÅ‚ość diakrytyków.</p> Automatic character case sensitivity Automatyczna czuÅ‚ość wielkoÅ›ci znaków <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity.</p> <p>Automatycznie uruchom rozróżnianie wielkoÅ›ci znaków jeÅ›li wpis ma wielkie litery (poza pierwszym znakiem). Inaczej musisz użyć jÄ™zyka zapytaÅ„ oraz modyfikatora <i>C</i> by wskazać rozróżnianie wielkoÅ›ci liter.</p> Maximum term expansion count Maksymalna liczba rozszerzeÅ„ terminu <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.</p> <p>Maksymalna liczba rozszerzeÅ„ dla pojedyÅ„czego terminu (np.: używajÄ…c wieloznaczników). DomyÅ›lne 10 000 jest wartoÅ›ciÄ… rozsÄ…dnÄ… oraz strzeże przed zawieszeniem zapytania podczas gdy przeszukiwana jest lista terminów</p> Maximum Xapian clauses count Maksymalna liczba klauzuli Xapian <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.</p> <p>Maksymalna liczba poczÄ…tkowych klauzuli dodawanych do zapytania Xapian. W niektórych przypadkach, wynik rozszerzeÅ„ terminu może być pomnożony, zwiÄ™kszajÄ…c zużycie pamiÄ™ci. DomyÅ›lne 100 000 powinno być dostatecznie wysokie dla wiÄ™kszoÅ›ci przypadków oraz dziaÅ‚ajÄ…ce na obecnych konfiguracjach sprzÄ™towych.</p> confgui::ConfSubPanelW Global Globalnie Max. compressed file size (KB) Maks. rozmiar skompresowanego pliku (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Wartość progowa od której skompresowane pliki przestajÄ… być przetwarzane. Brak limitu to -1, 0 wyłącza przetwarzanie plików skompresowanych. Max. text file size (MB) Maks. rozmiar plików tekstowych (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Wartość progowa po której pliki tekstowe przestajÄ… być przetwarzane. Brak limitu to -1. Używaj do wykluczenia gigantycznych plików dziennika systemowego (logs). Text file page size (KB) Rozmiar strony pliku tekstowego (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). IndeksujÄ…c dzieli plik tekstowy na podane kawaÅ‚ki (jeÅ›li różne od -1). Pomocne przy szukaniu w wielkich plikach (np.: dzienniki systemowe). Max. filter exec. time (S) Maks. czas filtrowania (s) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Przerywa po tym czasie zewnÄ™trzne filtrowanie. Dla rzadkich przypadków (np.: postscript) kiedy dokument może spowodować zapÄ™tlenie filtrowania. Brak limitu to -1. confgui::ConfTopPanelW Top directories Szczytowe katalogi The list of directories where recursive indexing starts. Default: your home. Lista katalogów rekursywnego indeksowania. DomyÅ›lnie: Twój katalog domowy. Skipped paths Wykluczone Å›cieżki These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')</br> Te katalogi sÄ… wykluczone z indeksowania.<br> Dozwolone wieloznaczniki. MuszÄ… odpowiadać Å›cieżkom znanym indekserowi (np.: jeÅ›li szczytowy katalog zawiera "/home/ja" i "/home" jest linkiem do "/usr/home", to poprawna Å›cieżka to "/home/ja/tmp*", natomiast błędna to "/usr/home/ja/tmp*")</br> Stemming languages ReguÅ‚y ciosania (ang. stemming languages) The languages for which stemming expansion<br>dictionaries will be built.</br> JÄ™zyki dla których sÅ‚ownik rozszerzenia ciosania<br> (stemming) bÄ™dzie zbudowany.</br> Log file name Nazwa pliku dziennika (logs) The file where the messages will be written.<br>Use 'stderr' for terminal output</br> Plik w którym zapisywane sÄ… komunikaty.<br>Użyj "stderr" by skorzystać z konsoli</br> Log verbosity level Poziom stężenia komunikatu This value adjusts the amount of messages,<br>from only errors to a lot of debugging data.</br> Wartość ta ustawia ilość komunikatów,<br>od prostych błędów aż po mnogie informacje diagnostyczne.</br> Index flush megabytes interval InterwaÅ‚ (megabajty) opróżniania indeksowania This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB </br> Ustawia próg indeksowania danych zanim zostanÄ… wysÅ‚ane na dysk.<br>Odpowiada za kontrolowanie zużycia pamiÄ™ci przez indekser. DomyÅ›lnie: 10MB</br> Max disk occupation (%) Maks. zużycie dysku (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default).</br> Procent zużycia dysku po którym indeksowanie zostanie przerwane (chroni przed zapeÅ‚nieniem dysku).<br>0 oznacz brak limitu (domyÅ›lnie).</br> No aspell usage Brak użycia Aspell Aspell language JÄ™zyk Aspell Database directory name Nazwa katalogu bazy danych Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. </br> Wyłącz używanie Aspell do tworzenia przybliżeÅ„ w narzÄ™dziu przeglÄ…dania terminów.<br> Użyteczne, gdy brak Aspell lub jest zepsuty. </br> The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. </br> JÄ™zyk dla katalogu Aspell, wyglÄ…dajÄ…cy jak "en" lub "pl" ..<br>Gdy brak, wartość Å›rodowiska NLS zostanie użyta (zwykle dziaÅ‚a). By sprawdzić, co posiadasz zainstalowane, wpisz "aspell config" po czym znajdź pliki .dat w katalogu "data-dir". </br> The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.</br> Nazwa katalogu przechowania indeksu<br>Nieabsolutna Å›cieżka jest brana wzglÄ™dnie do katalogu konfiguracji. DomyÅ›lnie jest to "xapiandb".</br> Unac exceptions Unac exceptions <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.</p> <p>To sÄ… wyjÄ…tki mechaniki unac., która domyÅ›lnie usuwa wszystkie diakrytyki oraz wykonujÄ… dekompozycjÄ™ kanonicznÄ…. Możliwe nadpisanie nieakcentowania dla pewnych znaków, w zależnoÅ›ci od twojego jÄ™zyka oraz wyszczególnienie dodatkowych dekompozycji, np.: ligatur. Dla każdego wpisu (oddzielony spacjami) pierwszy znak to źródÅ‚o, pozostaÅ‚e to tÅ‚umaczenie</p> uiPrefsDialogBase User preferences Ustawienia User interface WyglÄ…d Number of entries in a result page Liczba wyników na stronie If checked, results with the same content under different names will only be shown once. WyÅ›wietl tylko raz gdy tak sama zawartość (choć różne nazwy) Hide duplicate results. Ukryj duplikaty w wynikach. Highlight color for query terms PodÅ›wietl terminy z zapytania Result list font Czcionka listy wyników Opens a dialog to select the result list font Otwiera okno wyboru czcionek Helvetica-10 Helvetica-10 Resets the result list font to the system default Reset czcionki wyników do domyÅ›lnej Reset Reset Texts over this size will not be highlighted in preview (too slow). Teksty powyżej tego rozmiaru bÄ™dÄ… ukryte w podglÄ…dzie (zbyt wolne). Maximum text size highlighted for preview (megabytes) Maks. rozmiar tekstu dla wyróżnienia w podglÄ…dzie (MB) Choose editor applications Wybierz edytor aplikacji Display category filter as toolbar instead of button panel (needs restart). WyÅ›wietl filtr kategorii jako pasek zamiast panelu (wymagany restart). Auto-start simple search on whitespace entry. Proste szukanie gdy użyto biÅ‚ych znaków we wpisie. Start with advanced search dialog open. Rozpocznij oknem zaawansowanego szukania. Remember sort activation state. PamiÄ™taj stan sortowania. Prefer Html to plain text for preview. Użyj HTML (zamiast czysty tekst) dla podglÄ…du. Search parameters Parametry szukania Stemming language JÄ™zyk ciosania A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Wyszukanie dla [rolling stones] (2 terminy) zostanie zamienione na [rolling or stones or (rolling phrase 2 stones)]. To powinno dać pierwszeÅ„stwo wynikom, dokÅ‚adnie tak jak zostaÅ‚y wpisane. Automatically add phrase to simple searches Automatycznie dodaj frazÄ™ do szukania prostego Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Mam budować streszczenie dla wyników po przez użycie kontekstu teminów zapytania? Może zwalniać dla dużych dokumentów. Dynamically build abstracts Buduj streszczenia dynamicznie Do we synthetize an abstract even if the document seemed to have one? Tworzyć sztuczne streszczenie nawet jeÅ›li dokument ma wÅ‚asne? Replace abstracts from documents ZamieÅ„ streszczenia z dokumentów Synthetic abstract size (characters) Rozmiar sztucznego streszczenia (w znakach) Synthetic abstract context words Kontekstowe wyrazy sztucznego streszczenia The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Wyrazy z listy zostanÄ… automatycznie zmienione w klauzule ext:xxx we wpisach jÄ™zyka zapytaÅ„. Query language magic file name suffixes. Magiczne przyrostki nazw plików jÄ™zyka zapytaÅ„ Enable Włącz External Indexes ZewnÄ™trzne indeksy Toggle selected Odwróc zaznaczenie Activate All Aktywuj wszystko Deactivate All Deaktywuj wszystko Remove from list. This has no effect on the disk index. UsuÅ„ z listy. Brak skutku dla indeksu na dysku. Remove selected UsuÅ„ zaznaczenie Add index Dodaj indeks Apply changes Zastosuj zmiany &OK &Ok Discard changes Porzuć zmiany &Cancel &Anuluj Abstract snippet separator Oddzielacz snipetu streszczenia Style sheet Arkusz stylów Opens a dialog to select the style sheet file Otwiera okno wyboru arkusza stylów Choose Wybierz Resets the style sheet to default Reset arkusza stylów do domyÅ›lnych Result List Lista wyników Edit result paragraph format string ZmieÅ„ format paragrafu dla wyniku Edit result page html header insert ZmieÅ„ nagłówek HTML dla strony wyników Date format (strftime(3)) Format daty (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Próg czÄ™stotliowÅ›ci procentowej dla której terminy wew. autofrazy nie sÄ… używane. CzÄ™ste terminy sÄ… powodem sÅ‚abej wydajnoÅ›ci fraz. PominiÄ™te terminy zwiÄ™kszajÄ… rozlużnienie frazy oraz zmniejszanjÄ… wydajność autofrazy. DomyÅ›lna wartość to 2 (%). Autophrase term frequency threshold percentage Procentowy próg czÄ™stoÅ›ci dla terminu Autofrazy Plain text to HTML line style Styl linii czystego tekstu do HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Linie w PRE nie sÄ… zwijane. Użycie BR zaciera wciÄ™cia. PRE + Zawijaj styl może być tym co szukasz. <BR /> <BR /> <PRE /> <PRE /> <PRE> + wrap</PRE> <PRE> + zawijaj</PRE> Disable Qt autocompletion in search entry. Wyłącz podpowiedź Qt dla wpisu szukania Search as you type. Szukaj podczas pisania. Paths translations Åšcieżki tÅ‚umaczeÅ„ Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Kliknij by dodać kolejny katalog do listy. Możesz wybrać zarówno katalog konfiguracji Recoll jak i indeks Xapian. Snippets window CSS file Okno snippetów CSS Opens a dialog to select the Snippets window CSS style sheet file Otwórz okno by wybrać snipet CSS Resets the Snippets window style Reset stylu okna recoll-1.23.7/qtgui/i18n/recoll_xx.ts0000644000175000017500000030175213224431020014263 00000000000000 AdvSearch All clauses Any clause media other Bad multiplier suffix in size filter text spreadsheet presentation message texts spreadsheets AdvSearchBase Advanced search Search for <br>documents<br>satisfying: Delete clause Add clause Restrict file types Check this to enable filtering on file types By categories Check this to use file categories instead of raw mime types Save as default Searched file types All ----> Sel -----> <----- Sel <----- All Ignored file types Enter top directory for search Browse Restrict results to files in subtree: Start Search Close All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog EditTrans Source path Local path Config error Original path EditTransBase Path Translations Setting path translations for Select one or several file types, then use the controls in the frame below to change how they are processed Add Delete Cancel Save FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration "history" file is damaged or un(read)writeable, please check or remove it: Preview Close Tab Cancel Missing helper program: Can't turn doc into internal representation for Creating preview text Loading preview text into editor &Search for: &Next &Previous Clear Match &Case Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Local parameters <b>Customised subtrees The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. Skipped names These are patterns for file or directory names which should not be indexed. Follow symbolic links Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Index all file names Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Search parameters Web history Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &Open Open With Run Script Copy &File Name Copy &URL &Write to File Save selection to files Preview P&arent document/folder &Open Parent document/folder Find &similar documents Open &Snippets window Show subdocuments / attachments QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain (no stemming) (all languages) error retrieving stemming languages Indexing in progress: Purge Stemdb Closing Unknown Query results Cannot retrieve document info from database Warning Can't create preview window This search is not active any more Cannot extract document or create temporary file Executing: [ About Recoll History data Document history Update &Index Stop &Indexing All media message other presentation spreadsheet text sorted filtered No helpers found missing Missing helper programs No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index query error Content has been indexed for these mime types: Can't update index: indexer running Indexed MIME Types Bad viewer command line for %1: [%2] Please check the mimeview file Viewer command line for %1 specifies both file and parent file value: unsupported Cannot find parent document Indexing did not run yet External applications/commands needed for your file types and not found, as stored by the last indexing pass in Sub-documents and attachments Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents These Urls ( | ipath) share the same content: Bad desktop app spec for %1: [%2] Please check the desktop file Indexing interrupted The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll &File &Tools &Preferences &Help E&xit Ctrl+Q Update &index &Erase document history &About Recoll &User manual Document &History Document History &Advanced Search Advanced/complex Search &Sort parameters Sort parameters Term &explorer Term explorer tool Next page Next page of results First page Go to first page of results Previous page Previous page of results External index dialog PgDown PgUp &Full Screen F11 Full Screen &Erase search history Sort by dates from oldest to newest Sort by dates from newest to oldest Show Query Details &Rebuild index Shift+PgUp E&xternal index dialog &Index configuration &GUI configuration &Results Sort by date, oldest first Sort by date, newest first Show as table Show results in a spreadsheet-like table Save as CSV (spreadsheet) file Saves the result into a file which you can load in a spreadsheet Next Page Previous Page First Page Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel Abstract Author Document size Document date File size File name File date Keywords Original character set Relevancy rating Title URL Mtime Date Date and time Ipath MIME type ResList Result list (show query) Document history <p><b>No results found</b><br> Previous Next Unavailable document Preview Open <p><i>Alternate spellings (accents suppressed): </i> Documents out of at least for <p><i>Alternate spellings: </i> Result count (est.) Query details Snippets ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Save as CSV Add "%1" column SSearch Any term All terms File name Query language Bad query string Out of memory Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase Clear Ctrl+S Erase search entry Search Start query Enter search terms here. Type ESC SPC for completions of current term. Choose search type. SearchClauseW Select the type of query that will be performed with the words Number of additional words that may be interspersed with the chosen ones No field Any All None Phrase Proximity File name Snippets Snippets Find: Next Prev SnippetsW Search <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer &Expand Alt+E &Close Alt+C No db info. Match Case Accents SpellW Wildcards Regexp Stem expansion Spelling/Phonetic error retrieving stemming languages No expansion found Term Doc. / Tot. Index: %1 documents, average length %2 terms.%3 results %1 results List was truncated alphabetically, some frequent terms may be missing. Try using a longer root. Show index statistics Number of documents Average terms per document Database directory size MIME types: Item Value Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog error retrieving stemming languages The selected directory does not appear to be a Xapian index This is the main/local index! The selected directory is already in the index list Choose Result list paragraph format (erase all to reset to default) Result list header (default is empty) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read At most one index should be selected Cant add index with different case/diacritics stripping option Default QtWebkit font Any term All terms File name Query language Value from previous program exit ViewAction Command MIME type Desktop Default Changing entries with different current values ViewActionBase Native Viewers Close Select one or several mime types then use the controls in the bottom frame to change how they are processed. Use Desktop preferences by default Select one or several file types, then use the controls in the frame below to change how they are processed Exception to Desktop preferences Action (empty -> recoll default) Apply to current selection Recoll action: current value Select same <b>New Values:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) Process the WEB history queue Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file confgui::ConfParamFNW Choose confgui::ConfParamSLW + - confgui::ConfSearchPanelW Automatic diacritics sensitivity <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. Automatic character case sensitivity <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. Maximum term expansion count <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. Maximum Xapian clauses count <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. confgui::ConfSubPanelW Global Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories The list of directories where recursive indexing starts. Default: your home. Skipped paths Stemming languages The languages for which stemming expansion<br>dictionaries will be built. Log file name The file where the messages will be written.<br>Use 'stderr' for terminal output Log verbosity level This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Index flush megabytes interval This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB No aspell usage Aspell language Database directory name Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Unac exceptions <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences User interface Number of entries in a result page If checked, results with the same content under different names will only be shown once. Hide duplicate results. Result list font Opens a dialog to select the result list font Helvetica-10 Resets the result list font to the system default Reset Texts over this size will not be highlighted in preview (too slow). Maximum text size highlighted for preview (megabytes) Choose editor applications Auto-start simple search on whitespace entry. Start with advanced search dialog open. Remember sort activation state. Prefer Html to plain text for preview. Search parameters Stemming language A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Automatically add phrase to simple searches Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Dynamically build abstracts Do we synthetize an abstract even if the document seemed to have one? Replace abstracts from documents Synthetic abstract size (characters) Synthetic abstract context words The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Toggle selected Activate All Deactivate All Remove from list. This has no effect on the disk index. Remove selected Add index Apply changes &OK Discard changes &Cancel Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Resets the style sheet to default Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage Plain text to HTML line style Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. <BR> <PRE> <PRE> + wrap Disable Qt autocompletion in search entry. Search as you type. Paths translations Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Snippets window CSS file Opens a dialog to select the Snippets window CSS style sheet file Resets the Snippets window style Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_es.qm0000644000175000017500000026357713224431020014236 00000000000000<¸dÊÍ!¿`¡½ÝBH+ö -ö:¯o+;+¯G¤8ÞH,ŽÒH,ÎÉHYÎöIA°ïZlÀ³mbÅÈ^+Þ˜•Ôb¦ym"¨¥¼Å¶E–ÐD ,Ù] ^ ½×ÙLôÃdLôÒoVEÏVEϾf¾Ã–lÀ³¦xÆÒ¢˜Å9Ö¬Û¬ô¥¬ô©xEîR $—Èã'HäÅï*Ð%«)*ì0¬ +LôhÜ+f¾{Ø1ø!:Îd¨AVŽ,G…ÔL6G߯ÍH6óÔH6õÔ5J+‚j~J+‚Ì,J6• HJ6•ê™L™b—gMzÒ?Ph¨¾ÅSŠ˜Ô´S¸¹á£T°5¿sWTnWÈÕýXÉÄM!Z0ƒHM[ %À‚\ƒµÛ0e®jîgwîÉ1sºñCsºñ¨:v8“Ÿ{v®Â¥v®Â¨˜zϳÑ€€£7„jŠiŒ!þ—¤´è`0œÍæ_ªJ Ü®½Þ+R¯fSç{¶ÊðŠº° ’ÃÞÇ"Ðùƒ§wÐùƒÛÐùƒææãnÆýgt¥õ:•H¯ÕMEµ¤½nô¸óÂ.é&ô¸q0,…Ÿ;¸sÙô>.cu‰Do2™ÆN¡ŒXM¹CÿX®©5²`Þ^Á¢hˆ¸8TlÿtÏ|nÚpwñ…¿8wñ…èì€üÞ«®‘vã0•ñ“u6¢‰ š£cêçÎxCpdÞñƒxëͺØó LŽŠþSIË4ÿµ{ÿØ…ÖK çvp#2våÄ/v好àw 5¾+w 5Êíw 5Ï/wî¾xŒU#Ÿ.Œõ£¹Þòo©Ö³ÛZª6•Ók¯†”Œ»f3­ßͼuDÖÐgžÒÐgž¨ÁÔÂõkY׸~ÿÉì;U’4ï¡©71úUl¸úeîá ¬WX!DO7&Á:>.‡Nxö=údOâ?údÄåG$߉IJUY–CJUYÂÑY ôÙ[–unª_nÖϺ™Tu<Á–Ê·‘…¢µ¦Ê—¥rÊ—¥¨gÎÅåG|Ôä^@“ÝôL6æõÎùÕìxúùJg;zþA¢»4þŠ¥Ezÿ%´Ý€ÿAîDB dÇ<.ˆ£çÞËËõ¹sëdº";[¾Ôç<ÄöÆ×LƒëhNB™é…XË4›¨e 2œsvhÕô‚€ã‡…(P‘ Œ¯b¼•’"3u’ZÓ’˜I¼9˜I¼jL™n•þ™n•Ó<šß¤šŸf•ß8Ÿf•õÑŸf•3«®Û«Ì_¬,¥9G¯ƒW7y¯ƒWf©Äy%4¡Äy%<-΄ա÷Ð: ^Ú#eLðŒµRÂ`³´jMð;k$’ò" Î~UKôP9p h08u9QÄv2ãmV–T#oo—Bj­šK"Ù¦ %O¦©n¬;¦öõ„¨«‡¥¹¶7Åj€,EÄÅ^ögÄÖ[œ¤ÊXÔ€ënD‹fðw)Ñ&þ)IC1™!vôäã#+äS7I^«^<ˆ~ÜFW#ÏòF¯N8XH:"|_guO apä°f 9{|§N%@ŒÏ—ÃÀnÁ(“’ž0Ò™ÅóÓզ𴩲ð |‰¾l¯ŸÐÓtÓt©3ÈàŒ³ɆtWâ]88åÅ ÝéŽ#¶êñØÄ3g7,öyïæ:uîI6GñîP»JýnýQçÇt}}s£€;EÇë”ò“Sj¨0Î#õ©ÔÕM^¬¨”ï °cêÍÄÎÈ@ÃÕ™ÊÁ­;Ìí³iͳÃû×°ÝÜ*²äœc Žä´¥Œ`æí:”gî?À—Ôö¨åú ÃW² ´H©ñ -(8™ 9ZyÍ¡ ;´3š+ D© K¨ó³ ]#—M c‡C~ k¨µoº lMˆfò ‰ŒîU £qDÕØ «ƒÔ¼_ ­îÜ ®œ¯7u ²9 j ü>J¶ ä3–Ç äîpÖ íåõ2L *Nmž :^Þ Üc } *R6 +<”´ 6 ”4 >V…î» G.~N `P›H `ç£ a·E± c·E±^ d8è, ylM ˜Iœ+p ¤ž ë ®VTB ²ëC|Ä ÄãÃ+ âæç°x æõç¯þ ®¯ ®ù¯l Ô…0 ye4d THÎ ŽÚiD ,xƒ+ =!S‰ Kj×À h¹°i„ ’þƒ× ™÷¤ é  £Ü o! ¨Î£±ñ ¬r}/ »ïµ“g Ù·å³Ô Û·å´ ÛÓ3P ?¾Bd Vdšý ïúëÅ 'И®o +bC}˜ /¥œ 97Ã[ 9Éž L*Æ PÖ™ô RVŽ¥3 T#x­ Vüí \iCL ]æùñF `F¥ { hôîÆ8 v—¥ Ë {lIà €!Y f €!YÄ€ ‚Wå·¯ ŠŽù Œïõ·^ ¬æà‹- ¶…ï¬ ¹iÉ ÓÍ£ˆ Ú÷Ú´ Ýøì/ì é—~A õ­Nê" ö†ÀÓ m£¾ô 'RçOj -èô¿ª 8þ, FÁ™z OE°N ]„Ä: ]„Äì uò0¶  y·ä y¹~b ‚±3  …È©5‰ ‡uËy ‡ußl ‰Pº ‰P§> 5dF ¤š„ ¬Š©3à ½ý7bª ÇòÞ3Ò ÊÕ’7 ÕH È ÛQ5ñà û£Úb q©ªº€@I%Ýn~~/¸.!8bóÙ[9µµ<ÞT¨;óQá~KWW"ù{—Y~s­y[žsºÑ\Н4×e3²tg3²½pû~bõÕ 'Z™³6X!/h­c}»m€Çv¿­c ÚÂ|“xTÂ|“QÎÁ'¡<ó l©¢ü©Üü¶LDiX&Todas las cláusulas All clauses AdvSearch$Cualquier cláusula Any clause AdvSearchfSufijo multiplicador incorrecto en filtro de tamaño$Bad multiplier suffix in size filter AdvSearch mediosmedia AdvSearchmensajemessage AdvSearch otrosother AdvSearchpresentación presentation AdvSearchhoja de cálculo spreadsheet AdvSearch hojas de cálculo spreadsheets AdvSearch textotext AdvSearch textostexts AdvSearch<----- Todos <----- All AdvSearchBase<----- Sel <----- Sel AdvSearchBaseAñadir cláusula Add clause AdvSearchBase"Búsqueda avanzadaAdvanced search AdvSearchBaseTodos ----> All ----> AdvSearchBasejTodos los campos no vacíos a la derecha serán combinados con conjunciones AND (opción "Todas las cláusulas") o OR (opción "Cualquier cláusula").<br>Los campos "Cualquiera", "Todas" y "Ninguna" pueden aceptar una mezcla de palabras simples y frases dentro de comillas dobles.<br>Campos sin datos son ignorados.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBase BuscarBrowse AdvSearchBasePor categorías By categories AdvSearchBaseXMarque esto para habilitar filtros en fechas'Check this to enable filtering on dates AdvSearchBasenMarque esto para habilitar filtros en tipos de archivos,Check this to enable filtering on file types AdvSearchBaseZMarque esto para habilitar filtros en tamaños'Check this to enable filtering on sizes AdvSearchBasenMarque esto para usar categorías en lugar de tipos MIME;Check this to use file categories instead of raw mime types AdvSearchBase CerrarClose AdvSearchBaseBorrar cláusula Delete clause AdvSearchBaseVIngrese directorio inicial para la búsquedaEnter top directory for search AdvSearchBase FiltroFilter AdvSearchBaseFiltrar fechas Filter dates AdvSearchBase"Filtro de tamaños Filter sizes AdvSearchBase BuscarFind AdvSearchBase DesdeFrom AdvSearchBase6Tipos de archivos ignoradosIgnored file types AdvSearchBaseInvertirInvert AdvSearchBaseTamaño máximo Max. Size AdvSearchBase‚Tamaño máximo. Puede utilizar k/K, m/M o g/G como multiplicadores4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseTamaño Mínimo Min. Size AdvSearchBase‚Tamaño mínimo. Puede utilizar k/K, m/M o g/G como multiplicadores4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase6Restringir tipos de archivoRestrict file types AdvSearchBasedRestringir resultados a archivos en subdirectorio:%Restrict results to files in subtree: AdvSearchBase6Guardar como predeterminadoSave as default AdvSearchBaseHBuscar documentos<br>que satisfagan:'Search for
documents
satisfying: AdvSearchBase4Tipos de archivos buscadosSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase Iniciar búsqueda Start Search AdvSearchBase HastaTo AdvSearchBaseÒ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> horario de indexado por lotes (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cada campo puede contener un comodín (*), un valor numérico único, listas separadas por comas (1,3,5) y rangos (1-7). Más generalmente, los campos serán usados <span style=" font-style:italic;">tal como son</span> dentro del archivo crontab, y toda la sintaxis crontab puede ser usada, ver crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Por ejemplo, ingresar <span style=" font-family:'Courier New,courier';">*</span> en <span style=" font-style:italic;">Días, </span><span style=" font-family:'Courier New,courier';">12,19</span> en <span style=" font-style:italic;">Horas</span> y <span style=" font-family:'Courier New,courier';">15</span> en <span style=" font-style:italic;">Minutos</span> iniciaría recollindex cada día a las 12:15 AM y 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un horario con activaciones frecuentes es probablemente menos eficiente que la indexación en tiempo real.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

 CronToolWVentana de Cron Cron Dialog CronToolWZDías de la semana (* o 0-7, 0 o 7 es Domingo))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDeshabilitarDisable CronToolWHabilitarEnable CronToolWŠError al instalar entrada de cron. Sintaxis incorrecta en los campos?3Error installing cron entry. Bad syntax in fields ? CronToolW Horas (* o 0-23)Hours (* or 0-23) CronToolWÂParece ser que existen entradas para recollindex editadas manualmente, no se puede editar crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinutos (0-59)Minutes (0-59) CronToolW$Ventana de diálogoDialog EditDialog,Error de configuración Config error EditTransRuta local Local path EditTransRuta original Original path EditTransRuta de origen Source path EditTrans AñadirAdd EditTransBaseCancelarCancel EditTransBase BorrarDelete EditTransBase(Ruta de traduccionesPath Translations EditTransBaseGuardarSave EditTransBaseÔSeleccione uno o más tipos de archivos, y use los controles en la caja abajo para cambiar cómo se procesankSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBaseHEstablecer ruta de traducciones paraSetting path translations for  EditTransBase <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parece ser que el índice para esta configuración no existe.</span><br /><br />Si solamente desea indexar su directorio personal con un conjunto de valores iniciales razonables, presione el botón <span style=" font-style:italic;">Iniciar indexación ahora</span>. Es posible ajustar los detalles más tarde.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si necesita más control, use los enlaces siguientes para ajustar la configuración de indexación y el horario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Estas herramientas pueden ser accedidas luego desde el menú <span style=" font-style:italic;">Preferencias</span>.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

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

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

RTIToolWdTambién iniciar demonio de indexación ahora mismo.%Also start indexing daemon right now.RTIToolW‚Archivo de autoinicio borrado. Detener el proceso actual también?2Autostart file deleted. Kill current process too ?RTIToolW$No se puede crear:Can't create: RTIToolW@No se puede ejecutar recollindexCould not execute recollindexRTIToolW Borrando archivo Deleting fileRTIToolWBorrando: Deleting: RTIToolWbInicio automático de la indexación en tiempo real"Real time indexing automatic startRTIToolW*Eliminando autoinicioRemoving autostartRTIToolW(Reemplazando archivoReplacing fileRTIToolWReemplazando: Replacing: RTIToolWzIniciar el demonio de indexación con mi sesión de escritorio..Start indexing daemon with my desktop session.RTIToolWAdvertenciaWarningRTIToolW*(todos los lenguajes)(all languages)RclMain(sin raíces) (no stemming)RclMain Acerca de Recoll About RecollRclMainTodoAllRclMain¼Línea de comando incorrecta de visualizador para %1: [%2] Por favor revise el archivo mimeconfCBad viewer command line for %1: [%2] Please check the mimeview fileRclMain>No se puede accesar el archivo:Can't access file: RclMainRNo se puede crear ventana de vista previaCan't create preview windowRclMainHNo se puede descomprimir el archivo:Can't uncompress file: RclMainpNo se puede actualizar el índice: indexador en ejecución#Can't update index: indexer runningRclMainrNo se puede extraer el documento o crear archivo temporal0Cannot extract document or create temporary fileRclMain>No se encuentra documento padreCannot find parent documentRclMain†No se puede recuperar información del documento de la base de datos+Cannot retrieve document info from databaseRclMainCerrandoClosingRclMainpLos contenidos han sido indexados para estos tipos MIME:.Content has been indexed for these mime types:RclMain¾No se puede abrir índice externo. Base de datos no abierta. Revise listado de índices externos.HCould not open external index. Db not open. Check external indexes list.RclMain.Historial de documentosDocument historyRclMain HechoDoneRclMain*Documentos duplicadosDuplicate documentsRclMainBorrando índice Erasing indexRclMain ErrorErrorRclMainEjecutando: [ Executing: [RclMainAplicaciones/comandos externos requeridos por sus tipos de archivos y no encontrados, como se almacenaron en el último pase de indexación en pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMain$Datos de historial History dataRclMain8Error de consulta del índiceIndex query errorRclMain(Tipos MIME indexadosIndexed MIME TypesRclMainHLa indexación no se ha ejecutado aúnIndexing did not run yetRclMain Indexación fallóIndexing failedRclMain.Indexación en progreso:Indexing in progress: RclMain.Indexación interrumpidaIndexing interruptedRclMain:Programas ayudantes faltantesMissing helper programsRclMainMonitorMonitorRclMain`No hay visualizador configurado para tipo MIME [-No external viewer configured for mime type [RclMainÿÿÿÿNo helpers found missingRclMain"No hay resultadosNo results foundRclMainNingunoNoneRclMainÿÿÿÿPurgeRclMainÜConsulta en progreso.<br>Debido a limitaciones en la librería de indexación,<br>cancelar terminará el programaeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain,Resultados de búsqueda Query resultsRclMainRRestaurar el índice e iniciar desde cero?(Reset the index and start from scratch ?RclMain6Conteo de resultados (est.)Result count (est.)RclMainGuardar archivo Save fileRclMain RaízdbStemdbRclMain&Detener &IndexaciónStop &IndexingRclMain2Sub-documentos y adjuntosSub-documents and attachmentsRclMainüEl proceso de indexación actual no se inicio desde esta interfaz. Presione Ok para detenerlo, o Cancelar para dejarlo ejecutaryThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainÿÿÿÿhThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainhEstos URLs ( | ipath) comparten el mismo contenido: -These Urls ( | ipath) share the same content:RclMain8Esta búsqueda no está activa"This search is not active any moreRclMainDesconocidoUnknownRclMain$Actualizar &Índice Update &IndexRclMainActualizandoUpdatingRclMainÜLínea de comandos del visualizador para %1 especifica valores para el archivo y el archivo padre: no soportadoQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainAdvertenciaWarningRclMainPerror al recuperar lenguajes para raíces#error retrieving stemming languagesRclMainfiltradofilteredRclMain mediosmediaRclMainmensajemessageRclMainotrootherRclMainpresentación presentationRclMainordenadosortedRclMainhoja de cálculo spreadsheetRclMain textotextRclMain"&Acerca de Recoll &About Recoll RclMainBase$Búsqueda &Avanzada&Advanced Search RclMainBase>Borrar historial de &documentos&Erase document history RclMainBase:Borrar historial de &búsqueda&Erase search history RclMainBase&Archivo&File RclMainBase$Pantalla &Completa &Full Screen RclMainBase*Configuración de &GUI&GUI configuration RclMainBase &Ayuda&Help RclMainBase2&Configuración del Índice&Index configuration RclMainBase&Preferencias &Preferences RclMainBase&&Reconstruir índice&Rebuild index RclMainBase&Resultados&Results RclMainBase6Parámetros de &ordenamiento&Sort parameters RclMainBase&Herramientas&Tools RclMainBase$Manual de &Usuario &User manual RclMainBase4Búsqueda avanzada/complejaAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase.Historial de DocumentosDocument History RclMainBase0Historial de &DocumentosDocument &History RclMainBase &SalirE&xit RclMainBaseD&Configuración de índices externosE&xternal index dialog RclMainBaseBConfiguración de índices externosExternal index dialog RclMainBaseF11F11 RclMainBasePrimera Página First Page RclMainBasePrimera página First page RclMainBase"Pantalla Completa Full Screen RclMainBaseHIr a la primera página de resultadosGo to first page of results RclMainBase Página Siguiente Next Page RclMainBase Siguiente página Next page RclMainBase<Página de resultados siguienteNext page of results RclMainBase AvPágPgDown RclMainBase RePágPgUp RclMainBasePágina Anterior Previous Page RclMainBasePágina anterior Previous page RclMainBase:Página de resultados anteriorPrevious page of results RclMainBase RecollRecoll RclMainBaseZGuardar como un archivo CSV (hoja de cálculo)Save as CSV (spreadsheet) file RclMainBasešGuardar el resultado en un archivo que se puede cargar en una hoja de cálculo@Saves the result into a file which you can load in a spreadsheet RclMainBase Mayúsculas+RePág Shift+PgUp RclMainBaseBMostrar resultados de la consultaShow Query Details RclMainBase$Mostrar como tabla Show as table RclMainBasezMostrar resultados en una tabla similar a una hoja de cálculo(Show results in a spreadsheet-like table RclMainBaseHOrdenar por fecha, recientes primeroSort by date, newest first RclMainBaseFOrdenar por fecha, antiguos primeroSort by date, oldest first RclMainBaselOrdenar por fechas de la más reciente a la más antigua#Sort by dates from newest to oldest RclMainBaselOrdenar por fechas de la más antigua a la más reciente#Sort by dates from oldest to newest RclMainBase4Parámetros de ordenamientoSort parameters RclMainBase.&Explorador de términosTerm &explorer RclMainBaseLHerramienta de exploración de términosTerm explorer tool RclMainBase$Actualizar &índice Update &index RclMainBaseResumenAbstract RecollModel AutorAuthor RecollModel FechaDate RecollModelFecha y hora Date and time RecollModel&Fecha del documento Document date RecollModel(Tamaño del documento Document size RecollModel"Fecha del archivo File date RecollModel$Nombre del archivo File name RecollModel$Tamaño del archivo File size RecollModel IpathIpath RecollModelPalabras claveKeywords RecollModelTipo MIME MIME type RecollModelFecha ModMtime RecollModel>Conjunto de caracteres originalOriginal character set RecollModel4Calificación de relevanciaRelevancy rating RecollModel TítuloTitle RecollModelURLURL RecollModel$(mostrar consulta) (show query)ResList@<p><b>No hay resultados</b></br>

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

Alternate spellings (accents suppressed): ResList><p><i>Escrituras Alternas: </i>

Alternate spellings: ResList.Historial de documentosDocument historyResListDocumentos DocumentsResListSiguienteNextResList AbrirOpenResListVista previaPreviewResListAnteriorPreviousResList(Detalles de búsqueda Query detailsResList6Conteo de resultados (est.)Result count (est.)ResList&Lista de resultados Result listResListFragmentosSnippetsResList.Documento no disponibleUnavailable documentResListparaforResListde por lo menosout of at leastResList&Borrar columna&Delete columnResTable.&Restaurar ordenamiento &Reset sortResTable"&Guardar como CSV &Save as CSVResTable(Agregar columna "%1"Add "%1" columnResTable@No se puede abrir/crear archivo:Can't open/create file: ResTable6Guardar tabla a archivo CSVSave table to CSV fileResTable$Todos los términos All termsSSearch"Cualquier términoAny termSSearch"Consulta inválidaBad query stringSSearchhIngrese expresión de comodín para nombre de archivo.$Enter file name wildcard expression.SSearch²Ingrese términos de búsqueda aquí. Presione ESC ESPACIO para completar el término actual.FEnter search terms here. Type ESC SPC for completions of current term.SSearch"Nombre de archivo File nameSSearchNo hay memoria Out of memorySSearch(Lenguaje de consultaQuery languageSSearch.Elija tipo de búsqueda.Choose search type. SSearchBaseLimpiarClear SSearchBase Ctrl+SCtrl+S SSearchBaseªIngrese términos de búsqueda aquí. Presione ESC ESP para completar el término actual.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase4Borrar entrada de búsquedaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseBúsquedaSearch SSearchBase Iniciar consulta Start query SSearchBaseTodoAll SearchClauseWCualquieraAny SearchClauseW"Nombre de archivo File name SearchClauseWNingún campoNo field SearchClauseWNingunoNone SearchClauseW˜Número de palabras adicionales que pueden ser intercaladas con las escogidasHNumber of additional words that may be interspersed with the chosen ones SearchClauseW FrasePhrase SearchClauseWProximidad Proximity SearchClauseWzElija el tipo de consulta que será realizada con las palabras>Select the type of query that will be performed with the words SearchClauseWBuscar:Find:SnippetsSiguienteNextSnippetsAnteriorPrevSnippetsFragmentosSnippetsSnippets BuscarSearch SnippetsW BuscarBrowseSpecIdxW&Cerrar&Close SpellBase&Expandir&Expand  SpellBaseAcentosAccents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase0Distinción de mayúsculasCase SpellBaseLenguajeMatch SpellBase2No hay información de bd. No db info. SpellBase,Explorador de términos Term Explorer SpellBase%1 resultados %1 resultsSpellW>Términos promedio por documentoAverage terms per documentSpellWRTamaño del directorio de la base de datosDatabase directory sizeSpellWDoc./Tot. Doc. / Tot.SpellW€Índice: %1 documentos, largo promedio %2 términos. %3 resultados7Index: %1 documents, average length %2 terms.%3 resultsSpellWElementoItemSpellWpLa lista fue separada alfabéticamente, algunos términos 1List was truncated alphabetically, some frequent SpellWTipos MIME: MIME types:SpellW.Expansión no encontradaNo expansion foundSpellW(Número de documentosNumber of documentsSpellW"Expresión regularRegexpSpellW>Mostrar estadísticas del índiceShow index statisticsSpellW&Ortografía/fonéticaSpelling/PhoneticSpellW&Expansión de raícesStem expansionSpellWTérminoTermSpellW ValorValueSpellWComodines WildcardsSpellWPerror al recuperar lenguajes para raíces#error retrieving stemming languagesSpellW~frecuentes pueden no aparecer. Intente usar una raíz más larga..terms may be missing. Try using a longer root.SpellW$Todos los términos All terms UIPrefsDialog"Cualquier términoAny term UIPrefsDialogPAl menos un índice debe ser seleccionado$At most one index should be selected UIPrefsDialogÂNo se puede agregar un índice con diferente opción para remover mayúsculas/minúsculas/diacríticos>Cant add index with different case/diacritics stripping option UIPrefsDialog ElegirChoose UIPrefsDialog(Lenguaje de consultaQuery language UIPrefsDialog‚Encabezado de la lista de resultados (valor por defecto es vacío)%Result list header (default is empty) UIPrefsDialog¸Formato de párrafo para la lista de resultados (borre todo para volver al valor por defecto)Nuevos valores</b>New Values:ViewActionBaseZAcción (vacío -> valor por defecto de recoll) Action (empty -> recoll default)ViewActionBase:Aplicar a la selección actualApply to current selectionViewActionBase CerrarCloseViewActionBaseXExcepción de las preferencias del escritorio Exception to Desktop preferencesViewActionBase,Visualizadores NativosNative ViewersViewActionBase AcciónRecoll action:ViewActionBaseÔSeleccione uno o más tipos de archivos, y use los controles en la caja abajo para cambiar cómo se procesankSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseÈSeleccione uno o más tipos mime, y use los controles en la caja abajo para cambiar cómo se procesan.lSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBase"Seleccionar misma Select sameViewActionBase\Usar preferencias del escritorio como estándar"Use Desktop preferences by defaultViewActionBase valor current valueViewActionBaseÖHabilita la indexación de páginas visitadas en Firefox.<br>(necesita también el plugin Recoll para Firefox)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelWLTamaño máximo para el almacén web (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelWDProcesar la cola del historial WEBProcess the WEB history queueconfgui::ConfBeaglePanelWTEl nombre del directorio dónde almacenar las copias de páginas web visitadas.<br>Una ruta de directorio no absoluta es utilizada, relativa al directorio de configuración.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWdNombre del directorio del almacén para páginas webWeb page store directory nameconfgui::ConfBeaglePanelWZNo se puede escribir archivo de configuraciónCan't write configuration fileconfgui::ConfIndexW ElegirChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW^<p>Habilitar automáticamente la sensibilidad a las mayúsculas/minúsculas si la entrada tiene caracteres en mayúscula en una posición distinta al primer caracter. De otra forma necesita usar el lenguaje de búsqueda y el modificador <i>C</i> para especificar la sensibilidad a las mayúsculas y minúsculas.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelW2<p>Habilitar automáticamente la sensibilidad de diacríticos si el término de búsqueda tiene caracteres acentuados (no presentes en unac_except_trans). De otra forma necesita usar el lenguage de búsqueda y el modificador <i>D</i> para especificar la sensibilidad de los diacríticos.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelWÈ<p>Máxima expansión de conteo para un solo término (ej: cuando se usan comodines). El valor por defecto de 10000 es razonable y evitará consultas que parecen congelarse mientras el motor de búsqueda recorre la lista de términos.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelWô<p>Número máximo de cláusulas elementales agregadas a una consulta de Xapian. En algunos casos, el resultado de la expansión de términos puede ser multiplicativo, y deseamos evitar el uso excesivo de memoria. El valor por defecto de 100000 debería ser lo suficientemente alto en la mayoría de los casos, y compatible con las configuraciones de hardware típicas en la actualidad.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelW¤Sensibilidad automática a la distinción de mayúsculas/minúsculas de los caracteres$Automatic character case sensitivityconfgui::ConfSearchPanelWLSensibilidad automática de diacríticos Automatic diacritics sensitivityconfgui::ConfSearchPanelWHMáximo conteo de cláusulas de XapianMaximum Xapian clauses countconfgui::ConfSearchPanelWLMáximo conteo de expansión de términosMaximum term expansion countconfgui::ConfSearchPanelWþFiltros externos que se ejecuten por más tiempo del establecido serán detenidos. Esto es por el caso inusual (ej: postscript) dónde un documento puede causar que un filtro entre en un ciclo infinito. Establezca el número -1 para indicar que no hay límite.­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelW°Si se utiliza este valor (diferente de -1), los archivos de texto serán separados en partes de este tamaño para ser indexados. Esto ayuda con las búsquedas de archivos de texto muy grandes (ej: archivos de registro).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWPTamaño máximo de archivo comprimido (KB)Max. compressed file size (KB)confgui::ConfSubPanelWRTiempo máximo de ejecución de filtros (S)Max. filter exec. time (S)confgui::ConfSubPanelWPTamaño máximo para archivo de texto (MB)Max. text file size (MB)confgui::ConfSubPanelWVTamaño de página para archivo de texto (KB)Text file page size (KB)confgui::ConfSubPanelWdEste valor establece un umbral mas allá del cual los archivos<br>comprimidos no serán procesados. Escriba 1 para no tener límite,<br>o el número 0 para nunca hacer descompresión.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW¢Este valor establece un umbral más allá del cual los archivos de texto no serán procesados.<br>Escriba 1 para no tener límites. Este valor es utilizado para excluir archivos de registro gigantescos del índice.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWH<p>Estas son excepciones al mecanismo unac, el cual, de forma predeterminada, elimina todos los diacríticos, y realiza una descomposición canónica. Es posible prevenir la eliminación de acentos para algunos caracteres, dependiendo de su lenguaje, y especificar descomposiciones adicionales, por ejemplo, para ligaturas. En cada entrada separada por espacios, el primer caracter es el origen, y el resto es la traducción.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelWLenguaje AspellAspell languageconfgui::ConfTopPanelWLNombre del directorio de base de datosDatabase directory nameconfgui::ConfTopPanelW@Deshabilita el uso de aspell para generar aproximaciones ortográficas en la herramienta explorador de términos.<br>Útil si aspell no se encuentra o no funciona.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW\Intervalo en megabytes de escritura del índiceIndex flush megabytes intervalconfgui::ConfTopPanelW:Nombre de archivo de registro Log file nameconfgui::ConfTopPanelW@Nivel de verbosidad del registroLog verbosity levelconfgui::ConfTopPanelW$No utilizar aspellNo aspell usageconfgui::ConfTopPanelW(Directorios omitidos Skipped pathsconfgui::ConfTopPanelW*Lenguajes para raícesStemming languagesconfgui::ConfTopPanelW®El archivo donde los mensajes serán escritos.<br>Use 'stderr' para salida a la terminalPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWžEl lenguaje para el diccionario aspell. Esto debería ser algo como 'en' o 'fr' ...<br>Si no se establece este valor, el ambiente NLS será utilizado para calcularlo, lo cual usualmente funciona. Para tener una idea de lo que está instalado en sus sistema, escriba 'aspell-config' y busque archivos .dat dentro del directorio 'data-dir'.3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW¨Los lenguajes para los cuales los diccionarios de expansión de raíces serán creados.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÔLa lista de directorios donde la indexación recursiva comienza. Valor por defecto: su directorio personal.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWZEl nombre de un directorio donde almacenar el índice.<br>Una ruta no absoluta se interpreta como relativa al directorio de configuración. El valor por defecto es 'xapiandb'.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW8Este valor ajusta la cantidad de datos indexados entre escrituras al disco.<br> Esto ayuda a controlar el uso de memoria del indexador. Valor estándar 10MB ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWäEste valor ajusta la cantidad de mensajes,<br>desde solamente errores hasta montones de información de depuración.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW*Directorios primariosTop directoriesconfgui::ConfTopPanelW Excepciones UnacUnac exceptionsconfgui::ConfTopPanelW&Cancelar&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase<PRE> + wrap
 + wrapuiPrefsDialogBaseâUna búsqueda por [rolling stones] (2 términos) será cambiada por [rolling or stones or (rolling phrase 2 stones)].
Esto dará mayor precedencia a los resultados en los cuales los términos de búsqueda aparecen exactamente como fueron escritos.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseDSeparador de fragmentos de resumenAbstract snippet separatoruiPrefsDialogBaseActivar TodosActivate AlluiPrefsDialogBaseAñadir índice	Add indexuiPrefsDialogBaseAplicar cambios
Apply changesuiPrefsDialogBasetAuto iniciar búsqueda simple al entrar espacios en blanco.-Auto-start simple search on whitespace entry.uiPrefsDialogBasebAutomáticamente añadir frases a búsquedas simples+Automatically add phrase to simple searchesuiPrefsDialogBasexPorcentaje del umbral de frecuencia de términos de autofrase.Autophrase term frequency threshold percentageuiPrefsDialogBaseElegirChooseuiPrefsDialogBaseBEscoger aplicaciones para ediciónChoose editor applicationsuiPrefsDialogBaseHaga clic para agregar otro directorio de índice a la lista. Puede seleccionar un directorio de configuración de Recoll o un índice Xapian.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBase<Formato de fecha (strftime(3))Date format (strftime(3))uiPrefsDialogBase Desactivar TodosDeactivate AlluiPrefsDialogBasevDeshabilitar autocompletar de Qt en la entrada de búsqueda.*Disable Qt autocompletion in search entry.uiPrefsDialogBase"Descartar cambiosDiscard changesuiPrefsDialogBasex¿Sintetizar un resumen aunque el documento parece tener uno?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseF¿Intentar construir resúmenes para elementos en la lista de resultados utilizando el contexto de los términos de búsqueda?
Puede ser lento para documentos grandes.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBaseBConstruir resúmenes dinámicamenteDynamically build abstractsuiPrefsDialogBasepEditar encabezado html insertado en página de resultados#Edit result page html header insertuiPrefsDialogBasejEditar texto de formato para el párrafo de resultados#Edit result paragraph format stringuiPrefsDialogBaseHabilitarEnableuiPrefsDialogBase Índices ExternosExternal IndexesuiPrefsDialogBasedUmbral de porcentaje de frecuencia sobre el cuál no utilizamos términos dentro de la autofrase.
Los términos frequentes son un problema importante de desempeño con las frases.
Términos omitidos aumenta la holgura de la frase, y reducen la eficiencia de la autofrase.
El valor por defecto es 2 (por ciento).þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase>Esconder resultados duplicados.Hide duplicate results.uiPrefsDialogBaseØSi está marcado, los resultados con el mismo contenido bajo nombres diferentes serán mostrados solo una vez.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseLas líneas en texto PRE no son dobladas. Al usar BR se pierde indentación. El estilo PRE + Wrap probablemente es lo que está buscando.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBase|Tamaño máximo de texto resaltado para vista previa (megabytes)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase\Número de elementos en la página de resultados"Number of entries in a result pageuiPrefsDialogBase¬Abre una ventana de diálogo para el archivo de estilos CSS de la ventana de fragmentosAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBaseœAbre una ventana para seleccionar el tipo de letra para la lista de resultados-Opens a dialog to select the result list fontuiPrefsDialogBase~Abre una ventana de diálogo para seleccionar la hoja de estilos-Opens a dialog to select the style sheet fileuiPrefsDialogBase*Rutas de traduccionesPaths translationsuiPrefsDialogBaseDTexto común a estilo de línea HTMLPlain text to HTML line styleuiPrefsDialogBase^Preferir HTML a texto simple para vista previa.&Prefer Html to plain text for preview.uiPrefsDialogBaseˆSufijos para nombres mágicos de archivos en el lenguaje de consulta.(Query language magic file name suffixes.uiPrefsDialogBase\Recordar estado de activación de ordenamiento.Remember sort activation state.uiPrefsDialogBase‚Eliminar de la lista. Esto no tiene efecto en el índice en disco.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase$Eliminar selecciónRemove selecteduiPrefsDialogBaseLReemplazar resúmenes de los documentos Replace abstracts from documentsuiPrefsDialogBaseRestaurarResetuiPrefsDialogBase’Establece el valor por defecto para el estilo de la ventana de Fragmentos Resets the Snippets window styleuiPrefsDialogBaseªRestaurar el tipo de letra de la lista de resultados al valor por defecto del sistema1Resets the result list font to the system defaultuiPrefsDialogBasedRestablecer la hoja de estilo al valor por defecto!Resets the style sheet to defaultuiPrefsDialogBase&Lista de resultadosResult ListuiPrefsDialogBaseLTipo de letra para lista de resultadosResult list fontuiPrefsDialogBase&Buscar al escribir.Search as you type.uiPrefsDialogBase,Parámetros de búsquedaSearch parametersuiPrefsDialogBaseRArchivo CSS para la ventana de fragmentosSnippets window CSS fileuiPrefsDialogBasehIniciar con la ventana de búsqueda avanzada abierta.'Start with advanced search dialog open.uiPrefsDialogBase$Lenguaje de raícesStemming languageuiPrefsDialogBaseHoja de estiloStyle sheetuiPrefsDialogBaseXPalabras de contexto del resumen sintetizado Synthetic abstract context wordsuiPrefsDialogBaseVTamaño del resumen sintetizado (caracteres)$Synthetic abstract size (characters)uiPrefsDialogBase~Textos más allá de este tamaño no serán resaltados (muy lento).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseêLas palabras en la lista serán convertidas automáticamente a cláusulas ext:xxx en el ingreso de lenguaje de consulta.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase"Cambiar selecciónToggle selecteduiPrefsDialogBase&Interfaz de usuarioUser interfaceuiPrefsDialogBase.Preferencias de usuarioUser preferencesuiPrefsDialogBaseˆrecoll-1.23.7/qtgui/i18n/recoll_fr.qm0000644000175000017500000035066313224431020014227 00000000000000<¸dÊÍ!¿`¡½ÝB@+Iø-J%¯›+;ˆ´G¤:ºH,ÍH,UHY‚IAÛ¹Zlïº\ŒAÀmbôÇYÞÏ^ˆã˜•]¦yp¤¨¥ì8¶E¯àÐD
ôÙ](
½ ãA’º*Ð%ÕÅ*ì0Öª+Lôl2+f¾…+ÏÇØã/­>ÎL1øG:ÎdÑöAVމG…Ô­rGßÚbH6óH6õ0J+‚mÜJ+‚	˜J6•ôJ6•7¿L™b°²Mz³Ph¨îSŠ˜©S¸¹.-T°5î¬WTqWÈÕ½>XÉÄ®wZ0ƒ©±[%ï‹\ƒµ'e®nNgwîû­j^¨ºsºñ[sºñÒ&v8“¾Àv®ÂÅv®ÂÒŒzϳû€€£–ö„j˜ÐŒ!þÍ—¤´5ª0œqØÍ2Ϥf©ªxªJ
 ®½Þ-"¯fS4£¶Êð˜}º°
HÃÞö9Äâ‰ÀªÐùƒÑIÐùƒ'zÐùƒ3ÐÓnUôãndmýgtϳ:•ªÕ5EµÌånôç~–€ÉÂ.62Ò3Ý‘ôæò(ß	"¥+1ŽÔ0,…qt;¸s$Ã>.c}lDo2´©NıXM¹¥…X®©7”`Þ^ðhˆ¸:.lÿtþnÚsÂwOãÝ0wñ…îqwñ…5ø€üÞÖ>H™%;‘vãb•ñ“|Η–»&¢‰bX£cêÿ§áÁ°ü?†ÎxCt(Þñƒëͺ[€ó
L÷Ú΂vþSIÅÿµnzÿØ…u
ç}ÞKššBp#´våó6vå¥í=w5í~w5„w5·w5+ÉwîíÃŒUnŸ.›ˆ£¹ÞG¦;UÝê©Ö³'Dª6•h¯†”š†»f3ØuÇWÞÚͼu¦ÐgžôÐgžÒ¹ÓHÞ³)ÔÂõnÓ׸~Sžì;U¤ï¡©9-úUp"úeîgÙ~;¬»Ó!D°&ÁšÕ.‡N€u/ÄÑ=úd°Æ?údóîG$ß—¾JUY¯pJUYñ¼Y ô#[[–urP_nÛ|„ĺ™·³u0–Ê·£C¢äEÊ—¥’Ê—¥Ò[ÎÅå¨êÔä^¡(Ùc¬ŸÝôL”yæõÎMnìxpÏùJgœû=cÞHþA¢ê
þŠ¥§ÿ%´)‚ÿAîh­B h5Vù÷‹<.—.çÞ	+õè
ëdè³1M³=;[¾ð<ÄöõêLƒ8|NB™6©XË4·Æe2¸ÑlðPÈ"vhÕHËwT+Z€ã‡¡a…(P¢ÄŒ¯bì’"3C’ZÓv˜I¼:í˜I¼m¬™n•z™n•Œšß¤¶›Ÿf•+$Ÿf•IºŸf•¼«Ùl«	ˬ,¥;#¯ƒW9u¯ƒWj'µÝþŒp¾óßAÄy%6yÄy%œ¤Å	¹¡öÅ äzƒÍl£cfÎ„ÕÆ]Ð:Â
Ú#œÞãX|^0åõW5FÌ”Êiô9iG
-ZÝ-¼êi"5òÂ)ÖT¯d>j$EB9€nþBìSák¶Þásoˆ•pr?)ïãrž6|ôò“ƒÿpø±„kå…÷Š‘¿Íe‹¦,ã‹Üð#üŒÇ<Ø©ŽÔ°|"³ô›ˆ˜Æ›ˆ˜TŸ,tŠi¦ASœªÃ¢Ä!·¨
øo·¨
):»œRUÇ¢•‡*×I^ÜjØ~ChÞž¼•èêȰ_éã>hÀðŒµµÄp#e`³âgMð=‡$¤Ò"	-Ö…¥úUKô±i®¸"p
hsÞ¦ou9Tjv2ãpØvƒžÿ{^Ì>–T#s—BnšKyÚŸUÔ¿¦	%M¦©nÖÙ¦öõ¬¨«‡Ïy¶7ôm€‰JÃ’P³‘ÄÅ^JRÄÖ[¹ÊXÔ–ënD™Ýðw)¤þ†FCލ³µ!vô1Q#+ä¶?+õ^Ì3¿%¸7I^Õú<ˆ~($Cj»ÄFW#
jF¯N˜ŠH:"…M_guQtapäX¥f;]piTbé|§N|9ŒÍw…¹ŒÏ—ò½n𓒞˙ÅóЛ.H›ÝˆºáŸž®¦š´Òù²ð‡‡¾l¯¿d¿|ÙÁæn@UÓt6ÓtÓ#Æ>ÃàqÈà›@ɆtºÌâ]89îã )!ãÀ|åÅ unéŽ#å‘ñ#!.º;3j“EnÁ%<Ùùi*sn“[,öyAë:uGñJ¢V{JýnP‰QçÇ{^YŒÎµÒ}}zõ€;E÷”ò“¶ë¨0Î{©ÔÕ®¼¬¨”<“°c7ó¶¬h»[Ä…È@ýʶÕë—ÊÁ×ÛÌí³lcͳó×° ðÝ܇»äœcdä´¥šçæí:©Öî?À±%ö¨åsúü1	õT¦	k³¡	ÈJŸJ	ÉN²‘	´HÔw	-(:w	7Àþ…	9Zy3	;´3µ€	D©Ws	K¨óà#	]#—¹­	c‡C‹L	k¨µst	lMˆj\	…ÿäÅ&	‰Œî¹\	ŸÁò‰ì	£qDú	«ƒÔëÐ	­îf}	®œ¯—c	°Ž`¨-	²9a	ÛC[+	ü>¬	ãÉúd	ä3°	äît®	èe£Û	íåõk	ûiéˆ>
	¢µYÉ
*Nq*
͹ãÔ
:^*
Üc	
*R7ç
+<”tG
6 ©¡
>V…<)
G.~Q
S§`œq
`P·j
`ç£
a·EÛâ
c·EÜ&
d85t
yoÕ
˜Iœˆw
¤ž^m
¤s¾w­
¥ã
®VTY/
²ëCˆË
Äãò,
âæçÛh
æõçÚ—®Ùž®ùÙÿÔ…è^‹Ý	ye6@THüŽÚlœ,xƒˆ=!WKj×ïGX°ƒV­X°ƒâ½h¹°lÜ’þƒ ™÷Ëpéa»£Ür·¨Î£Ü«¬r‰B»ïµ¥YÙ·åáÑÛ·åâÛÓö?¾£J–ȉ±	Vd·4ò¯ïú8çYŽ'ИÙ+bCг.Ê¢ë/¥¸p97Ã9ɽqL*õ†PÖ™œåRVŽÎT#€4Vüsp\iC­Ï]æùE÷`F¥'hôîõ5v—¥ÀY{l«`€!Y¿ö€!Yó‹‚Wåæ^†|ð‡ÆŠ ŒïõåÿÒ¬e }À¬0¬æà™ ¶…=¹iÉXÓÍÊÚ÷&šÝøìŒÉé—~¢JòéˆÂÆõ­N7@ö†Àš
m£î7
#ùD3@
'RçQØ
-èôîÛ
7Qþ­
8þ‰ 
FÁ²í
OE°P€
XÅ^²
]„Ä;ø
]„Ä9&
^®é·
^®è
uò0åS
y·0œ
y¹~Ž
‚±3	¢
…È©”
‡u"
‡u,
‰Pœ;
‰PÐÌ
5d¨7
¤š„º‹
¬Š©5‰
½ý7f,
Çi†²
ÇòÞ‘ª
ÊÕ’9ª
ÕHz
ÛQ5F‰
û£&Bq©ÕH€ ÞѾCk{þ>E%ÝnŒÏ.Ê¢=¸/¸.O3U=j6ˆ—Ó–8bó#¨9µãJ<Þ¸O>Qá~¬©S«•¶W"ù„ÛY~sØ[žsé\\Н6«e3ßg3ßàhx5µ?pû~fsÕ „™³–4!Œa­cÿ»m€ö•¿­c
^Â|“ÏÂ|“²"ÉB®”ËÎÁ'Ä]ó
lÔ$ü©Ü*ü¶LlÿÙ)r	All ---->
AdvSearchBaseºTous les champs de droite non vides seront combinés par une conjonction ET (choix "Toutes les clauses") ou OU (choix "Une des clauses"). <br> Les champs de type  "Un de ces mots", "Tous ces mots" et "Aucun de ces mots" acceptent un mélange de mots et de phrases contenues dans des apostrophes "une phrase".<br>Les champs non renseignés sont ignorés.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. 
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseParcourirBrowse AdvSearchBasePar catégories By categories AdvSearchBaseZCocher pour activer le filtrage sur les dates'Check this to enable filtering on dates AdvSearchBasenCocher pour permettre le filtrage des types de fichiers,Check this to enable filtering on file types AdvSearchBasebCocher pour activer le fitrage sur taille fichier'Check this to enable filtering on sizes AdvSearchBaseŽCocher pour utiliser les catégories de fichiers au lieu des types mimes;Check this to use file categories instead of raw mime types AdvSearchBase FermerClose AdvSearchBase$Enlever une clause Delete clause AdvSearchBaseXEntrer le répertoire où démarre la rechercheEnter top directory for search AdvSearchBaseFiltrerFilter AdvSearchBase*Filtrer sur les dates Filter dates AdvSearchBase&Filtrer les tailles Filter sizes AdvSearchBaseTrouverFind AdvSearchBaseÀ partir deFrom AdvSearchBase2Types de fichiers ignorésIgnored file types AdvSearchBaseInverserInvert AdvSearchBaseTaille Max. Max. Size AdvSearchBaseœTaille Maximum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G.4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseTaille Min. Min. Size AdvSearchBaseœTaille minimum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G.4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase@Restreindre les types de fichierRestrict file types AdvSearchBaserRestreindre les résultats aux fichiers de l'arborescence:%Restrict results to files in subtree: AdvSearchBase8Sauver comme valeur initialeSave as default AdvSearchBaseTRechercher les <br>documents<br>vérifiant:'Search for
documents
satisfying: AdvSearchBase6Types de fichier recherchésSearched file types AdvSearchBaseSel -----> Sel -----> AdvSearchBase&Lancer la recherche Start Search AdvSearchBaseJusqu'àTo AdvSearchBaser<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span>: planification de l'indexation périodique (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chaque champ peut contenir un joker (*), une simple valeur numérique , des listes ponctuées par des virgules (1,3,5) et des intervalles (1-7). Plus généralement, les champs seront utilisés <span style=" font-style:italic;">tels quels</span> dans le fichier crontab, et la syntaxe générale crontab peut être utilisée, voir la page de manuel crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Par exemple, en entrant <span style=" font-family:'Courier New,courier';">*</span> dans <span style=" font-style:italic;">Jours, </span><span style=" font-family:'Courier New,courier';">12,19</span> dans <span style=" font-style:italic;">Heures</span> et <span style=" font-family:'Courier New,courier';">15</span> dans <span style=" font-style:italic;">Minutes</span>, recollindex démarrerait chaque jour à 12:15 et 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un planning avec des activations très fréquentes est probablement moins efficace que l'indexation au fil de l'eau.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

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

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

 CronToolWDialogue Cron Cron Dialog CronToolWpJours de la semaine (* ou 0-7, 0 ou 7 signifie Dimanche))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDésactiverDisable CronToolWActiverEnable CronToolW˜Erreur durant l'installation de l'entrée cron. Mauvaise syntaxe des champs ?3Error installing cron entry. Bad syntax in fields ? CronToolW$Heures (* ou 0-23)Hours (* or 0-23) CronToolWØIl semble que des entrées créées manuellement existent pour recollindex. Impossible d´éditer le fichier CronPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinutes (0-59)Minutes (0-59) CronToolWDialogueDialog EditDialogErreur config Config error EditTransChemin local Local path EditTransChemin Originel Original path EditTransChemin source Source path EditTransAjouterAdd EditTransBaseAnnulerCancel EditTransBaseSupprimerDelete EditTransBase,Traductions de cheminsPath Translations EditTransBaseSauvegarderSave EditTransBaseSélectionner un ou plusieurs types de fichiers, puis utiliser les contrôles dans le cadre ci-dessous pour changer leur traitementkSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBaseTAjustement des traductions de chemins pourSetting path translations for  EditTransBase X<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Il semble que l'index pour cette configuration n'existe pas encore.</span><br /><br />Si vous voulez simplement indexer votre répertoire avec un jeu raisonnable de valeurs par défaut, cliquer le bouton <span style=" font-style:italic;">Démarrer l'indexation maintenant</span>. Vous pourrez ajuster les détails plus tard. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous voulez plus de contrôle, utilisez les liens qui suivent pour ajuster la configuration et le planning d'indexation.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ces outils peuvent être accédés plus tard à partir du menu <span style=" font-style:italic;">Preferences</span>.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

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

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

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

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

 IdxSchedWPlanning CronCron scheduling IdxSchedWÎDéterminer si l'indexation au fil de l'eau démarre quand vous vous connectez (pour l'index par défaut).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWHParamétrage du planning d'indexationIndex scheduling setup IdxSchedWRDémarrage de l'indexation au fil de l'eauReal time indexing start up IdxSchedWêLe dialogue vous permettra de déterminer à quelle heure l'indexation devra démarrer et installera une entrée crontab._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedWDialogueDialog ListDialogGroupBoxGroupBox ListDialog€Le fichier d'historique est illisible, le verifier ou l'effacer:K"history" file is damaged or un(read)writeable, please check or remove it: Main‚Répertoire de la base de données non défini dans la configuration No db directory in configurationMain&Suivant&NextPreview&Précédent &PreviousPreview&Rechercher: &Search for:Preview„Impossible de traduire le document en représentation interne pour 0Can't turn doc into internal representation for PreviewAnnulerCancelPreviewEffacerClearPreviewFermer l'onglet Close TabPreviewTCréation du texte pour la prévisualisationCreating preview textPreview>Erreur de chargement du fichierError while loading filePreviewTChargement du texte de la prévisualisation Loading preview text into editorPreview&Respecter la &casse Match &CasePreviewNProgrammes filtres externes manquants: Missing helper program: Preview CopierCopyPreviewTextEdit$Replier les lignes Fold linesPreviewTextEdit.Préserver l'indentationPreserve indentationPreviewTextEditImprimerPrintPreviewTextEditNImprimer la fenêtre de prévisualisationPrint Current PreviewPreviewTextEdit.Sauvegarder le documentSave document to filePreviewTextEdit"Tout sélectionner Select AllPreviewTextEdit>Afficher les valeurs des champs Show fieldsPreviewTextEdit Afficher l'image Show imagePreviewTextEdit4Afficher le corps du texteShow main textPreviewTextEditT<b>Répertoires avec paramètres spécifiquesCustomised subtreesQObject<i>Les paramètres qui suivent sont définis soit globalement, si la sélection dans la liste ci-dessus<br>est vide ou réduite à la ligne vide, soit pour le répertoire sélectionné.<br>Vous pouvez ajouter et enlever des répertoires en cliquant les boutons +/-.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectôJeu de caractères utilisé pour lire les fichiers qui n'identifient pas de manière interne leur encodage, par exemple les fichiers texte purs.<br>La valeur par défaut est vide, et la valeur obtenue à partir de l'environnement est utilisée dans ce cas.ÆCharacter set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject>Jeu de caractères<br>par défautDefault
character setQObject8Suivre les liens symboliquesFollow symbolic linksQObjectIndexer les fichiers et répertoires pointés par les liens symboliques. Pas fait par défaut pour éviter les indexations multiplesTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$Paramètres globauxGlobal parametersQObject"Suffixes ignor'esIgnored endingsQObjectBIndexer tous les noms de fichiersIndex all file namesQObject Indexer les noms des fichiers dont le contenu n'est pas identifié ou traité (pas de type mime, ou type non supporté). Vrai par défaut}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"Paramètres locauxLocal parametersQObject8Paramètres pour la rechercheSearch parametersQObjectNoms ignorés Skipped namesQObjectÐLa liste des sous-répertoires de la zone indexée<br>où certains paramètres sont redéfinis. Défaut: vide.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectLSuffixes sélectionnant des fichiers qui seront indexés uniquement sur leur nom (pas d'identification de type MIME, pas de décompression, pas d'indexation du contenu).—These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing).QObject Canevas définissant les fichiers ou répertoires qui ne doivent pas etre indexés.LThese are patterns for file or directory names which should not be indexed.QObjectHistorique Web Web historyQObject&Ouvrir&OpenQWidget4&Ouvrir le document parent&Open Parent document/folderQWidget&Voir contenu&PreviewQWidget&Sauver sous&Write to FileQWidgetDImpossible d'extraire le document:Cannot extract document: QWidget@Choisir exactement un répertoireChoose exactly one directoryQWidget2Copier le nom de &FichierCopy &File NameQWidgetCopier l'&Url Copy &URLQWidgetBImpossible de lire le répertoire:Could not read directory: QWidgetRCréer ou choisir un répertoire d'écritureCreate or choose save directoryQWidgetDChercher des documents &similairesFind &similar documentsQWidget>Ouvrir la fenêtre des e&xtraitsOpen &Snippets windowQWidgetOuvrir Avec Open WithQWidgetBPrévisualiser le document p&arentPreview P&arent document/folderQWidget$Exécuter le Script Run ScriptQWidgetfSauvegarder la sélection courante dans des fichiersSave selection to filesQWidgetVAfficher les sous-documents et attachementsShow subdocuments / attachmentsQWidgetLCollision de noms inattendue, abandon.+Unexpected file name collision, cancelling.QWidget"Ne plus afficher.Do not show again.QxtConfirmationMessage<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut être configurer pour s'exécuter en arrière plan, mettant à jour l'index au fur et à mesure que des documents sont modifiés. Vous y gagnez un index toujours à jour, mais des ressources systême (mémoire et processeur) sont consommées en permanence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

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

RTIToolWNÉgalement démarrer le démon maintenant.%Also start indexing daemon right now.RTIToolWpFichier autostart détruit. Arrêter le process en cours ?2Autostart file deleted. Kill current process too ?RTIToolW(Impossible de créer:Can't create: RTIToolWBImpossible d'exécuter recollindexCould not execute recollindexRTIToolW*Effacement du fichier Deleting fileRTIToolWEffacement: Deleting: RTIToolWjDémarrage automatique de l'indexation au fil de l'eau"Real time indexing automatic startRTIToolW2Enlèvement de l'autostartRemoving autostartRTIToolW.Remplacement du fichierReplacing fileRTIToolW Remplacement de: Replacing: RTIToolWhDémarrer le démon d'indexation quand je me connecte..Start indexing daemon with my desktop session.RTIToolWAttentionWarningRTIToolW>avec le message complémentaire: with additional message: RclMain&(tous les langages)(all languages)RclMain"(pas d'expansion) (no stemming)RclMain$À propos de Recoll About RecollRclMainToutAllRclMain°Mauvaise spécification d'application pour %1: [%2] Merci de vérifier le fichier desktop ?Bad desktop app spec for %1: [%2] Please check the desktop fileRclMain&Chemins inexistants Bad pathsRclMainzChemins inexistants définis dans le fichier de configuration:!Bad paths in configuration file: RclMainLigne de commande incorrecte pour %1:[%2]. Vérifier le fichier mimeview.CBad viewer command line for %1: [%2] Please check the mimeview fileRclMainBImpossible d'accéder au fichier: Can't access file: RclMain^Impossible de créer la fenêtre de visualisationCan't create preview windowRclMainŒImpossible d'ouvrir le fichier des synonymes (erreur dans le fichier?)&Can't set synonyms file (parse error?)RclMainLImpossible de décomprimer le fichier: Can't uncompress file: RclMain~Impossible de mettre à jour l'index: un indexeur est déjà actif#Can't update index: indexer runningRclMain†Impossible d'extraire le document ou de créer le fichier temporaire0Cannot extract document or create temporary fileRclMainPImpossible de trouver le document parentCannot find parent documentRclMainZImpossible d'accéder au document dans la base+Cannot retrieve document info from databaseRclMainFChoisir un fichier pour sauvegarderChoose file to saveRclMain2Cliquer Annulation pour retourner à la liste.<br>Cliquer Ignorer pour afficher la prévisualisation de toutes facons (mémoriser l'option pour la session).pClick Cancel to return to the list.
Click Ignore to show the preview anyway (and remember for this session).RclMainîCliquer Ok pour mettre à jour l'index pour ce fichier, puis attendez la fin de l'indexation pour relancer la recherche.jClick Ok to update the index for this file, then you will need to re-run the query when indexing is done. RclMainFermetureClosingRclMainXDu contenu a été indexé pour ces types MIME:.Content has been indexed for these mime types:RclMaindLe chargement de la recherche sauvegardée a échouéCould not load saved queryRclMainºImpossible d'ouvrir un index externe. Base non ouverte. Verifier la liste des index externes.HCould not open external index. Db not open. Check external indexes list.RclMain>Impossible d'ouvrir le fichier:Could not open file: RclMainFImpossible d'écrire dans le fichierCould not write to fileRclMain°Désactivé parce que l'indexeur au fil de l'eau n'est pas disponible dans cet exécutable.;Disabled because the real time indexer was not compiled in.RclMain Ne plus afficher ce message (utiliser le dialogue de préférences pour rétablir).DDo not show this warning next time (use GUI preferences to restore).RclMain&Filtre de documentsDocument filterRclMainDHistorique des documents consultésDocument historyRclMainFiniDoneRclMain(Documents identiquesDuplicate documentsRclMain*Effacement de l'index Erasing indexRclMain ErreurErrorRclMainExécution de: [ Executing: [RclMain<Applications et commandes externes nécessaires pour vos types de documents, et non trouvées, telles qu'enregistrées par la dernière séquence d'indexation danspExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMain(Données d'historique History dataRclMain,L'index est verrouillé Index lockedRclMain®Index pas à jour pour ce fichier. Je ne veux pas risquer d'afficher la mauvaise entrée.NIndex not up to date for this file. Refusing to risk showing the wrong entry. RclMainDErreur de la recherche sur l'indexIndex query errorRclMain:Programmation de l'indexationIndex schedulingRclMain$Types MIME indexésIndexed MIME TypesRclMain~L'indexeur est actif. Impossible d'accéder au fichier webcache./Indexer is running. Can't access webcache file.RclMainFL'indexation n'a pas encore eu lieuIndexing did not run yetRclMain*L'indexation a échouéIndexing failedRclMain*Indexation en cours: Indexing in progress: RclMain,Indexation interrompueIndexing interruptedRclMain(Erreur de chargement Load errorRclMain.Applications manquantesMissing helper programsRclMainMoniteurMonitorRclMain`Pas de visualiseur configuré pour le type MIME [-No external viewer configured for mime type [RclMain:Pas d'applications manquantesNo helpers found missingRclMain8Pas de recherche sauvegardéeNo preserved previous searchRclMain*Aucun résultat trouvéNo results foundRclMain Pas de recherche No searchRclMain>Erreur d'indexation non fatale:Non-fatal indexing message: RclMainRienNoneRclMainþOuverture d'un fichier temporaire. Les modification seront perdues<br/>si vous ne les sauvez pas dans un emplacement permanent.`Opening a temporary copy. Edits will be lost if you don't save
them to a permanent location.RclMainNettoyagePurgeRclMainÎRequête en cours.<br>En raison de restrictions internes, <br>annuler terminera l'exécution du programmeeQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain2Résultats de la recherche Query resultsRclMain"Erreur de lecture Read failedRclMainNEffacer l'index et redémarrer de zéro ?(Reset the index and start from scratch ?RclMain4Nombre de résultats (est.)Result count (est.)RclMain,Sauvegarder le fichier Save fileRclMain@Recherches Sauvegardées (*.rclq)Saved Queries (*.rclq)RclMain¢Les schémas de sélection ne peuvent être utilisés qu'avec un répertoire de départ:Selection patterns can only be used with a start directoryRclMainxLes schémas de sélection nécessitent un répertoire de départSelection patterns need topdirRclMainæDésolé, pas disponible pour Windows pour le moment, utiliser les entrées du menu fichier pour mettre à jour l'indexYSorry, not available under Windows for now, use the File menu entries to update the indexRclMainBase radicauxStemdbRclMain*Arrèter l'&IndexationStop &IndexingRclMain<Sous-documents et attachementsSub-documents and attachmentsRclMainÌLe processus d'indexation en cours n'a pas été démarré depuis cette interface, impossible de l'arrêterOThe current indexing process was not started from this interface, can't kill itRclMain0Le processus d'indexation en cours n'a pas été démarré depuis cette interface. Cliquer Ok pour le tuer quand même, ou Annuler pour le laisser tranquilleyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain–Le document appartient à un index externe que je ne peux pas mettre à jour.@The document belongs to an external index which I can't update. RclMain”L'indexeur est actif, les choses devraient aller mieux quand il aura fini.@The indexer is running so things should improve when it's done. RclMainèLe visualiseur spécifié dans mimeview pour %1: %2 est introuvable. Voulez vous démarrer le dialogue de préférences ?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainVCes URLs(| ipath) partagent le même contenu-These Urls ( | ipath) share the same content:RclMain„Cet outil de configuration ne travaille que sur l'index principal.6This configuration tool only works for the main index.RclMainBCette recherche n'est plus active"This search is not active any moreRclMainbListe vide: attendre que l'indexation progresse ?6Types list empty: maybe wait for indexing to progress?RclMainInconnueUnknownRclMainŠÉtat de l'indexeur inconnu. Impossible d'accéder au fichier webcache.2Unknown indexer state. Can't access webcache file.RclMain,Mettre à jour l'&Index Update &IndexRclMainMise à jourUpdatingRclMain¬La ligne de commande pour %1 spécifie à la fois le fichier et son parent: non supportéQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainAttentionWarningRclMain Échec d'écriture Write failedRclMainnimpossible de trouver la liste des langages d'expansion#error retrieving stemming languagesRclMain filtréfilteredRclMainmultimédiamediaRclMainmessagemessageRclMain autresotherRclMainprésentation presentationRclMaintriésortedRclMain"feuille de calcul spreadsheetRclMain textetextRclMainPAvec re-traitement des fichiers en échec With failed files retrying RclMainBase&&A propos de Recoll &About Recoll RclMainBase$Recherche &Avancée&Advanced Search RclMainBaseF&Effacer l'historique des documents&Erase document history RclMainBaseH&Effacer l'historique des recherches&Erase search history RclMainBase&Fichier&File RclMainBase&Plein écran &Full Screen RclMainBase:Confi&guration de l'interface&GUI configuration RclMainBase &Aide&Help RclMainBase2Configuration de l'&Index&Index configuration RclMainBase&Préférences &Preferences RclMainBase*&Reconstruire l'index&Rebuild index RclMainBase&Résultats&Results RclMainBase.Paramètres pour le &tri&Sort parameters RclMainBase&Outils&Tools RclMainBase&Manuel &User manual RclMainBase &Voir&View RclMainBase"Recherche AvancéeAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase0Historique des documentsDocument History RclMainBase2&Historique des documentsDocument &History RclMainBase&QuitterE&xit RclMainBaseBConfiguration des index e&xternesE&xternal index dialog RclMainBase*Activer les synonymesEnable synonyms RclMainBaseIndex externesExternal index dialog RclMainBaseF11F11 RclMainBasePremière page First Page RclMainBasePremière page First page RclMainBasePlein écran Full Screen RclMainBaseJAller à la première page de résultatsGo to first page of results RclMainBase0&Statistiques de l'indexIndex &statistics RclMainBase&Types &MIME indexésIndexed &MIME types RclMainBase,Programme d'indexationIndexing &schedule RclMainBaseJIndexation avec des options spécialesIndexing with special options RclMainBaseBCharger une recherche sauvegardéeLoad saved query RclMainBase,&Traducteurs manquantsMissing &helpers RclMainBasePage suivante Next Page RclMainBasePage suivante Next page RclMainBasePage suivanteNext page of results RclMainBase´La prochaine mise à jour de l'index essaiera de traiter les fichiers actuellement en échec.Next update will retry previously failed files RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBasePage précédente Previous Page RclMainBasePage précédente Previous page RclMainBasePage précédentePrevious page of results RclMainBase,Fragments de rechercheQuery Fragments RclMainBase RecollRecoll RclMainBaseLSauver en format CSV (fichier tableur)Save as CSV (spreadsheet) file RclMainBaseBSauvegarder la dernière rechercheSave last query RclMainBase®Sauvegarde les résultats dans un fichier qu'il sera possible de charger dans un tableur@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift+PgUp Shift+PgUp RclMainBase<Afficher la requête en détailsShow Query Details RclMainBase2Afficher comme un tableau Show as table RclMainBaseLMontrer les résultats dans un tableau (Show results in a spreadsheet-like table RclMainBaseRTrier par date, le plus récent en premierSort by date, newest first RclMainBaseRTrier par date, le plus ancien en premierSort by date, oldest first RclMainBasefTrier par date des plus récentes aux plus anciennes#Sort by dates from newest to oldest RclMainBasefTrier par date des plus anciennes aux plus récentes#Sort by dates from oldest to newest RclMainBase,Paramètres pour le triSort parameters RclMainBase&Indexation spécialeSpecial Indexing RclMainBase.&Exploration de l'indexTerm &explorer RclMainBase<Outil d'exploration de l'indexTerm explorer tool RclMainBase&Indexer Update &index RclMainBase"Editeur &WebcacheWebcache Editor RclMainBaseQuitterQuit RclTrayIconRestaurerRestore RclTrayIconExtraitAbstract RecollModel AuteurAuthor RecollModelDateDate RecollModelDate et heure Date and time RecollModelDate document Document date RecollModelTaille document Document size RecollModelDate fichier File date RecollModelNom de fichier File name RecollModelTaille fichier File size RecollModel IpathIpath RecollModelMots clefKeywords RecollModelType MIME MIME type RecollModel MtimeMtime RecollModel6Jeu de caractères d'origineOriginal character set RecollModelPertinenceRelevancy rating RecollModel TitreTitle RecollModelURLURL RecollModel(requête) (show query)ResList8<p><b>Aucun résultat</b><br>

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

Alternate spellings (accents suppressed): ResListB<p><i>Orthographes proposés: </i>

Alternate spellings: ResListDHistorique des documents consultésDocument historyResListDocuments DocumentsResListSuivantNextResList OuvrirOpenResList PrévisualisationPreviewResListPrécédentPreviousResList,Détail de la recherche Query detailsResList4Nombre de résultats (est.)Result count (est.)ResList$Liste de résultats Result listResListExtraitsSnippetsResList*Document inaccessibleUnavailable documentResListpourforResListparmi au moinsout of at leastResList&&Enlever la colonne&Delete columnResTable<&Revenir au tri par pertinence &Reset sortResTable&&Sauvegarder en CSV &Save as CSVResTable0Ajouter une colonne "%1"Add "%1" columnResTablePImpossible d'ouvrir ou créer le fichier:Can't open/create file: ResTable>Sauvegarder dans un fichier CSVSave table to CSV fileResTable^diffèrent des préférences en cours (conservées)' differ from current preferences (kept)SSearchTous les termes All termsSSearchCertains termesAny termSSearch|L'option de suffixe automatique pour la recherche sauvegardée: Auto suffixes for stored query: SSearch¬L'option autophrase est positionnée, mais ne l'était pas pour la recherche sauvegardée3Autophrase is set but it was unset for stored querySSearch¦L'option autophrase est désactivée mais était active pour la recherche sauvegardée3Autophrase is unset but it was set for stored querySSearch(Requête non reconnueBad query stringSSearchlEntrer un nom de fichier (caractères jokers possibles)$Enter file name wildcard expression.SSearch<Entrer une expression du langage de recherche. Indications:<br> <i>term1 term2</i> : 'term1' et 'term2' dans un champ quelconque.<br> <i>field:term1</i> : 'term1' dans le champ 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Enter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date, size.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
You can use parentheses to make things clearer.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchÐEntrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours.FEnter search terms here. Type ESC SPC for completions of current term.SSearchbLes index externes pour la recherche sauvegardée:#External indexes for stored query: SSearchNom de fichier File nameSSearch4Plus de mémoire disponible Out of memorySSearch0Language d'interrogationQuery languageSSearchnLes langages d'expansion pour la recherche sauvegardée:%Stemming languages for stored query: SSearch:Choisir le type de recherche.Choose search type. SSearchBaseEffacerClear SSearchBase Ctrl+SCtrl+S SSearchBaseÐEntrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase Effacer l'entréeErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseRechercherSearch SSearchBase*Démarrer la recherche Start query SSearchBaseToutAll SearchClauseWCertainsAny SearchClauseWNom de fichier File name SearchClauseWSans champNo field SearchClauseWRienNone SearchClauseWœNombre de mots additionnels qui peuvent se trouver entre les termes recherchésHNumber of additional words that may be interspersed with the chosen ones SearchClauseW PhrasePhrase SearchClauseWProximité Proximity SearchClauseWrSélectionner le type de requête à effectuer avec les mots>Select the type of query that will be performed with the words SearchClauseWTrouver:Find:SnippetsSuivantNextSnippetsPrécédentPrevSnippetsExtraitsSnippetsSnippets2<p>Désolé, aucun résultat trouvé dans les limites de recherche. Peut-être que le document est très gros et que le générateur d'extraits s'est perdu...<p>ˆ

Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...

 SnippetsWRechercherSearch SnippetsWParcourirBrowseSpecIdxWêRépertoire à indexer récursivement. Il doit être à l'intérieur de la zone normale<br>définie par la variable topdirs.€Directory to recursively index. This must be inside the regular indexed area
as defined in the configuration file (topdirs).SpecIdxWPNe pas réessayer les fichiers en erreur.%Do not retry previously failed files.SpecIdxW†Sinon, seulement les fichiers modifiés ou en erreur seront traités.5Else only modified or failed files will be processed.SpecIdxWŒEffacer les données pour les fichiers sélectionnés avant de réindexer.*Erase selected files data before indexing.SpecIdxWLaisser vide pour sélectionner tous les fichiers. Vous pouvez utiliser plusieurs schémas séparés par des espaces.<br>Les schémas contenant des espaces doivent ere enclos dans des apostrophes doubles.<br>Ne peut être utilisé que si le répertoire de départ est positionné.ÐLeave empty to select all files. You can use multiple space-separated shell-type patterns.
Patterns with embedded spaces should be quoted with double quotes.
Can only be used if the start target is set.SpecIdxW*Schémas de sélection:Selection patterns:SpecIdxW&Indexation spécialeSpecial IndexingSpecIdxW„Répertoire de départ (sinon utiliser la variable normale topdirs):+Start directory (else use regular topdirs):SpecIdxW2Objet indexé de démarrageTop indexed entitySpecIdxW&Fermer&Close SpellBase&Dérivés&Expand  SpellBaseAccentsAccents SpellBase Alt+FAlt+C SpellBase Alt+DAlt+E SpellBase*Majuscules/MinusculesCase SpellBase$Faire correspondreMatch SpellBase<Pas d'information sur la base. No db info. SpellBase&Explorateur d'index Term Explorer SpellBase> Documents créés ou mis à jour Documents created/updatedSpellW" Fichiers testés Files testedSpellW, Fichiers non indexés Unindexed filesSpellW%1 résultats %1 resultsSpellWFNombre moyen de termes par documentAverage terms per documentSpellW4Taille occupee par l'indexDatabase directory sizeSpellWDoc. / Tot. Doc. / Tot.SpellWzIndex: %1 documents, longueur moyenne %2 termes. %3 résultats7Index: %1 documents, average length %2 terms.%3 resultsSpellWElementItemSpellWpLister les fichiers qui n'ont pas pu être traités (lent),List files which could not be indexed (slow)SpellW’La liste a été tronquée par ordre alphabétique. Certains termes fréquents1List was truncated alphabetically, some frequent SpellWBTaille maximale document (termes)Longest document length (terms)SpellWTypes MIME MIME types:SpellW Pas de résultatsNo expansion foundSpellW&Nombre de documentsNumber of documentsSpellW(Expression régulièreRegexpSpellWHRésultats de la dernière indexation:Results from last indexing:SpellWHAfficher les statistiques de l'indexShow index statisticsSpellWBTaille minimale document (termes) Smallest document length (terms)SpellWXErreur dans les suggestions orthographiques.Spell expansion error. SpellW,Orthographe/PhonétiqueSpelling/PhoneticSpellW,Expansion grammaticaleStem expansionSpellW TermeTermSpellW ValeurValueSpellWWildcards WildcardsSpellWlImpossible de former la liste des langages d'expansion#error retrieving stemming languagesSpellW„pourraient être absents. Essayer d'utiliser une racine plus longue.terms may be missing. Try using a longer root.SpellWTous les termes All terms UIPrefsDialogCertains termesAny term UIPrefsDialog:Selectionner au plus un index$At most one index should be selected UIPrefsDialogÂImpossible d'ajouter un index avec une option differente de sensibilite a la casse et aux accents>Cant add index with different case/diacritics stripping option UIPrefsDialogChoisirChoose UIPrefsDialog8Fonte par défaut de QtWebkitDefault QtWebkit font UIPrefsDialogNom de fichier File name UIPrefsDialog0Language d'interrogationQuery language UIPrefsDialogXEn-tête HTML (la valeur par défaut est vide)%Result list header (default is empty) UIPrefsDialogÀFormat de paragraphe de la liste de résultats (tout effacer pour revenir à la valeur par défaut)Nouveaux param&egrave;tres</b>New Values:ViewActionBaseTAction (vide -> utiliser le defaut recoll) Action (empty -> recoll default)ViewActionBaseBAppliquer à la sélection couranteApply to current selectionViewActionBase FermerCloseViewActionBaseFException aux préférences du bureau Exception to Desktop preferencesViewActionBase:Applications de visualisationNative ViewersViewActionBaseAction Recoll action:ViewActionBaseúSélectionner un ou plusieurs types de fichiers, puis utiliser les contrôles dans le cadre du bas pour changer leur traitementkSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseìSélectionner un ou plusieurs types MIME, puis utiliser les contrôles dans le cadre du bas pour changer leur traitementlSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBase<S&eacute;lectionner par valeur Select sameViewActionBaseDUtiliser les préférences du bureau"Use Desktop preferences by defaultViewActionBasevaleur actuelle current valueViewActionBase$Recherche (regexp) Search regexpWebcache Editeur WebcacheWebcache editorWebcacheCopier l'URLCopy URL WebcacheEditDDétruire les entrées sélectionnéesDelete selection WebcacheEdit~L'indexeur est actif. Impossible d'accéder au fichier webcache.-Indexer is running. Can't edit webcache file. WebcacheEdit~État indexeur inconnu. Impossible d'éditer le fichier webcache.0Unknown indexer state. Can't edit webcache file. WebcacheEditÊLe fichier webcache a été modifié, il faudra redémarrer l'indexation après avoir fermé cette fenêtre.RWebcache was modified, you will need to run the indexer after closing this window. WebcacheEditMIMEMIME WebcacheModelUrlUrl WebcacheModelöPermet d'indexer les pages Web visitées avec Firefox <br>(il vous faut également installer l'extension Recoll pour Firefox)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelW Les entrées seront recyclées quand la taille sera atteinte.<br>Seule l'augmentation de la taille a un sens parce que réduire la valeur ne tronquera pas un fichier existant (mais gachera de l'espace à la fin).¾Entries will be recycled once the size is reached.
Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).confgui::ConfBeaglePanelWDTaille max. pour le cache Web (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW:Traiter la file des pages WEBProcess the WEB history queueconfgui::ConfBeaglePanelWþLe nom d'un répertoire où stocker les copies des pages visitées.<br>Un chemin relatif se réfère au répertoire de configuration.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWÿÿÿÿWeb page store directory nameconfgui::ConfBeaglePanelW^Impossible d'ecrire le fichier de configurationCan't write configuration fileconfgui::ConfIndexWChoisirChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW <p>Activer automatiquement la sensibilité aux majuscules si le terme de recherche contient des majuscules (sauf en première lettre). Sans cette option, vous devez utiliser le langage de recherche et le drapeau <i>C</i> pour activer la sensibilité aux majuscules.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelW<p>Activer automatiquement la sensibilité aux accents si le terme recherché contient des accents (saufs pour ceux de unac_except_trans). Sans cette option, il vous faut utiliser le langage de recherche et le drapeau <i>D</i> pour activer la sensibilité aux accents.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelW$<p>Nombre maximum de termes de recherche résultant d'un terme entré (par exemple expansion par caractères jokers). La valeur par défaut de 10000 est raisonnable et évitera les requêtes qui paraissent bloquées pendant que le moteur parcourt l'ensemble de la liste des termes.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelWr<p>Nombre maximum de clauses Xapian élémentaires générées pour une requête. Dans certains cas, le résultat de l'expansion des termes peut ere multiplicatif, et utiliserait trop de mémoire. La valeur par défaut de 100000 devrait être à la fois suffisante et compatible avec les configurations matérielles typiques.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWLSensibilité automatique aux majuscules$Automatic character case sensitivityconfgui::ConfSearchPanelWFSensibilité automatique aux accents Automatic diacritics sensitivityconfgui::ConfSearchPanelW@Compte maximum de clauses XapianMaximum Xapian clauses countconfgui::ConfSearchPanelWPTaille maximum de l'expansion d'un termeMaximum term expansion countconfgui::ConfSearchPanelWÒUne liste exclusive des types MIME à indexer.<br>Rien d'autre ne sera indexé. Normalement vide et inactifeAn exclusive list of indexed mime types.
Nothing else will be indexed. Normally empty and inactiveconfgui::ConfSubPanelWTypes exclusExclude mime typesconfgui::ConfSubPanelWØUn filtre externe qui prend plus de temps sera arrêté. Traite le cas rare (possible avec postscript par exemple) où un document pourrait amener un filtre à boucler sans fin. Mettre -1 pour complètement supprimer la limite (déconseillé).­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelWÐSi cette valeur est spécifiée et positive, les fichiers de texte pur seront découpés en tranches de cette taille pour l'indexation. Ceci diminue les ressources consommées par l'indexation et aide le chargement pour prévisualisation.¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWfTaill maximale pour les fichiers à décomprimer (Ko)Max. compressed file size (KB)confgui::ConfSubPanelWXTemps d'exécution maximum pour un filtre (S)Max. filter exec. time (S)confgui::ConfSubPanelWNTaille maximale d'un fichier texte (MB)Max. text file size (MB)confgui::ConfSubPanelW6Types MIME à ne pas indexerMime types not to be indexedconfgui::ConfSubPanelW&Seulement ces typesOnly mime typesconfgui::ConfSubPanelWdTaille de page pour les fichiers de texte pur (KB)Text file page size (KB)confgui::ConfSubPanelW^Cette valeur définit un seuil au delà duquel les fichiers comprimés ne seront pas traités. Utiliser -1 pour désactiver la limitation, 0 pour ne traiter aucun fichier comprimé.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelWjCette valeur est un seuil au delà duquel les fichiers de texte pur ne seront pas indexés. Spécifier -1 pour supprimer la limite. Utilisé pour éviter d'indexer des fichiers monstres.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWØ<p>Ce sont les exceptions au mécanisme de suppression des accents, qui, par défaut et en fonction de la configuration de l'index, supprime tous les accents et effectue une décomposition canonique Unicode. Vous pouvez inhiber la suppression des accents pour certains caractères, en fonction de votre langue, et préciser d'autres décompositions, par exemple pour des ligatures. Dans la liste séparée par des espaces, le premier caractères d'un élément est la source, le reste est la traduction.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelW$Langue pour aspellAspell languageconfgui::ConfTopPanelWBRépertoire de stockage de l'indexDatabase directory nameconfgui::ConfTopPanelW Désactiver l'utilisation d'aspell pour générer les approximations orthographiques.<br> Utile si aspell n'est pas installé ou ne fonctionne pas. †Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelW\Intervalle d'écriture de l'index en mégaoctetsIndex flush megabytes intervalconfgui::ConfTopPanelW,Nom du fichier journal Log file nameconfgui::ConfTopPanelW&Niveau de verbositéLog verbosity levelconfgui::ConfTopPanelWrUtilisation disque maximale (%, 0 signifie pas de limite))Max disk occupation (%, 0 means no limit)confgui::ConfTopPanelW4Pas d'utilisation d'aspellNo aspell usageconfgui::ConfTopPanelWChemins ignorés Skipped pathsconfgui::ConfTopPanelWDLangue pour l'expansion des termesStemming languagesconfgui::ConfTopPanelW¬Le nom du fichier ou les messages seront ecrits.<br>Utiliser 'stderr' pour le terminalPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWLangue pour le dictionnaire aspell. La valeur devrait ressembler à 'en' ou 'fr'... <br>Si cette valeur n'est pas positionnée, l'environnement national sera utilisé pour la calculer, ce qui marche bien habituellement. Pour avoir une liste des valeurs possibles sur votre système, entrer 'aspell config' sur une ligne de commande et regarder les fichiers '.dat' dans le répertoire 'data-dir'. 3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW²Les langages pour lesquels les dictionnaires d'expansion<br>des termes seront construits.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÂLa liste des répertoires où l'indexation récursive démarre. Défault: votre répertoire par défaut.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWBLe nom d'un répertoire pour stocker l'index<br>Un chemin relatif sera interprété par rapport au répertoire de configuration. La valeur par défaut est 'xapiandb'.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWÎCe sont les chemins des répertoires où l'indexation n'ira pas.<br>Les éléments peuvent contenir des caractères joker. Les entrés doivent correspondre aux chemins vus par l'indexeur (ex.: si topdirs comprend '/home/me' et que '/home' est en fait un lien vers '/usr/home', un élément correct pour skippedPaths serait '/home/me/tmp*', et non '/usr/home/me/tmp*')BThese are pathnames of directories which indexing will not enter.
Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')confgui::ConfTopPanelW`C'est le pourcentage d'utilisation disque - utilisation totale, et non taille de l'index - où l'indexation s'arretera en erreur.<br>La valeur par défaut de 0 désactive ce test.œThis is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.
The default value of 0 removes any limit.confgui::ConfTopPanelWòAjuste la quantité de données lues entre les écritures sur disque.<br>Contrôle l'utilisation de la mémoire. Défaut 10 Mo ŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWðCette valeur ajuste la quantite de messages emis,<br>depuis uniquement les erreurs jusqu'a beaucoup de donnees de debug.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW*Répertoires de départTop directoriesconfgui::ConfTopPanelWExceptions UnacUnac exceptionsconfgui::ConfTopPanelW&Annuler&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase$<PRE> + repliement
 + wrapuiPrefsDialogBaseÊUne recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br>
Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase(Séparateur d'extraitAbstract snippet separatoruiPrefsDialogBaseTout activerActivate AlluiPrefsDialogBase Ajouter un index	Add indexuiPrefsDialogBase6Appliquer les modifications
Apply changesuiPrefsDialogBaseŠDémarrer automatiquement une recherche simple sur entrée d'un espace.-Auto-start simple search on whitespace entry.uiPrefsDialogBaserAjouter automatiquement une phrase aux recherches simples+Automatically add phrase to simple searchesuiPrefsDialogBase¦Seuil de fréquence de terme (pourcentage) pour la génération automatique de phrases.Autophrase term frequency threshold percentageuiPrefsDialogBase$Panneau de boutons
Buttons PaneluiPrefsDialogBaseChoisirChooseuiPrefsDialogBasetChoisir les éditeurs pour les différents types de fichiersChoose editor applicationsuiPrefsDialogBaseCliquer pour ajouter un autre index a la liste. Vous pouvez sélectionner soit un répertoire de configuration Recoll soit un index Xapian{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBase`Réduire dans la barre d'état au lieu de quitter.!Close to tray instead of exiting.uiPrefsDialogBase8Format de date (strftime(3))Date format (strftime(3))uiPrefsDialogBaseTout désactiverDeactivate AlluiPrefsDialogBaseòDécide si les filtres de documents sont affichés comme des radio-boutons, un combobox dans la barre d'outils, ou un menu.QDecide if document filters are shown as radio buttons, toolbar combobox, or menu.uiPrefsDialogBaserDesactiver l'autocompletion Qt dans l'entree de recherche*Disable Qt autocompletion in search entry.uiPrefsDialogBase8Abandonner les modificationsDiscard changesuiPrefsDialogBase¼Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseDécide si des résumés seront construits à partir du contexte des termes de recherche. 
Peut ralentir l'affichage si les documents sont gros.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBasePStyle de choix des filtres de documents:Document filter choice style:uiPrefsDialogBaseHConstruire dynamiquement les résumésDynamically build abstractsuiPrefsDialogBase`Editer le fragment à insérer dans l'en-tête HTML#Edit result page html header insertuiPrefsDialogBaseTEditer le format du paragraphe de résultat#Edit result paragraph format stringuiPrefsDialogBaseActiverEnableuiPrefsDialogBaseIndex externesExternal IndexesuiPrefsDialogBaseŠSeuil de fréquence (pourcentage) au delà duquel les termes ne seront pas utilisés.
Les phrases contenant des termes trop fréquents posent des problèmes de performance.
Les termes ignorés augmentent la distance de phrase, et réduisent l'efficacité de la fonction de recherche de phrase automatique.
La valeur par défaut est 2%þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase(Cacher les doublons.Hide duplicate results.uiPrefsDialogBasetStyle CSS de mise en avant pour les termes de la recherche#Highlight CSS style for query termsuiPrefsDialogBase‚N'afficher qu'une entrée pour les résultats de contenu identique.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBase¬Les lignes dans une balise PRE ne sont pas repliées. Utiliser BR conduit à perdre une partie des tabulations. Le style PRE + WRAP peut être le meilleurs compromis mais son bon fonctionnement dépend des versions Qt.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBase~Taille maximum des textes surlignés avant prévisualisation (MO)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseMenuMenuuiPrefsDialogBase8Nombre de résultats par page"Number of entries in a result pageuiPrefsDialogBaseÀOuvre un dialogue permettant de sélectionner la feuille de style CSS pour le popup des fragmentsAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBase`Ouvre une fenêtre permettant de changer la fonte-Opens a dialog to select the result list fontuiPrefsDialogBasetOuvre un dialogue pour choisir un fichier feuille de style-Opens a dialog to select the style sheet fileuiPrefsDialogBase,Traductions de cheminsPaths translationsuiPrefsDialogBaseZStyle de traduction texte ordinaire vers HTMLPlain text to HTML line styleuiPrefsDialogBasebUtiliser le format Html pour la previsualisation.&Prefer Html to plain text for preview.uiPrefsDialogBaselSuffixes automatiques pour le langage d'interrogation.(Query language magic file name suffixes.uiPrefsDialogBaseJMemoriser l'etat d'activation du tri.Remember sort activation state.uiPrefsDialogBaselOter de la liste. Sans effet sur les données stockées.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase(Effacer la sélectionRemove selecteduiPrefsDialogBasebRemplacer les résumés existant dans les documents Replace abstracts from documentsuiPrefsDialogBaseRéinitialiserResetuiPrefsDialogBasebRéinitialise le style de la fenêtre des fragments Resets the Snippets window styleuiPrefsDialogBaseZRéinitialiser la fonte à la valeur par défaut1Resets the result list font to the system defaultuiPrefsDialogBasejRestore la valeur par défaut pour la feuille de style!Resets the style sheet to defaultuiPrefsDialogBase$Liste de résultatsResult ListuiPrefsDialogBase@Fonte pour la liste de résultatsResult list fontuiPrefsDialogBaseXLancer la recherche a chaque caractere entreSearch as you type.uiPrefsDialogBase8Paramètres pour la rechercheSearch parametersuiPrefsDialogBase\Afficher l'icone dans la barre d'état système.Show system tray icon.uiPrefsDialogBase|Afficher un avertissement quand on édite une copie temporaire.)Show warning when opening temporary file.uiPrefsDialogBase^Feuille de style CSS pour le popup de fragmentsSnippets window CSS fileuiPrefsDialogBasebPanneau de recherche avancée ouvert au démarrage.'Start with advanced search dialog open.uiPrefsDialogBaseBDémarrer en mode recherche simpleStart with simple search modeuiPrefsDialogBaseDLangue pour l'expansion des termesStemming languageuiPrefsDialogBase Feuille de styleStyle sheetuiPrefsDialogBase(Fichier de synonymes
Synonyms fileuiPrefsDialogBase‚Nombre de mots de contexte par occurrence de terme dans le résumé Synthetic abstract context wordsuiPrefsDialogBaseRTaille du résumé synthétique (caractères)$Synthetic abstract size (characters)uiPrefsDialogBase¤Les textes plus gros ne seront pas surlignés dans la prévisualisation (trop lent).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseèLes mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBaseZChanger l'état pour les entrées sélectionnéesToggle selecteduiPrefsDialogBaseBCombobox dans le panneau d'outilsToolbar ComboboxuiPrefsDialogBase*Interface utilisateurUser interfaceuiPrefsDialogBase.Préférences utilisateurUser preferencesuiPrefsDialogBaseStyle utilisateur à appliquer à la fenêtre "snippets".<br>Note: l'en tête de page de résultat est aussi inclus dans la fenêtre "snippets".ƒUser style to apply to the snippets window.
Note: the result page header insert is also included in the snippets window header.uiPrefsDialogBaseˆrecoll-1.23.7/qtgui/i18n/recoll_fr.ts0000644000175000017500000051312213224431020014227 00000000000000 AdvSearch All clauses Toutes les clauses Any clause Une des clauses texts textes spreadsheets feuilles de calcul presentations présentations media multimédia messages messages other autres Bad multiplier suffix in size filter Suffixe multiplicateur incorrect dans un filtre de taille (k/m/g/t) text texte spreadsheet feuille de calcul presentation présentation message message AdvSearchBase Advanced search Recherche avancée Restrict file types Restreindre les types de fichier Save as default Sauver comme valeur initiale Searched file types Types de fichier recherchés All ----> Tout ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Tout Ignored file types Types de fichiers ignorés Enter top directory for search Entrer le répertoire où démarre la recherche Browse Parcourir Restrict results to files in subtree: Restreindre les résultats aux fichiers de l'arborescence: Start Search Lancer la recherche Search for <br>documents<br>satisfying: Rechercher les <br>documents<br>vérifiant: Delete clause Enlever une clause Add clause Ajouter une clause Check this to enable filtering on file types Cocher pour permettre le filtrage des types de fichiers By categories Par catégories Check this to use file categories instead of raw mime types Cocher pour utiliser les catégories de fichiers au lieu des types mimes Close Fermer All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Tous les champs de droite non vides seront combinés par une conjonction ET (choix "Toutes les clauses") ou OU (choix "Une des clauses"). <br> Les champs de type "Un de ces mots", "Tous ces mots" et "Aucun de ces mots" acceptent un mélange de mots et de phrases contenues dans des apostrophes "une phrase".<br>Les champs non renseignés sont ignorés. Invert Inverser Minimum size. You can use k/K,m/M,g/G as multipliers Taille minimum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G. Min. Size Taille Min. Maximum size. You can use k/K,m/M,g/G as multipliers Taille Maximum. Vous pouvez utiliser un suffixe multiplicateur: k/K, m/M, g/G. Max. Size Taille Max. Select Sélectionner Filter Filtrer From À partir de To Jusqu'à Check this to enable filtering on dates Cocher pour activer le filtrage sur les dates Filter dates Filtrer sur les dates Find Trouver Check this to enable filtering on sizes Cocher pour activer le fitrage sur taille fichier Filter sizes Filtrer les tailles CronToolW Cron Dialog Dialogue Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span>: planification de l'indexation périodique (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Chaque champ peut contenir un joker (*), une simple valeur numérique , des listes ponctuées par des virgules (1,3,5) et des intervalles (1-7). Plus généralement, les champs seront utilisés <span style=" font-style:italic;">tels quels</span> dans le fichier crontab, et la syntaxe générale crontab peut être utilisée, voir la page de manuel crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Par exemple, en entrant <span style=" font-family:'Courier New,courier';">*</span> dans <span style=" font-style:italic;">Jours, </span><span style=" font-family:'Courier New,courier';">12,19</span> dans <span style=" font-style:italic;">Heures</span> et <span style=" font-family:'Courier New,courier';">15</span> dans <span style=" font-style:italic;">Minutes</span>, recollindex démarrerait chaque jour à 12:15 et 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un planning avec des activations très fréquentes est probablement moins efficace que l'indexation au fil de l'eau.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Jours de la semaine (* ou 0-7, 0 ou 7 signifie Dimanche) Hours (* or 0-23) Heures (* ou 0-23) Minutes (0-59) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cliquer <span style=" font-style:italic;">Désactiver</span> pour arrêter l'indexation automatique périodique, <span style=" font-style:italic;">Activer</span> pour la démarrer, <span style=" font-style:italic;">Annuler</span> pour ne rien changer.</p></body></html> Enable Activer Disable Désactiver It seems that manually edited entries exist for recollindex, cannot edit crontab Il semble que des entrées créées manuellement existent pour recollindex. Impossible d´éditer le fichier Cron Error installing cron entry. Bad syntax in fields ? Erreur durant l'installation de l'entrée cron. Mauvaise syntaxe des champs ? EditDialog Dialog Dialogue EditTrans Source path Chemin source Local path Chemin local Config error Erreur config Original path Chemin Originel EditTransBase Path Translations Traductions de chemins Setting path translations for Ajustement des traductions de chemins pour Select one or several file types, then use the controls in the frame below to change how they are processed Sélectionner un ou plusieurs types de fichiers, puis utiliser les contrôles dans le cadre ci-dessous pour changer leur traitement Add Ajouter Delete Supprimer Cancel Annuler Save Sauvegarder FirstIdxDialog First indexing setup Paramétrage de la première indexation <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Il semble que l'index pour cette configuration n'existe pas encore.</span><br /><br />Si vous voulez simplement indexer votre répertoire avec un jeu raisonnable de valeurs par défaut, cliquer le bouton <span style=" font-style:italic;">Démarrer l'indexation maintenant</span>. Vous pourrez ajuster les détails plus tard. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si vous voulez plus de contrôle, utilisez les liens qui suivent pour ajuster la configuration et le planning d'indexation.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ces outils peuvent être accédés plus tard à partir du menu <span style=" font-style:italic;">Preferences</span>.</p></body></html> Indexing configuration Configuration de l'indexation This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Vous pourrez ajuster les répertoires que vous voulez indexer, et d'autres paramètres comme les schémas de noms ou chemins de fichiers exclus, les jeux de caractères par défaut, etc. Indexing schedule Planning de l'indexation This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Vous pourrez choisir entre l'indexation à intervalles fixes ou au fil de l'eau, et définir un planning pour la première (basé sur l'utilitaire cron). Start indexing now Démarrer l'indexation maintenant FragButs %1 not found. %1 non trouvé %1: %2 %1: %2 Fragment Buttons Fragments de recherche Query Fragments Fragments de recherche IdxSchedW Index scheduling setup Paramétrage du planning d'indexation <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut fonctionner en permanence, traitant les fichiers dès qu'ils sont modifiés, ou être exécutée à des moments prédéterminés. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Une lecture du manuel peut vous aider à choisir entre ces approches (presser F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cet outil peut vous aider à planifier l'indexation périodique, ou configurer un démarrage automatique de l'indexation au fil de l'eau quand vous vous connectez (ou les deux, ce qui est rarement pertinent). </p></body></html> Cron scheduling Planning Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Le dialogue vous permettra de déterminer à quelle heure l'indexation devra démarrer et installera une entrée crontab. Real time indexing start up Démarrage de l'indexation au fil de l'eau Decide if real time indexing will be started when you log in (only for the default index). Déterminer si l'indexation au fil de l'eau démarre quand vous vous connectez (pour l'index par défaut). ListDialog Dialog Dialogue GroupBox GroupBox Main No db directory in configuration Répertoire de la base de données non défini dans la configuration Could not open database in Impossible d'ouvrir la base dans . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Cliquer Annuler pour pouvoir éditer le fichier de configuration avant que l'indexation ne démarre, ou Ok pour continuer. Configuration problem (dynconf Problème de configuration (dynconf) "history" file is damaged or un(read)writeable, please check or remove it: Le fichier d'historique est illisible, le verifier ou l'effacer: Preview &Search for: &Rechercher: &Next &Suivant &Previous &Précédent Match &Case Respecter la &casse Clear Effacer Creating preview text Création du texte pour la prévisualisation Loading preview text into editor Chargement du texte de la prévisualisation Cannot create temporary directory Impossible de créer le répertoire temporaire Cancel Annuler Close Tab Fermer l'onglet Missing helper program: Programmes filtres externes manquants: Can't turn doc into internal representation for Impossible de traduire le document en représentation interne pour Cannot create temporary directory: Impossible de créer un répertoire temporaire Error while loading file Erreur de chargement du fichier PreviewTextEdit Show fields Afficher les valeurs des champs Show main text Afficher le corps du texte Print Imprimer Print Current Preview Imprimer la fenêtre de prévisualisation Show image Afficher l'image Select All Tout sélectionner Copy Copier Save document to file Sauvegarder le document Fold lines Replier les lignes Preserve indentation Préserver l'indentation QObject Global parameters Paramètres globaux Local parameters Paramètres locaux <b>Customised subtrees <b>Répertoires avec paramètres spécifiques The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. La liste des sous-répertoires de la zone indexée<br>où certains paramètres sont redéfinis. Défaut: vide. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Les paramètres qui suivent sont définis soit globalement, si la sélection dans la liste ci-dessus<br>est vide ou réduite à la ligne vide, soit pour le répertoire sélectionné.<br>Vous pouvez ajouter et enlever des répertoires en cliquant les boutons +/-. Skipped names Noms ignorés These are patterns for file or directory names which should not be indexed. Canevas définissant les fichiers ou répertoires qui ne doivent pas etre indexés. Default character set Jeu de caractères par défaut This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Jeu de caractères utilisé pour lire les fichiers qui ne l'identifient pas de manière interne, par exemple les fichiers de texte pur. <br>La valeur par défaut est vide, et le programme utilise l'environnement. Follow symbolic links Suivre les liens symboliques Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Indexer les fichiers et répertoires pointés par les liens symboliques. Pas fait par défaut pour éviter les indexations multiples Index all file names Indexer tous les noms de fichiers Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indexer les noms des fichiers dont le contenu n'est pas identifié ou traité (pas de type mime, ou type non supporté). Vrai par défaut Beagle web history Queue Web Search parameters Paramètres pour la recherche Web history Historique Web Default<br>character set Jeu de caractères<br>par défaut Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Jeu de caractères utilisé pour lire les fichiers qui n'identifient pas de manière interne leur encodage, par exemple les fichiers texte purs.<br>La valeur par défaut est vide, et la valeur obtenue à partir de l'environnement est utilisée dans ce cas. Ignored endings Suffixes ignor'es These are file name endings for files which will be indexed by content only (no MIME type identification attempt, no decompression, no content indexing. Suffixes correspondants `a des fichiers qui seront indexe's par nom seulement (pas d'identification de type MIME, pas d'ecompression, pas d'indexation du contenu). These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). Suffixes sélectionnant des fichiers qui seront indexés uniquement sur leur nom (pas d'identification de type MIME, pas de décompression, pas d'indexation du contenu). QWidget Create or choose save directory Créer ou choisir un répertoire d'écriture Choose exactly one directory Choisir exactement un répertoire Could not read directory: Impossible de lire le répertoire: Unexpected file name collision, cancelling. Collision de noms inattendue, abandon. Cannot extract document: Impossible d'extraire le document: &Preview &Voir contenu &Open &Ouvrir Open With Ouvrir Avec Run Script Exécuter le Script Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Save selection to files Sauvegarder la sélection courante dans des fichiers Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent Find &similar documents Chercher des documents &similaires Open &Snippets window Ouvrir la fenêtre des e&xtraits Show subdocuments / attachments Afficher les sous-documents et attachements QxtConfirmationMessage Do not show again. Ne plus afficher. RTIToolW Real time indexing automatic start Démarrage automatique de l'indexation au fil de l'eau <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">L'indexation <span style=" font-weight:600;">Recoll</span> peut être configurer pour s'exécuter en arrière plan, mettant à jour l'index au fur et à mesure que des documents sont modifiés. Vous y gagnez un index toujours à jour, mais des ressources systême (mémoire et processeur) sont consommées en permanence.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Démarrer le démon d'indexation quand je me connecte. Also start indexing daemon right now. Également démarrer le démon maintenant. Replacing: Remplacement de: Replacing file Remplacement du fichier Can't create: Impossible de créer: Warning Attention Could not execute recollindex Impossible d'exécuter recollindex Deleting: Effacement: Deleting file Effacement du fichier Removing autostart Enlèvement de l'autostart Autostart file deleted. Kill current process too ? Fichier autostart détruit. Arrêter le process en cours ? RclMain About Recoll À propos de Recoll Executing: [ Exécution de: [ Cannot retrieve document info from database Impossible d'accéder au document dans la base Warning Attention Can't create preview window Impossible de créer la fenêtre de visualisation Query results Résultats de la recherche Document history Historique des documents consultés History data Données d'historique Indexing in progress: Indexation en cours: Files Fichiers Purge Nettoyage Stemdb Base radicaux Closing Fermeture Unknown Inconnue This search is not active any more Cette recherche n'est plus active Can't start query: Impossible de démarrer la recherche: Bad viewer command line for %1: [%2] Please check the mimeconf file Mauvaise commande pour %1: [%2] Vérifier le fichier mimeconf Cannot extract document or create temporary file Impossible d'extraire le document ou de créer le fichier temporaire (no stemming) (pas d'expansion) (all languages) (tous les langages) error retrieving stemming languages impossible de trouver la liste des langages d'expansion Update &Index Mettre à jour l'&Index Indexing interrupted Indexation interrompue Stop &Indexing Arrèter l'&Indexation All Tout media multimédia message message other autres presentation présentation spreadsheet feuille de calcul text texte sorted trié filtered filtré External applications/commands needed and not found for indexing your file types: Applications externes non trouvees pour indexer vos types de fichiers: No helpers found missing Pas d'applications manquantes Missing helper programs Applications manquantes Save file dialog Dialogue de sauvegarde de fichier Choose a file name to save under Choisir un nom pour le nouveau fichier Document category filter Filtre de catégories de documents No external viewer configured for mime type [ Pas de visualiseur configuré pour le type MIME [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Le visualiseur spécifié dans mimeview pour %1: %2 est introuvable. Voulez vous démarrer le dialogue de préférences ? Can't access file: Impossible d'accéder au fichier: Can't uncompress file: Impossible de décomprimer le fichier: Save file Sauvegarder le fichier Result count (est.) Nombre de résultats (est.) Query details Détails de la recherche Could not open external index. Db not open. Check external indexes list. Impossible d'ouvrir un index externe. Base non ouverte. Verifier la liste des index externes. No results found Aucun résultat trouvé None Rien Updating Mise à jour Done Fini Monitor Moniteur Indexing failed L'indexation a échoué The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Le processus d'indexation en cours n'a pas été démarré depuis cette interface. Cliquer Ok pour le tuer quand même, ou Annuler pour le laisser tranquille Erasing index Effacement de l'index Reset the index and start from scratch ? Effacer l'index et redémarrer de zéro ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Requête en cours.<br>En raison de restrictions internes, <br>annuler terminera l'exécution du programme Error Erreur Index not open Index pas ouvert Index query error Erreur de la recherche sur l'index Indexed Mime Types Types MIME indexés Content has been indexed for these mime types: Du contenu a été indexé pour ces types MIME: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Index pas à jour pour ce fichier. Risque d'afficher une entrée incorrecte. Cliquer Ok pour mettre à jour l'index pour ce fichier, puis redémarrer la requête quand l'indexation est terminée. Sinon, Annuler. Can't update index: indexer running Impossible de mettre à jour l'index: un indexeur est déjà actif Indexed MIME Types Types MIME indexés Bad viewer command line for %1: [%2] Please check the mimeview file Ligne de commande incorrecte pour %1:[%2]. Vérifier le fichier mimeview. Viewer command line for %1 specifies both file and parent file value: unsupported La ligne de commande pour %1 spécifie à la fois le fichier et son parent: non supporté Cannot find parent document Impossible de trouver le document parent Indexing did not run yet L'indexation n'a pas encore eu lieu External applications/commands needed for your file types and not found, as stored by the last indexing pass in Applications et commandes externes nécessaires pour vos types de documents, et non trouvées, telles qu'enregistrées par la dernière séquence d'indexation dans Index not up to date for this file. Refusing to risk showing the wrong entry. L'index n'est pas à jour pour ce fichier. Il y aurait un risque d'afficher une entrée incorrecte Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Cliquer Ok pour mettre à jour l'index pour ce fichier, puis relancer la recherche quand l'indexation est terminée. Sinon cliquer Annuler Indexer running so things should improve when it's done L'indexeur est en cours d'exécution, le fichier devrait être mis à jour Sub-documents and attachments Sous-documents et attachements Document filter Filtre de documents Index not up to date for this file. Refusing to risk showing the wrong entry. Index pas à jour pour ce fichier. Je ne veux pas risquer d'afficher la mauvaise entrée. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. Cliquer Ok pour mettre à jour l'index pour ce fichier, puis attendez la fin de l'indexation pour relancer la recherche. The indexer is running so things should improve when it's done. L'indexeur est actif, les choses devraient aller mieux quand il aura fini. The document belongs to an external indexwhich I can't update. Le document appartient à un index externe que je ne peux pas mettre à jour. Click Cancel to return to the list. Click Ignore to show the preview anyway. Cliquer Annuler pour retourner à la liste. Cliquer Ignorer pour afficher tout de même. Duplicate documents Documents identiques These Urls ( | ipath) share the same content: Ces URLs(| ipath) partagent le même contenu Bad desktop app spec for %1: [%2] Please check the desktop file Mauvaise spécification d'application pour %1: [%2] Merci de vérifier le fichier desktop Bad paths Chemins inexistants Bad paths in configuration file: Chemins inexistants définis dans le fichier de configuration: Selection patterns need topdir Les schémas de sélection nécessitent un répertoire de départ Selection patterns can only be used with a start directory Les schémas de sélection ne peuvent être utilisés qu'avec un répertoire de départ No search Pas de recherche No preserved previous search Pas de recherche sauvegardée Choose file to save Choisir un fichier pour sauvegarder Saved Queries (*.rclq) Recherches Sauvegardées (*.rclq) Write failed Échec d'écriture Could not write to file Impossible d'écrire dans le fichier Read failed Erreur de lecture Could not open file: Impossible d'ouvrir le fichier: Load error Erreur de chargement Could not load saved query Le chargement de la recherche sauvegardée a échoué Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Ouverture d'un fichier temporaire. Les modification seront perdues<br/>si vous ne les sauvez pas dans un emplacement permanent. Do not show this warning next time (use GUI preferences to restore). Ne plus afficher ce message (utiliser le dialogue de préférences pour rétablir). Disabled because the real time indexer was not compiled in. Désactivé parce que l'indexeur au fil de l'eau n'est pas disponible dans cet exécutable. This configuration tool only works for the main index. Cet outil de configuration ne travaille que sur l'index principal. The current indexing process was not started from this interface, can't kill it Le processus d'indexation en cours n'a pas été démarré depuis cette interface, impossible de l'arrêter The document belongs to an external index which I can't update. Le document appartient à un index externe que je ne peux pas mettre à jour. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Cliquer Annulation pour retourner à la liste.<br>Cliquer Ignorer pour afficher la prévisualisation de toutes facons (mémoriser l'option pour la session). Index scheduling Programmation de l'indexation Sorry, not available under Windows for now, use the File menu entries to update the index Désolé, pas disponible pour Windows pour le moment, utiliser les entrées du menu fichier pour mettre à jour l'index Can't set synonyms file (parse error?) Impossible d'ouvrir le fichier des synonymes (erreur dans le fichier?) Index locked L'index est verrouillé Unknown indexer state. Can't access webcache file. État de l'indexeur inconnu. Impossible d'accéder au fichier webcache. Indexer is running. Can't access webcache file. L'indexeur est actif. Impossible d'accéder au fichier webcache. with additional message: avec le message complémentaire: Non-fatal indexing message: Erreur d'indexation non fatale: Types list empty: maybe wait for indexing to progress? Liste vide: attendre que l'indexation progresse ? RclMainBase Previous page Page précédente Next page Page suivante &File &Fichier E&xit &Quitter &Tools &Outils &Help &Aide &Preferences &Préférences Search tools Outils de recherche Result list Liste de résultats &About Recoll &A propos de Recoll Document &History &Historique des documents Document History Historique des documents &Advanced Search Recherche &Avancée Advanced/complex Search Recherche Avancée &Sort parameters Paramètres pour le &tri Sort parameters Paramètres pour le tri Next page of results Page suivante Previous page of results Page précédente &Query configuration &Recherche &User manual &Manuel Recoll Recoll Ctrl+Q Ctrl+Q Update &index &Indexer Term &explorer &Exploration de l'index Term explorer tool Outil d'exploration de l'index External index dialog Index externes &Erase document history &Effacer l'historique des documents First page Première page Go to first page of results Aller à la première page de résultats &Indexing configuration Configuration d'&Indexation All Tout &Show missing helpers Afficher les application&s manquantes PgDown PgDown Shift+Home, Ctrl+S, Ctrl+Q, Ctrl+S Shift+Home, Ctrl+S, Ctrl+Q, Ctrl+S PgUp PgUp &Full Screen &Plein écran F11 F11 Full Screen Plein écran &Erase search history &Effacer l'historique des recherches sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Trier par date des plus anciennes aux plus récentes sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Trier par date des plus récentes aux plus anciennes Show Query Details Afficher la requête en détails Show results as table Afficher les résultats en tableau &Rebuild index &Reconstruire l'index &Show indexed types &Afficher les types indexés Shift+PgUp Shift+PgUp &Indexing schedule &Planning d'indexation E&xternal index dialog Configuration des index e&xternes &Index configuration Configuration de l'&Index &GUI configuration Confi&guration de l'interface &Results &Résultats Sort by date, oldest first Trier par date, le plus ancien en premier Sort by date, newest first Trier par date, le plus récent en premier Show as table Afficher comme un tableau Show results in a spreadsheet-like table Montrer les résultats dans un tableau Save as CSV (spreadsheet) file Sauver en format CSV (fichier tableur) Saves the result into a file which you can load in a spreadsheet Sauvegarde les résultats dans un fichier qu'il sera possible de charger dans un tableur Next Page Page suivante Previous Page Page précédente First Page Première page Query Fragments Fragments de recherche With failed files retrying Avec re-traitement des fichiers en échec Next update will retry previously failed files La prochaine mise à jour de l'index essaiera de traiter les fichiers actuellement en échec Save last query Sauvegarder la dernière recherche Load saved query Charger une recherche sauvegardée Special Indexing Indexation spéciale Indexing with special options Indexation avec des options spéciales Indexing &schedule Programme d'indexation Enable synonyms Activer les synonymes &View &Voir Missing &helpers &Traducteurs manquants Indexed &MIME types Types &MIME indexés Index &statistics &Statistiques de l'index Webcache Editor Editeur &Webcache RclTrayIcon Restore Restaurer Quit Quitter RecollModel Abstract Extrait Author Auteur Document size Taille document Document date Date document File size Taille fichier File name Nom de fichier File date Date fichier Ipath Ipath Keywords Mots clef Mime type Type Mime Original character set Jeu de caractères d'origine Relevancy rating Pertinence Title Titre URL URL Mtime Mtime Date Date Date and time Date et heure Ipath Ipath MIME type Type MIME ResList Result list Liste de résultats Unavailable document Document inaccessible Previous Précédent Next Suivant <p><b>No results found</b><br> <p><b>Aucun résultat</b><br> &Preview &Voir contenu Copy &URL Copier l'&Url Find &similar documents Chercher des documents &similaires Query details Détail de la recherche (show query) (requête) Copy &File Name Copier le nom de &Fichier filtered filtré sorted trié Document history Historique des documents consultés Preview Prévisualisation Open Ouvrir <p><i>Alternate spellings (accents suppressed): </i> <p><i>Orthographes proposés (sans accents): </i> &Write to File &Sauver sous Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent &Open &Ouvrir Documents Documents out of at least parmi au moins for pour <p><i>Alternate spellings: </i> <p><i>Orthographes proposés: </i> Open &Snippets window Ouvrir la fenêtre des e&xtraits Duplicate documents Documents identiques These Urls ( | ipath) share the same content: Ces URLs(| ipath) partagent le même contenu Result count (est.) Nombre de résultats (est.) Snippets Extraits ResTable &Reset sort &Revenir au tri par pertinence &Delete column &Enlever la colonne Add " Ajouter " " column " colonne Save table to CSV file Sauvegarder dans un fichier CSV Can't open/create file: Impossible d'ouvrir ou créer le fichier: &Preview &Voir contenu &Open &Ouvrir Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Find &similar documents Chercher des documents &similaires Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent &Save as CSV &Sauvegarder en CSV Add "%1" column Ajouter une colonne "%1" ResTableDetailArea &Preview &Voir contenu &Open &Ouvrir Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Find &similar documents Chercher des documents &similaires Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent ResultPopup &Preview &Voir contenu &Open &Ouvrir Copy &File Name Copier le nom de &Fichier Copy &URL Copier l'&Url &Write to File &Sauver sous Save selection to files Sauvegarder la sélection courante dans des fichiers Preview P&arent document/folder Prévisualiser le document p&arent &Open Parent document/folder &Ouvrir le document parent Find &similar documents Chercher des documents &similaires Open &Snippets window Ouvrir la fenêtre des e&xtraits Show subdocuments / attachments Afficher les sous-documents et attachements Open With Ouvrir Avec Run Script Exécuter le Script SSearch Any term Certains termes All terms Tous les termes File name Nom de fichier Completions Complétions Select an item: Sélectionner un élément: Too many completions Trop de complétions possibles Query language Language d'interrogation Bad query string Requête non reconnue Out of memory Plus de mémoire disponible Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Entrer une expression du langage de recherche. Antisèche:<br> <i>term1 term2</i> : 'term1' ET 'term2' champ non spécifié.<br> <i>field:term1</i> : 'term1' recherche dans le champ 'field'.<br> Noms de champs standards (utiliser les mots anglais)/alias:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-champs: dir, mime/format, type/rclcat, date.<br> Examples d'intervalles de dates: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> NE PAS mettre les parenthèses.<br> <i>"term1 term2"</i> : phrase exacte. Options::<br> <i>"term1 term2"p</i> : proximité (pas d'ordre).<br> Utiliser le lien <b>Afficher la requête en détail</b> en cas de doute sur les résultats et consulter le manuel (en anglais) (&lt;F1>) pour plus de détails. Enter file name wildcard expression. Entrer un nom de fichier (caractères jokers possibles) Enter search terms here. Type ESC SPC for completions of current term. Entrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Entrer une expression du langage de recherche. Indications:<br> <i>term1 term2</i> : 'term1' et 'term2' dans un champ quelconque.<br> <i>field:term1</i> : 'term1' dans le champ 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: Les langages d'expansion pour la recherche sauvegardée: differ from current preferences (kept) diffèrent des préférences en cours (conservées) Auto suffixes for stored query: L'option de suffixe automatique pour la recherche sauvegardée: External indexes for stored query: Les index externes pour la recherche sauvegardée: Autophrase is set but it was unset for stored query L'option autophrase est positionnée, mais ne l'était pas pour la recherche sauvegardée Autophrase is unset but it was set for stored query L'option autophrase est désactivée mais était active pour la recherche sauvegardée SSearchBase SSearchBase SSearchBase Clear Effacer Ctrl+S Ctrl+S Erase search entry Effacer l'entrée Search Rechercher Start query Démarrer la recherche Enter search terms here. Type ESC SPC for completions of current term. Entrer les termes recherchés ici. Taper ESC SPC pour afficher les mots commençant par l'entrée en cours. Choose search type. Choisir le type de recherche. SearchClauseW SearchClauseW SearchClauseW Any of these Un de ces mots All of these Tous ces mots None of these Aucun de ces mots This phrase Cette phrase Terms in proximity Termes en proximité File name matching Modèle de nom de fichier Select the type of query that will be performed with the words Sélectionner le type de requête à effectuer avec les mots Number of additional words that may be interspersed with the chosen ones Nombre de mots additionnels qui peuvent se trouver entre les termes recherchés In field Sans champ No field Sans champ Any Certains All Tout None Rien Phrase Phrase Proximity Proximité File name Nom de fichier Snippets Snippets Extraits X X Find: Trouver: Next Suivant Prev Précédent SnippetsW Search Rechercher <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> <p>Désolé, aucun résultat trouvé dans les limites de recherche. Peut-être que le document est très gros et que le générateur d'extraits s'est perdu...<p> SortForm Date Date Mime type Type Mime SortFormBase Sort Criteria Critères de tri Sort the Trier les most relevant results by: résultats les plus pertinents en fonction de: Descending Décroissant Close Fermer Apply Appliquer SpecIdxW Special Indexing Indexation spéciale Do not retry previously failed files. Ne pas réessayer les fichiers en erreur. Else only modified or failed files will be processed. Sinon, seulement les fichiers modifiés ou en erreur seront traités. Erase selected files data before indexing. Effacer les données pour les fichiers sélectionnés avant de réindexer. Directory to recursively index Répertoire à indexer récursivement Browse Parcourir Start directory (else use regular topdirs): Répertoire de départ (sinon utiliser la variable normale topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Laisser vide pour sélectionner tous les fichiers. Vous pouvez utiliser plusieurs schémas séparés par des espaces.<br>Les schémas contenant des espaces doivent ere enclos dans des apostrophes doubles.<br>Ne peut être utilisé que si le répertoire de départ est positionné. Selection patterns: Schémas de sélection: Top indexed entity Objet indexé de démarrage Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Répertoire à indexer récursivement. Il doit être à l'intérieur de la zone normale<br>définie par la variable topdirs. SpellBase Term Explorer Explorateur d'index &Expand &Dérivés Alt+E Alt+D &Close &Fermer Alt+C Alt+F Term Terme No db info. Pas d'information sur la base. Doc. / Tot. Doc. / Tot. Match Faire correspondre Case Majuscules/Minuscules Accents Accents SpellW Wildcards Wildcards Regexp Expression régulière Spelling/Phonetic Orthographe/Phonétique Aspell init failed. Aspell not installed? Erreur d'initialisation aspell. Il n'est peut-être pas installé? Aspell expansion error. Erreur aspell. Stem expansion Expansion grammaticale error retrieving stemming languages Impossible de former la liste des langages d'expansion No expansion found Pas de résultats Term Terme Doc. / Tot. Doc. / Tot. Index: %1 documents, average length %2 terms Index: %1 documents, taille moyenne %2 termes Index: %1 documents, average length %2 terms.%3 results Index: %1 documents, longueur moyenne %2 termes. %3 résultats %1 results %1 résultats List was truncated alphabetically, some frequent La liste a été tronquée par ordre alphabétique. Certains termes fréquents terms may be missing. Try using a longer root. pourraient être absents. Essayer d'utiliser une racine plus longue Show index statistics Afficher les statistiques de l'index Number of documents Nombre de documents Average terms per document Nombre moyen de termes par document Smallest document length Longueur du plus petit document Longest document length Longueur du plus grand document Database directory size Taille occupee par l'index MIME types: Types MIME Item Element Value Valeur Smallest document length (terms) Taille minimale document (termes) Longest document length (terms) Taille maximale document (termes) Results from last indexing: Résultats de la dernière indexation: Documents created/updated Documents créés ou mis à jour Files tested Fichiers testés Unindexed files Fichiers non indexés List files which could not be indexed (slow) Lister les fichiers qui n'ont pas pu être traités (lent) Spell expansion error. Erreur dans les suggestions orthographiques. UIPrefsDialog The selected directory does not appear to be a Xapian index Le répertoire sélectionné ne semble pas être un index Xapian This is the main/local index! C'est l'index principal ! The selected directory is already in the index list Le répertoire sélectionné est déjà dans la liste Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Sélectionner un répertoire contenant un index Xapian (ex: /home/monAmi/.recoll/xapiandb) error retrieving stemming languages Impossible de former la liste des langues pour l'expansion grammaticale Choose Choisir Result list paragraph format (erase all to reset to default) Format de paragraphe de la liste de résultats (tout effacer pour revenir à la valeur par défaut) Result list header (default is empty) En-tête HTML (la valeur par défaut est vide) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Selection un repertoire de configuration Recoll ou un repertoire d'index Xapian (Ex: /home/moi/.recoll ou /home/moi/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Le repertoire selectionne ressemble a un repertoire de configuration Recoll mais la configuration n'a pas pu etre chargee At most one index should be selected Selectionner au plus un index Cant add index with different case/diacritics stripping option Impossible d'ajouter un index avec une option differente de sensibilite a la casse et aux accents Default QtWebkit font Fonte par défaut de QtWebkit Any term Certains termes All terms Tous les termes File name Nom de fichier Query language Language d'interrogation Value from previous program exit Valeur obtenue de la dernière exécution UIPrefsDialogBase User interface Interface utilisateur Number of entries in a result page Nombre de résultats par page Result list font Fonte pour la liste de résultats Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Ouvre une fenetre permettant de changer la fonte Reset Réinitialiser Resets the result list font to the system default Réinitialiser la fonte à la valeur par défaut Auto-start simple search on whitespace entry. Démarrer automatiquement une recherche simple sur entrée d'un espace. Start with advanced search dialog open. Panneau de recherche avancée ouvert au démarrage. Start with sort dialog open. Panneau de tri ouvert au démarrage. Search parameters Paramètres pour la recherche Stemming language Langue pour l'expansion des termes Dynamically build abstracts Construire dynamiquement les résumés Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Décide si des résumés seront construits à partir du contexte des termes de recherche. Peut ralentir l'affichage si les documents sont gros. Replace abstracts from documents Remplacer les résumés existant dans les documents Do we synthetize an abstract even if the document seemed to have one? Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un? Synthetic abstract size (characters) Taille du résumé synthétique (caractères) Synthetic abstract context words Nombre de mots de contexte par occurrence de terme dans le résumé External Indexes Index externes Add index Ajouter un index Select the xapiandb directory for the index you want to add, then click Add Index Sélectionner le répertoire xapian de l'index à ajouter, puis cliquer Ajouter Index Browse Parcourir &OK &OK Apply changes Appliquer les modifications &Cancel &Annuler Discard changes Suivant Result paragraph<br>format string Chaîne de formatage<br>des paragraphes résultats Automatically add phrase to simple searches Ajouter automatiquement une phrase aux recherches simples A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Une recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br> Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre. User preferences Préférences utilisateur Use desktop preferences to choose document editor. Utiliser les réglages du bureau pour choisir l'application de visualisation. External indexes Index externes Toggle selected Changer l'état pour les entrées sélectionnées Activate All Tout activer Deactivate All Tout désactiver Remove selected Effacer la sélection Remove from list. This has no effect on the disk index. Oter de la liste. Sans effet sur les données stockées. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definit le format des paragraphes de la liste de resultats. Utilise le format html qt et des directives de substitution de type printf:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Remember sort activation state. Mémoriser l'état d'activation du tri. Maximum text size highlighted for preview (megabytes) Taille maximum des textes surlignes avant previsualisation (MO) Texts over this size will not be highlighted in preview (too slow). Les texte plus gros ne seront pas surlignes dans la previsualisation (trop lent). Highlight color for query terms Couleur de mise en relief des termes recherchés Prefer Html to plain text for preview. Utiliser le format Html pour la previsualisation. If checked, results with the same content under different names will only be shown once. N'afficher qu'une entrée pour les résultats de contenu identique. Hide duplicate results. Cacher les doublons. Choose editor applications Choisir les éditeurs pour les différents types de fichiers Display category filter as toolbar instead of button panel (needs restart). Afficher le filtre de catégorie comme une barre d'outils plutot que comme un panneau de boutons (après le redémarrage). The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Les mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation. Query language magic file name suffixes. Suffixes automatiques pour le langage d'interrogation. Enable Activer ViewAction Changing actions with different current values Changement d'actions avec des valeurs actuelles differentes Mime type Type Mime Command Commande MIME type Type MIME Desktop Default Défaut du bureau Changing entries with different current values Nous changeons des éléments avec des valeurs actuelles différentes ViewActionBase File type Type de fichier Action Action Select one or several file types, then click Change Action to modify the program used to open them Sélectionner une ou plusieurs types de fichiers, puis cliquer Changer pour modifier le programme utilisé pour les ouvrir Change Action Changer Close Fermer Native Viewers Applications de visualisation Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Sélectionner un ou plusieurs types MIME puis cliquer "Modifier l'Action"<br>Vous pouvez aussi fermer ce dialogue et choisir "Utiliser les préférences du bureau"<br> dans le dialogue principal pour ignorer cette liste. Select one or several mime types then use the controls in the bottom frame to change how they are processed. Sélectionner un ou plusieurs types MIME, puis utiliser les contrôles dans le cadre du bas pour changer leur traitement Use Desktop preferences by default Utiliser les préférences du bureau Select one or several file types, then use the controls in the frame below to change how they are processed Sélectionner un ou plusieurs types de fichiers, puis utiliser les contrôles dans le cadre du bas pour changer leur traitement Exception to Desktop preferences Exception aux préférences du bureau Action (empty -> recoll default) Action (vide -> utiliser le defaut recoll) Apply to current selection Appliquer à la sélection courante Recoll action: Action current value valeur actuelle Select same S&eacute;lectionner par valeur <b>New Values:</b> <b>Nouveaux param&egrave;tres</b> Webcache Webcache editor Editeur Webcache Search regexp Recherche (regexp) WebcacheEdit Copy URL Copier l'URL Unknown indexer state. Can't edit webcache file. État indexeur inconnu. Impossible d'éditer le fichier webcache. Indexer is running. Can't edit webcache file. L'indexeur est actif. Impossible d'accéder au fichier webcache. Delete selection Détruire les entrées sélectionnées Webcache was modified, you will need to run the indexer after closing this window. Le fichier webcache a été modifié, il faudra redémarrer l'indexation après avoir fermé cette fenêtre. WebcacheModel MIME MIME Url Url confgui::ConfBeaglePanelW Steal Beagle indexing queue Voler la queue d'indexation de Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NE DOIT PAS être actif. Permet de traiter la queue de Beagle pour indexer l'historique des pages visitées de Firefox.<br> (Il faut aussi installer le plugin Beagle pour Firefox) Web cache directory name Nom du répertoire cache de pages WEB The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Le nom d'un répertoire où stocker les copies des pages WEB visitées.<br>Le chemin peut être relatif au répertoire de configuration. Max. size for the web cache (MB) Taille maximum pour le cache (MB) Entries will be recycled once the size is reached Les pages seront écrasées quand la taille spécifiée est atteinte Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Le nom d'un répertoire où stocker les copies des pages visitées.<br>Un chemin relatif se réfère au répertoire de configuration. Max. size for the web store (MB) Taille max. pour le cache Web (MB) Process the WEB history queue Traiter la file des pages WEB Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Permet d'indexer les pages Web visitées avec Firefox <br>(il vous faut également installer l'extension Recoll pour Firefox) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). Les entrées seront recyclées quand la taille sera atteinte.<br>Seule l'augmentation de la taille a un sens parce que réduire la valeur ne tronquera pas un fichier existant (mais gachera de l'espace à la fin). confgui::ConfIndexW Can't write configuration file Impossible d'ecrire le fichier de configuration confgui::ConfParamFNW Browse Parcourir Choose Choisir confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Sensibilité automatique aux accents <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>Activer automatiquement la sensibilité aux accents si le terme recherché contient des accents (saufs pour ceux de unac_except_trans). Sans cette option, il vous faut utiliser le langage de recherche et le drapeau <i>D</i> pour activer la sensibilité aux accents. Automatic character case sensitivity Sensibilité automatique aux majuscules <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>Activer automatiquement la sensibilité aux majuscules si le terme de recherche contient des majuscules (sauf en première lettre). Sans cette option, vous devez utiliser le langage de recherche et le drapeau <i>C</i> pour activer la sensibilité aux majuscules. Maximum term expansion count Taille maximum de l'expansion d'un terme <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>Nombre maximum de termes de recherche résultant d'un terme entré (par exemple expansion par caractères jokers). La valeur par défaut de 10000 est raisonnable et évitera les requêtes qui paraissent bloquées pendant que le moteur parcourt l'ensemble de la liste des termes. Maximum Xapian clauses count Compte maximum de clauses Xapian <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>Nombre maximum de clauses Xapian élémentaires générées pour une requête. Dans certains cas, le résultat de l'expansion des termes peut ere multiplicatif, et utiliserait trop de mémoire. La valeur par défaut de 100000 devrait être à la fois suffisante et compatible avec les configurations matérielles typiques. confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Taill maximale pour les fichiers à décomprimer (Ko) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Cette valeur définit un seuil au delà duquel les fichiers comprimés ne seront pas traités. Utiliser -1 pour désactiver la limitation, 0 pour ne traiter aucun fichier comprimé. Max. text file size (MB) Taille maximale d'un fichier texte (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Cette valeur est un seuil au delà duquel les fichiers de texte pur ne seront pas indexés. Spécifier -1 pour supprimer la limite. Utilisé pour éviter d'indexer des fichiers monstres. Text file page size (KB) Taille de page pour les fichiers de texte pur (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Si cette valeur est spécifiée et positive, les fichiers de texte pur seront découpés en tranches de cette taille pour l'indexation. Ceci diminue les ressources consommées par l'indexation et aide le chargement pour prévisualisation. Max. filter exec. time (S) Temps d'exécution maximum pour un filtre (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Un filtre externe sera interrompu si l'attente dépasse ce temps. Utile dans le cas rare (programme postscript par exemple) où un document pourrait forcer un filtre à boucler indéfiniment. Positionner à -1 pour supprimer la limite. External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Un filtre externe qui prend plus de temps sera arrêté. Traite le cas rare (possible avec postscript par exemple) où un document pourrait amener un filtre à boucler sans fin. Mettre -1 pour complètement supprimer la limite (déconseillé). Only mime types Seulement ces types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Une liste exclusive des types MIME à indexer.<br>Rien d'autre ne sera indexé. Normalement vide et inactif Exclude mime types Types exclus Mime types not to be indexed Types MIME à ne pas indexer confgui::ConfTopPanelW Top directories Répertoires de départ The list of directories where recursive indexing starts. Default: your home. La liste des répertoires où l'indexation récursive démarre. Défault: votre répertoire par défaut. Skipped paths Chemins ignorés These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Ce sont des noms de répertoires où l'indexation n'entrera pas.<br>Ils peuvent contenir des caractères jokers. Les chemins doivent correspondre à ceux vus par l'indexeur (par exemple: si un des répertoires de départ est '/home/me' et que '/home' est un lien sur '/usr/home', une entrée correcte ici serait '/home/me/tmp*' , pas '/usr/home/me/tmp*') Stemming languages Langue pour l'expansion des termes The languages for which stemming expansion<br>dictionaries will be built. Les langages pour lesquels les dictionnaires d'expansion<br>des termes seront construits. Log file name Nom du fichier journal The file where the messages will be written.<br>Use 'stderr' for terminal output Le nom du fichier ou les messages seront ecrits.<br>Utiliser 'stderr' pour le terminal Log verbosity level Niveau de verbosité This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Cette valeur ajuste la quantite de messages emis,<br>depuis uniquement les erreurs jusqu'a beaucoup de donnees de debug. Index flush megabytes interval Intervalle d'écriture de l'index en mégaoctets This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Ajuste la quantité de données lues entre les écritures sur disque.<br>Contrôle l'utilisation de la mémoire. Défaut 10 Mo Max disk occupation (%) Occupation disque maximum (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Niveau d'occupation du disque ou l'indexation s'arrete (pour eviter un remplissage excessif).<br>0 signifie pas de limite (defaut). No aspell usage Pas d'utilisation d'aspell Aspell language Langue pour aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Langue du dictionnaire aspell. Une valeur correcte ressemble à 'en' ou 'fr'... <br>Si cette valeur n'est pas positionnée, l'environnement est utilisé pour la calculer, ce qui marche bien, habituellement. Utiliser 'aspell config' et regarder les fichiers .dat dans le répertoire 'data-dir' pour connaitre les langues aspell installées sur votre système. Database directory name Répertoire de stockage de l'index The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Le nom d'un répertoire où l'index sera stocké<br>Un chemin relatif démarrera au répertoire de configuration. Le défaut est 'xapiandb'. Use system's 'file' command Utiliser la commande 'file' du systeme Use the system's 'file' command if internal<br>mime type identification fails. Utiliser la commande 'file' si la determination<br>interne du type mime n'obtient pas de resultat. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Désactiver l'utilisation d'aspell pour générer les approximations orthographiques.<br> Utile si aspell n'est pas installé ou ne fonctionne pas. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Langue pour le dictionnaire aspell. La valeur devrait ressembler à 'en' ou 'fr'... <br>Si cette valeur n'est pas positionnée, l'environnement national sera utilisé pour la calculer, ce qui marche bien habituellement. Pour avoir une liste des valeurs possibles sur votre système, entrer 'aspell config' sur une ligne de commande et regarder les fichiers '.dat' dans le répertoire 'data-dir'. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Le nom d'un répertoire pour stocker l'index<br>Un chemin relatif sera interprété par rapport au répertoire de configuration. La valeur par défaut est 'xapiandb'. Unac exceptions Exceptions Unac <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Ce sont les exceptions au mécanisme de suppression des accents, qui, par défaut et en fonction de la configuration de l'index, supprime tous les accents et effectue une décomposition canonique Unicode. Vous pouvez inhiber la suppression des accents pour certains caractères, en fonction de votre langue, et préciser d'autres décompositions, par exemple pour des ligatures. Dans la liste séparée par des espaces, le premier caractères d'un élément est la source, le reste est la traduction. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Ce sont les chemins des répertoires où l'indexation n'ira pas.<br>Les éléments peuvent contenir des caractères joker. Les entrés doivent correspondre aux chemins vus par l'indexeur (ex.: si topdirs comprend '/home/me' et que '/home' est en fait un lien vers '/usr/home', un élément correct pour skippedPaths serait '/home/me/tmp*', et non '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) Utilisation disque maximale (%, 0 signifie pas de limite) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. C'est le pourcentage d'utilisation disque - utilisation totale, et non taille de l'index - où l'indexation s'arretera en erreur.<br>La valeur par défaut de 0 désactive ce test. uiPrefsDialogBase User preferences Préférences utilisateur User interface Interface utilisateur Number of entries in a result page Nombre de résultats par page If checked, results with the same content under different names will only be shown once. N'afficher qu'une entrée pour les résultats de contenu identique. Hide duplicate results. Cacher les doublons. Highlight color for query terms Couleur de mise en relief des termes recherchés Result list font Fonte pour la liste de résultats Opens a dialog to select the result list font Ouvre une fenêtre permettant de changer la fonte Helvetica-10 Helvetica-10 Resets the result list font to the system default Réinitialiser la fonte à la valeur par défaut Reset Réinitialiser Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definit le format des paragraphes de la liste de resultats. Utilise le format html qt et des directives de substitution de type printf:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Result paragraph<br>format string Chaîne de formatage<br>des paragraphes résultats Texts over this size will not be highlighted in preview (too slow). Les textes plus gros ne seront pas surlignés dans la prévisualisation (trop lent). Maximum text size highlighted for preview (megabytes) Taille maximum des textes surlignés avant prévisualisation (MO) Use desktop preferences to choose document editor. Utiliser les réglages du bureau pour choisir l'application de visualisation. Choose editor applications Choisir les éditeurs pour les différents types de fichiers Display category filter as toolbar instead of button panel (needs restart). Afficher le filtre de catégorie comme une barre d'outils plutot que comme un panneau de boutons (après le redémarrage). Auto-start simple search on whitespace entry. Démarrer automatiquement une recherche simple sur entrée d'un espace. Start with advanced search dialog open. Panneau de recherche avancée ouvert au démarrage. Start with sort dialog open. Panneau de tri ouvert au démarrage. Remember sort activation state. Memoriser l'etat d'activation du tri. Prefer Html to plain text for preview. Utiliser le format Html pour la previsualisation. Search parameters Paramètres pour la recherche Stemming language Langue pour l'expansion des termes A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Une recherche pour [vin rouge] (2 mots) sera complétée comme [vin OU rouge OU (vin PHRASE 2 rouge)].<br> Ceci devrait donner une meilleure pertinence aux résultats où les termes recherchés apparaissent exactement et dans l'ordre. Automatically add phrase to simple searches Ajouter automatiquement une phrase aux recherches simples Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Décide si des résumés seront construits à partir du contexte des termes de recherche. Peut ralentir l'affichage si les documents sont gros. Dynamically build abstracts Construire dynamiquement les résumés Do we synthetize an abstract even if the document seemed to have one? Est-ce qu'un résumé doit etre synthétisé meme dans le cas ou le document original en avait un? Replace abstracts from documents Remplacer les résumés existant dans les documents Synthetic abstract size (characters) Taille du résumé synthétique (caractères) Synthetic abstract context words Nombre de mots de contexte par occurrence de terme dans le résumé The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Les mots de la liste seront automatiquement changés en clauses ext:xxx dans les requêtes en langage d'interrogation. Query language magic file name suffixes. Suffixes automatiques pour le langage d'interrogation. Enable Activer External Indexes Index externes Toggle selected Changer l'état pour les entrées sélectionnées Activate All Tout activer Deactivate All Tout désactiver Remove from list. This has no effect on the disk index. Oter de la liste. Sans effet sur les données stockées. Remove selected Effacer la sélection Click to add another index directory to the list Cliquer pour ajouter un autre index à la liste Add index Ajouter un index Apply changes Appliquer les modifications &OK &OK Discard changes Abandonner les modifications &Cancel &Annuler Abstract snippet separator Séparateur d'extrait Use <PRE> tags instead of <BR>to display plain text as html. Utilise des balises <PRE> au lieu de <BR> pour afficher du texte brut en html. Lines in PRE text are not folded. Using BR loses indentation. Les lignes de text brut <PRE> ne sont pas replies (scroll horizontal). L'utilisation de balises <BR> ne preserve pas l'indentation. Style sheet Feuille de style Opens a dialog to select the style sheet file Ouvre un dialogue pour choisir un fichier feuille de style Choose Choisir Resets the style sheet to default Restore la valeur par défaut pour la feuille de style Lines in PRE text are not folded. Using BR loses some indentation. Les lignes dans des sections PRE ne sont pas justifiées. Utiliser BR perd une partie de l'indentation. Use <PRE> tags instead of <BR>to display plain text as html in preview. Utiliser des tags <PRE> au lieu de <BR> pour afficher du texte non formaté en html dans la prévisualisation Result List Liste de résultats Edit result paragraph format string Editer le format du paragraphe de résultat Edit result page html header insert Editer le fragment à insérer dans l'en-tête HTML Date format (strftime(3)) Format de date (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Seuil de fréquence (pourcentage) au delà duquel les termes ne seront pas utilisés. Les phrases contenant des termes trop fréquents posent des problèmes de performance. Les termes ignorés augmentent la distance de phrase, et réduisent l'efficacité de la fonction de recherche de phrase automatique. La valeur par défaut est 2% Autophrase term frequency threshold percentage Seuil de fréquence de terme (pourcentage) pour la génération automatique de phrases Plain text to HTML line style Style de traduction texte ordinaire vers HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Les lignes dans une balise PRE ne sont pas repliées. Utiliser BR conduit à perdre une partie des tabulations. Le style PRE + WRAP peut être le meilleurs compromis mais son bon fonctionnement dépend des versions Qt. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + repliement Exceptions Exceptions Mime types that should not be passed to xdg-open even when "Use desktop preferences" is set.<br> Useful to pass page number and search string options to, e.g. evince. Types MIME qui ne doivent pas être passés à xdg-open même quand "Utiliser les préférences du bureau" est coché. <br> Utile pour pouvoir passer les paramètres de numéro de page et de terme de recherche à evince, par exemple. Disable Qt autocompletion in search entry. Desactiver l'autocompletion Qt dans l'entree de recherche Search as you type. Lancer la recherche a chaque caractere entre Paths translations Traductions de chemins Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Cliquer pour ajouter un autre index a la liste. Vous pouvez sélectionner soit un répertoire de configuration Recoll soit un index Xapian Snippets window CSS file Feuille de style CSS pour le popup de fragments Opens a dialog to select the Snippets window CSS style sheet file Ouvre un dialogue permettant de sélectionner la feuille de style CSS pour le popup des fragments Resets the Snippets window style Réinitialise le style de la fenêtre des fragments Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Décide si les filtres de documents sont affichés comme des radio-boutons, un combobox dans la barre d'outils, ou un menu. Document filter choice style: Style de choix des filtres de documents: Buttons Panel Panneau de boutons Toolbar Combobox Combobox dans le panneau d'outils Menu Menu Show system tray icon. Afficher l'icone dans la barre d'état système. Close to tray instead of exiting. Réduire dans la barre d'état au lieu de quitter. Start with simple search mode Démarrer en mode recherche simple Show warning when opening temporary file. Afficher un avertissement quand on édite une copie temporaire. User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Style utilisateur à appliquer à la fenêtre "snippets".<br>Note: l'en tête de page de résultat est aussi inclus dans la fenêtre "snippets". Synonyms file Fichier de synonymes Highlight CSS style for query terms Style CSS de mise en avant pour les termes de la recherche recoll-1.23.7/qtgui/i18n/recoll_da.qm0000644000175000017500000032451713224431020014203 00000000000000<¸dÊÍ!¿`¡½ÝBø+2¥-2Ò¯»+;fMG¤7¸H,”«H,úHYúFIAÌ©Zlß”\Œ*mbä±YÏ­^f|˜• Ÿ¦ykÚ¨¥Ü&¶E¤ÂÐD ÜÙ]  ½ ×*_À1øs:ÎdÆAVŽf®G…Ô‡ZGßËtH6ó EH6õ rJ+‚i\J+‚÷ÂJ6• J6•!>L™b¥ŠMzýAPh¨ÝèSŠ˜ åS¸¹ÊT°5ÞŠWTl®WÈÕ°XÉĈ-Z0ƒƒ[ %ße\ƒµ7e®iÀgwîêÃj^¨® sºñ/sºñüv8“²4v®Âv®ÂÄzϳ€€£s„j®Œ!þå—¤´g0œW¹Íܤf© ªJ Š®½Þ*v¯fS„¶Êð_º° @ÃÞåëÄ≳þÐùƒÂëÐùƒ—ÐùƒãÓnU”ÒãnK´ýgtÁA:•„ÕçEµ¿Onô׺–€»¾Â.ïÒ3Î_ô×B(ß ¨+1Ž{(0,…We;¸s¢>.cvÄDo2¨÷N·{XM¹£X®©4²`Þ^àhˆ¸7<lÿtú¶nÚnpwOãÎwñ…ÞOwñ…µ€üÞÇfH™‘vãjï•ñ“v$¢‰IÏ£cêE§á´h°ü(uÎxCn¾ÞñƒxÑëͺC¿ó L”qþSIö5ÿµTÿØ… i çw Kšv=p#Ìvåãvå¥Ý9w 5Ýpw 5öw 5ú}w 5®wîݧŒUT-Ÿ.’ø£¹Þ/™¦;UÎÀ©Ö³aª6•°¯†”’$»f3É…ÇWÞÞͼu€¸Ðgž¼ÐgžÄCÓHÞŒÔÂõj'׸~;‰ì;U™îï¡©69úUktúeî1 ¬“³!D‰Ñ&Áv¼.‡Ny©/Ä™=údŠP?údãÒG$ߨJUY¤vJUYáÌY ôV[–umH_n Ñ|„Ä º™ëuy –Ê·™Y¢ÔßÊ—¥^Ê—¥ÃéÎÅå‚úÔä^|iÙc¢ÝôLpèæõÎ6ìxVÌùJgwäû=cÏ$þA¢ÙÿþŠ¥@ÿ%´]ÿAîOÄB cÏ Vùç<.çÞ÷sõØ2ëdØÃ1M§Ÿ;[¾ <ÄöåªLƒ!ÿNB™ JXË4«Êe 2¬ËlðPºÞvhÕ1VwT7€ã‡—Í…(P˜ðŒ¯bÛî’"3’ZÓ.˜I¼7é˜I¼i*™n•”™n•<šß¤ª¥Ÿf•Ÿf•2mŸf•m—«Êž«÷í¬,¥8!¯ƒW6ƒ¯ƒWe§µÝþ…¾óÐÄy%3­Äy%x{Å ¹˜RÅ ätMÍl£Jß΄չÐ: Ú#xµãX|F=åõW2–Ì” iäiýÇ -ZW-¼ÚI"5òµ,)ÖT‰>j(B9€TéBìSükk¶ÞÒoˆ•ür?)ß½rž”$|ôòƒÿpè%„kåG‹¦,ÓÞ‹ÜðýŒÇ<É¿ŽÔ°öÔ"ŒÂ›ˆ˜ùž›ˆ˜Ÿ,tƒI¦ASàªÃ¢¶ý·¨ çç·¨ »œR _Ç¢•€Z×I^ÍRØ~CÞž”eèêÈ¥Eéã>dDðŒµŽXp# ]`³ÓMð:E$šª" ùÊ-Ö…›¸UKôŠ›i®¬ p hj¨sÞœu9Phv2ãlvƒ•­{^Ì'9–T#mé—BiƒšK^'ŸUÔ²‘¦ %E¦©nÇõ¦öõR¨«‡Á ¶7äO€fãÃ’P§ÝÄÅ^2ÿÄÖ[¬üÊXÔôënD‘—ðw)ü4þd#Ck㳩T!vôœ#+䎷+õ^¾‹7I^Ç$<ˆ~3Cj¯LFW#û$F¯NteH:"~•_guMêapä@îf 8QpiTJR|§N`DŒÍwŒÏ—â¡nà “’žkB™Åó ›.0›Ýˆ®ãŸž£;¦š´Äƒ²ð €£¾l¯²Þ¿|ÙWÁæn)@ÓtþÓtĵÆ>ÃÑEÈà’ºɆt’ìâ]87ãÀþåÅ ZSéŽ#Õõñ.º§3f Eno%<Ùè»*snoØ,öy*¸:uGñî‹ J¢RiJýn9QçÇuYŒÎ©þ}}t§€;E樔ò“C¨0Î_©ÔÕˆf¬¨”%°c!l¶¬h“AÄùaÈ@à ¹ʶÕÛÊÁÈíÌí³hͳââ×°—vÝÜe^äœc 6ä´¥’uæí:Ÿjî?À¥ïö¨åX#ú Ô õT ¤ ÈJ•î ÉN‹» ´HÅç -(7 7ÀþI 9Zyù ;´3©¤ D©?Ž K¨óÐß ]#—­­ c‡Cƒæ k¨µn, lMˆeØ …ÿä·ú ‰Œî‘¤ ŸÁò‚È £qD ø «ƒÔÛ² ­îM¬ ®œ¯sn °Ž`» ²9H· ÛCC` ü>…î ãÉéŽ ä3¤î äîo" èe£Ì íåõlŒ ûiéB ¢µAú *NlV ͹Ԃ :^ã Üc 3 *R5 +<”Y< 6 Ÿ5 >V…%x G.~My `P«p `ç£ a·EÌÒ c·EÍ d81 yk% ˜Iœf ¤žFz ¤s¾qó ¥õq ®VTAv ²ëCÇ Äãâ âæçÌR æõç˧ ®ÊÐ ®ùË! Ô… È è^„m ye3v THš ŽÚh< ,xƒe´ =!S Kj×ß X°ƒR› X°ƒÓu h¹°h~ ’þƒ ™÷½à éIF £Ü m© ¨Î£Í‘ ¬r‚, »ïµ› Ù·åÒ} Û·åÒ ÛÓmË ?¾~0 –È‚• Vd« 4ò¤/ ïú"\ Yø 'ИÊ2 +bCƒƒ .Ê¢Û /¥¬d 97Ã7 9ɰà L*å^ PÖ™“á RVŽ¿Ó T#yd VüX} \iC‡§ ]æù.„ `F¥ C hôîå v—¥³Ë {l…D €!Y³d €!Yãk ‚WåÖ¤ †|ð€Þ Š–q ŒïõÖ] Ò¬mB  }À¡¦ ¬æà‘^ ¶…&] ¹iÉ@D Óͼš Ú÷Ã Ýøìj^ é—~|Ü òéˆµÈ õ­N Ï ö†ÀÜ m£Þ #ùDW 'RçNN -èôÞ· 7Qþ¢f 8þg- FÁ§] OE°M XÅ^¬ ]„Ä8Ú ]„Ä"­ ^®Ù« ^®V uò0Õ· y·ñ y¹~, ‚±3È …È©py ‡uö† ‡uç ‰P“­ ‰PÂf 5d‚9 ¤š„®‰ ¬Š©2Õ ½ý7aä Çiú ÇòÞn? ÊÕ’6´ ÕH Š ÛQ5/ û£u q©Æž€|Ѿ, {þ'v%Ýn…_.Ê¢&í/¸.í3U&©6ˆ—Å8bó¯9µÔ<Þ:×Qá~†S«•ŽöW"ù~/Y~sÉ+[žsÙT\Н3ße3Ðeg3Тhx5Ýpû~b1Õ b ™³ro!iÈ­c»m€æ=¿­c ~Â|“yÂ|“‹jÉB®q8ÎÁ'·/ó lŦü©ÜÎü¶Li–6Alle sætninger All clauses AdvSearch"Vilkårlig sætning Any clause AdvSearch^Forkert multiplikator suffiks i størrelsefilter$Bad multiplier suffix in size filter AdvSearch mediermedia AdvSearch beskedmessage AdvSearch andetother AdvSearchpræsentation presentation AdvSearchregneark spreadsheet AdvSearchregneark spreadsheets AdvSearch teksttext AdvSearchtekstertexts AdvSearch<----- Alle <----- All AdvSearchBase<----- Valg <----- Sel AdvSearchBaseTilføj sætning Add clause AdvSearchBase"Avanceret søgningAdvanced search AdvSearchBaseAlle ----> All ----> AdvSearchBase6Alle felter med indhold til højre vil blive kombineret med AND ("Alle sætninger" valgt) eller OR ("Vilkårlig sætning" valgt) bindeord. <br>"Enhver" "Alle" og "Ingen" felttyper kan acceptere en blanding af simple ord, og fraser i dobbelte anførselstegn.<br>Felter uden data ignoreres.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseGennemseBrowse AdvSearchBase Efter kategorier By categories AdvSearchBasedAfkryds dette for at aktivere filtrering på datoer'Check this to enable filtering on dates AdvSearchBasehAfkryds dette for at aktivere filtrering på filtyper,Check this to enable filtering on file types AdvSearchBaselAfkryds dette for at aktivere filtrering på størrelser'Check this to enable filtering on sizes AdvSearchBase†Afkryds dette for at bruge filkategorier i stedet for rå mime-typer;Check this to use file categories instead of raw mime types AdvSearchBaseLukClose AdvSearchBaseSlet sætning Delete clause AdvSearchBaseBIndtast øverste mappe for søgningEnter top directory for search AdvSearchBase FilterFilter AdvSearchBaseFiltrer datoer Filter dates AdvSearchBase$Filtrer størrelser Filter sizes AdvSearchBaseFindFind AdvSearchBaseFraFrom AdvSearchBase&Ignorerede filtyperIgnored file types AdvSearchBaseInverterInvert AdvSearchBaseMaks. størrelse Max. Size AdvSearchBase€Maksimal størrelse. Du kan bruge k/K,m/M g/G som multiplikatorer4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseMin. størrelse Min. Size AdvSearchBase~Mindste størrelse. Du kan bruge k/K,m/M,g/G som multiplikatorer4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase Begræns filtyperRestrict file types AdvSearchBaseVBegræns resultater til filer i undermapper:%Restrict results to files in subtree: AdvSearchBase Gem som standardSave as default AdvSearchBaseRSøg efter <br>dokumenter<br>der opfylder:'Search for
documents
satisfying: AdvSearchBaseSøgte filtyperSearched file types AdvSearchBaseValg -----> Sel -----> AdvSearchBaseStart søgning Start Search AdvSearchBaseTilTo AdvSearchBase®<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indekseringstidsplan (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hvert felt kan indeholde et jokertegn (*), en enkelt numerisk værdi, kommaseparerede lister (1,3,5) og intervaller (1-7). Mere generelt vil felterne blive brugt <span style=" font-style:italic;"> som de er</span> inde i crontabfilen, og den fulde crontab syntaks kan bruges, se crontab (5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For eksempel, indtastning af <span style=" font-family:'Courier New,courier';">*</span> i <span style=" font-style:italic;">Dage, </span><span style=" font-family:'Courier New,courier';">12,19</span> i <span style=" font-style:italic;">Timer</span> og <span style=" font-family:'Courier New,courier';">15</span> i <span style=" font-style:italic;">Minutter</span> ville starte recollindex hver dag kl. 00:15 og 19:15 </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En tidsplan med meget hyppige aktiveringer er formentlig mindre effektiv end realtid indeksering.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

 CronToolWh<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Deaktiver</span> for at stoppe automatisk batch indeksering, <span style=" font-style:italic;">Aktiver</span> for at aktivere den, <span style=" font-style:italic;">Annuller</span> for ikke at ændre noget.</p></body></html>š

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

 CronToolWCron vindue Cron Dialog CronToolWZUgens dage (* eller 0-7, 0 eller 7 er Søndag))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDeaktiverDisable CronToolWAktiverEnable CronToolW‚Fejl ved installation af cron-indgange. Forkert syntaks i felter?3Error installing cron entry. Bad syntax in fields ? CronToolW(Timer (* eller 0-23)Hours (* or 0-23) CronToolWÂDet ser ud til, at manuelt redigerede indgange findes for recollindeks, kan ikke redigere crontabPIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinutter (0-59)Minutes (0-59) CronToolW VindueDialog EditDialog$Konfigureringsfejl Config error EditTransLokal sti Local path EditTransOriginal sti Original path EditTransKildesti Source path EditTrans TilføjAdd EditTransBaseAnnullerCancel EditTransBaseSletDelete EditTransBase*Oversættelse af stierPath Translations EditTransBaseGemSave EditTransBaseÞVælg en eller flere filtyper, brug derefter knapperne i rammen nedenfor for at ændre, hvordan de skal behandleskSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBaseRIndstilling af oversættelser af stier forSetting path translations for  EditTransBase <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Det fremgår, at indekset for denne konfiguration ikke eksisterer.</span><br /><br />Hvis du blot ønsker at indeksere din hjemmemappe med et sæt fornuftige standardindstillinger, skal du trykke på <span style=" font-style:italic;">Start indeksering nu</span> knappen. Du vil være i stand til at justere detaljerne senere. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hvis du ønsker mere kontrol, kan du bruge følgende link til at justere indekseringskonfiguration og tidsplan.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Disse værktøjer kan tilgås senere fra <span style=" font-style:italic;">Præference</span> menuen.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

FirstIdxDialog>Opsætning af første indekseringFirst indexing setupFirstIdxDialog8Konfiguration af indekseringIndexing configurationFirstIdxDialog0Tidsplan for indekseringIndexing scheduleFirstIdxDialog(Start indeksering nuStart indexing nowFirstIdxDialog Dette vil lade dig justere de mapper, du vil indeksere, og andre parametre som udelukkede filstier eller navne, standard tegnsæt etc.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogDette vil lade dig vælge mellem batch og realtime indeksering, og oprette en automatisk tidsplan for batch indeksering (ved hjælp af cron).€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog%1 ikke fundet. %1 not found.FragButs%1: %2%1: %2FragButs:Forespørgsel efter fragmenterQuery FragmentsFragButs <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksering kan køre permanent, indeksere filer når de ændrer sig, eller køre med adskilte intervaller. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Læsning af manualen kan hjælpe dig med at vælge mellem disse tilgange (tryk F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dette værktøj kan hjælpe dig med at oprette en tidsplan for at automatisere kørsler af batch indeksering, eller starte realtid indeksering når du logger ind (eller begge dele, hvilket sjældent giver mening). </p></body></html>¿

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

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

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

 IdxSchedW Cron skeduleringCron scheduling IdxSchedW´Beslut, om realtid indeksering skal startes når du logger ind (kun for standard-indekset).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedW>Opsætning af indeks skeduleringIndex scheduling setup IdxSchedW<Opstart af realtid indekseringReal time indexing start up IdxSchedWæVærktøjet vil lade dig afgøre, på hvilket tidspunkt indeksering skal køre og det vil installere en crontab indgang._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW VindueDialog ListDialogGruppeboksGroupBox ListDialogìFilen med "historik" er beskadiget eller den kan ikke læses eller skrives til, undersøg det venligst, eller fjern den:K"history" file is damaged or un(read)writeable, please check or remove it: Main>Ingen dbmappe i konfigurationen No db directory in configurationMain &Næste&NextPreview&Forrige &PreviousPreview&Søger efter: &Search for:Preview`Kan ikke lave dok til intern repræsentation for 0Can't turn doc into internal representation for PreviewAnnullerCancelPreviewRydClearPreviewLuk faneblad Close TabPreview6Laver forhåndsvisningstekstCreating preview textPreview8Fejl ved indlæsning af filenError while loading filePreviewVHenter forhåndsvisningstekst for redigering Loading preview text into editorPreview(Store/små &Bogstaver Match &CasePreview2Manglende hjælpeprogram: Missing helper program: Preview KopierCopyPreviewTextEditOmbryd linjer Fold linesPreviewTextEdit Bevar indrykningPreserve indentationPreviewTextEditUdskrivPrintPreviewTextEdit*Udskriv denne VisningPrint Current PreviewPreviewTextEdit(Gem dokument til filSave document to filePreviewTextEditVælg alle Select AllPreviewTextEditVis felter Show fieldsPreviewTextEditVis billede Show imagePreviewTextEditVis hovedtekstShow main textPreviewTextEdit2<b>Tilpassede undermapperCustomised subtreesQObjectÒ<i>De parametre, der følger er angivet enten på øverste niveau, hvis intet<br>eller en tom linje er valgt i listefeltet ovenfor, eller for den valgte undermappe. <br> Du kan tilføje eller fjerne mapper ved at klikke på +/- knapperne.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObjectxTegnsæt, der bruges til at læse filer, hvor tegnsættet ikke kan identificeres ud fra indholdet, f.eks. rene tekstfiler.<br>Standardværdien er tom, og værdien fra NLS-omgivelserne anvendes.ÆCharacter set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.QObject&Standard<br>tegnsætDefault
character setQObject(Følg symbolske linksFollow symbolic linksQObject´Følg symbolske link under indeksering. Standarden er nej, for at undgå dobbelt indekseringTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Globale parametreGlobal parametersQObject&ignorerede endelserIgnored endingsQObject,Indekser alle filnavneIndex all file namesQObjectIndekser navnene på filer, hvor indholdet ikke kan identificeres eller behandles (ingen eller ikke-understøttet mime-type). Standard er true}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Lokale parametreLocal parametersQObjectSøgeparametreSearch parametersQObjectUdeladte navne Skipped namesQObjectðListen over undermapper i det indekserede hierarki <br>hvor nogle parametre behøver at blive omdefineret. Standard: tom.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObjectbDette er endelser på filnavne for filer, hvor kun navnet vil blive indekseret (ingen forsøg på identifikation af MIME-type, ingen dekomprimering, ingen indeksering af indhold).—These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing).QObjectŠDette er mønstre for fil- eller mappenavne, der ikke skal indekseres.LThese are patterns for file or directory names which should not be indexed.QObjectWebhistorik Web historyQObject&Åbn&OpenQWidget6&Åbn Forælderdokument/mappe&Open Parent document/folderQWidget &Forhåndsvisning&PreviewQWidget&Skriv til fil&Write to FileQWidget8Kan ikke udtrække dokument: Cannot extract document: QWidget(Vælg præcis en mappeChoose exactly one directoryQWidgetKopier &FilnavnCopy &File NameQWidgetKopier &URL Copy &URLQWidget.Kunne ikke læse mappe: Could not read directory: QWidgetJOpret eller vælg mappe til at gemme iCreate or choose save directoryQWidget2Find &lignende dokumenterFind &similar documentsQWidget8Åbn vindue til &tekststumperOpen &Snippets windowQWidgetÅbn med Open WithQWidgetFForhåndsvis &Forælderdokument/mappePreview P&arent document/folderQWidgetKør skript Run ScriptQWidget0Gem det valgte til filerSave selection to filesQWidgetLVis underdokumenter / vedhæftede filerShow subdocuments / attachmentsQWidgetRUventet kollision af filnavn, annullerer.+Unexpected file name collision, cancelling.QWidgetVis ikke igen.Do not show again.QxtConfirmationMessager<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indeksering kan sættes til at køre som en dæmon, der opdatere indekset når filer ændres, i realtid. Du får et indeks, som altid er opdateret, men systemressourcer anvendes permanent..</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>.

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

RTIToolWJStart også indekseringsdæmon lige nu.%Also start indexing daemon right now.RTIToolWhAutostartfil er slettet. Stop også nuværende proces?2Autostart file deleted. Kill current process too ?RTIToolW$Kan ikke oprette: Can't create: RTIToolW6Kunne ikke køre recollindexCould not execute recollindexRTIToolWSletter fil Deleting fileRTIToolWSletter:  Deleting: RTIToolWNAutomatisk start af realtid indeksering"Real time indexing automatic startRTIToolW"Fjerner autostartRemoving autostartRTIToolWErstatter filReplacing fileRTIToolWErstatter:  Replacing: RTIToolWjStart indekseringsdæmonen med min skrivebordssession..Start indexing daemon with my desktop session.RTIToolWAdvarselWarningRTIToolW(alle sprog)(all languages)RclMain$(Ingen ordstammer) (no stemming)RclMainOm Recoll About RecollRclMainAlleAllRclMain€Forkert desktop app spec for %1: [%2] Tjek venligst desktopfilen?Bad desktop app spec for %1: [%2] Please check the desktop fileRclMainUgyldige stier Bad pathsRclMainFUgyldige stier i konfigurationsfil:!Bad paths in configuration file: RclMain¦Forkert kommandolinje for fremviser for %1: [%2] Kontroller venligst mimeview-filenCBad viewer command line for %1: [%2] Please check the mimeview fileRclMain(Kan ikke tilgå fil: Can't access file: RclMainNKan ikke oprette forhåndsvisningsvindueCan't create preview windowRclMain\Kan ikke aktivere synonymer-fil (analysefejl?)&Can't set synonyms file (parse error?)RclMain6Kan ikke dekomprimere fil: Can't uncompress file: RclMainVKan ikke opdatere indeks: indeksering kører#Can't update index: indexer runningRclMainpKan ikke udtrække dokument eller oprette midlertidig fil0Cannot extract document or create temporary fileRclMain>Kan ikke finde forælderdokumentCannot find parent documentRclMainRKan ikke hente dokumentinfo fra databasen+Cannot retrieve document info from databaseRclMain2Vælg fil, der skal gemmesChoose file to saveRclMainKlik på Annuller for at vende tilbage til listen. <br>Klik på Ignorer for at vise forhåndsvisningen alligevel. (og husk for denne session).pClick Cancel to return to the list.
Click Ignore to show the preview anyway (and remember for this session).RclMainôKlik OK for at opdatere indekset for denne fil, du bliver så nødt til at gentage forespørgslen når indeksering er færdig. jClick Ok to update the index for this file, then you will need to re-run the query when indexing is done. RclMainAfslutterClosingRclMainhIndholdet er blevet indekseret for disse mime-typer:.Content has been indexed for these mime types:RclMainJKunne ikke indlæse gemte forespørgselCould not load saved queryRclMain¦Kunne ikke åbne ekstern indeks. DB er ikke åben. Tjek liste over eksterne indekser.HCould not open external index. Db not open. Check external indexes list.RclMain*Kunne ikke åbne fil: Could not open file: RclMain2Kunne ikke skrive til filCould not write to fileRclMain~Deaktiveret fordi realtid indeksering ikke blev kompileret ind.;Disabled because the real time indexer was not compiled in.RclMain”Vis ikke denne advarsel næste gang (brug GUI præferencer for at gendanne).DDo not show this warning next time (use GUI preferences to restore).RclMainDokumentfilterDocument filterRclMain DokumenthistorikDocument historyRclMain FærdigDoneRclMain(Identiske dokumenterDuplicate documentsRclMainSletter indeks Erasing indexRclMainFejlErrorRclMainUdfører: [ Executing: [RclMainâEksterne programmer/kommandoer nødvendige for dine filtyper blev ikke fundet, som gemt af den sidste indeksering pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMainHistorik-data History dataRclMainIndeks låst Index lockedRclMain°Indeks er ikke opdateret for denne fil. Nægter at risikere at vise den forkerte indgang.NIndex not up to date for this file. Refusing to risk showing the wrong entry. RclMain0Indeks forespørgselsfejlIndex query errorRclMain$Indeks skeduleringIndex schedulingRclMain,Indekserede MIME-typerIndexed MIME TypesRclMain\Indeksering kører. Kan ikke tilgå webcachefil./Indexer is running. Can't access webcache file.RclMain>Indeksering har ikke kørt endnuIndexing did not run yetRclMain.Indeksering mislykkedesIndexing failedRclMain(Indeksering i gang: Indexing in progress: RclMain&indeksering afbrudtIndexing interruptedRclMainIndlæsningsfejl Load errorRclMain4Manglende hjælpeprogrammerMissing helper programsRclMainMonitorMonitorRclMainhIngen ekstern fremviser konfigureret for mime-type [-No external viewer configured for mime type [RclMain,Ingen hjælpere manglerNo helpers found missingRclMainDIngen tidligere søgning er bevaretNo preserved previous searchRclMain.Ingen resultater fundetNo results foundRclMainIngen søgning No searchRclMain IngenNoneRclMainÈÅbner en midlertidig kopi. Ændringer vil gå tabt, hvis du ikke gemmer<br/>dem til et permanent sted.`Opening a temporary copy. Edits will be lost if you don't save
them to a permanent location.RclMainRydder opPurgeRclMainðForespørgsel er i gang<br>På grund af begrænsninger i indekseringsbiblioteket,<br>vil en annullering afslutte programmeteQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMain4Resultater af forespørgsel Query resultsRclMain&Læsning mislykkedes Read failedRclMainBNulstil indekset og start forfra?(Reset the index and start from scratch ?RclMain8Optælling af resultat (est.)Result count (est.)RclMainGem fil Save fileRclMain8Gemte forespørgsler (*.rclq)Saved Queries (*.rclq)RclMainnMønstre for udvælgelse kan kun bruges med en startmappe:Selection patterns can only be used with a start directoryRclMainbMønstre for udvælgelse skal have en øverste mappeSelection patterns need topdirRclMainÀBeklager, er endnu ikke tilgængelig for Windows, bruge Fil menuindgange for at opdatere indeksetYSorry, not available under Windows for now, use the File menu entries to update the indexRclMainstammedbStemdbRclMain"Stop &IndekseringStop &IndexingRclMainFUnderdokumenter og vedhæftede filerSub-documents and attachmentsRclMainºDen nuværende indekseringsproces blev ikke startet fra denne grænseflade, kan ikke stoppe denOThe current indexing process was not started from this interface, can't kill itRclMain*Den nuværende indekseringsproces blev ikke startet fra denne grænseflade. Klik på OK for at stoppe den alligevel, eller Annuller for at lade den køreyThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain„Dokumentet tilhører et eksternt indeks, som jeg ikke kan opdatere.@The document belongs to an external index which I can't update. RclMain€Indeksering kører, så ting burde være bedre, når den er færdig. @The indexer is running so things should improve when it's done. RclMainÂFremviseren angivet i mimeview for %1: %2 er ikke fundet. Ønsker du at åbne indstillingsvinduet?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainbDisse webadresser ( | ipath) deler samme indhold:-These Urls ( | ipath) share the same content:RclMainrDette konfigurationsværktøj virker kun for hovedindekset.6This configuration tool only works for the main index.RclMainFDenne søgning er ikke længere aktiv"This search is not active any moreRclMain UkendtUnknownRclMaintIndeksering i ukendt tilstand. Kan ikke tilgå webcachefil.2Unknown indexer state. Can't access webcache file.RclMainOpdater &Indeks Update &IndexRclMainOpdatererUpdatingRclMain¸Fremviser kommandolinje for %1 angiver både fil og forælderfil værdier: er ikke understøttetQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainAdvarselWarningRclMain*Skrivning mislykkedes Write failedRclMain\fejl under hentning af ordstammer for sprogene#error retrieving stemming languagesRclMainfiltreretfilteredRclMain mediermediaRclMain beskedmessageRclMain andetotherRclMainpræsentation presentationRclMainsorteretsortedRclMainregneark spreadsheetRclMain teksttextRclMainR Forsøg igen med filer der mislykkedes With failed files retrying RclMainBase&Om Recoll &About Recoll RclMainBase$&Avanceret søgning&Advanced Search RclMainBase,&Slet dokumenthistorik&Erase document history RclMainBase$&Slet søgehistorik&Erase search history RclMainBase&Fil&File RclMainBase&Fuld skærm &Full Screen RclMainBase,&Konfiguration for GUI&GUI configuration RclMainBase &Hjælp&Help RclMainBase2&Konfiguration for Indeks&Index configuration RclMainBase&Præferencer &Preferences RclMainBase &Genopbyg indeks&Rebuild index RclMainBase&Resultater&Results RclMainBase*&Sorterings-parametre&Sort parameters RclMainBase&Værktøjer&Tools RclMainBase&Brugermanual &User manual RclMainBase&Vis&View RclMainBase4Avanceret/kompleks søgningAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase DokumenthistorikDocument History RclMainBase"Dokument&historikDocument &History RclMainBaseA&fslutE&xit RclMainBase$E&ksterne indekserE&xternal index dialog RclMainBase"Aktiver synonymerEnable synonyms RclMainBase"Eksterne indekserExternal index dialog RclMainBaseF11F11 RclMainBaseFørste side First Page RclMainBaseFørste side First page RclMainBaseFuld skærm Full Screen RclMainBaseBGå til første side med resultaterGo to first page of results RclMainBase Indeks&statistikIndex &statistics RclMainBase.Indekserede &MIME-typerIndexed &MIME types RclMainBase2Tid&splan for IndekseringIndexing &schedule RclMainBaseLIndeksering med særlige indstillinger Indexing with special options RclMainBase2Indlæs gemte forespørgselLoad saved query RclMainBase&Manglende &hjælpereMissing &helpers RclMainBaseNæste side Next Page RclMainBaseNæste side Next page RclMainBase2Næste side med resultaterNext page of results RclMainBaseŒNæste opdatering vil igen forsøge med filer, der tidligere mislykkedes.Next update will retry previously failed files RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBaseForrige side Previous Page RclMainBaseForrige side Previous page RclMainBase6Forrige side med resultaterPrevious page of results RclMainBase:Forespørgsel efter fragmenterQuery Fragments RclMainBase RecollRecoll RclMainBase4Gem som CSV (regneark) filSave as CSV (spreadsheet) file RclMainBase.Gem sidste forespørgselSave last query RclMainBasexGemmer resultatet i en fil, som du kan indlæse i et regneark@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift+PgUp Shift+PgUp RclMainBase6Vis Detaljer i forespørgselShow Query Details RclMainBaseVis som tabel Show as table RclMainBaseVVis resultater i en regneark-lignende tabel(Show results in a spreadsheet-like table RclMainBase>Sorter efter dato, nyeste førstSort by date, newest first RclMainBase>Sorter efter dato, ældste førstSort by date, oldest first RclMainBaseNSorter efter dato fra nyeste til ældste#Sort by dates from newest to oldest RclMainBaseNSorter efter dato fra ældste til nyeste#Sort by dates from oldest to newest RclMainBase(Sorterings-parametreSort parameters RclMainBase$Særlig indekseringSpecial Indexing RclMainBase&Søg efter ordTerm &explorer RclMainBase:Værktøj for søgning efter ordTerm explorer tool RclMainBaseOpdater &Indeks Update &index RclMainBase Rediger webcacheWebcache Editor RclMainBase AfslutQuit RclTrayIcon GendanRestore RclTrayIconSammendragAbstract RecollModelForfatterAuthor RecollModelDatoDate RecollModelDato og tid Date and time RecollModel Dokumentets dato Document date RecollModel*Dokumentets størrelse Document size RecollModelFildato File date RecollModelFilnavn File name RecollModelFilstørrelse File size RecollModel IpathIpath RecollModelNøgleordKeywords RecollModelMIME-type MIME type RecollModelMtidMtime RecollModel"Originale tegnsætOriginal character set RecollModel&Relevans bedømmelseRelevancy rating RecollModel TitelTitle RecollModelURLURL RecollModel$(vis forespørgsel) (show query)ResListJ<p><b>Ingen resultater fundet</b><br>

No results found
ResListp<p><i>Alternative stavemåder (accenter undertrykt): </i>4

Alternate spellings (accents suppressed): ResListD<p><i>Alternative stavemåder: </i>

Alternate spellings: ResList DokumenthistorikDocument historyResListDokumenter DocumentsResList NæsteNextResListÅbnOpenResListForhåndsvisningPreviewResListForrigePreviousResList.Detaljer i Forespørgsel Query detailsResList8Optælling af resultat (est.)Result count (est.)ResListResultatliste Result listResListTekststumperSnippetsResList2Dokument ikke tilgængeligUnavailable documentResListforforResListud af mindstout of at leastResList&Slet kolonne&Delete columnResTable$&Nulstil sortering &Reset sortResTable&Gem som CSV &Save as CSVResTable&Tilføj "%1" kolonneAdd "%1" columnResTable6Kan ikke åbne/oprette fil: Can't open/create file: ResTable*Gem tabel til CSV-filSave table to CSV fileResTablej adskiller sig fra de nuværende præferencer (beholdt)' differ from current preferences (kept)SSearchAlle ord All termsSSearchVilkårlig ordAny termSSearchZAutomatiske suffikser for gemte forespørgsel: Auto suffixes for stored query: SSearch„Autofrase er aktiveret, men var deaktiveret for gemte forespørgsel3Autophrase is set but it was unset for stored querySSearch„Autofrase er deaktiveret, men var aktiveret for gemte forespørgsel3Autophrase is unset but it was set for stored querySSearch6Forkert forespørgselsstrengBad query stringSSearchBIndtast filnavn jokertegn udtryk.$Enter file name wildcard expression.SSearch$Indtast forespørgselssprogets udtryk. Snydeark:<br> <i>ord1 ord2</i> : 'ord1' og 'ord2' i et hvilken som helst felt.<br> <i>felt:ord1</i> : 'ord1' i feltet 'felt'.<br> Standard feltnavne/synonymer:<br> titel/emne/billedtekst, forfatter/fra, modtager/til, filnavn, ekst.<br> Pseudofelter: dir, mime/format, type/rclcat, dato, størrelse.<br> To datointerval-eksempler: 2009-03-01/2009-05-20 2009-03-01/P2M:<br>. <i>ord1 ord2 OR ord3</i>: ord1 AND (ord2 OR ord3).<br> Du kan bruge parenteser for at gøre tingene klarere.<br> <i>"ord1 ord2"</i> : frase (skal forekomme nøjagtigt). Mulige modifikatorer:<br> <i>"ord1 ord2"p </i> : uordnet nærheds-søgning med standard afstand.<br> Brug <b>Vis Forespørgsel</b> link når i tvivl om resultatet og se manual (&lt;F1>) for flere detaljer.Enter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date, size.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
You can use parentheses to make things clearer.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual (<F1>) for more detail. SSearchŠIndtast søgeord her. Tast ESC SPC for færdiggørelse af nuværende ord.FEnter search terms here. Type ESC SPC for completions of current term.SSearchREksterne Indekser for gemte forespørgsel:#External indexes for stored query: SSearchFilnavn File nameSSearch(Ikke mere hukommelse Out of memorySSearch$ForespørgselssprogQuery languageSSearch^Ordstammer til sprogene for gemte forespørgsel:%Stemming languages for stored query: SSearchVælg søgetype.Choose search type. SSearchBaseRydClear SSearchBase Ctrl+SCtrl+S SSearchBaseŠIndtast søgeord her. Type ESC SPC for færdiggørelse af nuværende ord.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase Slet søgeindgangErase search entry SSearchBaseSSøgeBase SSearchBase SSearchBaseSøgSearch SSearchBase$Start forespørgsel Start query SSearchBaseAlleAll SearchClauseWVilkårligAny SearchClauseWFilnavn File name SearchClauseWIntet feltNo field SearchClauseW IngenNone SearchClauseWtAntal yderligere ord, der kan være blandet med de udvalgteHNumber of additional words that may be interspersed with the chosen ones SearchClauseW FrasePhrase SearchClauseW Nærhed Proximity SearchClauseWvVælg den type forespørgsel, der vil blive udført med ordene>Select the type of query that will be performed with the words SearchClauseW Find:Find:Snippets NæsteNextSnippetsForrigePrevSnippetsTekststumperSnippetsSnippetsh<p>Desværre blev der ikke, inden for rimelige grænser, fundet en nøjagtig match. Sandsynligvis fordi dokumentet er meget stort, så tekststump-generatoren for vild i mængden...</ p>ˆ

Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...

 SnippetsWSøgSearch SnippetsWGennemseBrowseSpecIdxW$Mappe for rekursiv indeksering. Dette skal være indenfor det regulære indekserede område<br> som defineret i konfigurationsfilen (øverste mapper).€Directory to recursively index. This must be inside the regular indexed area
as defined in the configuration file (topdirs).SpecIdxWlForsøg ikke igen med filer, der tidligere mislykkedes.%Do not retry previously failed files.SpecIdxW|Ellers vil kun ændrede eller mislykkede filer blive behandlet.5Else only modified or failed files will be processed.SpecIdxWVSlet udvalgte filers data, før indeksering.*Erase selected files data before indexing.SpecIdxWÂLad stå tomt for at vælge alle filer. Du kan bruge adskillige mellemrums-adskilte shell-type mønstre.<br>Mønstre med indlejrede mellemrum skal citeres med dobbelte anførselstegn.<br>Kan kun bruges, hvis startmålet er angivet.ÐLeave empty to select all files. You can use multiple space-separated shell-type patterns.
Patterns with embedded spaces should be quoted with double quotes.
Can only be used if the start target is set.SpecIdxW.Mønstre for udvælgelse:Selection patterns:SpecIdxW$Særlig indekseringSpecial IndexingSpecIdxWhStartmappe (ellers brug de regulære øverste mapper):+Start directory (else use regular topdirs):SpecIdxW*Top indekserede enhedTop indexed entitySpecIdxW&Luk&Close SpellBase&Udvid &Expand  SpellBaseAccenterAccents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase$Stor/Små bogstaverCase SpellBaseSammenlignMatch SpellBaseIngen dbinfo. No db info. SpellBaseSøg efter ord Term Explorer SpellBase> Dokumenter oprettet/opdateret Documents created/updatedSpellW Filer testet Files testedSpellW0 ikke-indekserede filer Unindexed filesSpellW%1 resultater %1 resultsSpellW<Gennemsnitlige ord pr dokumentAverage terms per documentSpellW6Mappestørrelse for databaseDatabase directory sizeSpellWDok. / Tot. Doc. / Tot.SpellWxIndex: %1 dokumenter, gennemsnitslængde %2 ord %3 resultater7Index: %1 documents, average length %2 terms.%3 resultsSpellWElementItemSpellWXListe blev afkortet alfabetisk, nogle ofte 1List was truncated alphabetically, some frequent SpellW8Længste dokumentlængde (ord)Longest document length (terms)SpellWMIME-typer: MIME types:SpellW,Ingen udvidelse fundetNo expansion foundSpellW Antal dokumenterNumber of documentsSpellW RegexRegexpSpellWDResultater fra sidste indeksering:Results from last indexing:SpellW0Vis statistik for indeksShow index statisticsSpellW8Mindste dokumentlængde (ord) Smallest document length (terms)SpellW"Stavning/FonetiskSpelling/PhoneticSpellW&Udvidelse af stammeStem expansionSpellWOrdTermSpellW VærdiValueSpellWJokertegn WildcardsSpellW^fejl under hentning af ordstammer for sprogene #error retrieving stemming languagesSpellWbDer kan mangle ord. Prøv at bruge en længere rod..terms may be missing. Try using a longer root.SpellWAlle ord All terms UIPrefsDialogVilkårlig ordAny term UIPrefsDialog@Der burde vælges højst et indeks$At most one index should be selected UIPrefsDialogÄKan ikke tilføje indeks med en anden indstilling for fjernelse af store-bogstaver/diakritiske tegn>Cant add index with different case/diacritics stripping option UIPrefsDialogVælgChoose UIPrefsDialog@Standard skrifttype for QtWebkitDefault QtWebkit font UIPrefsDialogFilnavn File name UIPrefsDialog$ForespørgselssprogQuery language UIPrefsDialog\Overskrift for resultatliste (standard er tom)%Result list header (default is empty) UIPrefsDialogŽAfsnitformat for resultatliste (slet alt for at nulstille til standard)Nye værdier:</b>New Values:ViewActionBaseBHandling (tom -> recoll standard) Action (empty -> recoll default)ViewActionBase2Anvend på aktuelle udvalgApply to current selectionViewActionBaseLukCloseViewActionBasePUndtagelse til indstillinger for Desktop Exception to Desktop preferencesViewActionBase,Oprindelige fremvisereNative ViewersViewActionBase Recoll handling:Recoll action:ViewActionBaseÚVælg en eller flere filtyper, og brug derefter knapperne i rammen nedenfor for at ændre, hvordan de behandleskSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseÔVælg en eller flere Mime-typer og brug derefter knapperne i bundrammen til at ændre, hvordan de behandles.lSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBaseVælg det samme Select sameViewActionBaseVBrug indstillinger for Desktop som standard"Use Desktop preferences by defaultViewActionBaseaktuelle værdi current valueViewActionBaseRegex søgning Search regexpWebcache Rediger webcacheWebcache editorWebcacheKopier URLCopy URL WebcacheEditSlet det valgteDelete selection WebcacheEditbIndeksering kører. Kan ikke redigere webcachefil.-Indexer is running. Can't edit webcache file. WebcacheEditzIndeksering i ukendt tilstand. Kan ikke redigere webcachefil.0Unknown indexer state. Can't edit webcache file. WebcacheEdit¬WebCache blev ændret, du er nød til at køre indeksering efter lukning af dette vindue.RWebcache was modified, you will need to run the indexer after closing this window. WebcacheEditMIMEMIME WebcacheModelUrlUrl WebcacheModelÈAktiverer indeksering af sider besøgt af Firefox.<br>(Du skal også installere Firefox Recoll plugin)\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelWŽIndgangene vil blive genbrugt, når størrelsen er nået.<br>Kun en øgning af størrelsen giver god mening, da en reducering af værdien ikke vil afkorte en eksisterende fil (kun spildplads i slutningen).¾Entries will be recycled once the size is reached.
Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).confgui::ConfBeaglePanelWBMax. størrelse til web-lager (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW:Behandl køen for WEB-historikProcess the WEB history queueconfgui::ConfBeaglePanelWþNavnet på en mappe hvor du vil gemme kopier af besøgte websider.<br>En relativ sti er taget i forhold til konfigurationsmappen.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWDMappenavn for lageret til WebsiderWeb page store directory nameconfgui::ConfBeaglePanelWBKan ikke skrive konfigurationsfilCan't write configuration fileconfgui::ConfIndexWVælgChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW<p>Udløser automatisk følsomhed over for store/små bogstaver, hvis indgangen har store bogstaver i andet end den første position. Ellers er du nød til bruge forespørgselssproget og <i>C</i> modifikatoren, for at angive følsomhed over for store/små bogstaver.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelWæ<p>Udløser automatisk følsomhed over for diakritiske tegn, hvis søgeordet har accent tegn (ikke i unac_except_trans). Ellers er du nød til bruge forespørgselssproget og <i>D</i> modifikatoren, for at angive følsomhed over for diakritiske tegn.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelW–<p>Maksimal antal udvidelser-for et enkelt ord (fx: når der bruges jokertegn). Standarden på 10 000 er rimeligt og vil undgå forespørgsler, der synes at fryse mens motoren arbejder sig igennem ordlisten.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelW¢<p>Maksimalt antal grundlæggende sætninger vi føjer til en enkel Xapian forespørgsel. I nogle tilfælde kan resultatet af ordudvidelse være multiplikativ, og vi ønsker at undgå at bruge overdreven hukommelse. Standarden på 100 000 bør være både høj nok i de fleste tilfælde og kompatibel med de nuværende typiske hardware konfigurationer.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWdAutomatisk følsomhed over for store/små bogstaver $Automatic character case sensitivityconfgui::ConfSearchPanelW\Automatisk følsomhed over for diakritiske tegn Automatic diacritics sensitivityconfgui::ConfSearchPanelW>Maksimale antal XapiansætningerMaximum Xapian clauses countconfgui::ConfSearchPanelW:Maksimale antal ordudvidelserMaximum term expansion countconfgui::ConfSearchPanelWÖEn eksklusiv liste over indekserede MIME-typer.<br>Intet andet vil blive indekseret. Normalt tom og inaktiveAn exclusive list of indexed mime types.
Nothing else will be indexed. Normally empty and inactiveconfgui::ConfSubPanelW"Udeluk mime-typerExclude mime typesconfgui::ConfSubPanelW¦Eksterne filtre der arbejder længere end dette vil blive afbrudt. Dette er for det sjældne tilfælde (dvs.: postscript) hvor et dokument kan forårsage, at et filter laver et loop. Indstil til -1 for ingen grænse.­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelWnHvis denne værdi er angivet (ikke lig med -1), vil tekstfiler opdeles i bidder af denne størrelse for indeksering. Dette vil hjælpe søgning i meget store tekstfiler (dvs.: log-filer).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWFMaks. komprimeret filstørrelse (KB)Max. compressed file size (KB)confgui::ConfSubPanelWDMaks. udførelsestid for filtre (S)Max. filter exec. time (S)confgui::ConfSubPanelW@Maks. størrelse på tekstfil (MB)Max. text file size (MB)confgui::ConfSubPanelWFMime-typer der ikke skal indekseresMime types not to be indexedconfgui::ConfSubPanelWKun mime-typerOnly mime typesconfgui::ConfSubPanelW<Sidestørrelse på tekstfil (KB)Text file page size (KB)confgui::ConfSubPanelWFDenne værdi angiver en grænse for, hvornår komprimerede filer ikke vil blive behandlet. Indstil til -1 for ingen grænse, til 0 for ingen dekomprimering nogensinde.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelWRDenne værdi angiver en grænse for, hvornår tekstfiler ikke vil blive behandlet. Indstil til -1 for ingen grænse. Dette er for at udelukke monster logfiler fra indekset.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWÒ<p>Disse er undtagelser fra unac mekanismen, der, som standard, fjerner alle diakritiske tegn, og udfører kanonisk nedbrydning. Du kan tilsidesætte fjernelse af accent for nogle tegn, afhængigt af dit sprog, og angive yderligere nedbrydninger, f.eks. for ligaturer. I hver indgang adskilt af mellemrum, er det første tegn kildedelen, og resten er oversættelsen.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelWAspell sprogAspell languageconfgui::ConfTopPanelW(Databasens mappenavnDatabase directory nameconfgui::ConfTopPanelW2Deaktiver brug af aspell til at generere stavnings-tilnærmelse i værktøj for søgning efter ord. <br> Nyttigt hvis aspell er fraværende eller ikke virker.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWPMegabyte interval for skrivning af IndexIndex flush megabytes intervalconfgui::ConfTopPanelWNavn på logfil Log file nameconfgui::ConfTopPanelW,Log informationsniveauLog verbosity levelconfgui::ConfTopPanelW Brug ikke aspellNo aspell usageconfgui::ConfTopPanelWUdeladte stier Skipped pathsconfgui::ConfTopPanelW.Ordstammer for sprogeneStemming languagesconfgui::ConfTopPanelWœFilen hvor meddelelser vil blive skrevet.<br>Brug 'stderr' for terminal outputPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWvSproget for aspell ordbog. Det skal se ud som "en" eller "fr" ...<br>Hvis denne værdi ikke er angivet, så vil NLS omgivelser blive brugt til at finde det, det fungerer normalt. For at få en idé om, hvad der er installeret på dit system, kan du skrive 'aspell konfig "og se efter .dat filer inde i 'data-dir' mappen.3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelW‚De sprog, hvor ordstamme-udvidelses<br>ordbøger vil blive bygget.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW°Listen over mapper hvor rekursiv indeksering starter. Standard: din hjemme-mappe (home).LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWNavnet på en mappe hvor du vil gemme indekset<br>En relativ sti er taget i forhold til konfigurationsmappen. Standard er "xapiandb.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelWbDenne værdi justere mængden af data, der er indekseret mellem skrivning til disken.<br>Dette hjælper med at kontrollere indekseringsprogrammets brug af hukommelse. Standard 10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW¶Denne værdi justerer mængden af meddelelser,<br>fra kun fejl til en masse fejlretningsdata.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelWØverste mapperTop directoriesconfgui::ConfTopPanelW Unac-undtagelserUnac exceptionsconfgui::ConfTopPanelW&Annuller&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase<PRE> + wrap
 + wrapuiPrefsDialogBase¤En søgning efter [Rullende Sten] (2 ord) vil blive ændret til [rullende eller sten eller (rullende frase 2 sten)].
Dette skulle give højere forrang til resultaterne, hvor søgeordene vises nøjagtigt som angivet.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseVSeparator mellem sammendragets tekststumperAbstract snippet separatoruiPrefsDialogBaseAktiver alleActivate AlluiPrefsDialogBaseTilføj index	Add indexuiPrefsDialogBase Anvend ændringer
Apply changesuiPrefsDialogBaseNAutostart simpel søgning ved blanktegn.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseXTilføj automatisk frase til simple søgninger+Automatically add phrase to simple searchesuiPrefsDialogBasebTærskelprocentsats for ordhyppighed ved autofrase.Autophrase term frequency threshold percentageuiPrefsDialogBase"Panel med knapper
Buttons PaneluiPrefsDialogBaseVælgChooseuiPrefsDialogBase4Vælg redigeringsprogrammerChoose editor applicationsuiPrefsDialogBaseøKlik for at tilføje endnu en indeksmappe til listen. Du kan vælge enten en Recoll konfigurationsmappe eller et Xapianindeks.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBaseZLuk til systembakke i stedet for at afslutte.!Close to tray instead of exiting.uiPrefsDialogBase0Datoformat (strftime(3))Date format (strftime(3))uiPrefsDialogBaseDeaktiver alleDeactivate AlluiPrefsDialogBaseÀBestemmer om dokumentfiltre er vist som radioknapper, værktøjslinje kombinationsfelt eller menu.QDecide if document filters are shown as radio buttons, toolbar combobox, or menu.uiPrefsDialogBaseXDeaktiver Qt autofuldførelse i søgeindgange.*Disable Qt autocompletion in search entry.uiPrefsDialogBase"Kassere ændringerDiscard changesuiPrefsDialogBaseŒSkal vi sammenfatte et sammendrag, selvom dokumentet synes at have et?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBase8Skal vi forsøge at lave sammendrag af indgange til resultatliste ved at bruge sammenhænget med forespørgselsordene? 
Kan være langsomt for store dokumenter.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBase<Valgmetode for dokumentfilter:Document filter choice style:uiPrefsDialogBase.Lav dynamisk sammendragDynamically build abstractsuiPrefsDialogBasepRediger kode for indsætnig i html-hoved for resultatside#Edit result page html header insertuiPrefsDialogBaseNRediger formatstreng for resultatafsnit#Edit result paragraph format stringuiPrefsDialogBaseAktiverEnableuiPrefsDialogBase"Eksterne IndekserExternal IndexesuiPrefsDialogBaseîHyppighedens procentvise tærskel, hvorover vi ikke bruger ord inde i autofrase.
Hyppige ord er et stort problem for ydeevnen med fraser.
Udeladte ord forøger frase stilstand, og reducere effektiviteten af autofrase.
Standardværdien er 2 (procent).þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase6Skjul identiske resultater.Hide duplicate results.uiPrefsDialogBaseÖAfkryds forårsager, at resultater med samme indhold under forskellige navne kun bliver rapporteret en gang.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseäLinjer i PRE tekst ombrydes ikke. Brug af BR mister en del indrykning. PRE + Wrap stil kunne være, hvad du ønsker.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBaseˆMaksimal tekststørrelse der fremhæves for forhåndsvisning (megabyte)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseMenuMenuuiPrefsDialogBase@Antal indgange i en resultatside"Number of entries in a result pageuiPrefsDialogBase’Åbner et vindue til at vælge CSS stilark-fil for vinduet til tekststumperAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBasenÅbner et vindue til at vælge resultatlistens skrifttype-Opens a dialog to select the result list fontuiPrefsDialogBasePÅbn et vindue for at vælge stilark-filen-Opens a dialog to select the style sheet fileuiPrefsDialogBase,Oversættelser af stierPaths translationsuiPrefsDialogBaseFAlmindelig tekst til HTML linjetypePlain text to HTML line styleuiPrefsDialogBasenForetræk Html til almindelig tekst for forhåndsvisning.&Prefer Html to plain text for preview.uiPrefsDialogBase\Forespørgselssprogets magiske filnavnendelser.(Query language magic file name suffixes.uiPrefsDialogBaseLHusk sorteringens aktiveringstilstand.Remember sort activation state.uiPrefsDialogBase~Fjern fra listen. Dette har ingen virkning på indeks på disken.7Remove from list. This has no effect on the disk index.uiPrefsDialogBaseFjern valgteRemove selecteduiPrefsDialogBase@Erstat sammendrag fra dokumenter Replace abstracts from documentsuiPrefsDialogBaseNulstilResetuiPrefsDialogBaseVNulstil stilen for vinduet til tekststumper Resets the Snippets window styleuiPrefsDialogBasexNulstiller resultatlistens skrifttype til systemets standard1Resets the result list font to the system defaultuiPrefsDialogBase8Nulstil stilark til standard!Resets the style sheet to defaultuiPrefsDialogBaseResultatlisteResult ListuiPrefsDialogBase8Skrifttype for resultatlisteResult list fontuiPrefsDialogBase(Søg mens du skriver.Search as you type.uiPrefsDialogBaseSøgeparametreSearch parametersuiPrefsDialogBaseVis statusikon.Show system tray icon.uiPrefsDialogBase^Vis advarsel, når der åbnes en midlertidig fil.)Show warning when opening temporary file.uiPrefsDialogBaseFCSS-fil for vindue til tekststumperSnippets window CSS fileuiPrefsDialogBaseJStart med åbent avanceret søgevindue.'Start with advanced search dialog open.uiPrefsDialogBase8Start med enkel søgetilstandStart with simple search modeuiPrefsDialogBase(Ordstammer for sprogStemming languageuiPrefsDialogBaseStilarkStyle sheetuiPrefsDialogBaseSynonymer-fil
Synonyms fileuiPrefsDialogBasebSammenhængende ord for det genererede sammendrag  Synthetic abstract context wordsuiPrefsDialogBaseZStørrelse på det genererede sammendrag (tegn)$Synthetic abstract size (characters)uiPrefsDialogBase¬Tekster over denne størrelse vil ikke blive fremhævet i forhåndsvisning (for langsom).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseÀOrdene på listen bliver automatisk vendt til ext: xxx sætninger i forespørgselssprogets indgang.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase Skift det valgteToggle selecteduiPrefsDialogBase<værktøjslinje kombinationsfeltToolbar ComboboxuiPrefsDialogBase"brugergrænsefladeUser interfaceuiPrefsDialogBase&BrugerindstillingerUser preferencesuiPrefsDialogBase(Brugerstil der skal anvendes på vinduet til tekststumper.<br>Bemærk: Det færdige sidehoved-indstik er også inkluderet i tekststumper-vinduets hoved.ƒUser style to apply to the snippets window.
Note: the result page header insert is also included in the snippets window header.uiPrefsDialogBaseˆrecoll-1.23.7/qtgui/i18n/recoll_pl.qm0000644000175000017500000026541713125527323014251 00000000000000<¸dÊÍ!¿`¡½ÝBè+þy-þ¦¯+;3 G¤5óH,‰*H,«©H,ØHYØ3IA­žZl¼mbÁ蘕Ý&¦yg먥¸‰¶E’7ÐD “Ù] Å ½ájLô¿7LôÛfVEšVEØßf¾¿glÀ°;xÆÛ—˜Å6߬å¬ô-¬ô¥žEîU„$—ÈÕ'Hä *Ð%§;*ì0¨+Lôd+f¾Ä\1øÆ:Îd¤G…ÔQG߬ºH6óÜÌH6õÜùJ+‚eJ+‚Õ—J6• ãJ6•òæL™b’´MzÛ6Ph¨ºOSŠ˜ÝtS¸¹êÖT°5º÷WTh¹WÈÕš¶XÉÄQðZ0ƒM°[ %»â\ƒµåªe®eígwîÉ!oA^1Wsºñsºñ¤Tv8“œBv®Âv®Â¤À€€£>)„j„ÛŒ!þ0—¤´ðû0œNÍîüªJ M®½Þ(¹¯fSð0¶Êð„Œº° ÃÞÃ*Ðùƒ£aÐùƒæ0Ðùƒïwãnxýgt¢ :•N Õ \Eµ ÕnôµEÂ.ñ™ô´Í0,…Þ;¸sãá>.cq}Do2•ÂNž'Vsn4XM¹J¦X®©2×hˆ¸5[lÿtØ¥nÚjwñ…º¾wñ…ñaxýî%ò~„Hâ5€üÞ§®‘vã8.•ñ“q,¢‰bÞñƒsëͺ ò)~Hó LˆêþSIÔµÿµÿÿØ…ßø çqëA"£p#vå¿þv她w 5¹Íw 5Ôzw 5Ødwîº ŒU­Ÿ.‡M©Ö³åت6•Ü-¯†”†w»f3ªÕÈT/wËÂî”yͼuKmÐgž¶Ðgž¤óÔÂõfHì;UŒ:ï¡©4BúUgyúeîx ¬Zƒ!DS( ‹N>x&ÁAæ=údS³?úd±¡?údÀ²G$߃ËJUY‘åJUY¾YY ôâÙ[–uiQ_nàbzn*º™W[uD–Ê·‹—˜™žvø¢²P¯¡3©§Ê—¥HÊ—¥¤‰ÎÅåMÔä^GkÝôL=3ã¿Þ‚ìx;ùJgBøþA¢·þŠ¥Kçÿ%´çB `0C.3Ï<.ƒ'çÞÕ:õµ¿ëd¶@;[¾Ý­<ÄöÂáLƒó—NB™ñöe 2˜ÞvhÕý€ã‡Š¹…(P‹0Œ¯b¸Y’"3 ¼’ZÓ ˜I¼6"˜I¼eQ™n•Ešß¤—@Ÿf•éŸf•þ;Ÿf•:•««Ü«Õʬ,¥6V¯ƒW4ˆ¯ƒWaàÄy%1èÄy%Cƒ΄՞’Ð: ÛÚ#C¹ãX|(åõW0ËÌ” ;iÛÊ -Z’zÏÞç-¼·j)ÖTR‹-±.tn6×4BBìSÚng2þþÓj“.("k¶Þ° l9”Íoˆ•Ùýr?)¼:ržˆƒs˜%–w|ôò‡„kåÅG‹¦,±o‹Üð㊌Ç<«"U"›ˆ˜×‰›ˆ˜Ûý¦AS%ªÃ¢¡·¨ È—»œRÝü¿gu¨‘Ç¢•Å•ÒΗ×I^®WØ~C=èêÈ’kéã>`«ðŒµV#`³±Mð8`$Œú" ×»:ªùjUKôSþp h7çu9NMv2ãh–T#j—Be®¦ %C¦©n¨3¦öõù¨«‡¡Ó¶7ÁÁwN¼„ÄÖ[™ÊXÔënD…Îî!¸äKðw)Ú/C96!vôí¤#+äVv7I^§j<ˆ~æâFW#ÙF¯N@ZH:"ÄM–>ø_guK¿apä ìf 6†ŒÍwÅ ŒÏ—¿““’ž8™ÅóÜ™¦š´¥1²ð Åê¾l¯œ‰ÓtöÓt¥iÈà‡ɆtZ*â]85éŽ#³¢ñâŸó®t3bR:uîN‘G;.jåGñîT`QçÇo4kzÎu}}nÁ€;EÃóƒAŽë”ò“VÁ¨0Î'©ÔÕR%¬¨”÷B°cóÄ×HÈ@ÃÞIÊÁ©qÌi®ÉÍÌí³d6ͳ¿ÈÖŽkK×°ŠDÝÜ2¯äœc ñä´¥†Ìæí:Ÿî?À“ö¨å 0ú ÃZà ´H¦ -(5ª 9ZyÖô ;´3– D© ¾ K¨ó¯§ ]#—™Ö c‡CÇá k¨µjK lMˆb! ‰ŒîXê ŸÁòÆñ £qDß‹ «ƒÔ¸ ­îB ®œ¯?u ²9P ü>Oã Ýêž!y ä3¾à íåõ9ã *Nha :^è% Üc R *R3. 6 j >V…öö G.~KT `P˜ `ç£ a·E­Ç c·E® d8ðÇ yg ˜Iœ3e ¤žk ®VT z ²ëCÆ) Ä㾩 âæç­G æõç¬ï ®¬ ®ù¬c Ô… y ye1· TH? ŽÚdo ,xƒ3 =!P Kj×»¢ T|cª h¹°d§ ’þƒà  ™÷Àó éé £Ü iº ¨Î£®˜ ¬rÆ’ »ïµy ÒönŽ< Ù·å°g Û·å°¶ ÛÓ:Ï ?¾IS Vd—Ì ïúóê 'И«Q +bCÇt /¥˜ L*— PÖ™ˆ> RVŽ¡Y T#t/ Vü Ž \iCQj ]æùú `F¥  hôîÂR v—¥f {lO9 €!Y €!YÀM ‚Wå´U ЉY Œïõ´ ‘–²‘ ¬æà…• ¶…÷Ç ¹iÉ Z ÓÍŸÏ Ú÷å Ýøì7• é—~H] õ­Nòy ö†ÀÜa m£º~ 'RçL# -èô»< .!N-˜ 8þ4¤ FÁ”3 OE°JÕ ]„Ä7 ]„Äô? m†CGÞ uò0³d y·í y¼Î< 8ž½Ð ‚±3G …È©< ‡uÔö ‰Pˆ ‰P£( 5dLŽ “õ~Û ¤š„šL ¬Š©1 ³µšå ½ý7^} ÇòÞ;? ÊÕ’4É ÕH _ ÛQ5ú· û£ä¸ q©¦Ø€G!%Ýny®/¸.’5bÎû@8bóã:9µ±Ø<ÞWû8äQá~PZW"ùykY~sª{[žs¶Ã\Н2e3¯g3¯`pû~^Ü™³=‹!7 ‚´nd­cÌ»m€Ãz¿­cÑÂ|“sÞÂ|“TÇÎÁ'Ïâ ó l¥Îü©Ü_ü¶L«i[ Ka|dy warunek All clauses AdvSearchKtóry[ warunek Any clause AdvSearchHBBdna jednostka we filtrze rozmiaru$Bad multiplier suffix in size filter AdvSearchmultimediamedia AdvSearchwiadomo[cimessage AdvSearchpozostaBeother AdvSearchprezentacje presentation AdvSearcharkusze spreadsheet AdvSearchtekstowetext AdvSearch <----- Wszystkie <----- All AdvSearchBase"<----- Zaznaczone <----- Sel AdvSearchBaseDodaj warunek Add clause AdvSearchBase"DokBadne szukanieAdvanced search AdvSearchBaseWszystkie ----> All ----> AdvSearchBase.Podane warunki (pola z prawej strony) bd u|yte razem (dla zaznaczonego "Ka|dy warunek") lub oddzielnie (dla zaznaczonego "Który[ warunek"). <br>Pola "Które[", "Wszystkie" i "{adne" przyjmuj pojedyDcze wyrazy lub frazy w cudzysBowiu.<br>Pola bez danych s ignorowane.</br></br>All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored.

 AdvSearchBasePrzegldajBrowse AdvSearchBaseJako kategoria By categories AdvSearchBase2Zaznacz, by okre[li dat'Check this to enable filtering on dates AdvSearchBase<Zaznacz, by okre[li typ pliku,Check this to enable filtering on file types AdvSearchBase8Zaznacz, by okre[li rozmiar'Check this to enable filtering on sizes AdvSearchBase4Zaznacz, by u|y kategorii;Check this to use file categories instead of raw mime types AdvSearchBaseZamknijClose AdvSearchBaseUsuD warunek Delete clause AdvSearchBase<Podaj szczyt katalogu szukaniaEnter top directory for search AdvSearchBase FiltryFilter AdvSearchBasePo dacie Filter dates AdvSearchBasePo rozmiarze Filter sizes AdvSearchBase ZnajdzFind AdvSearchBasePo:From AdvSearchBasePomiD plikiIgnored file types AdvSearchBaseLE{CE POZAInvert AdvSearchBaseMniejszy od: Max. Size AdvSearchBaseJDopuszczalne jednostki: k/K, m/M, g/G4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseWikszy od: Min. Size AdvSearchBaseJDopuszczalne jednostki: k/K, m/M, g/G4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase Okre[l typ plikuRestrict file types AdvSearchBase<Tylko pliki LE{CE W katalogu:%Restrict results to files in subtree: AdvSearchBase.Zapamitaj wybrane typySave as default AdvSearchBase^Znajdz <br>dokumenty<br>speBniacjce:</br></br>1Search for
documents
satisfying:

 AdvSearchBasePrzeszukaj plikSearched file types AdvSearchBase"Zaznaczone -----> Sel -----> AdvSearchBase Szukaj Start Search AdvSearchBase Przed:To AdvSearchBase¦<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksuj cyklicznie (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ka|de pole mo|e zawiera wieloznacznik (*), pojdyDcz warto[, list po przecinku (1,3,5) oraz zakres (1-7). Tak samo<span style=" font-style:italic;">jak</span>gdyby to byB plik Crontab. Dlatego mo|liwe jest u|ycie skBadni Crontab. (zobacz crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />PrzykBadowo wpisujc <span style=" font-family:'Courier New,courier';">*</span> w <span style=" font-style:italic;">"Dni tygodnia", </span><span style=" font-family:'Courier New,courier';">12,19</span> w <span style=" font-style:italic;">"Godziny"</span> oraz <span style=" font-family:'Courier New,courier';">15</span> w <span style=" font-style:italic;">"Minuty"</span> uruchomili by[my indeksowanie (recollindex) ka|dego dnia o 00:15 oraz 19:15</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indeksowanie cykliczne (nawet te bardzo czste) jest mniej efektowne ni| indeksowanie w czasie rzeczywistym.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

 CronToolWZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Kliknij <span style=" font-style:italic;">WyBcz</span>, aby zatrzyma automatyczne indeksowanie. <span style=" font-style:italic;">WBcz</span>, aby je rozpocz. <span style=" font-style:italic;">Anuluj</span>, aby utrzyma obecny stan.</p></body></html>š

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

 CronToolW"Ustaw cykl (CRON) Cron Dialog CronToolWZDni tygodnia (* or 0-7, 0 lub 7 to Niedziela))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolW WyBczDisable CronToolW WBczEnable CronToolWpBBd przy rejestrowaniu cyklu. BBdna skBadnia w polach?3Error installing cron entry. Bad syntax in fields ? CronToolW(Godziny (* lub 0-23)Hours (* or 0-23) CronToolW¦Nie mo|na zmieni crontab. Wyglda na to, |e istniej rczne wpisy dla recollindex.PIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinuty (0-59)Minutes (0-59) CronToolWOkno dialogoweDialog EditDialog"BBd konfiguracji Config error EditTransZcie|ka lokalna Local path EditTrans$Zcie|ka oryginalna Original path EditTrans Zcie|ka zródBowa Source path EditTrans DodajAdd EditTransBase AnulujCancel EditTransBaseUsuDDelete EditTransBase&Zcie|ka tBumaczeniaPath Translations EditTransBase ZapiszSave EditTransBaseÂWybierz jeden lub kilka typów pliku, nastpnie wska| w ramce poni|ej jak maj zosta przetworzonekSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBaseDUstawienie [cie|ki translacji dla Setting path translations for  EditTransBase ä<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Indeks dla tej konfiguracji nie istnieje.</span><br /><br />Je[li tylko chcesz indeksowa swój katalog domowy u|wyajc fabrcznych ustawieD, wci[nij przycisk <span style=" font-style:italic;">Rozpocznij indeksowanie </span>. SzczegóBy mo|esz ustawi równie| pózniej. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Je[li chesz mie wiksz kontrol, u|yj nastpujcych odno[ników w celu konfiguracji indeksowania oraz jego harmonogramu.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">To samo mo|esz równie| otrzyma pozniej wybierajc <span style=" font-style:italic;">Ustawienia</span> z menu.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

FirstIdxDialogHPocztkowa konfiguracja indeksowaniaFirst indexing setupFirstIdxDialog2Konfiguracja indeksowaniaIndexing configurationFirstIdxDialog0Harmonogram indeksowaniaIndexing scheduleFirstIdxDialog.Rozpocznij indeksowanieStart indexing nowFirstIdxDialogTutaj mo|esz wybra katalogi do indeksowania, oraz inne parametry tj. wyBczenie [cie|ek plików czy ich nazw, domy[lny zestaw znaków, etc.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialog"Tutaj mo|esz wybra midzy indeksowaniem w kolejce, a indeksowaniem nabierzco, jak i ustaleniem automatycznej kolejki indeksowania (dziki Cron)€This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog Ž<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Indeksowanie <span style=" font-weight:600;">Recoll</span> mo|e by uruchomione na staBe (indeksujc ka|d zmian) lub w okre[lonych cyklach.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Instrukcja obsBugi (EN) mo|e pomóc wybra rozwizanie dla Ciebie (wci[nij F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Narzdzie to pomo|e Ci zaplanowa indeksowanie cykliczne lub wybierzesz indeksowanie "na bie|co" po zalogowaniu (lub jedno i drugie, co rzadko jest sendowne).</p></body></html>¿

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

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

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

 IdxSchedW2Planowanie z u|yciem CronCron scheduling IdxSchedW\Pozwala uruchomi indeksowanie po zalogowaniu.ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWLKonfiguracja harmonogramu indeksowaniaIndex scheduling setup IdxSchedWBUruchom indeksowanie "na bie|co"Real time indexing start up IdxSchedW¸Tutaj zdecydujesz o jakim czasie indeksowanie ma by uruchamiane (po przez wpis do crontab)._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedWOkno dialogoweDialog ListDialog GrupaGroupBox ListDialog¼Plik "history" jest uszkodzony lub brak mo|liwo[ci jego odczytu/zapisu, zmieD to lub go usuD: K"history" file is damaged or un(read)writeable, please check or remove it: MainXBrak katalogu dla bazy danych w konfiguracji No db directory in configurationMain&Nastpny&NextPreview&Poprzedni &PreviousPreview&Szukaj: &Search for:Preview^Nie mog przemieni dokumentu na wBadny format 0Can't turn doc into internal representation for Preview AnulujCancelPreviewWyczy[ClearPreviewZamknij kart Close TabPreview*Tworz podgld tekstuCreating preview textPreview(BBd Badowania plikuError while loading filePreview@Aaduj podgld tekstu do edytora Loading preview text into editorPreview2Sprawdzaj &wielko[ liter Match &CasePreview>Brak programu usprawniajcego: Missing helper program: Preview KopiujCopyPreviewTextEditZwiD linie Fold linesPreviewTextEdit Zachowaj wciciaPreserve indentationPreviewTextEdit DrukujPrintPreviewTextEdit*Drukuj obecny podgldPrint Current PreviewPreviewTextEdit0Zapisz dokument do plikuSave document to filePreviewTextEdit Zaznacz wszystko Select AllPreviewTextEditPoka| pola Show fieldsPreviewTextEditPoka| obraz Show imagePreviewTextEdit$Poka| tekst gBównyShow main textPreviewTextEdit0<b>Dostosowana gaBz</b>Customised subtreesQObject <i>Poni|sze parametry tycz s pod[wietlonego katalogu z powy|szej listy.<br> Je[li powy|sza lista jest pusta lub pod[wietla pust lini poni|sze ustawienia tycz si najpBytszego katalogu.<br>Mo|esz doda lub usun katalog klikajc przyciski +/-</br></br></i> ñThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.

QObject,Domy[lny zestaw znakówDefault character setQObjectBIdz za dowizaniami symbolicznymiFollow symbolic linksQObjectˆFollow symbolic links while indexing. The default is no, to avoid duplicate indexing Indeksujc, idz za dowizaniami symbolicznymi. Domy[lnia warto[ to NIE, chroni przed zduplikowanymi indeksami.TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject$Parametry globalneGlobal parametersQObject>Indeksuj wszystkie nazwy plikówIndex all file namesQObject Indeksuj nazwy plików dla których zawarto[ nie mo|e by rozpoznana lub przetworzona (Nie lub nieobsBugiwany typ MIME). Domy[lnie Tak.}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject"Parametry lokalneLocal parametersQObject$Parametry szukaniaSearch parametersQObjectWykluczenia Skipped namesQObjectLista podkatalogów w zaindeksowanej hierarchii <br> dla których cz[ parametrów musi by ustalona ponownie. Domy[lnie: pusty.</br>xThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.
QObjectˆTutaj ustawiasz reguBy wykluczajce indeksowanie plików i katalogów.LThese are patterns for file or directory names which should not be indexed.QObject€To jest zestaw znaków sBu|cy do odczytu plików i nie jest to|samy z ustawieniami wewntrznymi (np: czyste pliki tesktowe)<br>Domy[lnie jest pusty, a u|yta jest warto[ ze [rodowiska NLS.</br>×This is the character set used for reading files which do not identify the character set internally, for example pure text files.
The default value is empty, and the value from the NLS environnement is used.
QObjectHistoria sieci Web historyQObject.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksacja mo|e by uruchomiona w tle (daemon), aktualizujc indeks nabierzco. Zyskujesz zawsze aktualny indeks, tracc cz[ zasobów systemowych.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> .

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

RTIToolWbDodatkowo natychmiast uruchom indeksowanie w tle.%Also start indexing daemon right now.RTIToolWrUsunito plik autostartu. Zamkn równie| bie|cy proces?2Autostart file deleted. Kill current process too ?RTIToolW$Nie mog utworzy:Can't create: RTIToolW:Nie mo|na wykona recollindexCould not execute recollindexRTIToolWUsuwanie pliku Deleting fileRTIToolWUsuwanie: Deleting: RTIToolWjAutomatyczny start indeksowania w czasie rzeczywistym"Real time indexing automatic startRTIToolW&Usuwanie autostartuRemoving autostartRTIToolWPodmiana plikuReplacing fileRTIToolWPodmiana: Replacing: RTIToolWlUruchom indeksowanie w tle razem ze startem komputera..Start indexing daemon with my desktop session.RTIToolWOstrze|enieWarningRTIToolW(ka|dy jzyk)(all languages)RclMain>wyBcz ciosanie (ang. stemming) (no stemming)RclMainKarta Recoll About RecollRclMainWszystkoAllRclMainŒBBdna komenda przegldarki dla typu %1: [%2] Sprawdz plik widoku MIMECBad viewer command line for %1: [%2] Please check the mimeview fileRclMainFNie mog uzyska dostpu do pliku: Can't access file: RclMain@Nie mo|na utworzy okna podglduCan't create preview windowRclMain4Nie mog wypakowa pliku: Can't uncompress file: RclMaindNie mog zaktualizowa indeksu: pracujcy indekser#Can't update index: indexer runningRclMaintNie mo|na wypakowa dokumentu lub stworzy plik tymczasowy0Cannot extract document or create temporary fileRclMainHNie mo|na odszuka rodzica dokumentuCannot find parent documentRclMain|Brak mo|liwo[ci pobrania informacji o dokumencie z bazy danych+Cannot retrieve document info from databaseRclMain¬Kliknij Ok by uaktualni indeks tego pliku, po zakoDczeniu ponów zapytanie lub Anuluj.fClick Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.RclMainZamykanieClosingRclMainhZawarto[ zostaBa zaindeksowana dla tych typów MIME:.Content has been indexed for these mime types:RclMainÊNie mog otworzyc zewntrznego indeksu. Nie otwarta baza danych. Sprawdz list zewntrznych indeksów.HCould not open external index. Db not open. Check external indexes list.RclMain2Filtr kategorii dokumentuDocument category filterRclMain&Historia dokumentówDocument historyRclMainZakoDczoneDoneRclMain Usuwanie indeksu Erasing indexRclMainBBdErrorRclMainWykonuj: [ Executing: [RclMainŒBrak zewntrznych aplikacji|komend wymaganych przez twoje typy plików.pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMainHistoria danych History dataRclMain*Indeks jest zamknityIndex not openRclMainŒIndeks tego pliku jest nieaktualny. Odmawiam podania bBdnych wyników.MIndex not up to date for this file. Refusing to risk showing the wrong entry.RclMain,BBd odpytania indeksuIndex query errorRclMain.Zaindeksowane typy MIMEIndexed MIME TypesRclMainvIndeksowanie w trakcie, spodziewana poprawa po zakoDczeniu.7Indexer running so things should improve when it's doneRclMainXIndeksowanie nie zostaBo jeszcze uruchomioneIndexing did not run yetRclMain(Pora|ka indeksowaniaIndexing failedRclMain.Indeksowanie w tracie: Indexing in progress: RclMain,Brakujce rozszerzeniaMissing helper programsRclMainSprawdzanieMonitorRclMainvBrak skonfigurowanej zewntrzenej przegldarki typów MIME [-No external viewer configured for mime type [RclMainBWszystkie rozszerzenia znalezionoNo helpers found missingRclMainBrak wynikówNo results foundRclMainNicNoneRclMainWyczy[PurgeRclMainÒTrwa odpytywanie.<br>z powodu ograniczeD biblioteki indeksowania,<br>anulowanie zamknie program</br></br>oQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the program

RclMainWynik zapytania Query resultsRclMain>Ponownie spisa indeks od zera?(Reset the index and start from scratch ?RclMain,Liczba wyników (szac.)Result count (est.)RclMainZapisz plik Save fileRclMain StemdbStemdbRclMain.Zatrzymaj &IndeksowanieStop &IndexingRclMain2Poddokumenty i zaBcznikiSub-documents and attachmentsRclMain¨Obecny proces indeksowania uruchomiono z innego okna. Kliknij Ok, by zamkn proces.yThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMain‚Brak przegldarki dla typu MIME %1: %2 . Chcesz to ustawi teraz?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainFTo wyszukanie przestaBo by aktywne"This search is not active any moreRclMainNieznaneUnknownRclMainOd[wie| &Indeks Update &IndexRclMainOd[wie|anieUpdatingRclMain®Polecenie czytnika dla %1 podaje zarówno plik jak i warto[ pliku rodzica: niewspieraneQViewer command line for %1 specifies both file and parent file value: unsupportedRclMainOstrze|enieWarningRclMaintBBd pobierania "reguB ciosania" (ang. stemming languages)#error retrieving stemming languagesRclMainprzefiltrowanefilteredRclMainmultimediamediaRclMainwiadomo[cimessageRclMainpozostaBeotherRclMainprezentacje presentationRclMainposortowanesortedRclMainarkusze spreadsheetRclMaintekstowetextRclMain&Karta Recoll &About Recoll RclMainBase,&Zaawansowane szukanie&Advanced Search RclMainBase0&UsuD histori dokumentu&Erase document history RclMainBase.&UsuD histori szukania&Erase search history RclMainBase &Plik&File RclMainBasePeBen &Ekran &Full Screen RclMainBase"Konfiguracja &GUI&GUI configuration RclMainBase &Pomoc&Help RclMainBase*&Konfiguracja indeksu&Index configuration RclMainBase$&Plan indeksowania&Indexing schedule RclMainBase&Ustawienia &Preferences RclMainBase&Odnów indeks&Rebuild index RclMainBase&Wyniki&Results RclMainBase2Poka| zaindeksowane &typy&Show indexed types RclMainBase:Poka| &brakujcych pomocników&Show missing helpers RclMainBase*Parametry &sortowania&Sort parameters RclMainBase&Narzdzia&Tools RclMainBase&Instrukcja &User manual RclMainBase ZBo|one szukanieAdvanced/complex Search RclMainBaseWszystkoAll RclMainBase Ctrl+QCtrl+Q RclMainBase$Historia DokumentuDocument History RclMainBase&&Historia dokumentuDocument &History RclMainBase&ZakoDczE&xit RclMainBase"Zewntrzny indeksE&xternal index dialog RclMainBase"Zewntrzny indeksExternal index dialog RclMainBaseF11F11 RclMainBasePierwsza strona First Page RclMainBasePierwsza strona First page RclMainBasePeBen ekran Full Screen RclMainBaseFPrzejdz do pierwszej strony wynikówGo to first page of results RclMainBaseNastpna strona Next Page RclMainBaseNastpna strona Next page RclMainBase.Nastpna strona wynikówNext page of results RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBase"Poprzednia strona Previous Page RclMainBase"Poprzednia strona Previous page RclMainBase2Poprzednia strona wynikówPrevious page of results RclMainBase RecollRecoll RclMainBase Wyniki Result list RclMainBase:Zapisz jako plik CSV (arkusz)Save as CSV (spreadsheet) file RclMainBase\Zapisz wyniki do pliku czytelnego przez arkusz@Saves the result into a file which you can load in a spreadsheet RclMainBase,Narzdzia wyszukiwania Search tools RclMainBaseShift+PgUp Shift+PgUp RclMainBase2Poka| szczegóBy zapytaniaShow Query Details RclMainBase"Poka| jako tabela Show as table RclMainBase0Poka| wyniki jako arkusz(Show results in a spreadsheet-like table RclMainBase>Sortuj po dacie: od najnowszegoSort by date, newest first RclMainBase@Sortuj po dacie: od najstarszegoSort by date, oldest first RclMainBase>Sortuj po dacie: od najnowszego#Sort by dates from newest to oldest RclMainBase@Sortuj po dacie: od najstarszego#Sort by dates from oldest to newest RclMainBase(Parametry sortowaniaSort parameters RclMainBase"Przej|yj &terminyTerm &explorer RclMainBase*Przegldanie terminówTerm explorer tool RclMainBase*&Aktualizacja indeksu Update &index RclMainBaseAbstrakcjaAbstract RecollModel AutorAuthor RecollModelDataDate RecollModelData i czas Date and time RecollModelData dokumentu Document date RecollModel"Rozmiar dokumentu Document size RecollModelData pliku File date RecollModelNazwa pliku File name RecollModelRozmiar pliku File size RecollModel IpathIpath RecollModelSBowa kluczeKeywords RecollModelTyp MIME MIME type RecollModel Czas modyfikacjiMtime RecollModel0Oryginalny zestaw znakówOriginal character set RecollModelTrafno[Relevancy rating RecollModel TytuBTitle RecollModelURLURL RecollModel"(Poka| zapytanie) (show query)ResList@<p><b>Brak wyników</b><br /></p>$

No results found

ResListx<p><i>Aleternatywna pisowania (ignorowane akcenty): </i></p>8

Alternate spellings (accents suppressed):

ResListJ<p><i>Alternatywna pisownia: </i></p>#

Alternate spellings:

ResList$Historia dokumentuDocument historyResListDokumenty DocumentsResList(Duplikaty dokumentówDuplicate documentsResListNastpnyNextResList OtwórzOpenResListPoprzedniPreviewResListPoprzedniPreviousResList&SzczegóBy zapytania Query detailsResList6Liczba wyników (oszacowana)Result count (est.)ResListLista wyników Result listResListTTe URLe ( | ipath) maj t sam zawarto[:-These Urls ( | ipath) share the same content:ResList(Dokument niedostpnyUnavailable documentResListdlaforResListz co najmniejout of at leastResList&UsuD kolumn&Delete columnResTable"&Reset sortowania &Reset sortResTable &Zapisz jako CSV &Save as CSVResTable$Dodaj "%1" kolumnAdd "%1" columnResTableDNie mo|na otworzy|utworzy pliku:Can't open/create file: ResTable6Zapisz tabel jako plik CSVSave table to CSV fileResTable&Otwórz&Open ResultPopup@&Otwórz dokument|katalog rodzica&Open Parent document/folder ResultPopup&Poprzedni&Preview ResultPopup Zapisz &do pliku&Write to File ResultPopup&&Kopiuj nazw plikuCopy &File Name ResultPopupKopiuj &URL Copy &URL ResultPopup2Znajdz &podobne dokumentyFind &similar documents ResultPopup*Otwórz okno &snipetówOpen &Snippets window ResultPopupDPodgld rodzica dokumentu|kataloguPreview P&arent document/folder ResultPopup6Zapisz zaznaczenie do plikuSave selection to files ResultPopup:Poka| poddokumenty|zaBcznikiShow subdocuments / attachments ResultPopupKa|dy termin All termsSSearchKtóry[ terminAny termSSearch BBdne zapytanieBad query stringSSearchlWprowadz wieloznakowe (wildcard) wyra|enie nazwy pliku$Enter file name wildcard expression.SSearch€Wprowadz wyra|enie pytajce. Zciga:<br> <i>termin1 termin2</i> : 'termin1' i 'termin2' w którym[ polu.<br> <i>pole:termin1</i> : 'termin1' w polu 'pole'.<br> Standardowe pola nazwy|synonimy:<br> tytuB/przedmiot/napis, autor/od, odbiorca/do, nazwa pliku, ext.<br> Pseudo-pola: katalog, mime/format, typ/rclcat, data.<br> PrzykBad przedziaBu dat: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>termin1 termin2 LUB termin3</i> : termin1 LUB (termin2 LUB termin3).<br> Nawiasy aktualnie niedozwolone.<br> <i>"termin1 termin2"</i> : fraza (wystpienie dokBadne). Dostpne modyfikatory:<br> <i>"termin1 termin2"p</i> : nieuporzdkowane ssiednie szukanie z domy[ln odlegBo[ci.<br> U|yj <b>Poka| zapytanie</b> je[li jeste[ niepewny wyników i sprawdz je z instrukcj (<F1>) . </br></br></br></br></br></br></br></br></br></br></br>Enter query language expression. Cheat sheet:
term1 term2 : 'term1' and 'term2' in any field.
field:term1 : 'term1' in field 'field'.
Standard field names/synonyms:
title/subject/caption, author/from, recipient/to, filename, ext.
Pseudo-fields: dir, mime/format, type/rclcat, date.
Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.
term1 term2 OR term3 : term1 AND (term2 OR term3).
No actual parentheses allowed.
"term1 term2" : phrase (must occur exactly). Possible modifiers:
"term1 term2"p : unordered proximity search with default distance.
Use Show Query link when in doubt about result and see manual () for more detail.










SSearch’Wprowadz tutaj szkane terminy. Wpisz ESC SPC by uzupeBni bie|cy termin.FEnter search terms here. Type ESC SPC for completions of current term.SSearchNazwa pliku File nameSSearchBrak pamici Out of memorySSearchJzyk zapytaDQuery languageSSearch*Wybierz typ szukania.Choose search type. SSearchBaseWyczy[Clear SSearchBase Ctrl+SCtrl+S SSearchBase’Wprowadz tutaj szkane terminy. Wpisz ESC SPC by uzupeBni bie|cy termin.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase"UsuD szukany wpisErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase SzukajSearch SSearchBaseStart zapytania Start query SSearchBase Ka|dyAll SearchClauseW Który[Any SearchClauseWNazwa pliku File name SearchClauseWBez polaNo field SearchClauseW {adenNone SearchClauseW„Liczba dodatkowych wyrazów, które mog by przeplatane z wybranymiHNumber of additional words that may be interspersed with the chosen ones SearchClauseW FrazaPhrase SearchClauseWSsiedztwo Proximity SearchClauseWhWybierz typ zapytania, który bdzie u|yty z wyrazami>Select the type of query that will be performed with the words SearchClauseWZnajdz:Find:SnippetsNastpnyNextSnippetsPoprzedniPrevSnippetsSnipetySnippetsSnippets SzukajSearch SnippetsW&Zamknij&Close SpellBase&Rozszerz&Expand  SpellBaseAkcentyAccents SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase,Wielko[ znaków (Case)Case SpellBaseDopasowanieMatch SpellBase&Brak informacji bd. No db info. SpellBase"Przegld terminów Term Explorer SpellBase%1 wyników %1 resultsSpellW2BBd rozszerzenia Aspell.Aspell expansion error. SpellW`Nieudany start Aspell. Nie zainstalowano Aspell?)Aspell init failed. Aspell not installed?SpellW8Zrednia terminów na dokumentAverage terms per documentSpellW8Rozmiar katalogu bazy danychDatabase directory sizeSpellWDok. / Razem Doc. / Tot.SpellWxIndeks: %1 dokumenty, [rednia dBugo[ %2 terminów.%3 wyników7Index: %1 documents, average length %2 terms.%3 resultsSpellWElementItemSpellWRLista obcita alfabetycznie, cz[ czsta1List was truncated alphabetically, some frequent SpellW8Najwiksza dBugo[ dokumentuLongest document lengthSpellWTypy MIME: MIME types:SpellW4Nieznalezione rozszerzenieNo expansion foundSpellW"Liczba dokumentówNumber of documentsSpellW6Wyra|enie reguBowe (regexp)RegexpSpellW:Poka| statystyki indeksowaniaShow index statisticsSpellW:Najmniejsza dBugo[ dokumentuSmallest document lengthSpellW*Pisownia/Fonetyczno[Spelling/PhoneticSpellWHRoszerzenie rdzenia (Stem expansion)Stem expansionSpellW TerminTermSpellWWarto[ValueSpellW4Wieloznaczniki (wildcards) WildcardsSpellWtBBd pobierania "reguB ciosania" (ang. stemming languages)#error retrieving stemming languagesSpellWVTerminy mog zgin. U|yj dBu|szego rdzenia.terms may be missing. Try using a longer root.SpellW^Co najwy|ej jeden indeks powinnien by wyberany$At most one index should be selected UIPrefsDialogšNie mo|na doda indeksu z opcj ró|nej wielko[ci-liter/znakach-diakrytycznych>Cant add index with different case/diacritics stripping option UIPrefsDialogWybierzChoose UIPrefsDialogPNagBówek listy wyników (domy[lnie pusty)%Result list header (default is empty) UIPrefsDialogŒFormat paragrafu listy wyników (usuD wszystko by wrói do domy[lnych)Nowa warto[:</b>New Values:ViewActionBase@CzyD (pusty -> recoll domy[lnie) Action (empty -> recoll default)ViewActionBase0U|yj dla obecnego wyboruApply to current selectionViewActionBaseZamknijCloseViewActionBase8Wyjtki dla ustawieD Pulpitu Exception to Desktop preferencesViewActionBase"Systemowy czytnikNative ViewersViewActionBase$Recoll zachowanie:Recoll action:ViewActionBaseÂWybierz jeden lub kilka typów pliku, nastpnie wska| w ramce poni|ej jak maj zosta przetworzonekSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseØWybierz jedno lub kilka typów MIME po czym okre[l jak maj by przetwarzane u|ywajc kontrolek na dole ramkilSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBaseWybierz to samo Select sameViewActionBase@U|yj domy[lnie ustawieD Pulpitu "Use Desktop preferences by defaultViewActionBaseobecna warto[ current valueViewActionBaseÈWBcz ineksowanie odwiedzonych stron w Firefox.<br>(Wymagana instalacja dodatku Firefox Recoll)</br>aEnables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)
confgui::ConfBeaglePanelWRWpisy bd odnowione gdy osignie rozmiar1Entries will be recycled once the size is reachedconfgui::ConfBeaglePanelWNMaks. rozmiar dla schowka webowego (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelW>Przejdz do kolejki historii webProcess the WEB history queueconfgui::ConfBeaglePanelWNazwa katalogu w którym trzymane s kopie odwiedzonych stron.<br>Nieabsolutna [cie|ka jest brana wzgldnie do katalogu konfiguracji.</br>–The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.
confgui::ConfBeaglePanelWLNazwa katalogu dla trzymania stron webWeb page store directory nameconfgui::ConfBeaglePanelWHNie mo|na pisa w pliku konfiguracjiCan't write configuration fileconfgui::ConfIndexWWybierzChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW°<p>Automatycznie uruchom rozró|nianie wielko[ci znaków je[li wpis ma wielkie litery (poza pierwszym znakiem). Inaczej musisz u|y jzyka zapytaD oraz modyfikatora <i>C</i> by wskaza rozró|nianie wielko[ci liter.</p>æ

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.

confgui::ConfSearchPanelW˜<p>Automatycznie uruchom czuBo[ diakrytyków je[li szukana fraza zawiera "ogonki" (nie w unac_except_trans). Inaczej musisz u|y jzyka zapytaD oraz modyfikator<i>D</i> by wskaza czuBo[ diakrytyków.</p>ß

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.

confgui::ConfSearchPanelWº<p>Maksymalna liczba rozszerzeD dla pojedyDczego terminu (np.: u|ywajc wieloznaczników). Domy[lne 10 000 jest warto[ci rozsdn oraz strze|e przed zawieszeniem zapytania podczas gdy przeszukiwana jest lista terminów</p>Ç

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.

confgui::ConfSearchPanelWl<p>Maksymalna liczba pocztkowych klauzuli dodawanych do zapytania Xapian. W niektórych przypadkach, wynik rozszerzeD terminu mo|e by pomno|ony, zwikszajc zu|ycie pamici. Domy[lne 100 000 powinno by dostatecznie wysokie dla wikszo[ci przypadków oraz dziaBajce na obecnych konfiguracjach sprztowych.</p>9

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.

confgui::ConfSearchPanelWJAutomatyczna czuBo[ wielko[ci znaków$Automatic character case sensitivityconfgui::ConfSearchPanelWDAutomatyczna czuBo[ na diakrytyki Automatic diacritics sensitivityconfgui::ConfSearchPanelWDMaksymalna liczba klauzuli Xapian Maximum Xapian clauses countconfgui::ConfSearchPanelWHMaksymalna liczba rozszerzeD terminuMaximum term expansion countconfgui::ConfSearchPanelWDPrzerywa po tym czasie zewntrzne filtrowanie. Dla rzadkich przypadków (np.: postscript) kiedy dokument mo|e spowodowa zaptlenie filtrowania. Brak limitu to -1.­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelWGlobalnieGlobalconfgui::ConfSubPanelWIndeksujc dzieli plik tekstowy na podane kawaBki (je[li ró|ne od -1). Pomocne przy szukaniu w wielkich plikach (np.: dzienniki systemowe).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWPMaks. rozmiar skompresowanego pliku (KB)Max. compressed file size (KB)confgui::ConfSubPanelW4Maks. czas filtrowania (s)Max. filter exec. time (S)confgui::ConfSubPanelWHMaks. rozmiar plików tekstowych (MB)Max. text file size (MB)confgui::ConfSubPanelWHRozmiar strony pliku tekstowego (KB)Text file page size (KB)confgui::ConfSubPanelWWarto[ progowa od której skompresowane pliki przestaj by przetwarzane. Brak limitu to -1, 0 wyBcza przetwarzanie plików skompresowanych.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW@Warto[ progowa po której pliki tekstowe przestaj by przetwarzane. Brak limitu to -1. U|ywaj do wykluczenia gigantycznych plików dziennika systemowego (logs).›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWÊ<p>To s wyjtki mechaniki unac., która domy[lnie usuwa wszystkie diakrytyki oraz wykonuj dekompozycj kanoniczn. Mo|liwe nadpisanie nieakcentowania dla pewnych znaków, w zale|no[ci od twojego jzyka oraz wyszczególnienie dodatkowych dekompozycji, np.: ligatur. Dla ka|dego wpisu (oddzielony spacjami) pierwszy znak to zródBo, pozostaBe to tBumaczenie</p>p

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.

confgui::ConfTopPanelWJzyk AspellAspell languageconfgui::ConfTopPanelW4Nazwa katalogu bazy danychDatabase directory nameconfgui::ConfTopPanelWWyBcz u|ywanie Aspell do tworzenia przybli|eD w narzdziu przegldania terminów.<br> U|yteczne, gdy brak Aspell lub jest zepsuty. </br>‹Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work.
confgui::ConfTopPanelWZInterwaB (megabajty) opró|niania indeksowaniaIndex flush megabytes intervalconfgui::ConfTopPanelW8Nazwa pliku dziennika (logs) Log file nameconfgui::ConfTopPanelW4Poziom st|enia komunikatuLog verbosity levelconfgui::ConfTopPanelW.Maks. zu|ycie dysku (%)Max disk occupation (%)confgui::ConfTopPanelW$Brak u|ycia AspellNo aspell usageconfgui::ConfTopPanelW$Wykluczone [cie|ki Skipped pathsconfgui::ConfTopPanelWRReguBy ciosania (ang. stemming languages)Stemming languagesconfgui::ConfTopPanelWªPlik w którym zapisywane s komunikaty.<br>U|yj "stderr" by skorzysta z konsoli</br>UThe file where the messages will be written.
Use 'stderr' for terminal output
confgui::ConfTopPanelWìJzyk dla katalogu Aspell, wygldajcy jak "en" lub "pl" ..<br>Gdy brak, warto[ [rodowiska NLS zostanie u|yta (zwykle dziaBa). By sprawdzi, co posiadasz zainstalowane, wpisz "aspell config" po czym znajdz pliki .dat w katalogu "data-dir". </br>8The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory.
confgui::ConfTopPanelW¬Jzyki dla których sBownik rozszerzenia ciosania<br> (stemming) bdzie zbudowany.</br>NThe languages for which stemming expansion
dictionaries will be built.
confgui::ConfTopPanelW”Lista katalogów rekursywnego indeksowania. Domy[lnie: Twój katalog domowy.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWNazwa katalogu przechowania indeksu<br>Nieabsolutna [cie|ka jest brana wzgldnie do katalogu konfiguracji. Domy[lnie jest to "xapiandb".</br>šThe name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.
confgui::ConfTopPanelWDTe katalogi s wykluczone z indeksowania.<br> Dozwolone wieloznaczniki. Musz odpowiada [cie|kom znanym indekserowi (np.: je[li szczytowy katalog zawiera "/home/ja" i "/home" jest linkiem do "/usr/home", to poprawna [cie|ka to "/home/ja/tmp*", natomiast bBdna to "/usr/home/ja/tmp*")</br>(These are names of directories which indexing will not enter.
May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
confgui::ConfTopPanelWProcent zu|ycia dysku po którym indeksowanie zostanie przerwane (chroni przed zapeBnieniem dysku).<br>0 oznacz brak limitu (domy[lnie).</br>œThis is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).
0 means no limit (this is the default).
confgui::ConfTopPanelW$Ustawia próg indeksowania danych zanim zostan wysBane na dysk.<br>Odpowiada za kontrolowanie zu|ycia pamici przez indekser. Domy[lnie: 10MB</br>‘This value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB
confgui::ConfTopPanelWÎWarto[ ta ustawia ilo[ komunikatów,<br>od prostych bBdów a| po mnogie informacje diagnostyczne.</br>_This value adjusts the amount of messages,
from only errors to a lot of debugging data.
confgui::ConfTopPanelW$Szczytowe katalogiTop directoriesconfgui::ConfTopPanelWUnac exceptionsUnac exceptionsconfgui::ConfTopPanelW&Anuluj&CanceluiPrefsDialogBase&Ok&OKuiPrefsDialogBase <BR />
uiPrefsDialogBase<PRE />
uiPrefsDialogBase*<PRE> + zawijaj</PRE>
 + wrap
uiPrefsDialogBase|Wyszukanie dla [rolling stones] (2 terminy) zostanie zamienione na [rolling or stones or (rolling phrase 2 stones)]. To powinno da pierwszeDstwo wynikom, dokBadnie tak jak zostaBy wpisane.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBase>Oddzielacz snipetu streszczeniaAbstract snippet separatoruiPrefsDialogBase Aktywuj wszystko Activate AlluiPrefsDialogBaseDodaj indeks Add indexuiPrefsDialogBaseZastosuj zmiany Apply changesuiPrefsDialogBasedProste szukanie gdy u|yto biBych znaków we wpisie.-Auto-start simple search on whitespace entry.uiPrefsDialogBase\Automatycznie dodaj fraz do szukania prostego+Automatically add phrase to simple searchesuiPrefsDialogBase^Procentowy próg czsto[ci dla terminu Autofrazy.Autophrase term frequency threshold percentageuiPrefsDialogBaseWybierzChooseuiPrefsDialogBase0Wybierz edytor aplikacjiChoose editor applicationsuiPrefsDialogBaseâKliknij by doda kolejny katalog do listy. Mo|esz wybra zarówno katalog konfiguracji Recoll jak i indeks Xapian.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBase2Format daty (strftime(3))Date format (strftime(3))uiPrefsDialogBase$Deaktywuj wszystkoDeactivate AlluiPrefsDialogBaseNWyBcz podpowiedz Qt dla wpisu szukania*Disable Qt autocompletion in search entry.uiPrefsDialogBasePorzu zmianyDiscard changesuiPrefsDialogBaseŒWy[wietl filtr kategorii jako pasek zamiast panelu (wymagany restart).KDisplay category filter as toolbar instead of button panel (needs restart).uiPrefsDialogBasezTworzy sztuczne streszczenie nawet je[li dokument ma wBasne?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseìMam budowa streszczenie dla wyników po przez u|ycie kontekstu teminów zapytania? Mo|e zwalnia dla du|ych dokumentów.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase<Buduj streszczenia dynamicznieDynamically build abstractsuiPrefsDialogBaseLZmieD nagBówek HTML dla strony wyników#Edit result page html header insertuiPrefsDialogBaseBZmieD format paragrafu dla wyniku#Edit result paragraph format stringuiPrefsDialogBase WBczEnableuiPrefsDialogBase$Zewntrzne indeksyExternal IndexesuiPrefsDialogBaseêPróg czstotliow[ci procentowej dla której terminy wew. autofrazy nie s u|ywane. Czste terminy s powodem sBabej wydajno[ci fraz. Pominite terminy zwikszaj rozlu|nienie frazy oraz zmniejszanj wydajno[ autofrazy. Domy[lna warto[ to 2 (%).þFrequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBase6Ukryj duplikaty w wynikach.Hide duplicate results.uiPrefsDialogBase:Pod[wietl terminy z zapytaniaHighlight color for query termsuiPrefsDialogBasexWy[wietl tylko raz gdy tak sama zawarto[ (cho ró|ne nazwy)XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseÄLinie w PRE nie s zwijane. U|ycie BR zaciera wcicia. PRE + Zawijaj styl mo|e by tym co szukasz.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBaselMaks. rozmiar tekstu dla wyró|nienia w podgldzie (MB)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase2Liczba wyników na stronie"Number of entries in a result pageuiPrefsDialogBase@Otwórz okno by wybra snipet CSSAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBase8Otwiera okno wyboru czcionek-Opens a dialog to select the result list fontuiPrefsDialogBaseDOtwiera okno wyboru arkusza stylów-Opens a dialog to select the style sheet fileuiPrefsDialogBase"Zcie|ki tBumaczeDPaths translationsuiPrefsDialogBaseDStyl linii czystego tekstu do HTMLPlain text to HTML line styleuiPrefsDialogBase\U|yj HTML (zamiast czysty tekst) dla podgldu.&Prefer Html to plain text for preview.uiPrefsDialogBase\Magiczne przyrostki nazw plików jzyka zapytaD(Query language magic file name suffixes.uiPrefsDialogBase2Pamitaj stan sortowania.Remember sort activation state.uiPrefsDialogBase^UsuD z listy. Brak skutku dla indeksu na dysku.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase UsuD zaznaczenieRemove selecteduiPrefsDialogBase@ZamieD streszczenia z dokumentów Replace abstracts from documentsuiPrefsDialogBase ResetResetuiPrefsDialogBase Reset stylu okna Resets the Snippets window styleuiPrefsDialogBaseFReset czcionki wyników do domy[lnej1Resets the result list font to the system defaultuiPrefsDialogBaseDReset arkusza stylów do domy[lnych!Resets the style sheet to defaultuiPrefsDialogBaseLista wyników Result ListuiPrefsDialogBase,Czcionka listy wynikówResult list fontuiPrefsDialogBase.Szukaj podczas pisania.Search as you type.uiPrefsDialogBase$Parametry szukaniaSearch parametersuiPrefsDialogBase$Okno snippetów CSSSnippets window CSS fileuiPrefsDialogBaseRRozpocznij oknem zaawansowanego szukania.'Start with advanced search dialog open.uiPrefsDialogBaseJzyk ciosaniaStemming languageuiPrefsDialogBaseArkusz stylów Style sheetuiPrefsDialogBaseTKontekstowe wyrazy sztucznego streszczenia Synthetic abstract context wordsuiPrefsDialogBaseVRozmiar sztucznego streszczenia (w znakach)$Synthetic abstract size (characters)uiPrefsDialogBase†Teksty powy|ej tego rozmiaru bd ukryte w podgldzie (zbyt wolne).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase¸Wyrazy z listy zostan automatycznie zmienione w klauzule ext:xxx we wpisach jzyka zapytaD.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase$Odwróc zaznaczenieToggle selecteduiPrefsDialogBase WygldUser interfaceuiPrefsDialogBaseUstawieniaUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_es.ts0000644000175000017500000043373413224431020014241 00000000000000 AdvSearch All clauses Todas las cláusulas Any clause Cualquier cláusula texts textos spreadsheets hojas de cálculo presentations presentaciones media medios messages mensajes other otros Bad multiplier suffix in size filter Sufijo multiplicador incorrecto en filtro de tamaño text texto spreadsheet hoja de cálculo presentation presentación message mensaje AdvSearchBase Advanced search Búsqueda avanzada Search for <br>documents<br>satisfying: Buscar documentos<br>que satisfagan: Delete clause Borrar cláusula Add clause Añadir cláusula Restrict file types Restringir tipos de archivo Check this to enable filtering on file types Marque esto para habilitar filtros en tipos de archivos By categories Por categorías Check this to use file categories instead of raw mime types Marque esto para usar categorías en lugar de tipos MIME Save as default Guardar como predeterminado Searched file types Tipos de archivos buscados All ----> Todos ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Todos Ignored file types Tipos de archivos ignorados Enter top directory for search Ingrese directorio inicial para la búsqueda Browse Buscar Restrict results to files in subtree: Restringir resultados a archivos en subdirectorio: Start Search Iniciar búsqueda Close Cerrar All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Todos los campos no vacíos a la derecha serán combinados con conjunciones AND (opción "Todas las cláusulas") o OR (opción "Cualquier cláusula").<br>Los campos "Cualquiera", "Todas" y "Ninguna" pueden aceptar una mezcla de palabras simples y frases dentro de comillas dobles.<br>Campos sin datos son ignorados. Invert Invertir Minimum size. You can use k/K,m/M,g/G as multipliers Tamaño mínimo. Puede utilizar k/K, m/M o g/G como multiplicadores Min. Size Tamaño Mínimo Maximum size. You can use k/K,m/M,g/G as multipliers Tamaño máximo. Puede utilizar k/K, m/M o g/G como multiplicadores Max. Size Tamaño máximo Filter Filtro Check this to enable filtering on dates Marque esto para habilitar filtros en fechas Filter dates Filtrar fechas From Desde To Hasta Find Buscar Check this to enable filtering on sizes Marque esto para habilitar filtros en tamaños Filter sizes Filtro de tamaños CronToolW Cron Dialog Ventana de Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> horario de indexado por lotes (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Cada campo puede contener un comodín (*), un valor numérico único, listas separadas por comas (1,3,5) y rangos (1-7). Más generalmente, los campos serán usados <span style=" font-style:italic;">tal como son</span> dentro del archivo crontab, y toda la sintaxis crontab puede ser usada, ver crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Por ejemplo, ingresar <span style=" font-family:'Courier New,courier';">*</span> en <span style=" font-style:italic;">Días, </span><span style=" font-family:'Courier New,courier';">12,19</span> en <span style=" font-style:italic;">Horas</span> y <span style=" font-family:'Courier New,courier';">15</span> en <span style=" font-style:italic;">Minutos</span> iniciaría recollindex cada día a las 12:15 AM y 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Un horario con activaciones frecuentes es probablemente menos eficiente que la indexación en tiempo real.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Días de la semana (* o 0-7, 0 o 7 es Domingo) Hours (* or 0-23) Horas (* o 0-23) Minutes (0-59) Minutos (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Presione <span style=" font-style:italic;">Deshabilitar</span> para detener la indexación automática por lotes, <span style=" font-style:italic;">Habilitar</span> para activarla, <span style=" font-style:italic;">Cancelar</span> para no cambiar nada.</p></body></html> Enable Habilitar Disable Deshabilitar It seems that manually edited entries exist for recollindex, cannot edit crontab Parece ser que existen entradas para recollindex editadas manualmente, no se puede editar crontab Error installing cron entry. Bad syntax in fields ? Error al instalar entrada de cron. Sintaxis incorrecta en los campos? EditDialog Dialog Ventana de diálogo EditTrans Source path Ruta de origen Local path Ruta local Config error Error de configuración Original path Ruta original EditTransBase Path Translations Ruta de traducciones Setting path translations for Establecer ruta de traducciones para Select one or several file types, then use the controls in the frame below to change how they are processed Seleccione uno o más tipos de archivos, y use los controles en la caja abajo para cambiar cómo se procesan Add Añadir Delete Borrar Cancel Cancelar Save Guardar FirstIdxDialog First indexing setup Primera configuración de indexación <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Parece ser que el índice para esta configuración no existe.</span><br /><br />Si solamente desea indexar su directorio personal con un conjunto de valores iniciales razonables, presione el botón <span style=" font-style:italic;">Iniciar indexación ahora</span>. Es posible ajustar los detalles más tarde.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Si necesita más control, use los enlaces siguientes para ajustar la configuración de indexación y el horario.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Estas herramientas pueden ser accedidas luego desde el menú <span style=" font-style:italic;">Preferencias</span>.</p></body></html> Indexing configuration Configuración de indexación This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Esto le permite ajustar los directorios que quiere indexar y otros parámetros, como rutas de archivos o nombres excluidos, conjuntos de caracteres estándar, etc. Indexing schedule Horario de indexación This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Esto le permite escoger entre indexación en tiempo real y por lotes, y configurar un horario automático para indexar por lotes (utilizando cron). Start indexing now Iniciar indexación ahora FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup Configuración de horario de indexación <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede ejecutarse permanentemente, indexando archivos cuando cambian, o puede ejecutarse en intervalos discretos. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Leer el manual puede ayudarle a decidir entre estos dos métodos (presione F1).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Esta herramienta puede ayudarle a configurar un horario para automatizar la ejecución de indexación por lotes, o iniciar la indexación en tiempo real cuando inicia la sesión (o ambos, lo cual rara vez tiene sentido).</p></body></html> Cron scheduling Horario de Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Esta herramienta le permite decidir a qué hora la indexación se ejecutará e instalará una entrada en el crontab. Real time indexing start up Inicio de la indexación en tiempo real Decide if real time indexing will be started when you log in (only for the default index). Decida si la indexación en tiempo real será ejecutada cuando inicie la sesión (solo para el índice estándar). ListDialog Dialog Ventana de diálogo GroupBox Cuadro de grupo Main No db directory in configuration Directorio de base de datos no está configurado Could not open database in No se puede abrir base de datos en . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Presione Cancelar si desea editar la configuración antes de indexar, o Ok para proceder. "history" file is damaged or un(read)writeable, please check or remove it: El archivo de historial esta dañado o no se puede leer, por favor revíselo o bórrelo: Preview Close Tab Cerrar Pestaña Cannot create temporary directory No se puede crear directorio temporal Cancel Cancelar Missing helper program: Programa ayudante faltante: Can't turn doc into internal representation for No se puede convertir documento a representación interna para Creating preview text Creando texto de vista previa Loading preview text into editor Cargando texto de vista previa en el editor &Search for: &Buscar por: &Next &Siguiente &Previous &Previo Clear Limpiar Match &Case &Coincidir mayúsculas y minúsculas Cannot create temporary directory: No se puede crear directorio temporal: Error while loading file Error al cargar archivo PreviewTextEdit Show fields Mostrar campos Show main text Mostrar texto principal Print Imprimir Print Current Preview Imprimir vista previa actual Show image Mostrar imagen Select All Seleccionar todo Copy Copiar Save document to file Guardar documento en un archivo Fold lines Doblar líneas Preserve indentation Preservar indentación QObject Global parameters Parámetros globales Local parameters Parámetros locales <b>Customised subtrees <b>Subdirectorios personalizados The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. La lista de subdirectorios en la jerarquía indexada<br>dónde algunos parámetros necesitan ser definidos. Valor por defecto: vacío. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Los parámetros siguientes se aplican a nivel superior, si una línea vacía<br>o ninguna es seleccionada en el listado arriba, o para cada directorio seleccionado.<br>Puede añadir o remover directorios presionando los botones +/-. Skipped names Nombres omitidos These are patterns for file or directory names which should not be indexed. Estos son patrones de nombres de archivos o directorios que no deben ser indexados. Default character set Conjunto de caracteres por defecto This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Este es el conjunto de caracteres usado para leer archivos que no son identificados internamente, por ejemplo, archivos de texto puro.<br>El valor por defecto está vacío, y el valor del ambiente NLS es usado. Follow symbolic links Seguir enlaces simbólicos Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Seguir enlaces simbólicos al indexar. El valor por defecto es no, para evitar indexar duplicados Index all file names Indexar todos los nombres de archivos Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indexar los nombres de los archivos para los cuales los contenidos no pueden ser<br>identificados o procesados (tipo MIME inválido o inexistente). El valor por defecto es verdadero Beagle web history Historial web Beagle Search parameters Parámetros de búsqueda Web history Historial Web Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &Open &Abrir Open With Run Script Copy &File Name Copy &URL Copiar &URL &Write to File Save selection to files Guardar selección a archivos Preview P&arent document/folder &Open Parent document/folder &Abrir documento/directorio ascendente Find &similar documents Buscar documentos &similares Open &Snippets window Abrir ventana de &fragmentos Show subdocuments / attachments Mostrar subdocumentos / adjuntos QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start Inicio automático de la indexación en tiempo real <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">La indexación de <span style=" font-weight:600;">Recoll</span> puede configurarse para ejecutar como un demonio, actualizando el índice cuando los archivos cambian, en tiempo real. Obtiene un índice actualizado siempre, pero los recursos del sistema son utilizados permanentemente.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Iniciar el demonio de indexación con mi sesión de escritorio. Also start indexing daemon right now. También iniciar demonio de indexación ahora mismo. Replacing: Reemplazando: Replacing file Reemplazando archivo Can't create: No se puede crear: Warning Advertencia Could not execute recollindex No se puede ejecutar recollindex Deleting: Borrando: Deleting file Borrando archivo Removing autostart Eliminando autoinicio Autostart file deleted. Kill current process too ? Archivo de autoinicio borrado. Detener el proceso actual también? RclMain (no stemming) (sin raíces) (all languages) (todos los lenguajes) error retrieving stemming languages error al recuperar lenguajes para raíces Indexing in progress: Indexación en progreso: Files Ficheros Purge Stemdb Raízdb Closing Cerrando Unknown Desconocido Can't start query: No se puede iniciar la consulta: Query results Resultados de búsqueda Cannot retrieve document info from database No se puede recuperar información del documento de la base de datos Warning Advertencia Can't create preview window No se puede crear ventana de vista previa This search is not active any more Esta búsqueda no está activa Bad viewer command line for %1: [%2] Please check the mimeconf file Línea de comando incorrecta de visualizador para %1: [%2] Por favor revise el fichero mimeconf Cannot extract document or create temporary file No se puede extraer el documento o crear archivo temporal Executing: [ Ejecutando: [ About Recoll Acerca de Recoll History data Datos de historial Document history Historial de documentos Update &Index Actualizar &Ãndice Indexing interrupted Indexación interrumpida Stop &Indexing Detener &Indexación All Todo media medios message mensaje other otro presentation presentación spreadsheet hoja de cálculo text texto sorted ordenado filtered filtrado External applications/commands needed and not found for indexing your file types: Aplicaciones/comandos externos necesarios y no encontrados para indexar sus tipos de fichero: No helpers found missing Missing helper programs Programas ayudantes faltantes Document category filter Filtro de categorías de documentos No external viewer configured for mime type [ No hay visualizador configurado para tipo MIME [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: No se puede accesar el archivo: Can't uncompress file: No se puede descomprimir el archivo: Save file Guardar archivo Result count (est.) Conteo de resultados (est.) Query details Detalles de búsqueda Could not open external index. Db not open. Check external indexes list. No se puede abrir índice externo. Base de datos no abierta. Revise listado de índices externos. No results found No hay resultados None Ninguno Updating Actualizando Done Hecho Monitor Monitor Indexing failed Indexación falló The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone El proceso de indexación actual no se inicio desde esta interfaz. Presione Ok para detenerlo, o Cancelar para dejarlo ejecutar Erasing index Borrando índice Reset the index and start from scratch ? Restaurar el índice e iniciar desde cero? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Consulta en progreso.<br>Debido a limitaciones en la librería de indexación,<br>cancelar terminará el programa Error Error Index not open Ãndice no está abierto Index query error Error de consulta del índice Indexed Mime Types Tipos MIME indexados Content has been indexed for these mime types: Los contenidos han sido indexados para estos tipos MIME: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Ãndice no actualizado para este fichero. No mostrado para evitar utilizar la entrada errónea. Presione Ok para actualizar el índice para este fichero, luego ejecute la consulta de nuevo cuando la indexación termine. En caso contrario, presione Cancelar. Can't update index: indexer running No se puede actualizar el índice: indexador en ejecución Indexed MIME Types Tipos MIME indexados Bad viewer command line for %1: [%2] Please check the mimeview file Línea de comando incorrecta de visualizador para %1: [%2] Por favor revise el archivo mimeconf Viewer command line for %1 specifies both file and parent file value: unsupported Línea de comandos del visualizador para %1 especifica valores para el archivo y el archivo padre: no soportado Cannot find parent document No se encuentra documento padre Indexing did not run yet La indexación no se ha ejecutado aún External applications/commands needed for your file types and not found, as stored by the last indexing pass in Aplicaciones/comandos externos requeridos por sus tipos de archivos y no encontrados, como se almacenaron en el último pase de indexación en Index not up to date for this file. Refusing to risk showing the wrong entry. El índice no está actualizado para este archivo. Rehusando mostrar la entrada equivocada. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Presione Ok para actualizar el índice para este archivo, y ejecute de nuevo la consulta cuando la indexación termine. En caso contrario, cancele. Indexer running so things should improve when it's done El indexador está en ejecución, así que las cosas deberían mejorar cuando termine Sub-documents and attachments Sub-documentos y adjuntos Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents Documentos duplicados These Urls ( | ipath) share the same content: Estos URLs ( | ipath) comparten el mismo contenido: Bad desktop app spec for %1: [%2] Please check the desktop file The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll Recoll Search tools Herramientas de búsqueda Result list Lista de resultados &File &Archivo &Tools &Herramientas &Preferences &Preferencias &Help &Ayuda E&xit &Salir Ctrl+Q Ctrl+Q Update &index Actualizar &índice &Erase document history Borrar historial de &documentos &About Recoll &Acerca de Recoll &User manual Manual de &Usuario Document &History Historial de &Documentos Document History Historial de Documentos &Advanced Search Búsqueda &Avanzada Advanced/complex Search Búsqueda avanzada/compleja &Sort parameters Parámetros de &ordenamiento Sort parameters Parámetros de ordenamiento Term &explorer &Explorador de términos Term explorer tool Herramienta de exploración de términos Next page Siguiente página Next page of results Página de resultados siguiente First page Primera página Go to first page of results Ir a la primera página de resultados Previous page Página anterior Previous page of results Página de resultados anterior &Query configuration Configuración de &consulta External index dialog Configuración de índices externos &Indexing configuration Configuración de &indexación All Todo &Show missing helpers &Mostrar ayudantes faltantes PgDown AvPág PgUp RePág &Full Screen Pantalla &Completa F11 F11 Shift+Home Mayúsculas+Inicio Full Screen Pantalla Completa &Erase search history Borrar historial de &búsqueda sortByDateAsc ordenarPorFechaAsc Sort by dates from oldest to newest Ordenar por fechas de la más antigua a la más reciente sortByDateDesc ordenarPorFechaDesc Sort by dates from newest to oldest Ordenar por fechas de la más reciente a la más antigua Show Query Details Mostrar resultados de la consulta Show results as table Mostrar resultados tabulados &Rebuild index &Reconstruir índice &Show indexed types &Mostrar tipos indexados Shift+PgUp Mayúsculas+RePág &Indexing schedule &Horario de indexación E&xternal index dialog &Configuración de índices externos &Index configuration &Configuración del Ãndice &GUI configuration Configuración de &GUI &Results &Resultados Sort by date, oldest first Ordenar por fecha, antiguos primero Sort by date, newest first Ordenar por fecha, recientes primero Show as table Mostrar como tabla Show results in a spreadsheet-like table Mostrar resultados en una tabla similar a una hoja de cálculo Save as CSV (spreadsheet) file Guardar como un archivo CSV (hoja de cálculo) Saves the result into a file which you can load in a spreadsheet Guardar el resultado en un archivo que se puede cargar en una hoja de cálculo Next Page Página Siguiente Previous Page Página Anterior First Page Primera Página Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel Abstract Resumen Author Autor Document size Tamaño del documento Document date Fecha del documento File size Tamaño del archivo File name Nombre del archivo File date Fecha del archivo Ipath Ipath Keywords Palabras clave Mime type Tipo MIME Original character set Conjunto de caracteres original Relevancy rating Calificación de relevancia Title Título URL URL Mtime Fecha Mod Date Fecha Date and time Fecha y hora Ipath Ipath MIME type Tipo MIME ResList Result list Lista de resultados (show query) (mostrar consulta) &Preview &Vista Previa Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL Find &similar documents Buscar documentos &similares Document history Historial de documentos <p><b>No results found</b><br> <p><b>No hay resultados</b></br> Previous Anterior Next Siguiente Unavailable document Documento no disponible Preview Vista previa Open Abrir <p><i>Alternate spellings (accents suppressed): </i> <p><i>Ortografía alterna (acentos suprimidos): </i> &Write to File &Escribir a fichero Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente &Open &Abrir Documents Documentos out of at least de por lo menos for para <p><i>Alternate spellings: </i> <p><i>Escrituras Alternas: </i> Duplicate documents Documentos duplicados These Urls ( | ipath) share the same content: Estos URLs ( | ipath) comparten el mismo contenido: Result count (est.) Conteo de resultados (est.) Query details Detalles de búsqueda Snippets Fragmentos ResTable &Reset sort &Restaurar ordenamiento &Delete column &Borrar columna Add " Añadir " " column " columna Save table to CSV file Guardar tabla a archivo CSV Can't open/create file: No se puede abrir/crear archivo: &Preview &Vista previa &Open &Abrir Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL &Write to File &Escribir a fichero Find &similar documents Buscar documentos &similares Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente &Save as CSV &Guardar como CSV Add "%1" column Agregar columna "%1" ResTableDetailArea &Preview &Vista previa &Open &Abrir Copy &File Name Copiar nombre de &fichero Copy &URL Copiar &URL &Write to File &Escribir a fichero Find &similar documents Buscar documentos &similares Preview P&arent document/folder &Vista previa de documento/directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente ResultPopup &Preview &Previsualización &Open &Abrir Copy &File Name Copiar nombre de &archivo Copy &URL Copiar &URL &Write to File &Escribir a archivo Save selection to files Guardar selección a archivos Preview P&arent document/folder &Vista previa de documento o directorio ascendente &Open Parent document/folder &Abrir documento/directorio ascendente Find &similar documents Buscar documentos &similares Open &Snippets window Abrir ventana de &fragmentos Show subdocuments / attachments Mostrar subdocumentos / adjuntos SSearch Any term Cualquier término All terms Todos los términos File name Nombre de archivo Query language Lenguaje de consulta Bad query string Consulta inválida Out of memory No hay memoria Too many completions Demasiadas finalizaciones Completions Finalizaciones Select an item: Seleccione un ítem: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Ingrese expresión de lenguaje de consulta. Hoja de trucos:<br> <i>term1 term2</i> : 'term1' y 'term2' en cualquier campo.<br> <i>campo:term1</i> : 'term1' en campo 'campo'. <br> Nombres de campos estándar/sinónimos:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-campos: dir, mime/format, type/rclcat, date.<br> Dos ejemplos de intervalo de fechas: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> Los paréntesis no están permitidos en realidad.<br> <i>"term1 term2"</i> : frase (debe aparecer exactamente). Modificadores posibles:<br> <i>"term1 term2"p</i> : busca de proximidad sin orden con distancia estándar.<br> Use el enlace <b>Mostrar Consulta</b> en caso de duda sobre el resultado y vea el manual (&lt;F1>) para más detalles. Enter file name wildcard expression. Ingrese expresión de comodín para nombre de archivo. Enter search terms here. Type ESC SPC for completions of current term. Ingrese términos de búsqueda aquí. Presione ESC ESPACIO para completar el término actual. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear Limpiar Ctrl+S Ctrl+S Erase search entry Borrar entrada de búsqueda Search Búsqueda Start query Iniciar consulta Enter search terms here. Type ESC SPC for completions of current term. Ingrese términos de búsqueda aquí. Presione ESC ESP para completar el término actual. Choose search type. Elija tipo de búsqueda. SearchClauseW Any of these Cualquiera All of these Todas None of these Ninguna This phrase Frase Terms in proximity Términos en proximidad File name matching Nombre de fichero Select the type of query that will be performed with the words Elija el tipo de consulta que será realizada con las palabras Number of additional words that may be interspersed with the chosen ones Número de palabras adicionales que pueden ser intercaladas con las escogidas No field Ningún campo Any Cualquiera All Todo None Ninguno Phrase Frase Proximity Proximidad File name Nombre de archivo Snippets Snippets Fragmentos about:blank about:blank Find: Buscar: Next Siguiente Prev Anterior SnippetsW Search Buscar <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse Buscar Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer Explorador de términos &Expand &Expandir Alt+E Alt+E &Close &Cerrar Alt+C Alt+C No db info. No hay información de bd. Match Lenguaje Case Distinción de mayúsculas Accents Acentos SpellW Wildcards Comodines Regexp Expresión regular Stem expansion Expansión de raíces Spelling/Phonetic Ortografía/fonética error retrieving stemming languages error al recuperar lenguajes para raíces Aspell init failed. Aspell not installed? Inicialización de Aspell falló. Está instalado Aspell? Aspell expansion error. Error de expansión de Aspell. No expansion found Expansión no encontrada Term Término Doc. / Tot. Doc./Tot. Index: %1 documents, average length %2 terms Ãndice: %1 documentos, largo promedio %2 términos Index: %1 documents, average length %2 terms.%3 results Ãndice: %1 documentos, largo promedio %2 términos. %3 resultados %1 results %1 resultados List was truncated alphabetically, some frequent La lista fue separada alfabéticamente, algunos términos terms may be missing. Try using a longer root. frecuentes pueden no aparecer. Intente usar una raíz más larga. Show index statistics Mostrar estadísticas del índice Number of documents Número de documentos Average terms per document Términos promedio por documento Smallest document length Tamaño del documento más pequeño Longest document length Tamaño del documento más grande Database directory size Tamaño del directorio de la base de datos MIME types: Tipos MIME: Item Elemento Value Valor Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog error retrieving stemming languages error al recuperar lenguajes para raíces The selected directory does not appear to be a Xapian index El directorio seleccionado no parece ser un índice Xapian This is the main/local index! Este es el índice local o principal! The selected directory is already in the index list El directorio seleccionado ya está en la lista de índices Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Seleccione el directorio para el índice Xapian (ej: /home/buddy/.recoll/xapiandb) Choose Elegir Result list paragraph format (erase all to reset to default) Formato de párrafo para la lista de resultados (borre todo para volver al valor por defecto) Result list header (default is empty) Encabezado de la lista de resultados (valor por defecto es vacío) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Seleccionar el directorio de configuración de recoll o el directorio para el índice xapian (ej: /home/me/.recoll o /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read El directorio seleccionado parecer ser un directorio de configuración de Recoll pero la configuración no puede ser leída At most one index should be selected Al menos un índice debe ser seleccionado Cant add index with different case/diacritics stripping option No se puede agregar un índice con diferente opción para remover mayúsculas/minúsculas/diacríticos Default QtWebkit font Any term Cualquier término All terms Todos los términos File name Query language Lenguaje de consulta Value from previous program exit ViewAction Changing actions with different current values Cambiando acciones con valores actuales diferentes Mime type Tipo MIME Command Comando MIME type Tipo MIME Desktop Default Valor predeterminado del ambiente de escritorio Changing entries with different current values Cambiando entradas con diferentes valores actuales ViewActionBase Native Viewers Visualizadores Nativos Select one or several file types, then click Change Action to modify the program used to open them Seleccione uno o varios tipos de fichero, luego presione Cambiar Acción para modificar el programa usado para abrirlos Change Action Cambiar Acción Close Cerrar Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Seleccione uno o varios tipos MIME y presione "Cambiar Acción"<br>Puede también cerrar esta ventana y marcar "Usar preferencias del escritorio"<br>en el panel principal para ignorar esta lista y usar los valores estándar de su escritorio. Select one or several mime types then use the controls in the bottom frame to change how they are processed. Seleccione uno o más tipos mime, y use los controles en la caja abajo para cambiar cómo se procesan. Use Desktop preferences by default Usar preferencias del escritorio como estándar Select one or several file types, then use the controls in the frame below to change how they are processed Seleccione uno o más tipos de archivos, y use los controles en la caja abajo para cambiar cómo se procesan Exception to Desktop preferences Excepción de las preferencias del escritorio Action (empty -> recoll default) Acción (vacío -> valor por defecto de recoll) Apply to current selection Aplicar a la selección actual Recoll action: Acción current value valor Select same Seleccionar misma <b>New Values:</b> <b>Nuevos valores</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Steal Beagle indexing queue Robar cola de indexado de Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle NO DEBE estar ejecutándose. Habilita procesar la cola para indexar el historial web de Firefox de Beagle.<br>(debe también instalar el plugin Beagle para Firefox) Entries will be recycled once the size is reached Las entradas serán recicladas una vez que el tamaño es alcanzado Web page store directory name Nombre del directorio del almacén para páginas web The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. El nombre del directorio dónde almacenar las copias de páginas web visitadas.<br>Una ruta de directorio no absoluta es utilizada, relativa al directorio de configuración. Max. size for the web store (MB) Tamaño máximo para el almacén web (MB) Process the WEB history queue Procesar la cola del historial WEB Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Habilita la indexación de páginas visitadas en Firefox.<br>(necesita también el plugin Recoll para Firefox) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file No se puede escribir archivo de configuración confgui::ConfParamFNW Choose Elegir confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Sensibilidad automática de diacríticos <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>Habilitar automáticamente la sensibilidad de diacríticos si el término de búsqueda tiene caracteres acentuados (no presentes en unac_except_trans). De otra forma necesita usar el lenguage de búsqueda y el modificador <i>D</i> para especificar la sensibilidad de los diacríticos. Automatic character case sensitivity Sensibilidad automática a la distinción de mayúsculas/minúsculas de los caracteres <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>Habilitar automáticamente la sensibilidad a las mayúsculas/minúsculas si la entrada tiene caracteres en mayúscula en una posición distinta al primer caracter. De otra forma necesita usar el lenguaje de búsqueda y el modificador <i>C</i> para especificar la sensibilidad a las mayúsculas y minúsculas. Maximum term expansion count Máximo conteo de expansión de términos <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>Máxima expansión de conteo para un solo término (ej: cuando se usan comodines). El valor por defecto de 10000 es razonable y evitará consultas que parecen congelarse mientras el motor de búsqueda recorre la lista de términos. Maximum Xapian clauses count Máximo conteo de cláusulas de Xapian <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>Número máximo de cláusulas elementales agregadas a una consulta de Xapian. En algunos casos, el resultado de la expansión de términos puede ser multiplicativo, y deseamos evitar el uso excesivo de memoria. El valor por defecto de 100000 debería ser lo suficientemente alto en la mayoría de los casos, y compatible con las configuraciones de hardware típicas en la actualidad. confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Tamaño máximo de archivo comprimido (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Este valor establece un umbral mas allá del cual los archivos<br>comprimidos no serán procesados. Escriba 1 para no tener límite,<br>o el número 0 para nunca hacer descompresión. Max. text file size (MB) Tamaño máximo para archivo de texto (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Este valor establece un umbral más allá del cual los archivos de texto no serán procesados.<br>Escriba 1 para no tener límites. Este valor es utilizado para excluir archivos de registro gigantescos del índice. Text file page size (KB) Tamaño de página para archivo de texto (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Si se utiliza este valor (diferente de -1), los archivos de texto serán separados en partes de este tamaño para ser indexados. Esto ayuda con las búsquedas de archivos de texto muy grandes (ej: archivos de registro). Max. filter exec. time (S) Tiempo máximo de ejecución de filtros (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Filtros externos que se ejecuten por más tiempo del establecido serán abortados.<br>Esto ocurre en los raros casos (ej: postscript) cuando un documento hace que un filtro entre en un ciclo.<br>Establezca un valor de -1 para no tener límite. External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Filtros externos que se ejecuten por más tiempo del establecido serán detenidos. Esto es por el caso inusual (ej: postscript) dónde un documento puede causar que un filtro entre en un ciclo infinito. Establezca el número -1 para indicar que no hay límite. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories Directorios primarios The list of directories where recursive indexing starts. Default: your home. La lista de directorios donde la indexación recursiva comienza. Valor por defecto: su directorio personal. Skipped paths Directorios omitidos These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Estos son los nombres de directorios los cuales no se indexan.<br>Puede contener comodines. Debe corresponder a las rutas vistas por el indexador (ej: si los directorios primarios incluyen '/home/me' y '/home' es en realidad un enlace a '/usr/home', la entrada correcta para directorios omitidos sería '/home/me/tmp*', no '/usr/home/me/tmp*') Stemming languages Lenguajes para raíces The languages for which stemming expansion<br>dictionaries will be built. Los lenguajes para los cuales los diccionarios de expansión de raíces serán creados. Log file name Nombre de archivo de registro The file where the messages will be written.<br>Use 'stderr' for terminal output El archivo donde los mensajes serán escritos.<br>Use 'stderr' para salida a la terminal Log verbosity level Nivel de verbosidad del registro This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Este valor ajusta la cantidad de mensajes,<br>desde solamente errores hasta montones de información de depuración. Index flush megabytes interval Intervalo en megabytes de escritura del índice This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Este valor ajusta la cantidad de datos indexados entre escrituras al disco.<br> Esto ayuda a controlar el uso de memoria del indexador. Valor estándar 10MB Max disk occupation (%) Utilización máxima de disco (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Este es el porcentaje de utilización de disco donde la indexación fallará y se detendrá (para evitar llenarle el disco).<br>0 significa sin límites (valor por defecto). No aspell usage No utilizar aspell Aspell language Lenguaje Aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. El lenguaje para el diccionario aspell. Esto debe ser algo como 'en' o 'fr'...<br>Si este valor no se especifica, el ambiente NLS será usado para averiguarlo, lo cual usualmente funciona. Para tener una idea de qué esta instalado en su sistema escriba 'aspell-config' y busque por ficheros .dat dentro del directorio 'data-dir'. Database directory name Nombre del directorio de base de datos The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Nombre del directorio donde almacenar el índice.<br>Un valor no absoluto para la ruta de directorio es usado, relativo al directorio de configuración. El valor estándar es 'xapiandb'. Use system's 'file' command Utilizar el comando 'file' del sistema Use the system's 'file' command if internal<br>mime type identification fails. Utilizar el comando 'file' del sistema si la identificación interna de tipos MIME falla. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Deshabilita el uso de aspell para generar aproximaciones ortográficas en la herramienta explorador de términos.<br>Útil si aspell no se encuentra o no funciona. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. El lenguaje para el diccionario aspell. Esto debería ser algo como 'en' o 'fr' ...<br>Si no se establece este valor, el ambiente NLS será utilizado para calcularlo, lo cual usualmente funciona. Para tener una idea de lo que está instalado en sus sistema, escriba 'aspell-config' y busque archivos .dat dentro del directorio 'data-dir'. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. El nombre de un directorio donde almacenar el índice.<br>Una ruta no absoluta se interpreta como relativa al directorio de configuración. El valor por defecto es 'xapiandb'. Unac exceptions Excepciones Unac <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Estas son excepciones al mecanismo unac, el cual, de forma predeterminada, elimina todos los diacríticos, y realiza una descomposición canónica. Es posible prevenir la eliminación de acentos para algunos caracteres, dependiendo de su lenguaje, y especificar descomposiciones adicionales, por ejemplo, para ligaturas. En cada entrada separada por espacios, el primer caracter es el origen, y el resto es la traducción. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Preferencias de usuario User interface Interfaz de usuario Number of entries in a result page Número de elementos en la página de resultados If checked, results with the same content under different names will only be shown once. Si está marcado, los resultados con el mismo contenido bajo nombres diferentes serán mostrados solo una vez. Hide duplicate results. Esconder resultados duplicados. Highlight color for query terms Color de resaltado para términos de búsqueda Result list font Tipo de letra para lista de resultados Opens a dialog to select the result list font Abre una ventana para seleccionar el tipo de letra para la lista de resultados Helvetica-10 Helvetica-10 Resets the result list font to the system default Restaurar el tipo de letra de la lista de resultados al valor por defecto del sistema Reset Restaurar Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Define el formato para cada párrafo de resultados. Utilice formato qt-html y reemplazos estilo printf:<br>%A Resumen<br> %D Fecha<br> %I Nombre del ícono<br> %K Palabras clave (si existen)<br> %L Enlaces de vista previa y edición<br> %M Tipo MIME<br> %Número de resultado<br> %R Porcentaje de relevancia<br> %S Información de tamaño<br> %T Título<br> %U Url<br> Result paragraph<br>format string Texto de formato para<br>párrafo de resultados Texts over this size will not be highlighted in preview (too slow). Textos más allá de este tamaño no serán resaltados (muy lento). Maximum text size highlighted for preview (megabytes) Tamaño máximo de texto resaltado para vista previa (megabytes) Use desktop preferences to choose document editor. Usar preferencias del escritorio para seleccionar editor de documentos. Choose editor applications Escoger aplicaciones para edición Display category filter as toolbar instead of button panel (needs restart). Mostrar filtros de categorías como barra de herramientas en lugar de panel de botones (necesita reinicio). Auto-start simple search on whitespace entry. Auto iniciar búsqueda simple al entrar espacios en blanco. Start with advanced search dialog open. Iniciar con la ventana de búsqueda avanzada abierta. Remember sort activation state. Recordar estado de activación de ordenamiento. Prefer Html to plain text for preview. Preferir HTML a texto simple para vista previa. Search parameters Parámetros de búsqueda Stemming language Lenguaje de raíces A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una búsqueda por [rolling stones] (2 términos) será cambiada por [rolling or stones or (rolling phrase 2 stones)]. Esto dará mayor precedencia a los resultados en los cuales los términos de búsqueda aparecen exactamente como fueron escritos. Automatically add phrase to simple searches Automáticamente añadir frases a búsquedas simples Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. ¿Intentar construir resúmenes para elementos en la lista de resultados utilizando el contexto de los términos de búsqueda? Puede ser lento para documentos grandes. Dynamically build abstracts Construir resúmenes dinámicamente Do we synthetize an abstract even if the document seemed to have one? ¿Sintetizar un resumen aunque el documento parece tener uno? Replace abstracts from documents Reemplazar resúmenes de los documentos Synthetic abstract size (characters) Tamaño del resumen sintetizado (caracteres) Synthetic abstract context words Palabras de contexto del resumen sintetizado The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Las palabras en la lista serán convertidas automáticamente a cláusulas ext:xxx en el ingreso de lenguaje de consulta. Query language magic file name suffixes. Sufijos para nombres mágicos de archivos en el lenguaje de consulta. Enable Habilitar External Indexes Ãndices Externos Toggle selected Cambiar selección Activate All Activar Todos Deactivate All Desactivar Todos Remove from list. This has no effect on the disk index. Eliminar de la lista. Esto no tiene efecto en el índice en disco. Remove selected Eliminar selección Click to add another index directory to the list Presione para añadir otro directorio de índice a la lista Add index Añadir índice Apply changes Aplicar cambios &OK &OK Discard changes Descartar cambios &Cancel &Cancelar Abstract snippet separator Separador de fragmentos de resumen Use <PRE> tags instead of <BR>to display plain text as html. Utilizar etiquetas <PRE> en lugar de <BR> para mostrar texto simple como html. Lines in PRE text are not folded. Using BR loses indentation. Líneas en texto PRE no se parten. Al usar BR se pierde indentación. Style sheet Hoja de estilo Opens a dialog to select the style sheet file Abre una ventana de diálogo para seleccionar la hoja de estilos Choose Elegir Resets the style sheet to default Restablecer la hoja de estilo al valor por defecto Lines in PRE text are not folded. Using BR loses some indentation. Líneas en texto PRE no se parten. Al usar BR se pierde indentación. Use <PRE> tags instead of <BR>to display plain text as html in preview. Use etiquetas <PRE> en lugar de <BR> para desplegar texto corriente como html en la vista previa. Result List Lista de resultados Edit result paragraph format string Editar texto de formato para el párrafo de resultados Edit result page html header insert Editar encabezado html insertado en página de resultados Date format (strftime(3)) Formato de fecha (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Umbral de porcentaje de frecuencia sobre el cuál no utilizamos términos dentro de la autofrase. Los términos frequentes son un problema importante de desempeño con las frases. Términos omitidos aumenta la holgura de la frase, y reducen la eficiencia de la autofrase. El valor por defecto es 2 (por ciento). Autophrase term frequency threshold percentage Porcentaje del umbral de frecuencia de términos de autofrase Plain text to HTML line style Texto común a estilo de línea HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Las líneas en texto PRE no son dobladas. Al usar BR se pierde indentación. El estilo PRE + Wrap probablemente es lo que está buscando. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + wrap Disable Qt autocompletion in search entry. Deshabilitar autocompletar de Qt en la entrada de búsqueda. Search as you type. Buscar al escribir. Paths translations Rutas de traducciones Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Haga clic para agregar otro directorio de índice a la lista. Puede seleccionar un directorio de configuración de Recoll o un índice Xapian. Snippets window CSS file Archivo CSS para la ventana de fragmentos Opens a dialog to select the Snippets window CSS style sheet file Abre una ventana de diálogo para el archivo de estilos CSS de la ventana de fragmentos Resets the Snippets window style Establece el valor por defecto para el estilo de la ventana de Fragmentos Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_el.ts0000644000175000017500000051560113224431020014224 00000000000000 AdvSearch All clauses Όλες οι ÏήτÏες Any clause Οποιαδήποτε ÏήτÏα texts κείμενα spreadsheets φÏλλα εÏγασίας presentations παÏουσιάσεις media πολυμέσα messages ΜηνÏματα other άλλα Bad multiplier suffix in size filter Κακό επίθεμα πολλαπλασιαστή στο φίλτÏο μεγέθους text κείμενο spreadsheet λογιστικό φÏλλο presentation παÏουσίαση message μήνυμα AdvSearchBase Advanced search ΠÏοχωÏημένη αναζήτηση Find Αναζήτηση All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Όλα τα μη κενά πεδία στα δεξιά θα συνδυαστοÏν με ένα συνδυασμό ΚΑΙ (επιλογή «Όλες οι ÏήτÏες») ή Ή (επιλογή «Μια από τις ÏήτÏες»). <br> Τα πεδία του Ï„Ïπου «Μια από αυτές τις λέξεις», «Όλες οι λέξεις» και «Καμιά από αυτές τις λέξεις» δέχονται ένα ανακάτεμα λέξεων και φÏάσεων σε εισαγωγικά. <br>Τα κενά πεδία αγνοοÏνται. Search for <br>documents<br>satisfying: Αναζήτηση <br>εγγÏάφων<br>που ικανοποιοÏν: Delete clause ΔιαγÏαφή ÏήτÏας Add clause ΠÏοσθήκη ÏήτÏας Filter ΦίλτÏο Check this to enable filtering on dates Επιλέξτε αυτό για να ενεÏγοποιήσετε το φίλτÏο στις ημεÏομηνίες Filter dates ΦίλτÏο ημεÏομηνίας From Από To Έως Check this to enable filtering on sizes Επιλέξτε αυτό για να ενεÏγοποιήσετε το φιλτÏάÏισμα στο μέγεθος αÏχείων Filter sizes ΦίλτÏο μεγέθους Minimum size. You can use k/K,m/M,g/G as multipliers Ελάχιστο μέγεθος: ΜποÏείτε να χÏησιμοποιήσετε τα k/K,m/M,g/G ως πολλαπλασιαστές Min. Size Ελαχ. μέγεθος Maximum size. You can use k/K,m/M,g/G as multipliers Μέγιστο μέγεθος: ΜποÏείτε να χÏησιμοποιήσετε τα k/K,m/M,g/G ως πολλαπλασιαστές Max. Size Μέγ. μέγεθος Check this to enable filtering on file types ΕνεÏγοποιήστε αυτή την επιλογή για να χÏησιμοποιηθεί το φιλτÏάÏισμα στους Ï„Ïπους αÏχείων Restrict file types ΠεÏιοÏισμός του Ï„Ïπου αÏχείων Check this to use file categories instead of raw mime types Επιλέξτε το για να χÏησιμοποιήσετε τις κατηγοÏίες αÏχείων αντί των Ï„Ïπων mime By categories Ανά κατηγοÏία Save as default Αποθήκευση ως Ï€Ïοεπιλογή Searched file types ΑναζητοÏμενοι Ï„Ïποι αÏχείων All ----> Όλα ----> Sel -----> Επιλ ----> <----- Sel <----- Επιλ <----- All <----- Όλα Ignored file types ΤÏποι αÏχείων που θα αγνοηθοÏν Enter top directory for search Εισάγετε τον κατάλογο εκκίνησης της αναζήτησης Browse ΠεÏιήγηση Restrict results to files in subtree: ΠεÏιοÏισμός των αποτελεσμάτων στα αÏχεία του δέντÏου: Invert ΑντιστÏοφή Start Search Εκκίνηση αναζήτησης Close Κλείσιμο CronToolW Cron Dialog Διάλογος Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Ï€ÏογÏαμματισμός της πεÏιοδικής ευÏετηÏίασης (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Κάθε πεδίο μποÏεί να πεÏιέχει ένα χαÏακτήÏα υποκατάστασης (*), μια απλή αÏιθμητική τιμή, λίστες διαχωÏισμένες με κόμα (1,3,5) και εÏÏη (1-7). ΓενικότεÏα, τα πεδία θα χÏησιμοποιηθοÏν <span style=" font-style:italic;">ως έχουν</span> στο αÏχείο crontab, και η γενική σÏνταξη crontab μποÏεί να χÏησιμοποιηθεί, δείτε στη σελίδα του εγχειÏιδίου crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Για παÏάδειγμα, εισάγοντας <span style=" font-family:'Courier New,courier';">*</span> στις <span style=" font-style:italic;">ΗμέÏες, </span><span style=" font-family:'Courier New,courier';">12,19</span> στις <span style=" font-style:italic;">ÎÏες</span> και <span style=" font-family:'Courier New,courier';">15</span> στα <span style=" font-style:italic;">Λεπτά</span>, το recollindex θα ξεκινά κάθε μέÏα στις 12:15 AM και 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ο Ï€ÏογÏαμματισμός με Ï€Î¿Î»Ï ÏƒÏ…Ï‡Î½Î­Ï‚ ενεÏγοποιήσεις είναι πιθανώς λιγότεÏο αποτελεσματικός από την ευÏετηÏίαση σε Ï€Ïαγματικό χÏόνο.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) ΗμέÏες της εβδομάδας (* ή 0-7, 0 ή 7 σημαίνει ΚυÏιακή) Hours (* or 0-23) ÎÏες (* ή 0-23) Minutes (0-59) Λεπτά (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Κάντε κλικ στο <span style=" font-style:italic;">ΑπενεÏγοποίηση</span> για να διακόψετε την πεÏιοδική αυτόματη ευÏετηÏίαση, στο <span style=" font-style:italic;">ΕνεÏγοποίηση</span> για να την ενεÏγοποιήσετε, και <span style=" font-style:italic;">ΑκÏÏωση</span> για να μην αλλάξει τίποτα.</p></body></html> Enable ΕνεÏγοποίηση Disable ΑπενεÏγοποίηση It seems that manually edited entries exist for recollindex, cannot edit crontab Φαίνεται ότι υπάÏχουν καταχωÏήσεις δημιουÏγημένες χειÏοκίνητα για το recollindex. Η επεξεÏγασία του αÏχείου Cron δεν είναι δυνατή Error installing cron entry. Bad syntax in fields ? Σφάλμα κατά την εγκατάσταση της καταχώÏησης cron. Κακή σÏνταξη των πεδίων; EditDialog Dialog Διάλογος EditTrans Source path ΔιαδÏομή πηγής Local path Τοπική διαδÏομή Config error Σφάλμα διαμόÏφωσης Original path ΑÏχική διαδÏομή EditTransBase Path Translations ΔιαδÏομή μεταφÏάσεων Setting path translations for ΟÏισμός διαδÏομής μεταφÏάσεων για Select one or several file types, then use the controls in the frame below to change how they are processed Επιλέξτε έναν οι πεÏισσότεÏους Ï„Ïπους αÏχείων, και στη συνέχεια χÏησιμοποιήστε τα κουμπιά ελέγχου στο παÏακάτω πλαίσιο για να αλλάξετε τον Ï„Ïόπο επεξεÏγασίας Add ΠÏοσθήκη Delete ΔιαγÏαφή Cancel ΑκÏÏωση Save Αποθήκευση FirstIdxDialog First indexing setup ΔιαμόÏφωση της Ï€Ïώτης δεικτοδότησης <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Φαίνεται ότι το ευÏετήÏιο για αυτήν τη διαμόÏφωση δεν υπάÏχει ακόμα..</span><br /><br />Αν θέλετε απλά να δεικτοδοτήσετε τον Ï€Ïοσωπικό σας κατάλογο με ένα ικανοποιητικό σÏνολοy Ï€Ïοεπιλογών, πατήστε το κουμπί <span style=" font-style:italic;">«ΈναÏξη της ευÏετηÏίασης τώÏα»</span>. ΜποÏείτε να Ïυθμίσετε τις λεπτομέÏειες αÏγότεÏα. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Αν επιθυμείτε πεÏισσότεÏο έλεγχο, χÏησιμοποιήστε τους παÏακάτω συνδέσμους για να Ïυθμίσετε τη διαμόÏφωση της ευÏετηÏίασης και του Ï€ÏογÏαμματισμοÏ.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ΜποÏείτε να έχετε Ï€Ïόσβαση στα εÏγαλεία αυτά αÏγότεÏα από το Î¼ÎµÎ½Î¿Ï <span style=" font-style:italic;">ΠÏοτιμήσεις</span>.</p></body></html> Indexing configuration ΔιαμόÏφωση ευÏετηÏίασης This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Σας επιτÏέπει τη ÏÏθμιση των καταλόγων που επιθυμείτε να δεικτοδοτήσετε, και άλλων παÏαμέτÏων όπως οι εξαιÏοÏμενες διαδÏομές αÏχείων ή ονομάτων, των Ï€ÏοκαθοÏισμένων συνόλων χαÏακτήÏων, κλπ. Indexing schedule ΠÏογÏαμματισμός ευÏετηÏίασης This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Σας επιτÏέπει την επιλογή Î¼ÎµÏ„Î±Î¾Ï Ï„Î·Ï‚ Ï€ÏογÏαμματισμένης ευÏετηÏίασης και αυτής σε Ï€Ïαγματικό χÏόνο, και τον καθοÏισμό του Ï€ÏογÏÎ±Î¼Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï Î³Î¹Î± την Ï€Ïώτη (βασισμένη στο εÏγαλείο cron). Start indexing now ΈναÏξη της ευÏετηÏίασης τώÏα FragButs %1 not found. Δεν βÏέθηκε το %1. %1: %2 %1: %2 Query Fragments ΘÏαÏσματα εÏωτήματος IdxSchedW Index scheduling setup ΔιαμόÏφωση του Ï€ÏογÏÎ±Î¼Î¼Î±Ï„Î¹ÏƒÎ¼Î¿Ï ÎµÏ…ÏετηÏίασης <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Η ευÏετηÏίαση του <span style=" font-weight:600;">Recoll</span> μποÏεί να βÏίσκεται μόνιμα σε λειτουÏγία, επεξεÏγάζοντας τα αÏχεία αμέσως μετά Î±Ï†Î¿Ï Ï„ÏοποποιηθοÏν, ή να εκτελείται σε Ï€ÏοκαθοÏισμένες στιγμές. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Μια ανάγνωση του εγχειÏιδίου μποÏεί να σας βοηθήσει να επιλέξετε Î¼ÎµÏ„Î±Î¾Ï Î±Ï…Ï„ÏŽÎ½ των Ï€Ïοσεγγίσεων (πατήστε F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Αυτό το εÏγαλείο μποÏεί να σας βοηθήσει να διαμοÏφώσετε την Ï€ÏογÏαμματισμένη ευÏετηÏίαση ή να οÏίσετε μια αυτόματη έναÏξη της ευÏετηÏίασης σε Ï€Ïαγματικό χÏόνο κατά τη σÏνδεσή σας (ή και τα δÏο, κάτι που σπάνια χÏειάζεται). </p></body></html> Cron scheduling ΠÏογÏαμματισμός Cron The tool will let you decide at what time indexing should run and will install a crontab entry. Ο διάλογος σας επιτÏέπει να Ï€ÏοσδιοÏίσετε την ÏŽÏα έναÏξης της ευÏετηÏίασης και θα εισάγει μια καταχώÏηση crontab. Real time indexing start up ΈναÏξη της ευÏετηÏίασης σε Ï€Ïαγματικό χÏόνο Decide if real time indexing will be started when you log in (only for the default index). ΠÏοσδιοÏίστε αν η ευÏετηÏίαση σε Ï€Ïαγματικό χÏόνο θα ξεκινά με τη σÏνδεσή σας (μόνο για το Ï€ÏοκαθοÏισμένο ευÏετήÏιο). ListDialog Dialog Διάλογος GroupBox GroupBox Main "history" file is damaged or un(read)writeable, please check or remove it: Το αÏχείο ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ¯Ï„Îµ είναι κατεστÏαμμένο είτε δεν είναι αναγνώσιμο/εγγÏάψιμο, παÏακαλώ ελέγξτε το ή διαγÏάψτε το: No db directory in configuration Δεν έχει Ï€ÏοσδιοÏιστεί ο κατάλογος της βάσης δεδομένων στη διαμόÏφωση Preview &Search for: &Αναζήτηση για: &Next &Επόμενο &Previous &ΠÏοηγοÏμενο Clear ΚαθαÏισμός Match &Case ΔιάκÏιση &πεζών/κεφαλαίων Close Tab Κλείσιμο της καÏτέλας Cancel ΑκÏÏωση Cannot create temporary directory: Αδυναμία δημιουÏγίας του Ï€ÏοσωÏÎ¹Î½Î¿Ï ÎºÎ±Ï„Î±Î»ÏŒÎ³Î¿Ï…: Missing helper program: Ελλείποντα εξωτεÏικά Ï€ÏογÏάμματα φίλτÏου: Can't turn doc into internal representation for ΑδÏνατη η μεταγλώττιση του εγγÏάφου σε εσωτεÏική αναπαÏάσταση για Error while loading file Σφάλμα κατά τη φόÏτωση του αÏχείου Creating preview text ΔημιουÏγία του κειμένου Ï€Ïοεπισκόπησης Loading preview text into editor ΦόÏτωση του κειμένου Ï€Ïοεπισκόπησης στον επεξεÏγαστή PreviewTextEdit Show fields Εμφάνιση των πεδίων Show image Εμφάνιση της εικόνας Show main text Εμφάνιση του σώματος του κειμένου Select All Επιλογή όλων Copy ΑντιγÏαφή Print ΕκτÏπωση Fold lines Αναδίπλωση των γÏαμμών Preserve indentation ΔιατήÏηση της εσοχής Save document to file Αποθήκευση του εγγÏάφου Print Current Preview ΕκτÏπωση του παÏαθÏÏου Ï€Ïοεπισκόπησης QObject Global parameters Καθολικές Ïυθμίσεις Local parameters Τοπικές Ïυθμίσεις Beagle web history ΙστοÏικό Î¹ÏƒÏ„Î¿Ï Beagle <b>Customised subtrees <b>Κατάλογοι με Ï€ÏοσαÏμοσμένες Ïυθμίσεις The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Η λίστα των υποκαταλόγων της ζώνης με ευÏετήÏιο<br>όπου έχουν Ï€ÏοκαθοÏιστεί οÏισμένες παÏάμετÏοι. ΠÏοεπιλογή: κενό. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Οι παÏάμετÏοι που ακολουθοÏν έχουν καθοÏιστεί είτε καθολικά, αν η επιλογή στην παÏαπάνω λίστα<br>είναι κενή ή μια κενή γÏαμμή, είτε για τον επιλεγμένο κατάλογο.<br>ΜποÏείτε να Ï€Ïοσθέσετε και να αφαιÏέσετε καταλόγους κάνοντας κλικ στα κουμπιά +/-. Skipped names Αγνοημένα ονόματα These are patterns for file or directory names which should not be indexed. Μοτίβα που καθοÏίζουν τα αÏχεία ή καταλόγους που δεν θα Ï€Ïέπει να έχουν ευÏετήÏιο. Default character set ΣÏνολο χαÏακτήÏων<br>εξ οÏÎ¹ÏƒÎ¼Î¿Ï This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Το σÏνολο των χαÏακτήÏων που χÏησιμοποιείται για την ανάγνωση των αÏχείων στα οποία δεν μποÏεί να αναγνωÏιστεί το σÏνολο χαÏακτήÏων με εσωτεÏικό Ï„Ïόπο, για παÏάδειγμα τα αÏχεία Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï….<br>Η Ï€ÏοκαθοÏισμένη τιμή είναι κενή, και το Ï€ÏόγÏαμμα χÏησιμοποιεί αυτή του πεÏιβάλλοντος. Follow symbolic links ΑκολοÏθηση των συμβολικών δεσμών Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Îα δημιουÏγηθεί ευÏετήÏιο για αÏχεία και καταλόγους που υποδεικνÏονται από συμβολικοÏÏ‚ δεσμοÏÏ‚. Η Ï€ÏοκαθοÏισμένη τιμή είναι όχι, για την αποφυγή διπλότυπης ευÏετηÏίασης Index all file names ΕυÏετήÏιο για όλα τα ονόματα αÏχείων Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true ΕυÏετήÏιο για τα ονόματα των αÏχείων των οποίων το πεÏιεχόμενο δεν έχει αναγνωÏιστεί ή επεξεÏγαστεί (χωÏίς Ï„Ïπο mime, ή μη υποστηÏιζόμενος Ï„Ïπος). Η Ï€ÏοκαθοÏισμένη τιμή είναι αληθές Search parameters Ρυθμίσεις αναζήτησης Web history ΙστοÏικό Î¹ÏƒÏ„Î¿Ï Default<br>character set ΣÏνολο χαÏακτήÏων<br>εξ οÏÎ¹ÏƒÎ¼Î¿Ï Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Το σÏνολο των χαÏακτήÏων που χÏησιμοποιείται για την ανάγνωση των αÏχείων που δεν έχουν εσωτεÏικό αναγνωÏιστικό των χαÏακτήÏων, για παÏάδειγμα αÏχεία Î±Ï€Î»Î¿Ï ÎºÎµÎ¹Î¼Î­Î½Î¿Ï…: <br>Η τιμή εξ οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ κενή, και χÏησιμοποιείται η τιμή του πεÏιβάλλοντος NLS. Ignored endings Αγνοημένες καταλήξεις These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). Αυτές είναι καταλήξεις αÏχείων στα οποία η ευÏετηÏίαση θα γίνει μόνο βάσει του ονόματος (χωÏίς Ï€Ïοσπάθεια αναγνώÏισης του Ï„Ïπου MIME, χωÏίς αποσυμπίεση, χωÏίς δεικτοδότηση του πεÏιεχομένου). QWidget Create or choose save directory ΔημιουÏγία ή επιλογή του καταλόγου αποθήκευσης Choose exactly one directory Επιλέξτε μόνο έναν κατάλογο Could not read directory: ΑδÏνατη η ανάγνωση του καταλόγου: Unexpected file name collision, cancelling. ΑπÏοσδόκητη σÏγκÏουση ονομάτων αÏχείων, ακÏÏωση. Cannot extract document: ΑδÏνατη η εξαγωγή του εγγÏάφου: &Preview &ΠÏοεπισκόπηση &Open Ά&νοιγμα Open With Άνοιγμα με Run Script Εκτέλεση μακÏοεντολής Copy &File Name ΑντιγÏαφή του ονόματος του α&Ïχείου Copy &URL ΑντιγÏαφή του &URL &Write to File &ΕγγÏαφή σε αÏχείο Save selection to files Αποθήκευση της επιλογής σε αÏχεία Preview P&arent document/folder ΠÏοεπισκόπηση του &Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Open Parent document/folder &Άνοιγμα του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου Find &similar documents Αναζήτηση παÏÏŒ&μοιων εγγÏάφων Open &Snippets window Άνοιγμα του παÏαθÏÏου απο&σπασμάτων Show subdocuments / attachments Εμφάνιση των υπο-εγγÏάφων / συνημμένων QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start Αυτόματη έναÏξη ευÏετηÏίασης σε Ï€Ïαγμ. χÏόνο <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Η ευÏετηÏίαση του <span style=" font-weight:600;">Recoll</span> μποÏεί να έχει Ïυθμιστεί να εκτελείται στο παÏασκήνιο, ενημεÏώνωντας το ευÏετήÏιο σταδιακά κατά την Ï„Ïοποποίηση του αÏχείου. Επωφελείστε από ένα ευÏετήÏιο πάντα ενημεÏωμένο, αλλά καταναλόνωνται συνέχεια πόÏοι του συστήματος (μνήμη και επεξεÏγαστής).</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Εκκίνηση του δαίμονα ευÏετηÏίασης κατά τη σÏνδεσή μου. Also start indexing daemon right now. Επίσης να γίνει έναÏξη της ευÏετηÏίασης τώÏα. Replacing: Αντικατάσταση του: Replacing file Αντικατάσταση του αÏχείου Can't create: Αδυναμία δημιουÏγίας: Warning ΠÏοσοχή Could not execute recollindex Αδυναμία εκτέλεσης του recollindex Deleting: ΔιαγÏαφή: Deleting file ΔιαγÏαφή του αÏχείου Removing autostart ΑφαίÏεση του autostart Autostart file deleted. Kill current process too ? Το αÏχείο autostart διαγÏάφτηκε. ΤεÏματισμός της διεÏγασίας σε εξέλιξη; RclMain All Όλα media πολυμέσα message μήνυμα other άλλα presentation παÏουσίαση spreadsheet λογιστικό φÏλλο text κείμενο sorted ταξινομημένο filtered φιλτÏαÏισμένο (no stemming) (χωÏίς επέκταση) (all languages) (όλες οι γλώσσες) error retrieving stemming languages σφάλμα στη λήψη της λίστας των γλωσσών επέκτασης Document category filter ΦίλτÏο κατηγοÏιών των εγγÏάφων Could not open external index. Db not open. Check external indexes list. ΑδÏνατο το άνοιγμα ενός εξωτεÏÎ¹ÎºÎ¿Ï ÎµÏ…ÏετηÏίου. Η βάση δεδομένων δεν είναι ανοιχτή. Ελέγξτε τη λίστα των εξωτεÏικών ευÏετηÏίων. Indexing in progress: ΕυÏετηÏίαση σε εξέλιξη: None Τίποτα Updating ΕνημέÏωση Purge ΚαθαÏισμός Stemdb Stemdb Closing Κλείσιμο Done Έγινε Monitor ΠαÏακολοÏθηση Unknown Άγνωστο Indexing failed Η ευÏετηÏίαση απέτυχε Stop &Indexing Διακοπή της &ευÏετηÏίασης Update &Index ΕνημέÏωση του &ευÏετηÏίου Warning ΠÏοσοχή The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Η διεÏγασία ευÏετηÏίασης σε εξέλιξη δεν ξεκίνησε από αυτή τη διεπαφή. Κάντε κλικ στο Εντάξει για να τη σκοτώσετε όπως και να 'χει, ή στο ΑκÏÏωση για να την αφήσετε ήσυχη Erasing index ΔιαγÏαφή του ευÏετηÏίου Reset the index and start from scratch ? ΔιαγÏαφή του ευÏετηÏίου και επανέναÏξη από το μηδέν; Query results Αποτελέσματα της αναζήτησης Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Αίτημα σε εξέλιξη.<br>Λόγω εσωτεÏικών πεÏιοÏισμών,<br>η ακÏÏωση θα τεÏματίσει την εκτέλεση του Ï€ÏογÏάμματος Result count (est.) ΑÏιθμός αποτελεσμάτων (εκτίμ.) No results found Δεν βÏέθηκαν αποτελέσματα About Recoll Σχετικά με το Recoll External applications/commands needed and not found for indexing your file types: ΑπαιτοÏνται εξωτεÏικές εφαÏμογές/εντολές που δεν βÏέθηκαν για την ευÏετηÏίαση των Ï„Ïπων των αÏχείων σας: No helpers found missing Δεν λείπει καμιά εφαÏμογή Missing helper programs ΕφαÏμογές που λείπουν Error Σφάλμα Index not open Το ευÏετήÏιο δεν είναι ανοιχτό Index query error Σφάλμα στην αναζήτηση στο ευÏετήÏιο Indexed MIME Types ΤÏποι MIME με ευÏετήÏιο Content has been indexed for these mime types: Το πεÏιεχόμενο έχει δεικτοδοτηθεί για αυτοÏÏ‚ τους Ï„Ïπους MIME: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Το ευÏετήÏιο δεν είναι ενημεÏωμένο για αυτό το αÏχείο. ΥπάÏχει κίνδυνος εμφάνισης μιας εσφαλμένης καταχώÏησης. Κάντε κλικ στο Εντάξει για να ενημεÏώσετε το ευÏετήÏιο για αυτό το αÏχείο, και επανεκκινήστε το αίτημα μετά την ολοκλήÏωση της ενημέÏωσης του ευÏετηÏίου. ΔιαφοÏετικά, κάντε κλικ στο ΑκÏÏωση. Can't create preview window ΑδÏνατη η δημιουÏγία του παÏαθÏÏου Ï€Ïοεπισκόπησης Can't update index: indexer running ΑδÏνατη η ενημέÏωση του ευÏετηÏίου: μια εÏγασία ευÏετηÏίασης βÏίσκεται σε εξέλιξη This search is not active any more Η αναζήτηση δεν είναι ενεÏγή πια Cannot retrieve document info from database ΑδÏνατη η Ï€Ïόσβαση στο έγγÏαφο στη βάση δεδομένων Save file Αποθήκευση του αÏχείου Cannot extract document or create temporary file ΑδÏνατη η εξαγωγή του εγγÏάφου ή η δημιουÏγία ενός Ï€ÏοσωÏÎ¹Î½Î¿Ï Î±Ïχείου No external viewer configured for mime type [ Κανένας Ïυθμισμένος Ï€Ïοβολέας για τον Ï„Ïπο MIME [ Bad viewer command line for %1: [%2] Please check the mimeconf file Κακοδιατυπωμένη εντολή για %1: [%2] ΠαÏακαλώ ελέγξτε το αÏχείο mimeconf The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Ο καθοÏισμένος Ï€Ïοβολέας στο mimeview για %1: %2 δεν βÏέθηκε. Θέλετε να ξεκινήσετε το διάλογο με τις Ï€Ïοτιμήσεις; Can't access file: ΑδÏνατη η Ï€Ïόσβαση στο αÏχείο: Can't uncompress file: ΑδÏνατη η αποσυμπίεση του αÏχείου: Executing: [ Εκτέλεση του: [ History data Δεδομένα του ιστοÏÎ¹ÎºÎ¿Ï Document history ΙστοÏικό των ανοιγμένων εγγÏάφων Query details ΛεπτομέÏειες της αναζήτησης Bad viewer command line for %1: [%2] Please check the mimeview file Λανθασμένη γÏαμμή εντολής για %1: [%2] ΠαÏακαλώ ελέγξτε το αÏχείο mimeview Viewer command line for %1 specifies both file and parent file value: unsupported Η γÏαμμή εντολής για %1 καθοÏίζει την ίδια στιγμή το αÏχείο και τον γονέα του: δεν υποστηÏίζεται Cannot find parent document ΑδÏνατη η εÏÏεση του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου Indexing did not run yet Η δεικτοδότηση δεν έχει εκτελεστή εκόμα External applications/commands needed for your file types and not found, as stored by the last indexing pass in ΕξωτεÏικές εφαÏμογές και εντολές απαÏαίτητες για τους Ï„Ïπους των εγγÏάφων σας, και που δεν έχουν βÏεθεί, όπως έχουν ταξινομηθεί από την τελευταία δεικτοδότηση που έλαβε χώÏα στις Index not up to date for this file. Refusing to risk showing the wrong entry. Η δεικτοδότηση δεν είναι ενημεÏωμένηη για αυτό το αÏχείο. Πιθανός κίνδυνος εμφάνισης μιας λανθασμένης εισαγωγής. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Κάντε κλικ στο Εντάξει για να ενημεÏώσετε τη δεικτοδότηση για αυτό το αÏχείο, και στη συνέχεια επανεκκινήστε την αναζήτηση όταν θα έχει ολοκληÏωθεί η δημιουÏγία του ευÏετηÏίου. ΔιαφοÏετικά, κλικ στο ΑκÏÏωση. Indexer running so things should improve when it's done Η δημιουÏγία του ευÏετηÏίου βÏίσκεται σε εξέλιξη, το αÏχείο θα ενημεÏωθεί μετά το πέÏας της ενημέÏωσης Sub-documents and attachments Υπο-έγγÏαφα και συνημμένα Document filter ΦίλτÏο εγγÏάφου Index not up to date for this file. Refusing to risk showing the wrong entry. Το ευÏετήÏιο δεν είναι ενημεÏωμένο για αυτό το αÏχείο. ΆÏνηση της διακινδυνευμένης εμφάνισης μιας λανθασμένης καταχώÏησης. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. Κάντε κλικ στο Εντάξει για να ενημεÏώσετε το ευÏετήÏιο για αυτό το αÏχείο, στη συνέχεια θα Ï€Ïέπει να εκτελέσετε εκ νέου το εÏώτημα μετ το πέÏας της δεικτοδότησης. The indexer is running so things should improve when it's done. Τα Ï€Ïάγματα θα βελτιωθοÏν μετά το πέÏας της δεικτοδότησης. The document belongs to an external indexwhich I can't update. Το έγγÏαφο ανήκει σε ένα εξωτεÏικό ευÏετήÏιο το οποίο δεν μποÏÏŽ να ενημεÏώσω. Click Cancel to return to the list. Click Ignore to show the preview anyway. Κάντε κλικ στο ΑκÏÏωση για να επιστÏέψετε στον κατάλογο. Κάντε κλικ στο Αγνόηση για την εμφάνιση της Ï€Ïοεπισκόπησης οÏτως ή άλλως. Duplicate documents Διπλότυπα έγγÏαφα These Urls ( | ipath) share the same content: Αυτά τα Url (| ipath) μοιÏάζονται το ίδιο πεÏιεχόμενο: Bad desktop app spec for %1: [%2] Please check the desktop file Κακοδιατυπωμένος Ï€ÏοσδιοÏισμός εφαÏμογής επιφάνειας εÏγασίας για το %1: [%2] ΠαÏακαλώ ελέγξτε το αÏχείο της επιφάνειας εÏγασίας Indexing interrupted Η ευÏετηÏίαση διεκόπη with additional message: Non-fatal indexing message: Index locked Bad paths Bad paths in configuration file: The current indexing process was not started from this interface, can't kill it Selection patterns need topdir Selection patterns can only be used with a start directory The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Types list empty: maybe wait for indexing to progress? Can't set synonyms file (parse error?) RclMainBase Recoll Recoll All Όλα Search tools ΕÏγαλεία αναζήτησης Result list Λίστα αποτελεσμάτων &File &ΑÏχείο &Tools &ΕÏγαλεία &Preferences &ΠÏοτιμήσεις &Help &Βοήθεια E&xit Έ&ξοδος Ctrl+Q Ctrl+Q Update &index Ε&νημέÏωση ευÏετηÏίου &Rebuild index Α&νακατασκευή του ευÏετηÏίου &Erase document history &ΔιαγÏαφή του ιστοÏÎ¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφων &Erase search history Δια&γÏαφή του ιστοÏÎ¹ÎºÎ¿Ï Î±Î½Î±Î¶Î·Ï„Î®ÏƒÎµÏ‰Î½ &Show missing helpers Ε&μφάνιση των ελλειπουσών εφαÏμογών &Show indexed types Εμ&φάνιση των Ï„Ïπων με ευÏετήÏιο &About Recoll &Σχετικά με το Recoll &User manual Ε&γχειÏίδιο Document &History &ΙστοÏικό των εγγÏάφων Document History ΙστοÏικό των εγγÏάφων &Advanced Search &ΠÏοχωÏημένη αναζήτηση Advanced/complex Search ΠÏοχωÏημένη αναζήτηση &Sort parameters &Ρυθμίσεις ταξινόμησης Sort parameters Ρυθμίσεις ταξινόμησης Term &explorer Ε&ξεÏευνητής του ευÏετηÏίου Term explorer tool ΕÏγαλείο εξεÏεÏνησης του ευÏετηÏίου Next page Επόμενη σελίδα Next page of results Επόμενη σελίδα των αποτελεσμάτων PgDown PgDown First page ΠÏώτη σελίδα Go to first page of results Μετάβαση στην Ï€Ïώτη σελίδα αποτελεσμάτων Shift+PgUp Shift+PgUp Previous page ΠÏοηγοÏμενη σελίδα Previous page of results ΠÏοηγοÏμενη σελίδα αποτελεσμάτων PgUp PgUp &Indexing configuration ΔιαμόÏφωση ευÏετηÏίασης &Indexing schedule &ΠÏογÏαμματισμός της ευÏετηÏίασης &Query configuration Δια&μόÏφωση της αναζήτησης E&xternal index dialog Δια&μόÏφωση των εξωτεÏικών ευÏετηÏίων External index dialog ΕξωτεÏικά ευÏετήÏια &Full Screen Π&λήÏης οθόνη Full Screen ΠλήÏης οθόνη F11 F11 sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Ταξινόμηση ανά ημεÏομηνία από την παλαιότεÏη στη νεότεÏη sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Ταξινόμηση ανά ημεÏομηνία από τη νεότεÏη στην παλαιότεÏη Show Query Details Εμφάνιση της αναζήτησης λεπτομεÏειακά Show results as table Εμφάνιση των αποτελεσμάτων σε πίνακα &Index configuration ΔιαμόÏφωση &ΕυÏετηÏίου &GUI configuration ΔιαμόÏφωση &ΠεÏιβάλλοντος &Results Αποτε&λέσματα Sort by date, oldest first Ταξινόμηση ανά ημεÏομηνία, τα παλαιότεÏα Ï€Ïώτα Sort by date, newest first Ταξινόμηση ανά ημεÏομηνία, τα νεότεÏα Ï€Ïώτα Show as table Εμφάνιση ως πίνακας Show results in a spreadsheet-like table Εμφάνιση των αποτελεσμάτων σε έναν πίνακα ως φÏλλο εÏγασίας Save as CSV (spreadsheet) file Αποθήκευση ως αÏχείο CVS (φÏλλο εÏγασίας) Saves the result into a file which you can load in a spreadsheet ΑποθηκεÏει το αποτέλεσμα σε ένα αÏχείο το οποίο μποÏείτε να φοÏτώσετε σε ένα φÏλλο εÏγασίας Next Page Επόμενη σελίδα Previous Page ΠÏοηγοÏμενη σελίδα First Page ΠÏώτη σελίδα Query Fragments ΘÏαÏσματα εÏωτήματος With failed files retrying ΠÏοσπάθεια εκ νέου με αποτυχημένα αÏχεία Next update will retry previously failed files Η επόμενη ενημέÏωση θα επιχειÏήσει ξανά με τα αποτυχημένα αÏχεία &View Missing &helpers Indexed &MIME types Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options Index &statistics Webcache Editor RclTrayIcon Restore ΕπαναφοÏά Quit Έξοδος RecollModel Abstract Απόσπασμα Author ΣυγγÏαφέας Document size Μέγεθος εγγÏάφου Document date ΗμεÏομηνία εγγÏάφου File size Μέγεθος αÏχείου File name Όνομα αÏχείου File date ΗμεÏομηνία αÏχείου Ipath Ipath Keywords Λέξεις κλειδιά MIME type ΤÏπος MIME Original character set ΑÏχικό σÏνολο χαÏακτήÏων Relevancy rating ΕγγÏτητα Title Τίτλος URL URL Mtime Mtime Date ΗμεÏομηνία Date and time ΗμεÏομηνία και ÏŽÏα ResList <p><b>No results found</b><br> <p><b>Κανένα αποτέλεσμα</b><br> Documents ΈγγÏαφα out of at least από τουλάχιστον for για Previous ΠÏοηγοÏμενο Next Επόμενο Unavailable document Μη διαθέσιμο έγγÏαφο Preview ΠÏοεπισκόπηση Open Άνοιγμα (show query) (αίτημα) <p><i>Alternate spellings (accents suppressed): </i> <p><i>ΠÏοτεινόμενη οÏθογÏαφία (χωÏίς τόνους): </i> Document history ΙστοÏικό των ανοιγμένων εγγÏάφων Result list Λίστα αποτελεσμάτων &Preview &ΠÏοεπισκόπηση &Open Ά&νοιγμα Copy &File Name ΑντιγÏαφή του ονόματος του α&Ïχείου Copy &URL ΑντιγÏαφή URL &Write to File Απο&θήκευση σε Find &similar documents Αναζήτηση παÏÏŒ&μοιων εγγÏάφων Preview P&arent document/folder ΠÏοεπισκόπηση του &Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Open Parent document/folder &Άνοιγμα του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου <p><i>Alternate spellings: </i> <p><i>Εναλλακτικά λεξικά: </i> Duplicate documents Διπλότυπα έγγÏαφα These Urls ( | ipath) share the same content: Αυτά τα URL (| ipath) μοιÏάζονται το ίδιο πεÏιεχόμενο: Result count (est.) ΑÏιθμός αποτελεσμάτων (εκτίμ.) Query details ΛεπτομέÏειες της αναζήτησης Snippets Αποσπάσματα ResTable Save table to CSV file Αποθήκευση σε ένα αÏχείο CSV Can't open/create file: ΑδÏνατο το άνοιγμα/δημιουÏγία του αÏχείου: &Preview &ΠÏοεπισκόπηση &Open Ά&νοιγμα Copy &File Name ΑντιγÏαφή του ονόματος του α&Ïχείου Copy &URL ΑντιγÏαφή URL &Write to File Απο&θήκευση σε Find &similar documents Αναζήτηση παÏÏŒ&μοιων εγγÏάφων Preview P&arent document/folder ΠÏοεπισκόπηση του &Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Open Parent document/folder &Άνοιγμα του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Reset sort &ΕπαναφοÏά της ταξινόμησης &Save as CSV &Αποθήκευση ως CSV &Delete column &ΑφαίÏεση της στήλης Add "%1" column ΠÏοσθήκη μιας στήλης «%1» ResTableDetailArea &Preview &ΠÏοεπισκόπηση &Open Ά&νοιγμα Copy &File Name ΑντιγÏαφή του ονόματος του α&Ïχείου Copy &URL ΑντιγÏαφή URL &Write to File Απο&θήκευση σε Find &similar documents Αναζήτηση παÏÏŒ&μοιων εγγÏάφων Preview P&arent document/folder ΠÏοεπισκόπηση του &Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Open Parent document/folder &Άνοιγμα του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου ResultPopup &Preview &ΠÏοεπισκόπηση &Open Ά&νοιγμα Copy &File Name ΑντιγÏαφή του ονόματος του α&Ïχείου Copy &URL ΑντιγÏαφή URL &Write to File Απο&θήκευση σε Save selection to files Αποθήκευση της επιλογής σε αÏχεία Preview P&arent document/folder ΠÏοεπισκόπηση του &Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου &Open Parent document/folder &Άνοιγμα του Î³Î¿Î½Î¹ÎºÎ¿Ï ÎµÎ³Î³Ïάφου/καταλόγου Find &similar documents Αναζήτηση παÏÏŒ&μοιων εγγÏάφων Open &Snippets window Άνοιγμα του παÏαθÏÏου απο&σπασμάτων Show subdocuments / attachments Εμφάνιση των υπο-εγγÏάφων / συνημμένων SSearch Any term Οποιοσδήποτε ÏŒÏος All terms Όλοι οι ÏŒÏοι File name Όνομα αÏχείου Query language Γλώσσα εÏωτημάτων Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Εισάγετε μια έκφÏαση γλώσσας εÏωτήματος. Σκονάκι:<br> <i>term1 term2</i> : 'term1' ΚΑΙ 'term2' σε οποιοδήποτε πεδίο.<br> <i>field:term1</i> : 'term1' αναζήτηση στο πεδίο 'field'.<br> ΠÏότυπα ονόματα/συνώνυμα πεδίων (χÏήση αγγλικών λέξεων):<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> ΠαÏάδειγμα διαστημάτων ημεÏομηνιών: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> ΜΗΠβάλετε τις παÏενθέσεις.<br> <i>"term1 term2"</i> : ακÏιβής Ï€Ïόταση. Επιλογές:<br> <i>"term1 term2"p</i> : εγγÏτητα (χωÏίς σειÏά).<br> ΧÏησιμοποιήστε το δεσμό <b>ΛεπτομεÏειακή εμφάνιση του εÏωτήματος</b> σε πεÏίπτωση που υπάÏχει αμφιβολία στα αποτελέσματα και δείτε το εγχείÏίδιο (στα αγγλικά) (&lt;F1>) για πεÏισσότεÏες λεπτομέÏειες. Enter file name wildcard expression. Εισάγετε ένα όνομα αÏχείου (επιτÏέπονται και σÏμβολα υποκατάστασης). Enter search terms here. Type ESC SPC for completions of current term. Εισάγετε εδώ τους ÏŒÏους της αναζήτησης. Πατήστε ESC SPC για να εμφανίσετε τις λέξεις που αÏχίζουν με τον Ï„Ïέχοντα ÏŒÏο. Bad query string Μη αναγνωÏισμένο εÏώτημα Out of memory Δεν υπάÏχει διαθέσιμη μνήμη Too many completions Πολλές πιθανές συμπληÏώσεις Completions ΣυμπληÏώσεις Select an item: Επιλέξτε ένα αντικείμενο: Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Εισαγωγή έκφÏασης γλώσσας εÏωτήματος. «Σκονάκι»:<br> <i>ÏŒÏος1 ÏŒÏος2</i> : 'ÏŒÏος1' και 'ÏŒÏος2' σε οποιοδήποτε πεδίο.<br> <i>πεδίο:ÏŒÏος1</i> : 'ÏŒÏος1' στο πεδίο 'πεδίο'.<br> Τυπικό πεδίο ονόματα/συνώνυμα:<br> τίτλος/θέμα/υπόμνημα, συγγÏαφέας/από, παÏαλήπτης/Ï€Ïος, όνομα αÏχείου, επέκταση.<br> Ψευδο-πεδία: κατάλογος, mime/μοÏφή, Ï„Ïπος/rclcat, ημεÏομηνία, μέγεθος.<br> ΠαÏαδείγματα δυο διαστημάτων ημεÏομηνιών: 2009-03-01/2009-05-20 2009-03-01/Π2Μ.<br> <i>ÏŒÏος1 ÏŒÏος2 OR ÏŒÏος3</i> : ÏŒÏος1 AND (ÏŒÏος2 OR ÏŒÏος3).<br> ΜποÏείτε να χÏησιμοποιείτε παÏενθέσεις για πιο ευανάγνωστες εκφÏάσεις.<br> <i>"ÏŒÏος1 ÏŒÏος2"</i> : φÏάση (Ï€Ïέπει να αντιστοιχεί ακÏιβώς). Πιθανοί Ï„Ïοποποιητές:<br> <i>"ÏŒÏος1 ÏŒÏος2"p</i> : αταξινόμητη και κατά Ï€Ïοσέγγιση αναζήτηση με Ï€ÏοκαθοÏισμένη απόσταση.<br> ΧÏησιμοποιήστε τον δεσμό <b>Εμφάνιση εÏωτήματος</b> σε πεÏίπτωση αμφιβολίας σχετικά με το αποτέλεσμα και ανατÏέξτε στο εγχειÏίδιο χÏήσης (&lt;F1>) για πεÏισσότεÏες λεπτομέÏειες. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Erase search entry ΚαθαÏισμός της καταχώÏησης Clear ΚαθαÏισμός Ctrl+S Ctrl+S Start query ΈναÏξη της αναζήτησης Search Αναζήτηση Choose search type. Επιλογή του Ï„Ïπου αναζήτησης. Enter search terms here. Type ESC SPC for completions of current term. Εισάγετε εδώ τους ÏŒÏους αναζήτησης. Πατήστε ESC SPC για να εμφανίσετε τις λέξεις που αÏχίζουν από τον Ï„Ïέχοντα ÏŒÏο. SearchClauseW Any Οποιοδήποτε All Όλα None Κανένα Phrase ΦÏάση Proximity ΕγγÏτητα File name Όνομα του αÏχείου No field ΧωÏίς πεδίο Select the type of query that will be performed with the words Επιλέξτε τον Ï„Ïπο του εÏωτήματος που θα Ï€Ïαγματοποιηθεί με τις λέξεις Number of additional words that may be interspersed with the chosen ones ΑÏιθμός των επιπÏόσθετων λέξεων που μποÏοÏν να βÏεθοÏν Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ αναζητηθέντων ÏŒÏων Snippets Snippets Αποσπάσματα Find: ΕÏÏεση: Next Επόμενο Prev ΠÏοηγοÏμενο SnippetsW Search Αναζήτηση <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> <p>Λυπάμαι, δεν βÏέθηκε μια ακÏιβής αντιστοιχία εντός οÏίων. Πιθανώς το έγγÏαφο να είναι ογκώδες και ο δημιουÏγός αποσπασμάτων χάθηκε σε έναν λαβÏÏινθο...</p> SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse ΠεÏιήγηση Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer ΕξεÏευνητής ÏŒÏων &Expand &Ανάπτυξη Alt+E Alt+E &Close &Κλείσιμο Alt+C Alt+C No db info. Δεν υπάÏχουν πληÏοφοÏίες για τη βάση δεδομένων. Match ΤαίÏιασμα Case Πεζά/κεφαλαία Accents Τόνοι SpellW Wildcards ΧαÏακτήÏες υποκατάστασης Regexp Κανονική έκφÏαση Stem expansion ΓÏαμματική επέκταση Spelling/Phonetic ΟÏθογÏαφία/Φωνητικό error retrieving stemming languages σφάλμα κατά τη λήψη των γλωσσών επέκτασης Term ÎŒÏος Doc. / Tot. Doc. / Tot. Index: %1 documents, average length %2 terms ΕυÏετήÏιο: %1 έγγÏαφα, μέσο μήκος %2 ÏŒÏοι Aspell init failed. Aspell not installed? Σφάλμα στην αÏχικοποίηση του aspell. Μήπως δεν είναι εγκατεστημένο; Aspell expansion error. Σφάλμα επέκτασης του aspell. No expansion found Κανένα αποτέλεσμα Index: %1 documents, average length %2 terms.%3 results ΕυÏετήÏιο: %1 έγγÏαφα, μέσο μήκος %2 ÏŒÏοι.%3 αποτελέσματα %1 results %1 αποτελέσματα List was truncated alphabetically, some frequent Η λίστα έχει κοπεί αλφαβητικά, μεÏικοί συχνοί terms may be missing. Try using a longer root. ÏŒÏοι μποÏεί να λείπουν. ΠÏοσπαθήστε να χÏησιμοποιήσετε μια πιο μακÏιά Ïίζα. Show index statistics Εμφάνιση στατιστικών του ευÏετηÏίου Number of documents ΑÏιθμός εγγÏάφων Average terms per document Μέσος ÏŒÏος ÏŒÏων ανά έγγÏαφο Smallest document length ΜικÏότεÏο μήκος εγγÏάφου Longest document length ΜεγαλÏτεÏο μήκος εγγÏάφου Database directory size Μέγεθος καταλόγου βάσης δεδομένων MIME types: ΤÏποι MIME: Item Αντικείμενο Value Τιμή List files which could not be indexed (slow) Spell expansion error. Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files UIPrefsDialog Choose Επιλέξτε error retrieving stemming languages σφάλμα κατά τη λήψη των γλωσσών επέκτασης Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Επιλέξτε έναν κατάλογο που πεÏιέχει ένα ευÏετήÏιο Xapian (Ï€.χ. /home/buddy/.recoll/xapiandb) The selected directory does not appear to be a Xapian index Ο επιλεγμένος κατάλογος δεν φαίνεται ότι είναι ένα ευÏετήÏιο Xapian This is the main/local index! Αυτό είναι το κÏÏιο ευÏετήÏιο! The selected directory is already in the index list Ο επιλεγμένος κατάλογος βÏίσκεται ήδη στη λίστα Result list paragraph format (erase all to reset to default) ΜοÏφή λίστας παÏαγÏάφου αποτελεσμάτων (διαγÏαφή όλων για επαναφοÏά στην εξ' οÏισμοÏ) Result list header (default is empty) Επικεφαλίδα λίστας αποτελεσμάτων (η εξ' οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ κενή) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Επιλέξτε τον κατάλογο διαμόÏφωσης του recoll ή του καταλόγου ευÏετηÏίου του xapian (Ï€.χ.: /home/me/.recoll ή /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Ο επιλεγμένος κατάλογος φαίνεται ως ένας κατάλογος διαμόÏφωσης του Recoll αλλά δεν είναι δυνατή η ανάγνωση της διαμόÏφωσης At most one index should be selected Ένα πεÏισσότεÏο ευÏετήÏιο θα Ï€Ïέπει να επιλεχθεί Cant add index with different case/diacritics stripping option ΑδÏνατη η Ï€Ïοσθήκη ευÏετηÏίου με διαφοÏετικές επιλογές διάκÏισης πεζών / κεφαλαίων και αποσπασμάτων Default QtWebkit font ΓÏαμματοσειÏά εξ οÏÎ¹ÏƒÎ¼Î¿Ï QtWebkit Any term Οποιοσδήποτε ÏŒÏος All terms Όλοι οι ÏŒÏοι File name Query language Γλώσσα εÏωτημάτων Value from previous program exit ViewAction MIME type ΤÏπος MIME Command Εντολή Changing actions with different current values Αλλαγή των ενεÏγειών με διαφοÏετικές Ï„Ïέχουσες τιμές Desktop Default ΠÏοκαθοÏισμένο Επιφάνειας εÏγασίας Changing entries with different current values Αλλαγή αντικειμένων με Ï„Ïέχουσες τιμές διαφοÏετικές ViewActionBase Native Viewers ΕφαÏμογές απεικόνισης Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Επιλέξτε έναν ή πεÏισσότεÏους Ï„Ïπους MIME και κάντε κλικ στο «Αλλαγή της ενέÏγειας»<br>ΜποÏείτε επίσης να κλείσετε το διάλογο και να επιλέξετε «ΧÏήση των Ï€Ïοτιμήσεων του πεÏιβάλλοντος εÏγασίας»<br>στο κÏÏιο παÏάθυÏο για να αγνοήσετε αυτή τη λίστα. Select one or several file types, then click Change Action to modify the program used to open them Επιλέξτε έναν ή πεÏισσότεÏους Ï„Ïπους αÏχείων και κάντε κλικ στο «Αλλαγή» για να αλλάξετε το Ï€ÏόγÏαμμα που χÏησιμοποιείται για το άνοιγμά τους Change Action Αλλαγή Close Κλείσιμο Select one or several mime types then use the controls in the bottom frame to change how they are processed. Επιλέξτε έναν οι πεÏισσότεÏους Ï„Ïπους αÏχείων, και στη συνέχεια χÏησιμοποιήστε τα κουμπιά ελέγχου στο πλαίσιο στο κάτω μέÏος για να αλλάξετε τον Ï„Ïόπο επεξεÏγασίας. Use Desktop preferences by default ΧÏήση εξ' οÏÎ¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ Ï€Ïοτιμήσεων της Επιφάνειας εÏγασίας Select one or several file types, then use the controls in the frame below to change how they are processed Επιλέξτε έναν οι πεÏισσότεÏους Ï„Ïπους αÏχείων, και στη συνέχεια χÏησιμοποιήστε τα κουμπιά ελέγχου στο παÏακάτω πλαίσιο για να αλλάξετε τον Ï„Ïόπο επεξεÏγασίας Exception to Desktop preferences ΕξαίÏεση των Ï€Ïοτιμήσεων Επιφάνειας εÏγασίας Action (empty -> recoll default) ΕνέÏγεια (κενό -> Ï€ÏοκαθοÏισμένη του recoll) Apply to current selection ΕφαÏμογή στην Ï„Ïέχουσα επιλογή Recoll action: ΕνέÏγεια Recoll: current value Ï„Ïέχουσα τιμή Select same Επιλογή ανά τιμή <b>New Values:</b> <b>Îέες τιμές:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Steal Beagle indexing queue Κλέψιμο της ουÏάς ευÏετηÏίασης του Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Το Beagle ΔΕΠΠΡΕΠΕΙ να εκτελείται. ΕπιτÏέπει την επεξεÏγασία της ουÏάς του Beagle για ευÏετηÏίαση του ιστοÏÎ¹ÎºÎ¿Ï Ï„Ï‰Î½ ιστοσελίδων του Firefox.<br>(θα Ï€Ïέπει επίσης να εγκαταστήσετε το Ï€Ïόσθετο του Beagle για το Firefox) Web page store directory name Όνομα καταλόγου αποθήκευσης ιστοσελίδων The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Το όνομα του καταλόγου αποθήκευσης αντιγÏάφων των επισκεφθέντων ιστοσελίδων.<br>Μια σχετική διαδÏομή αναφεÏόμενη στη διαδÏομή διαμόÏφωσης. Max. size for the web store (MB) Μέγ. μέγεθος της λανθάνουσας μνήμης Î¹ÏƒÏ„Î¿Ï (MB) Entries will be recycled once the size is reached Θα γίνεται αντικατάσταση των καταχωÏήσεων όταν επιτευχθεί το καθοÏισμένο μέγεθος Process the WEB history queue ΕπεξεÏγασία της ουÏάς ιστοÏÎ¹ÎºÎ¿Ï Ï„Î¿Ï… Î™ÏƒÏ„Î¿Ï Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) ΕνεÏγοποιεί τη δεικτοδότηση των επισκεπτόμενων σελίδων στον Firefox.<br>(θα Ï€Ïέπει να εγκαταστήσετε και το Ï€Ïόσθετο Firefox Recoll) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file ΑδÏνατη η εγγÏαφή του αÏχείου διαμόÏφωσης confgui::ConfParamFNW Choose Επιλέξτε confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Αυτόματη ευαισθησία στους τόνους <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>Αυτόματη εναλλαγή ευαισθησίας Ï„Î¿Î½Î¹ÏƒÎ¼Î¿Ï Î±Î½ ο ÏŒÏος αναζήτησης διαθέτει τονισμένους χαÏακτήÏες (εκτός αυτών του unac_except_trans). ΔιαφοÏετικά θα Ï€Ïέπει να χÏησιμοποιήσετε τη γλώσσα της αναζήτησης και τον Ï„Ïοποποιητή <i>D</i> για τον καθοÏισμό της ευαισθησίας τονισμών. Automatic character case sensitivity Αυτόματη ευαισθησία πεζών/κεφαλαίων <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>Αυτόματη εναλλαγή ευαισθησίας διάκÏισης πεζών/κεφαλαίων αν η ο ÏŒÏος αναζήτησης διαθέτει κεφαλαία γÏάμματα (εκτός του Ï€Ïώτου γÏάμματος). ΔιαφοÏετικά θα Ï€Ïέπει να χÏησιμοποιήσετε τη γλώσσα της αναζήτησης και τον Ï„Ïοποποιητή <i>C</i> για τον καθοÏισμό της ευαισθησίας διάκÏισης πεζών / κεφαλαίων. Maximum term expansion count Μέγιστο μέγεθος επέκτασης ενός ÏŒÏου <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>Μέγιστος αÏιθμός επέκτασης για έναν ÏŒÏο (Ï€.χ.: κατά τη χÏήση χαÏακτήÏων υποκατάστασης). Η Ï€ÏοκαθοÏισμένη τιμή 10000 είναι λογική και θα αποφÏγει εÏωτήματα που εμφανίζονται σαν παγωμένα την ίδια στιγμή που η μηχανή διαπεÏνά τη λίστα ÏŒÏων. Maximum Xapian clauses count Μέγιστος αÏιθμός ÏητÏών Xapian <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>Μέγιστος αÏιθμός στοιχειωδών ÏητÏών που Ï€Ïοσθέτουμε σε ένα απλό εÏώτημα Xapian. Σε μεÏικές πεÏιπτώσεις, το αποτέλεσμα της επέκτασης των ÏŒÏων μποÏεί να είναι πολλαπλασιαστικό, και θα χÏησιμοποιοÏσε υπεÏβολική μνήμη. Η Ï€ÏοκαθοÏισμένη τιμή 100000 θα Ï€Ïέπει να είναι επαÏκής και συμβατή με μια τυπική διαμόÏφωση υλικοÏ. confgui::ConfSubPanelW Max. compressed file size (KB) Μεγ.μέγεθος για τα συμπιεσμένα αÏχεία (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Αυτή η τιμή καθοÏίζει ένα ÏŒÏιο πέÏαν του οποίου τα συμπιεσμένα αÏχεία δεν θα επεξεÏγάζονται. ΧÏησιμοποιήστε -1 για κανένα ÏŒÏιο, 0 για να μην επεξεÏγάζονται τα συμπιεσμένα αÏχεία. Max. text file size (MB) Μεγ. μέγεθος αÏχείων κειμένου (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Αυτή η τιμή οÏίζει ένα ÏŒÏιο πέÏαν του οποίου δεν θα γίνεται ευÏετηÏίαση για τα αÏχεία κειμένου. ΟÏίστε -1 για κανένα ÏŒÏιο. Αυτό χÏησιμεÏει για τον αποκλεισμό από την ευÏετηÏίαση τεÏάστιων αÏχείων καταγÏαφών. Text file page size (KB) Μέγεθος κοπής για τα αÏχεία κειμένου (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Αν αυτή η τιμή έχει οÏιστεί και είναι θετική, τα αÏχεία κειμένου θα κοποÏν σε κομμάτια Î±Ï…Ï„Î¿Ï Ï„Î¿Ï… μεγέθους για την ευÏετηÏίαση. Αυτό βοηθά στη μείωση των καταναλωμένων πόÏων από την ευÏετηÏίαση και βοηθά τη φόÏτωση για την Ï€Ïοεπισκόπηση. Max. filter exec. time (S) Μεγ. χÏόνος εκτέλεσης για ένα φίλτÏο (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Τα εξωτεÏικά φίλτÏα σε λειτουÏγία μεγαλÏτεÏη από αυτό θα διακόπτονται. ΧÏήσιμο για τη σπάνια πεÏίπτωση (Ï€.χ. postscript) όπου ένα έγγÏαφο μποÏεί να Ï€Ïοκαλέσει ένα βÏόγχο στο φίλτÏο. οÏίστε το σε -1 για να αφαιÏέσετε το ÏŒÏιο. Global Γενικά External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Τα εξωτεÏικά φίλτÏα σε λειτουÏγία μεγαλÏτεÏη από αυτό θα διακόπτονται. ΧÏήσιμο για τη σπάνια πεÏίπτωση (Ï€.χ. postscript) όπου ένα έγγÏαφο μποÏεί να Ï€Ïοκαλέσει ένα βÏόγχο στο φίλτÏο. ΟÏίστε το σε -1 για να αφαιÏέσετε το ÏŒÏιο. Only mime types Μόνο οι Ï„Ïποι MIME An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Μια αποκλειστική λίστα δεικτοδοτημένων Ï„Ïπων mime.<br>Δεν θα δεικτοδοτηθεί τίποτα άλλο. Φυσιολογικά κενό και αδÏανές Exclude mime types Αποκλεισμός Ï„Ïπων αÏχείων Mime types not to be indexed Οι Ï„Ïποι Mime που δεν θα δεικτοδοτηθοÏν confgui::ConfTopPanelW Top directories Κατάλογοι εκκίνησης The list of directories where recursive indexing starts. Default: your home. Η λίστα των καταλόγων για την έναÏξη της αναδÏομικής ευÏετηÏίασης. ΠÏοεπιλογή: ο Ï€Ïοσωπικός σας κατάλογος. Skipped paths ΠαÏαλειπόμενες διαδÏομές These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') ΠÏόκειται για ονόματα καταλόγων που δεν θα δεικτοδοτηθοÏν.<br>ΜποÏοÏν να πεÏιέχουν χαÏακτήÏες υποκατάστασης. Οι διαδÏομές Ï€Ïέπει να αντιστοιχοÏν με αυτές που είδε ο δεικτοδότης (Ï€.χ: αν ένας κατάλογος έναÏξης είναι '/home/me' και το '/home' είναι ένας δεσμός στο '/usr/home', μια σωστή διαδÏομή εδώ θα ήταν '/home/me/tmp*' , όχι '/usr/home/me/tmp*') Stemming languages Γλώσσα για την επέκταση των ÏŒÏων The languages for which stemming expansion<br>dictionaries will be built. Οι γλώσσες για τις οποίες θα δημιουÏγηθοÏν τα λεξικά επεκτάσεων<br>των ÏŒÏων. Log file name Όνομα του αÏχείου καταγÏαφών The file where the messages will be written.<br>Use 'stderr' for terminal output Το αÏχείο που θα εγγÏαφοÏν τα μηνÏματα.<br>ΧÏησιμοποιήστε 'stderr' για την έξοδο τεÏÎ¼Î±Ï„Î¹ÎºÎ¿Ï Log verbosity level Επίπεδο ανάλυσης των καταγÏαφών This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Αυτή η τιμή Ïυθμίζει την ποσότητα των απεσταλμένων μηνυμάτων,<br>από μόνο τα σφάλματα μέχÏι πολλά δεδομένα αποσφαλμάτωσης. Index flush megabytes interval ΚαθυστέÏηση εγγÏαφής του ευÏετηÏίου σε megabyte This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Αυτή η τιμή Ïυθμίζει την ποσότητα των δεδομένων που δεικτοδοτοÏνται Î¼ÎµÏ„Î±Î¾Ï Ï„Ï‰Î½ εγγÏαφών στο δίσκο.<br>Βοηθά στον έλεγχο χÏήσης της μνήμης. ΠÏοεπιλογή: 10MB Max disk occupation (%) Μεγ. χÏήση του δίσκου (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Το ποσοστό χÏήσης του δίσκου που θα σταματήσει η ευÏετηÏίαση (για να αποφευχθεί η υπεÏβολική πλήÏωση).<br>0 σημαίνει χωÏίς ÏŒÏιο (Ï€Ïοεπιλογή). Use system's 'file' command ΧÏήση της εντολής 'file' του συστήματος Use the system's 'file' command if internal<br>mime type identification fails. ΧÏήση της εντολής 'file' αν ο εσωτεÏικός εντοπισμός<br>του Ï„Ïπου mime δεν επιφέÏει αποτελέσματα. No aspell usage ΧωÏίς χÏήση του aspell Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. ΑπενεÏγοποιεί τη χÏήση του aspell για τη δημιουÏγία των οÏθογÏαφικών Ï€Ïοσεγγίσεων.<br>ΧÏήσιμο αν το aspell δεν είναι εγκατεστημένο ή δεν λειτουÏγεί. Aspell language Γλώσσα του aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Η γλώσσα για το λεξικό aspell. Αυτό θα Ï€Ïέπει να είναι του Ï„Ïπου «en» ή «el» ...<br> Αν αυτή η τιμή δεν οÏιστεί, χÏησιμοποιείται το εθνικό πεÏιβάλλον NLS για να την υπολογίσει, που συνήθως δουλεÏει. Για να πάÏετε μια ιδέα του τι είναι εγκατεστημένο στο σÏστημά σας, πληκτÏολογήστε «aspell config» και παÏατηÏήστε τα αÏχεία .dat στον κατάλογο «data-dir». Database directory name Κατάλογος αποθήκευσης του ευÏετηÏίου The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Το όνομα του καταλόγου αποθήκευσης του ευÏετηÏίου<br>Μια σχετική διαδÏομή αναφεÏόμενη στη διαδÏομή διαμόÏφωσης. Η εξ' οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ «xapiandb». The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Η γλώσσα για το λεξικό aspell. Αυτό θα Ï€Ïέπει να είναι του Ï„Ïπου «en» ή «el» ...<br> Αν αυτή η τιμή δεν οÏιστεί, χÏησιμοποιείται το εθνικό πεÏιβάλλον NLS για να την υπολογίσει, που συνήθως δουλεÏει. Για να πάÏετε μια ιδέα του τι είναι εγκατεστημένο στο σÏστημά σας, πληκτÏολογήστε «aspell config» και παÏατηÏήστε τα αÏχεία .dat στον κατάλογο «data-dir». The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Το όνομα του καταλόγου αποθήκευσης του ευÏετηÏίου<br>Μια σχετική διαδÏομή αναφεÏόμενη στη διαδÏομή διαμόÏφωσης. Η εξ' οÏÎ¹ÏƒÎ¼Î¿Ï ÎµÎ¯Î½Î±Î¹ «xapiandb». Unac exceptions ΕξαιÏέσεις unac <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Αυτές είναι εξαιÏέσεις για τον μηχανισμό unac, ο οποίος εξ' οÏισμοÏ, αφαιÏεί όλους τους τονισμοÏÏ‚, και Ï€Ïαγματοποιεί κανονική αποσÏνθεση. ΜποÏείτε να αναιÏέσετε την αφαίÏεση των τονισμών για οÏισμένους χαÏακτήÏες, ανάλογα με τη γλώσσα σας, και διευκÏινίστε άλλους αποσυνθέσεις, για παÏάδειγμα συμπλεγμένους χαÏακτήÏες. Στη λίστα διαχωÏισμένη με κενά, ο Ï€Ïώτος χαÏακτήÏας ενός αντικειμένου είναι η πηγή, το υπόλοιπο είναι η μετάφÏαση. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences ΠÏοτιμήσεις χÏήστη User interface ΠεÏιβάλλον χÏήστη Highlight color for query terms ΧÏώμα Ï„Î¿Î½Î¹ÏƒÎ¼Î¿Ï Ï„Ï‰Î½ ÏŒÏων αναζήτησης Style sheet ΦÏλλο στυλ Opens a dialog to select the style sheet file Ανοίγει έναν διάλογο για την επιλογή ενός αÏχείου φÏλλου στυλ Choose Επιλογή Resets the style sheet to default ΕπαναφέÏει την Ï€ÏοκαθοÏισμένη τιμή για το φÏλλο στυλ Reset ΕπαναφοÏά Texts over this size will not be highlighted in preview (too slow). Τα κείμενα μεγαλÏτεÏα από αυτό το μέγεθος δεν θα τονιστοÏν στην Ï€Ïοεπισκόπηση (Ï€Î¿Î»Ï Î±Ïγό). Maximum text size highlighted for preview (megabytes) Μεγ. μέγεθος τονισμένων κειμένων Ï€Ïος Ï€Ïοεπισκόπηση (MB) Prefer Html to plain text for preview. ΧÏήση της μοÏφής HTML για την Ï€Ïοεπισκόπηση. Lines in PRE text are not folded. Using BR loses some indentation. Οι γÏαμμές στις ενότητες PRE δεν δικαιολογοÏνται. ΧÏησιμοποιώντας BR χάνονται μεÏικές εσοχές. Use <PRE> tags instead of <BR>to display plain text as html in preview. ΧÏήση <PRE> αντί <BR> για απλό κείμενο αντί html στην Ï€Ïοεπισκόπηση. Use desktop preferences to choose document editor. ΧÏήση Ïυθμίσεων του πεÏιβάλλοντος για την επιλογή της εφαÏμογής Ï€Ïοβολής. Choose editor applications Επιλέξτε τους επεξεÏγαστές για τους διάφοÏους Ï„Ïπους αÏχείων Display category filter as toolbar instead of button panel (needs restart). Εμφάνιση φίλτÏ. κατηγοÏίας ως γÏ. εÏγαλείων αντί για πίν. κουμπιών (απαιτεί επανεκκίνηση). Auto-start simple search on whitespace entry. Αυτόματη έναÏξη μιας απλής αναζήτησης όταν εισαχθεί ένα κενό. Start with advanced search dialog open. Εκκίνηση με τον διάλογο της Ï€ÏοχωÏημένης αναζήτησης ανοιχτό. Remember sort activation state. Απομνημόνευση της κατάστασης ενεÏγοποίησης της ταξινόμησης. Result List Λίστα αποτελεσμάτων Number of entries in a result page ΑÏιθμός αποτελεσμάτων ανά σελίδα Result list font ΓÏαμματοσειÏά λίστας Opens a dialog to select the result list font Ανοίγει έναν διάλογο για την επιλογή της γÏαμματοσειÏάς για τη λίστα αποτελεσμάτων Helvetica-10 Helvetica-10 Resets the result list font to the system default ΕπαναφέÏει τη γÏαμματοσειÏά της λίστας αποτελεσμάτων στην Ï€ÏοκαθοÏισμένη του συστήματος Edit result paragraph format string ΕπεξεÏγασία της μοÏφής της παÏαγÏάφου αποτελεσμάτων Edit result page html header insert ΕπεξεÏγασία του τμήματος για εισαγωγή στην κεφαλίδα HTML Date format (strftime(3)) ΜοÏφή της ημεÏομηνίας (strftime(3)) Abstract snippet separator ΔιαχωÏιστής αποσπάσματος Search parameters Ρυθμίσεις αναζήτησης If checked, results with the same content under different names will only be shown once. Εμφανίζει μια μόνο καταχώÏηση για τα αποτελέσματα με πανομοιότυπο πεÏιεχόμενο. Hide duplicate results. ΑπόκÏυψη των διπλοεγγÏαφών. Stemming language Γλώσσα για την ανάπτυξη των ÏŒÏων A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Μια αναζήτηση για [χωÏιάτικη σαλάτα] (2 ÏŒÏοι) θα συμπληÏωθεί ως [χωÏιάτικη Ή σαλάτα Ή (χωÏιάτικη ΦΡΑΣΗ 2 σαλάτα)].<br> Αυτό θα Ï€Ïέπει να αποδώσει μια καλÏτεÏη εγγÏτητα των αποτελεσμάτων όπου οι αναζητοÏμενοι ÏŒÏοι εμφανίζονται ακÏιβώς με τη σειÏά. Automatically add phrase to simple searches ΠÏοσθήκη αυτόματα μιας φÏάσης στις απλές αναζητήσεις Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). ÎŒÏιο συχνότητας (ποσοστό) πέÏαν του οποίου οι ÏŒÏοι δεν θα χÏησιμοποιοÏνται. Οι φÏάσεις που πεÏιέχουν Ï€Î¿Î»Ï ÏƒÏ…Ï‡Î½Î¿ÏÏ‚ ÏŒÏους δημιουÏγοÏν Ï€Ïοβλήματα στην απόδοση. Οι αγνοημένοι ÏŒÏοι αυξάνουν την απόσταση της φÏάσης, και μειώνουν την αποτελεσματικότητα της λειτουÏγίας αναζήτησης αυτόματης φÏάσης. Η Ï€ÏοκαθοÏισμένη τιμή είναι 2%. Autophrase term frequency threshold percentage ÎŒÏιο συχνότητας του ÏŒÏου (ποσοστό) για την αυτόματη δημιουÏγία φÏάσεων Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Αποφασίζει αν θα δημιουÏγοÏνται αποσπάσματα από το πεÏιεχόμενο των ÏŒÏων αναζήτησης. ΜποÏεί να επιβÏαδÏνει την απεικόνιση αν τα έγγÏαφα είναι μεγάλα. Dynamically build abstracts Δυναμική δημιουÏγία των αποσπασμάτων Do we synthetize an abstract even if the document seemed to have one? Θα Ï€Ïέπει να γίνεται σÏνθεση μιας σÏνοψης ακόμα και αν το αÏχικό έγγÏαφο διαθέτει μια; Replace abstracts from documents Αντικατάσταση των υπαÏχόντων αποσπασμάτων στα έγγÏαφα Synthetic abstract size (characters) Μέγεθος του ÏƒÏ…Î½Î¸ÎµÏ„Î¹ÎºÎ¿Ï Î±Ï€Î¿ÏƒÏ€Î¬ÏƒÎ¼Î±Ï„Î¿Ï‚ (χαÏακτήÏες) Synthetic abstract context words ΑÏιθμός σχετικών λέξεων ανά εμφάνιση του ÏŒÏου στο απόσπασμα The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Οι λέξεις στη λίστα θα αλλάξουν αυτόματα σε ÏήτÏες ext:xxx στις καταχωÏήσεις σε γλώσσα εÏωτημάτων. Query language magic file name suffixes. Αυτόματα επιθήματα για τη γλώσσα εÏωτημάτων. Enable ΕνεÏγό External Indexes ΕξωτεÏικά ευÏετήÏια Toggle selected Αλλαγή κατάστασης επιλεγμένων Activate All ΕνεÏγοποίηση όλων Deactivate All ΑπενεÏγοποίηση όλων Remove from list. This has no effect on the disk index. ΑφαίÏεση από τη λίστα. Δεν έχει επίπτωση στο αποθηκευμένο ευÏετήÏιο. Remove selected ΑφαίÏεση των επιλεγμένων Click to add another index directory to the list Κάντε κλικ για να Ï€Ïοσθέσετε ένα άλλο ευÏετήÏιο στη λίστα Add index ΠÏοσθήκη ευÏετηÏίου Apply changes ΕφαÏμογή των αλλαγών &OK &Εντάξει Discard changes ΑπόÏÏιψη των αλλαγών &Cancel &ΑκÏÏωση Plain text to HTML line style Στυλ μετάφÏασης απλό κείμενο σε HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Οι γÏαμμές που είναι έγκλειστες στα PRE δεν αναδιπλώνονται. Η χÏήση BR οδηγεί σε απώλεια οÏισμένων εσοχών. Το στυλ PRE + αναδίπλωση φαίνεται να είναι η καλÏτεÏη επιλογή αλλά η σωστή του λειτουÏγία εξαÏτάται από την έκδοση της Qt. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + αναδίπλωση Disable Qt autocompletion in search entry. ΑπενεÏγοποίηση της αυτόματης συμπλήÏωσης Qt στην εισαγωγή αναζήτησης. Search as you type. Αναζήτηση κατά την πληκτÏολόγηση. Paths translations ΔιαδÏομές μεταφÏάσεων Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Κάντε κλικ για να Ï€Ïοσθέσετε έναν κατάλογο ευÏετηÏίου στη λίστα. ΜποÏείτε να επιλέξετε είτε έναν κατάλογο διαμόÏφωσης Recoll ή ένα ευÏετήÏιο Xapian. Snippets window CSS file ΑÏχείο CSS παÏαθÏÏου αποσπάσματος Opens a dialog to select the Snippets window CSS style sheet file Ανοίγει έναν διάλογο που σας επιτÏέπει την επιλογή του αÏχείου στυλ CSS για το αναδυόμενο παÏάθυÏο αποσπασμάτων Resets the Snippets window style ΕπαναφοÏά του στυλ του παÏαθÏÏου αποσπασμάτων Decide if document filters are shown as radio buttons, toolbar combobox, or menu. ΚαθοÏίζει αν τα φίλτÏα των εγγÏάφων θα εμφανίζονται ως κουμπιά επιλογών, γÏαμμή εÏγαλείων πλαισίων συνδυασμών, ή μενοÏ. Document filter choice style: ΤεχνοτÏοπία επιλογής φίλτÏου εγγÏάφων: Buttons Panel Πίνακας κουμπιών Toolbar Combobox ΓÏαμμή εÏγαλείων πλαισίων συνδυασμών Menu ÎœÎµÎ½Î¿Ï Show system tray icon. Εμφάνιση του εικονιδίου πλαισίου συστήματος. Close to tray instead of exiting. Αντί για έξοδο, καταχώνιασμα στο πλαίσιο συστήματος. Highlight CSS style for query terms Start with simple search mode Show warning when opening temporary file. User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file recoll-1.23.7/qtgui/i18n/recoll_ru.ts0000644000175000017500000052706613224431020014262 00000000000000 AdvSearch All clauses Ð’Ñе Ð¿Ð¾Ð»Ñ Any clause Любое поле texts текÑты spreadsheets таблицы presentations презентации media мультимедиа messages ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ other иное Bad multiplier suffix in size filter Ðеверный ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð¼Ð½Ð¾Ð¶Ð¸Ñ‚ÐµÐ»Ñ Ð² фильтре размера text текÑÑ‚ spreadsheet таблицы presentation презентации message ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ AdvSearchBase Advanced search Сложный поиÑк Restrict file types Ограничить типы файлов Save as default Сохранить как умолчание Searched file types ИÑкомые All ----> Ð’Ñе ----> Sel -----> Эти ----> <----- Sel <----- Эти <----- All <----- Ð’Ñе Ignored file types Игнорируемые Enter top directory for search Введите каталог начала поиÑка Browse ПроÑмотр Restrict results to files in subtree: ИÑкать только в каталоге: Start Search Ðачать поиÑк Search for <br>documents<br>satisfying: ИÑкать <br>документы,<br>удовлетворÑющие: Delete clause Убрать поле Add clause Добавить поле Check this to enable filtering on file types Фильтровать по типам файлов By categories По категориÑм Check this to use file categories instead of raw mime types ИÑпользовать категории, а не типы MIME Close Закрыть All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Ð’Ñе непуÑтые Ð¿Ð¾Ð»Ñ Ñправа будут объединены логичеÑким И ("вÑе Ñлова") или ИЛИ ("любое Ñлово"). <br>ÐŸÐ¾Ð»Ñ Ñ‚Ð¸Ð¿Ð° "любые", "вÑе" или "без Ñтих" принимают набор проÑтых Ñлов и фразы, заключённые в двойные кавычки.<br>ПуÑтые Ð¿Ð¾Ð»Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑŽÑ‚ÑÑ. Invert Обратить Minimum size. You can use k/K,m/M,g/G as multipliers Минимальный размер. Можно иÑпользовать k/K, m/M, g/G как множители Min. Size Мин. размер Maximum size. You can use k/K,m/M,g/G as multipliers МакÑ. размер. Можно иÑпользовать k/K, m/M, g/G как множители Max. Size МакÑ. размер Filter Фильтр From От To До Check this to enable filtering on dates Включить фильтрование по дате Filter dates Фильтрование по дате Find Ðайти Check this to enable filtering on sizes Включить фильтрование по размеру Filter sizes Фильтрование по размеру CronToolW Cron Dialog Диалог Cron <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">РаÑпиÑание пакетного индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <span style=" font-weight:600;">Recoll</span> (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Каждое поле может Ñодержать шаблон (*), одно чиÑленное значение, ÑпиÑок через запÑтую (1,3,5) или диапазон (1-7). Эти Ð¿Ð¾Ð»Ñ Ð±ÑƒÐ´ÑƒÑ‚ иÑпользованы <span style=" font-style:italic;">как еÑть</span> в файле crontab, Ð´Ð»Ñ Ð¾Ð·Ð½Ð°ÐºÐ¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð»Ð½Ñ‹Ð¼ ÑинтакÑиÑом которого Ñм. crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Ðапример, ввод <span style=" font-family:'Courier New,courier';">*</span> Ð´Ð»Ñ <span style=" font-style:italic;">Дни</span>, <span style=" font-family:'Courier New,courier';">12,19</span> Ð´Ð»Ñ <span style=" font-style:italic;">ЧаÑÑ‹</span> и <span style=" font-family:'Courier New,courier';">15</span> Ð´Ð»Ñ <span style=" font-style:italic;">Минуты</span> запуÑтит recollindex ежедневно в 12:15 и 19:15.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">РаÑпиÑание Ñ Ð¾Ñ‡ÐµÐ½ÑŒ чаÑтыми запуÑками может оказатьÑÑ Ð¼ÐµÐ½ÐµÐµ Ñффективным, чем индекÑирование в реальном времени.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Дни недели (* или 0-7, 0 или 7 - воÑкреÑенье) Hours (* or 0-23) ЧаÑÑ‹ (* или 0-23) Minutes (0-59) Минуты (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ðажмите <span style=" font-style:italic;">Выключить</span> Ð´Ð»Ñ Ð¿Ñ€ÐµÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑкой фоновой индекÑации, <span style=" font-style:italic;">Включить</span> Ð´Ð»Ñ ÐµÑ‘ запуÑка, <span style=" font-style:italic;">Отмена</span>, чтобы оÑтавить вÑÑ‘ как еÑть.</p></body></html> Enable Включить Disable Выключить It seems that manually edited entries exist for recollindex, cannot edit crontab Похоже, что Ð´Ð»Ñ recollindex еÑть вручную правленые запиÑи, не будем трогать crontab Error installing cron entry. Bad syntax in fields ? Ошибка уÑтановки запиÑи cron. Ðеверный ÑинтакÑÐ¸Ñ Ð¿Ð¾Ð»ÐµÐ¹? EditDialog Dialog Диалог EditTrans Source path ИÑходный путь Local path Локальный путь Config error Ошибка конфигурации Original path Изначальный путь EditTransBase Path Translations Корректировка путей Setting path translations for Задать корректировку Ð´Ð»Ñ Select one or several file types, then use the controls in the frame below to change how they are processed Выберите типы файлов и иÑпользуйте кнопки ниже, чтобы изменить то, как они обрабатываютÑÑ Add Добавить Delete Удалить Cancel Отмена Save Сохранить FirstIdxDialog First indexing setup ÐаÑтройка первого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Похоже, что Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñтой конфигурации не ÑущеÑтвует.</span><br /><br />ЕÑли надо проиндекÑировать домашний каталог Ñ Ð½Ð°Ð±Ð¾Ñ€Ð¾Ð¼ разумных умолчаний, нажмите кнопку <span style=" font-style:italic;">ЗапуÑтить индекÑирование</span>. ПодробноÑти можно будет уточнить позже. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ЕÑли требуетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ контролÑ, воÑпользуйтеÑÑŒ ÑÑылками Ð´Ð»Ñ ÑƒÑ‚Ð¾Ñ‡Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ и раÑпиÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑированиÑ.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Этот инÑтрументарий доÑтупен в любое Ð²Ñ€ÐµÐ¼Ñ Ð¿Ð¾ÑредÑтвом меню <span style=" font-style:italic;">ÐаÑтройки</span>.</p></body></html> Indexing configuration ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. ЗдеÑÑŒ можно уточнить, какие каталоги требуетÑÑ Ð¸Ð½Ð´ÐµÐºÑировать, какие пути или имена не требуетÑÑ, Ñ ÐºÐ°ÐºÐ¸Ð¼Ð¸ кодировками и Ñ‚.п. Indexing schedule РаÑпиÑание индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). ЗдеÑÑŒ можно выбрать режим индекÑированиеÑ: пакетный или реального времени, а также наÑтроить раÑпиÑание автоматичеÑкого индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ помощи cron. Start indexing now ЗапуÑтить индекÑирование FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup ÐаÑтройка раÑпиÑÐ°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ИндекÑирование <span style=" font-weight:600;">Recoll</span> может работать поÑтоÑнно, индекÑÐ¸Ñ€ÑƒÑ Ð¸Ð·Ð¼ÐµÐ½ÑющиеÑÑ Ñ„Ð°Ð¹Ð»Ñ‹, или запуÑкатьÑÑ Ñ‡ÐµÑ€ÐµÐ· промежутки времени. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Прочитайте подÑказку, чтобы решить, какой подход будет удобней (нажмите F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ЗдеÑÑŒ можно наÑтроить раÑпиÑание автоматичеÑких запуÑков пакетного индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ же Ñтарта индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени при входе в ÑиÑтему (или вÑÑ‘ и Ñразу, что редко имеет ÑмыÑл). </p></body></html> Cron scheduling РаÑпиÑание cron The tool will let you decide at what time indexing should run and will install a crontab entry. ЗдеÑÑŒ можно выбрать, в какое Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð¿ÑƒÑкать индекÑирование, и уÑтановить запиÑÑŒ crontab. Real time indexing start up ЗапуÑк индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени Decide if real time indexing will be started when you log in (only for the default index). Решите, нужно ли начинать индекÑирование в реальном времени при входе в ÑиÑтему (только Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑа по умолчанию). ListDialog Dialog Диалог GroupBox GroupBox Main No db directory in configuration Ðет каталога БД в конфигурации Could not open database in Ðевозможно открыть БД в . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . Ðажмите "Отменить", еÑли хотите иÑправить файл конфигурации до начала индекÑированиÑ, или "OK" Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ. Configuration problem (dynconf Проблема конфигурации (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Файл иÑтории ("history") повреждён или не читаетÑÑ/не запиÑываетÑÑ, проверьте или удалите его: Preview &Search for: &ИÑкать: &Next &Дальше &Previous &Предыдущее Match &Case &Соблюдать региÑтр Clear ОчиÑтить Creating preview text Создаю текÑÑ‚ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра Loading preview text into editor Загружаю текÑÑ‚ в редактор Cannot create temporary directory Ðевозможно Ñоздать временный каталог Cancel Отмена Close Tab Закрыть вкладку Missing helper program: ОтÑутÑтвует вÑÐ¿Ð¾Ð¼Ð¾Ð³Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð°: Can't turn doc into internal representation for Ðевозможно Ñконвертировать документ во внутреннее предÑтавление Cannot create temporary directory: Ðевозможно Ñоздать временный каталог: Error while loading file Ошибка загрузки файла PreviewTextEdit Show fields Показать Ð¿Ð¾Ð»Ñ Show main text Показать оÑновной текÑÑ‚ Print Печать Print Current Preview Печать текущего окна предпроÑмотра Show image Показать изображение Select All Выделить вÑÑ‘ Copy Копировать Save document to file Сохранить документ в файл Fold lines ПереноÑить Ñтроки Preserve indentation СохранÑть отÑтупы QObject Global parameters Общие параметры Local parameters ЧаÑтные параметры <b>Customised subtrees <b>Каталоги Ñ Ð¾ÑобенноÑÑ‚Ñми The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. СпиÑок подкаталогов в индекÑируемой иерархии,<br>где некоторые параметры нуждаютÑÑ Ð² коррекции. Обычно пуÑÑ‚. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Следующие параметры уÑтанавливаютÑÑ Ð½Ð° верхнем уровне, еÑли выбрать<br>ничего или пуÑтую Ñтроку, или Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ подкаталога.<br>Ð’Ñ‹ можете добавлÑть и удалÑть каталоги кнопками +/-. Skipped names ПропуÑкаемые имена These are patterns for file or directory names which should not be indexed. Шаблоны имён файлов или каталогов, которые не Ñледует индекÑировать. Default character set Кодировка по умолчанию This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Эта кодировка будет иÑпользована при чтении файлов, в которых Ñ‚Ð°ÐºÐ¾Ð²Ð°Ñ Ð½Ðµ указываетÑÑ Ñвно (например, чиÑто текÑтовых файлов).<br>Обычно значение пуÑто, тогда оно извлекаетÑÑ Ð¸Ð· Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ (локали). Follow symbolic links РаÑкрывать ÑимволичеÑкие ÑÑылки Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Ходить по ÑимволичеÑким ÑÑылкам при индекÑировании. Обычно не делаетÑÑ Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð´ÑƒÐ±Ð»ÐµÐ¹ Index all file names ИндекÑировать вÑе имена файлов Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true ИндекÑировать и те имена файлов, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… не получаетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÑŒ или обработать Ñодержимое (неизвеÑтный или неподдерживаемый тип MIME). Обычно так Beagle web history Web-иÑÑ‚Ð¾Ñ€Ð¸Ñ Beagle Search parameters Параметры поиÑка Web history ПоÑещённые web-Ñтраницы Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &ПроÑмотр &Open О&ткрыть Open With Run Script Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Save selection to files Сохранить выделение в файлы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог Find &similar documents Ðайти &подобные документы Open &Snippets window Открыть окно &Фрагменты Show subdocuments / attachments Показать вложенные документы QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start ÐвтоматичеÑкий запуÑк индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² реальном времени <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">ИндекÑирование <span style=" font-weight:600;">Recoll</span> может быть наÑтроено как ÑервиÑ, обновлÑющий Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ñ€Ð¸ изменении файлов в реальном времени. При Ñтом Ð¸Ð½Ð´ÐµÐºÑ Ð²Ñегда Ñвежий, но ценой поÑтоÑнно иÑпользуемых ÑиÑтемных реÑурÑов.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. ЗапуÑкать Ñлужбу индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¼ÐµÑте Ñ Ð¼Ð¾ÐµÐ¹ ÑеÑÑией. Also start indexing daemon right now. Также запуÑтить Ñлужбу индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ñмо ÑейчаÑ. Replacing: ЗаменÑÑŽ: Replacing file ЗаменÑÑŽ файл Can't create: Ðе могу Ñоздать: Warning ОÑторожно Could not execute recollindex Ðевозможно запуÑтить recollindex Deleting: УдалÑÑŽ: Deleting file УдалÑÑŽ файл Removing autostart Убираю автозапуÑк Autostart file deleted. Kill current process too ? Файл автозапуÑка удалён. ОÑтановить текущий процеÑÑ? RclMain Query results Результаты поиÑка Cannot retrieve document info from database Ðевозможно извлечь информацию документа из БД Warning ОÑторожно Can't create preview window Ðевозможно Ñоздать окно предпроÑмотра Executing: [ ВыполнÑÑŽ: [ About Recoll О программе Document history ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² History data Данные иÑтории Indexing in progress: ИндекÑирование: Files Файлы Purge ОчиÑтить Stemdb База корней Closing Закрываю Unknown ÐеизвеÑтно This search is not active any more Этот поиÑк уже не активен Bad viewer command line for %1: [%2] Please check the mimeconf file ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока программы проÑмотра %1: [%2] Проверьте файл mimeconf Cannot extract document or create temporary file Ðевозможно извлечь документ или Ñоздать временный файл (no stemming) (без Ñловоформ) (all languages) (вÑе Ñзыки) error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков Update &Index Обновить &Ð¸Ð½Ð´ÐµÐºÑ Indexing interrupted ИндекÑирование прервано Stop &Indexing П&рервать индекÑирование Can't start query: Ошибка Ñтарта запроÑа: All вÑе media медиа message ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ other иное presentation презентации spreadsheet таблицы text текÑÑ‚ sorted Ñортированное filtered фильтрованное External applications/commands needed and not found for indexing your file types: ОтÑутÑтвующие внешние приложениÑ/команды, требуемые Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐ¸Ñ… файлов: No helpers found missing Ð’Ñе вÑпомогательные программы доÑтупны Missing helper programs ÐедоÑтающие вÑпомогательные программы Save file dialog Сохранить файл Choose a file name to save under Выберите Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Document category filter Фильтр категории документа No external viewer configured for mime type [ Ðе указана внешнÑÑ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð° проÑмотра Ð´Ð»Ñ [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Программа проÑмотра, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð² mimeview Ð´Ð»Ñ %1: %2, не найдена. Открыть диалог наÑтроек? Can't access file: Ðет доÑтупа к файлу: Can't uncompress file: Ðевозможно раÑпаковать файл: Save file Сохранить файл Result count (est.) Результатов (примерно) Query details ПодробноÑти запроÑа Could not open external index. Db not open. Check external indexes list. Ðе удалоÑÑŒ открыть внешний индекÑ. БД не открыта. Проверьте ÑпиÑок внешних индекÑов. No results found ПоиÑк не дал результатов None ОтÑутÑтвует Updating ОбновлÑÑŽ Done Готово Monitor Монитор Indexing failed ИндекÑирование не удалоÑÑŒ The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Текущий процеÑÑ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ðµ был запущен из Ñтого интерфейÑа. Ðажмите OK Ð´Ð»Ñ Ð¾Ñтанова или Отменить, чтоб работал Ñебе Erasing index Стираю Ð¸Ð½Ð´ÐµÐºÑ Reset the index and start from scratch ? Обнулить Ð¸Ð½Ð´ÐµÐºÑ Ð¸ начать заново? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ð±Ñ€Ð°Ð±Ð°Ñ‚Ñ‹Ð²Ð°ÐµÑ‚ÑÑ.<br>Из-за ограничений библиотеки<br>оÑтанов прервёт вÑÑŽ программу Error Ошибка Index not open Ð˜Ð½Ð´ÐµÐºÑ Ð½Ðµ открыт Index query error Ошибка запроÑа Indexed Mime Types ИндекÑируемые MIME-типы Content has been indexed for these mime types: ПроиндекÑировано Ñодержание Ñледующих MIME-типов: Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñтого файла уÑтарел. Ðе буду риÑковать показывать не тот фрагмент. Ðажмите OK Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ Ñтого файла, затем повторите запроÑ. Или же Отменить. Can't update index: indexer running Ðе могу обновить индекÑ: индекÑатор уже трудитÑÑ Indexed MIME Types ИндекÑируемые MIME-типы Bad viewer command line for %1: [%2] Please check the mimeview file ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока программы проÑмотра %1: [%2] Проверьте файл mimeview Viewer command line for %1 specifies both file and parent file value: unsupported ÐšÐ¾Ð¼Ð°Ð½Ð´Ð½Ð°Ñ Ñтрока программы проÑмотра Ð´Ð»Ñ %1 Ñодержит как Ñам файл, так и родителÑ: такое не поддерживаетÑÑ Cannot find parent document Ðевозможно найти родительÑкий документ Indexing did not run yet ИндекÑирование пока не выполнÑлоÑÑŒ External applications/commands needed for your file types and not found, as stored by the last indexing pass in Требуемые внешние программы Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… типов файлов не найдены: Ñм. файл Index not up to date for this file. Refusing to risk showing the wrong entry. Ð˜Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñтого файла уÑтарел. ОтказываюÑÑŒ риÑковать показывать неправильную запиÑÑŒ. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel. Ðажмите ОК, чтобы обновить Ð¸Ð½Ð´ÐµÐºÑ Ð´Ð»Ñ Ñ„Ð°Ð¹Ð»Ð°, и перезапуÑтите очередь по окончании. Или нажмите Отмена. Indexer running so things should improve when it's done ИндекÑÐ°Ñ†Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÑетÑÑ, так что по завершении положение должно улучшитьÑÑ Sub-documents and attachments Вложенные документы Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents Дублированные документы These Urls ( | ipath) share the same content: Данные URL ( | индекÑные пути) имеют одно и то же Ñодержимое: Bad desktop app spec for %1: [%2] Please check the desktop file The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll Recoll &File &Файл &Tools &ИнÑтрументы &Preferences &ÐаÑтройки &Help &ПодÑказка Search tools ИнÑтрументы поиÑка Result list СпиÑок результатов E&xit &Выход &About Recoll &О программе &User manual &РуководÑтво Document &History &ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² Document History ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² &Advanced Search &Сложный поиÑк Advanced/complex Search Сложный поиÑк &Sort parameters &Параметры Ñортировки Sort parameters Параметры Ñортировки Next page След. Ñтраница Next page of results Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница результатов Previous page Пред. Ñтраница Previous page of results ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница результатов &Query configuration &ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ctrl+Q Ctrl+Q Update &index Обновить &Ð¸Ð½Ð´ÐµÐºÑ Term &explorer Ðавигатор &терминов Term explorer tool ИнÑтрумент иÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÑ€Ð¼Ð¸Ð½Ð¾Ð² External index dialog Диалог внешнего индекÑа &Erase document history &ОчиÑтить иÑторию документов First page ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница Go to first page of results Перейти к первой Ñтранице результатов &Indexing configuration ÐаÑтройки ин&декÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ All вÑе &Show missing helpers &Показать недоÑтающие внешние программы PgDown PgDown PgUp PgUp &Full Screen Во веÑÑŒ &Ñкран F11 F11 Full Screen Во веÑÑŒ Ñкран &Erase search history ОчиÑтить иÑторию &поиÑка sortByDateAsc sortByDateAsc Sort by dates from oldest to newest Сортировать по датам от Ñтарых к новым sortByDateDesc sortByDateDesc Sort by dates from newest to oldest Сортировать по датам от новых к Ñтарым Show Query Details Показать детали запроÑа Show results as table Показать результаты в виде таблицы &Rebuild index Пере&индекÑировать &Show indexed types Показать индекÑируемые &типы Shift+PgUp Shift-PgUp &Indexing schedule &РаÑпиÑание индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ E&xternal index dialog Диалог &внешнего индекÑа &Index configuration ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ &индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ &GUI configuration ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð¸&нтерфейÑа &Results СпиÑок &результатов Sort by date, oldest first Сортировать по датам от Ñтарых к новым Sort by date, newest first Сортировать по датам от новых к Ñтарым Show as table Показать в виде таблицы Show results in a spreadsheet-like table Показать результаты в виде таблицы Save as CSV (spreadsheet) file Сохранить в CSV-файл Saves the result into a file which you can load in a spreadsheet Сохранить результаты в текÑтовый файл Ñ Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñми, открываемый как таблица в Office Next Page След. Ñтраница Previous Page Пред. Ñтраница First Page ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel File name Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Mime type Тип MIME Date Дата Abstract Выдержка Author Ðвтор Document size Размер документа Document date Дата документа File size Размер файла File date Дата файла Keywords Ключевые Ñлова Original character set ИÑÑ…Ð¾Ð´Ð½Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²ÐºÐ° Relevancy rating РелевантноÑть Title Ðазвание URL URL Mtime Изменено Date and time Дата и Ð²Ñ€ÐµÐ¼Ñ Ipath I-путь MIME type Тип MIME ResList Result list СпиÑок результатов Unavailable document Документ недоÑтупен Previous ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Next Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ <p><b>No results found</b><br> <p><b>Ðе найдено</b><br> &Preview &ПроÑмотр Find &similar documents Ðайти &подобные документы Query details ПодробноÑти запроÑа (show query) (показать запроÑ) Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL filtered фильтрованное sorted Ñортированное Document history ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² Preview ПредпроÑмотр Open Открыть <p><i>Alternate spellings (accents suppressed): </i> <p><i>ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ (без диакритичеÑких знаков): </i> &Write to File &Сохранить в файл Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог &Open О&ткрыть Documents Документы out of at least из минимум for по <p><i>Alternate spellings: </i> <p><i>ÐÐ»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ð¾Ñ€Ñ„Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ: </i> Duplicate documents Дублированные документы These Urls ( | ipath) share the same content: Данные URL ( | индекÑные пути) имеют одно и то же Ñодержимое: Result count (est.) Результатов (примерно) Snippets Фрагменты ResTable &Reset sort &СброÑить параметры Ñортировки &Delete column &Удалить Ñтолбец Add " Добавить Ñтолбец " " column " Save table to CSV file Сохранить таблицу в CSV-файл Can't open/create file: Ðе удалоÑÑŒ открыть/Ñоздать файл: &Preview &ПроÑмотр &Open О&ткрыть Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Find &similar documents Ðайти &подобные документы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог &Save as CSV &Сохранить как CSV Add "%1" column Добавить колонку "%1" ResTableDetailArea &Preview &ПроÑмотр &Open О&ткрыть Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Find &similar documents Ðайти &подобные документы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог ResultPopup &Preview &ПроÑмотр &Open О&ткрыть Copy &File Name Скопировать &Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Copy &URL Копировать &URL &Write to File &Сохранить в файл Save selection to files Сохранить выделение в файлы Preview P&arent document/folder &ПредпроÑмотр родительÑкого документа/каталога &Open Parent document/folder &Открыть родительÑкий документ/каталог Find &similar documents Ðайти &подобные документы Open &Snippets window Открыть окно &Фрагменты Show subdocuments / attachments Показать вложенные документы SSearch Any term Любое Ñлово All terms Ð’Ñе Ñлова File name Ð˜Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Completions Ð”Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Select an item: Выберите: Too many completions Слишком много дополнений Query language Язык запроÑа Bad query string ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ñтрока запроÑа Out of memory ÐедоÑтаточно памÑти Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Введите выражение на Ñзыке запроÑов. Шпаргалка:<br> <i>Ñлово1 Ñлово2</i> : 'Ñлово1' и 'Ñлово2' в любом поле.<br> <i>поле:Ñлово1</i> : 'Ñлово1' в поле 'поле'.<br> Стандартные полÑ/Ñинонимы:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> ПÑевдо-полÑ: dir, mime/format, type/rclcat, date.<br> Примеры интервалов между Ð´Ð²ÑƒÐ¼Ñ Ð´Ð°Ñ‚Ð°Ð¼Ð¸: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>Ñлово1 Ñлово2 OR Ñлово3</i> : Ñлово1 И (Ñлово2 ИЛИ Ñлово3).<br> Ð’ дейÑтвительноÑти, Ñкобки не разрешены.<br> <i>"Ñлово1 Ñлово2"</i> : фраза (должна вÑтречатьÑÑ Ð¸Ð¼ÐµÐ½Ð½Ð¾ в таком виде). Модификаторы:<br> <i>"Ñлово1 Ñлово2"p</i> : неупорÑдоченный поиÑк Ñ Ñ€Ð°ÑÑтоÑнием (<i><b>p</b>roximity</i>) по умолчанию.<br> ИÑпользуйте ÑÑылку <b>показать запроÑ</b>, когда ÑомневаетеÑÑŒ в результате, и Ñмотрите подробноÑти в руководÑтве (&lt;F1>). Enter file name wildcard expression. Введите маÑку имени файла. Enter search terms here. Type ESC SPC for completions of current term. Введите поиÑковые Ñлова. Можно нажать Esc-пробел Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ñлова. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear ОчиÑтить Ctrl+S Ctrl+S Erase search entry ОчиÑтить поле ввода Search ИÑкать Start query ПриÑтупить к поиÑку Enter search terms here. Type ESC SPC for completions of current term. Введите поиÑковые Ñлова. Можно нажать Esc-пробел Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ Ñлова. Choose search type. Выберите тип поиÑка SearchClauseW Any of these Ñ Ð»ÑŽÐ±Ñ‹Ð¼Ð¸ Ñловами All of these Ñо вÑеми Ñловами None of these без Ñтих Ñлов This phrase фраза Terms in proximity Ñлова вблизи File name matching Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Select the type of query that will be performed with the words Выберите тип запроÑа, который будет произведён по Ñловам Number of additional words that may be interspersed with the chosen ones КоличеÑтво дополнительных Ñлов, которые могут оказатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ выбранными No field Ðе иÑп. Ð¿Ð¾Ð»Ñ Any любое All вÑе None без Phrase фраза Proximity близоÑть File name Ð¸Ð¼Ñ Ñ„Ð°Ð¹Ð»Ð° Snippets Snippets Фрагменты about:blank about:blank Find: Ðайти: Next Ð¡Ð»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Prev ÐŸÑ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ SnippetsW Search ИÑкать <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SortForm Date Дата Mime type Тип MIME SortFormBase Sort Criteria Критерии Ñортировки Sort the Сортировать most relevant results by: наиболее похожих результатов по: Descending убыванию Close Закрыть Apply Применить SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse ПроÑмотр Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer Ðавигатор терминов &Expand &РаÑкрыть Alt+E Alt-E &Close &Закрыть Alt+C Alt+C Term Слово No db info. Ðет информации о БД. Match Учитывать Case региÑтр Accents ÑƒÐ´Ð°Ñ€ÐµÐ½Ð¸Ñ SpellW Wildcards Шаблоны Regexp Регвыражение Spelling/Phonetic ÐапиÑание/фонетика Aspell init failed. Aspell not installed? Ðе получилоÑÑŒ инициализировать Aspell. Он уÑтановлен? Aspell expansion error. Ошибка раÑÐºÑ€Ñ‹Ð²Ð°Ð½Ð¸Ñ aspell. Stem expansion РаÑкрытие оÑновы error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков No expansion found РаÑкрытие не найдено Term Слово Doc. / Tot. Док. / Ð’Ñего Index: %1 documents, average length %2 terms ИндекÑ: %1 документ(ов), ÑреднÑÑ Ð´Ð»Ð¸Ð½Ð° %2 Ñлемент(ов) Index: %1 documents, average length %2 terms.%3 results ИндекÑ: %1 документ(ов), ÑреднÑÑ Ð´Ð»Ð¸Ð½Ð° %2 Ñлов(о). %3 результат(ов) %1 results %1 результат(ов) List was truncated alphabetically, some frequent СпиÑок был обрезан в алфавитном порÑдке, некоторые чаÑтые terms may be missing. Try using a longer root. Ñлова могут отÑутÑтвовать. Попробуйте более длинный корень. Show index statistics Показать ÑтатиÑтику индекÑа Number of documents ЧиÑло документов Average terms per document Среднее чиÑло Ñлов в документе Smallest document length ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° документа Longest document length МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° документа Database directory size Размер каталога базы данных MIME types: MIME-типы: Item Элемент Value Значение Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog The selected directory does not appear to be a Xapian index Выбранный каталог не похож на Ð¸Ð½Ð´ÐµÐºÑ Xapian This is the main/local index! Это главный индекÑ! The selected directory is already in the index list Этот каталог уже в ÑпиÑке индекÑов Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Выберите каталог индекÑа Xapian (например, /home/приÑтель/.recoll/xapiandb) error retrieving stemming languages ошибка Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ ÑпиÑка Ñзыков Choose Выберите Result list paragraph format (erase all to reset to default) Формат абзаца в ÑпиÑке результатов (очиÑтите, чтобы вернутьÑÑ Ðº варианту по умолчанию) Result list header (default is empty) Заголовок ÑпиÑка результатов (по умолчанию пуÑÑ‚) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Выберите каталог конфигурации Recoll или индекÑа Xapian (например, /home/Ñ/.recoll или /home/приÑтель/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Выбранный каталог выглÑдит как каталог конфигурации Recoll, но наÑтройки не могут быть прочитаны At most one index should be selected Следует выбирать не больше одного индекÑа Cant add index with different case/diacritics stripping option Ðевозможно добавить Ð¸Ð½Ð´ÐµÐºÑ Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ наÑтройками региÑтра и диакритики Default QtWebkit font Any term Любое Ñлово All terms Ð’Ñе Ñлова File name Query language Язык запроÑа Value from previous program exit UIPrefsDialogBase User interface Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КоличеÑтво запиÑей на Ñтраницу результатов Result list font Шрифт ÑпиÑка результатов Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Открывает диалог выбора шрифта ÑпиÑка результатов Reset Вернуть Resets the result list font to the system default УÑтанавливает шрифт ÑпиÑка результатов в обычный Auto-start simple search on whitespace entry. Ðачинать проÑтой поиÑк по вводу пробела. Start with advanced search dialog open. Открывать диалог Ñложного поиÑка при запуÑке. Start with sort dialog open. Открывать диалог Ñортировки при запуÑке. Search parameters Параметры поиÑка Stemming language Язык Ñловоформ Dynamically build abstracts ДинамичеÑкое выделение конÑпекта Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Следует ли пытатьÑÑ Ð¿Ð¾Ñтроить конÑпект из найденных документов, опираÑÑÑŒ на контекÑÑ‚ ключевых Ñлов? Может быть медленным Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… документов. Replace abstracts from documents Замещать конÑпект, ÑодержащийÑÑ Ð² документах Do we synthetize an abstract even if the document seemed to have one? Создавать ли конÑпект, еÑли документ уже имеет его? Synthetic abstract size (characters) Размер Ñоздаваемого конÑпекта (в Ñимволах) Synthetic abstract context words КонтекÑтных Ñлов External Indexes Внешние индекÑÑ‹ Add index Добавить Ð¸Ð½Ð´ÐµÐºÑ Select the xapiandb directory for the index you want to add, then click Add Index Выберите нужный каталог Ñ Ð¸Ð½Ð´ÐµÐºÑом Xapian и нажмите "Добавить индекÑ" Browse ПроÑмотр &OK &OK Apply changes Применить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &Cancel &Отмена Discard changes Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Result paragraph<br>format string Строка форматированиÑ<br>блока результатов Automatically add phrase to simple searches ÐвтоматичеÑки добавлÑть фразу при проÑтом поиÑке A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. ПоиÑк [rolling stones] (два Ñлова) будет изменён на [rolling или stones или (rolling phrase 2 stones)]. Это может поднÑть результаты, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñлова Ñледуют именно в том порÑдке, как введены. User preferences ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Use desktop preferences to choose document editor. ИÑпользовать деÑктопные наÑтройки Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° редактора документов. External indexes Внешние индекÑÑ‹ Toggle selected Переключить выделенные Activate All Включить вÑе Remove selected Удалить выделенные Remove from list. This has no effect on the disk index. Удалить из ÑпиÑка. Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° диÑке без изменений. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ОпределÑет формат каждого блока ÑпиÑка результатов. ИÑпользуйте html-формат qt и замены в Ñтиле printf:<br>%A аннотациÑ<br> %D дата<br> %I название пиктограммы<br> %K ключевые Ñлова (еÑли еÑть)<br> %L ÑÑылки предварительного проÑмотра и редактированиÑ<br> %M тип MIME<br> %N количеÑтво результатов<br> %R релевантноÑть<br> %S размер<br> %T заголовок<br> %U URL<br> Remember sort activation state. Запомнить ÑоÑтоÑние Ñортировки. Maximum text size highlighted for preview (megabytes) МакÑимальный объём текÑта Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ при проÑмотре (Мб) Texts over this size will not be highlighted in preview (too slow). ТекÑты большего размера не будут подÑвечиватьÑÑ Ð¿Ñ€Ð¸ предварительном проÑмотре (медленно). Highlight color for query terms Цвет Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Deactivate All Выключить вÑе Prefer Html to plain text for preview. Предпочитать HTML текÑту Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра If checked, results with the same content under different names will only be shown once. Показывать результаты Ñ Ñ‚ÐµÐ¼ же Ñодержанием под разными именами не более одного раза Hide duplicate results. ПрÑтать дубликаты Choose editor applications Выбор редакторов Display category filter as toolbar instead of button panel (needs restart). Показывать фильтр категории документа в виде выпадающего ÑпиÑка, а не панели Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¼Ð¸ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк). ViewAction Changing actions with different current values Изменение дейÑтвий Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ текущими значениÑми Mime type Тип MIME Command Команда MIME type Тип MIME Desktop Default ВзÑть из Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Changing entries with different current values Изменение запиÑей Ñ Ñ€Ð°Ð·Ð»Ð¸Ñ‡Ð½Ñ‹Ð¼Ð¸ текущими значениÑми ViewActionBase File type Тип файла Action ДейÑтвие Select one or several file types, then click Change Action to modify the program used to open them Выберите один или неÑколько типов файлов, затем нажмите "Сменить дейÑтвие" Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ñ‹, работающей Ñ Ð½Ð¸Ð¼Ð¸ Change Action Сменить дейÑтвие Close Закрыть Native Viewers Родные вьюеры Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults. Выберите один или неÑколько MIME-типов и нажмите"Сменить дейÑтвие"<br>Также Ð’Ñ‹ можете закрыть Ñтот диалог и уÑтановить флаг "ИÑпользовать деÑктопные наÑтройки"<br> в оÑновной панели, чтобы иÑпользовать деÑктопные наÑтройки вмеÑто данного ÑпиÑка. Select one or several mime types then use the controls in the bottom frame to change how they are processed. Выберите MIME-типы и иÑпользуйте кнопки ниже, чтобы изменить то, как они обрабатываютÑÑ Use Desktop preferences by default ИÑпользовать наÑтройки Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Select one or several file types, then use the controls in the frame below to change how they are processed Выберите типы файлов и иÑпользуйте кнопки ниже, чтобы изменить то, как они обрабатываютÑÑ Exception to Desktop preferences Переопределить наÑтройки Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Action (empty -> recoll default) ДейÑтвие (пуÑто -> вариант по умолчанию) Apply to current selection Применить к выделению Recoll action: current value Select same <b>New Values:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Steal Beagle indexing queue ВоÑпользоватьÑÑ Ð¾Ñ‡ÐµÑ€ÐµÐ´ÑŒÑŽ индекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Beagle Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin) Beagle ÐЕ должен выполнÑтьÑÑ. Включить обработку очереди Beagle Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Web-иÑтории Firefox.<br>(Ð´Ð»Ñ Ñтого Ñледует также уÑтановить плагин Beagle Ð´Ð»Ñ Firefox) Web cache directory name Каталог Веб-кÑша The name for a directory where to store the cache for visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°, в котором хранитÑÑ ÐºÑш поÑещенных Веб-Ñтраниц.<br>Путь указываетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно каталога Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸ÐµÐ¹ и не ÑвлÑетÑÑ Ð°Ð±Ñолютным. Max. size for the web cache (MB) Предел размера Веб-кÑша (MB) Entries will be recycled once the size is reached При доÑтижении указанного размера кÑша Ñтарые запиÑи будут удалÑтьÑÑ Web page store directory name Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½Ð¸Ð»Ð¸Ñ‰Ð° web-Ñтраниц The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¿Ð¸Ð¹ поÑещённых web-Ñтраниц.<br>Путь, не ÑвлÑющийÑÑ Ð°Ð±Ñолютным, берётÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно каталога конфигурации. Max. size for the web store (MB) МакÑимальный размер web-хранилища (МБ) Process the WEB history queue Обрабатывать поÑещённые web-Ñтраницы Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Включает индекÑирование Ñтраниц, открывавшихÑÑ Ð² Firefox.<br>(нужно дополнение Recoll Ð´Ð»Ñ Firefox) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file Ðевозможно запиÑать файл конфигурации confgui::ConfParamFNW Browse ПроÑмотр Choose ПроÑмотр confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity ÐвтоматичеÑÐºÐ°Ñ Ñ‡ÑƒÐ²ÑтвительноÑть Ð´Ð»Ñ Ð´Ð¸Ð°ÐºÑ€Ð¸Ñ‚Ð¸ÐºÐ¸ <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>ÐвтоматичеÑки включает чувÑтвительноÑть Ð´Ð»Ñ Ð´Ð¸Ð°ÐºÑ€Ð¸Ñ‚Ð¸ÐºÐ¸, еÑли Ñтрока поиÑка Ñодержит диакритичеÑкие знаки (не в Unac-иÑключениÑÑ…). Ð’ противном Ñлучае иÑпользуйте Ñзык запроÑов (модификатор <i>D</i> Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‡ÑƒÐ²ÑтвительноÑти). Automatic character case sensitivity ÐвтоматичеÑÐºÐ°Ñ Ñ‡ÑƒÐ²ÑтвительноÑть Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтра <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>ÐвтоматичеÑки включает чувÑтвительноÑть Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтра Ñимволов, еÑли Ñтрока поиÑка Ñодержит заглавные буквы (кроме первой буквы). Ð’ противном Ñлучае иÑпользуйте Ñзык запроÑов (модификатор <i>C</i> Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‡ÑƒÐ²ÑтвительноÑти). Maximum term expansion count МакÑимальное чиÑло раÑкрытий Ñлов <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>МакÑимальное чиÑло раÑкрытий Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñлова (напр. при иÑпользовании маÑок). Значение по умолчанию (10 000) ÑвлÑетÑÑ Ñ€Ð°Ð·ÑƒÐ¼Ð½Ñ‹Ð¼ и поможет избежать Ñлишком затратных запроÑов. Maximum Xapian clauses count МакÑимальное чиÑло Xapian-предложений <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>МакÑимальное чиÑло Ñлементарных предложений, добавлÑемых в Ð·Ð°Ð¿Ñ€Ð¾Ñ Ðº Xapian. Ð’ некоторых ÑлучаÑÑ… результатом раÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñлов может Ñтать чрезмерное потребление памÑти. Значение по умолчанию (100 000) доÑтаточно в большинÑтве Ñлучаев и подходит Ð´Ð»Ñ Ñовременных аппаратных конфигураций. confgui::ConfSubPanelW Global Общее Max. compressed file size (KB) Предел размера Ñжатого файла (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Это значение уÑтанавливает порог размера Ñжатых файлов, которые будут обрабатыватьÑÑ. -1 отключает порог, 0 отключает декомпреÑÑию. Max. text file size (MB) Предел размера текÑтового файла (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Это значение уÑтанавливает порог размера текÑтовых файлов, которые будут обрабатыватьÑÑ. -1 отключает порог. Ð”Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка может быть полезна Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… файлов: журналов Ñообщений и Ñ‚.п. Text file page size (KB) Размер Ñтраницы текÑтового файла (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). ЕÑли Ñто значение уÑтановлено (Ñ‚.е. не равно -1), то при индекÑировании текÑтовые файлы разбиваютÑÑ Ð½Ð° фрагменты ÑоответÑтвующего размера. Ð”Ð°Ð½Ð½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ помочь при выполнении поиÑка в очень больших текÑтовых файлах (например, файлах журналов). Max. filter exec. time (S) Предельное Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ фильтра (Ñек) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit. Внешние фильтры, выполнÑющиеÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ указанного предельного времени работы, принудительно завершаютÑÑ. Это может помочь в тех редких ÑлучаÑÑ…, когда фильтр (например, postscript) зацикливаетÑÑ Ð¿Ñ€Ð¸ обработке некоторого документа. Значение, равное -1, выключает проверку времени работы. External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Внешние фильтры, выполнÑющиеÑÑ Ð´Ð¾Ð»ÑŒÑˆÐµ указанного предельного времени работы, принудительно завершаютÑÑ. Это может помочь в тех редких ÑлучаÑÑ…, когда фильтр (например, postscript) зацикливаетÑÑ Ð¿Ñ€Ð¸ обработке некоторого документа. Значение, равное -1, выключает проверку времени работы. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories ИндекÑируемые папки The list of directories where recursive indexing starts. Default: your home. СпиÑок каталогов, где начинаетÑÑ Ñ€ÐµÐºÑƒÑ€Ñивное индекÑирование. Обычно домашний каталог. Skipped paths ПропуÑкать Stemming languages Языки Ñо Ñловоформами The languages for which stemming expansion<br>dictionaries will be built. Языки, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… будут поÑтроены<br>Ñловари раÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñловоформ. Log file name Файл журнала The file where the messages will be written.<br>Use 'stderr' for terminal output Файл, куда будут запиÑыватьÑÑ ÑообщениÑ.<br>'stderr' Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° на терминал Log verbosity level ПодробноÑть журнала This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Это значение определÑет подробноÑть Ñообщений,<br>от ошибок до отладочных данных. Index flush megabytes interval Интервал запиÑи индекÑа (Мб) Max disk occupation (%) МакÑимальное иÑпользование диÑка (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Процент занÑтоÑти диÑка, при котором индекÑирование будет прервано (во избежание Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупного меÑта).<br>Обычно: 0 (отключает проверку). No aspell usage Ðе иÑпользовать aspell Aspell language Язык aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Язык ÑÐ»Ð¾Ð²Ð°Ñ€Ñ aspell. Обычно вроде 'en' или 'ru'...<br>ЕÑли значение не указано, будет иÑпользовано окружение (локаль), что обычно работает. Чтобы поÑмотреть, какие варианты доÑтупны в ÑиÑтеме, наберите 'aspell config' и проверьте, какие .dat-файлы еÑть в каталоге 'data-dir'. Database directory name Каталог базы данных The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°, в котором хранитÑÑ Ð¸Ð½Ð´ÐµÐºÑ<br>ОтноÑительный путь берётÑÑ Ð¾Ñ‚ каталога конфигурации. Обычно 'xapiandb'. Use system's 'file' command ИÑпользовать ÑиÑтемную 'file' Use the system's 'file' command if internal<br>mime type identification fails. ИÑпользовать ÑиÑтемную команду 'file' <br>при Ñбое внутреннего Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ Ñ‚Ð¸Ð¿Ð¾Ð² MIME. These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Имена каталогов, которые индекÑирование обойдёт.<br>Может Ñодержать шаблоны. ОбÑзано подходить к путÑм, которые видит индекÑатор (например, еÑли topdirs включает '/home/me' и '/home' ÑвлÑетÑÑ ÑÑылкой на '/usr/home', то Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ должна быть '/home/me/tmp*', а не '/usr/home/me/tmp*') This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Это значение определÑет количеÑтво проиндекÑированных данных между ÑброÑами на диÑк.<br>Помогает контролировать иÑпользование памÑти при индекÑации. Обычно 10Mb Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Отключает иÑпользование aspell Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ приближений напиÑÐ°Ð½Ð¸Ñ Ð² навигаторе терминов.<br> Полезно, еÑли aspell отÑутÑтвует или Ñломан. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Язык ÑÐ»Ð¾Ð²Ð°Ñ€Ñ aspell. Обычно вроде 'en' или 'ru'...<br>ЕÑли значение не указано, будет иÑпользовано окружение (локаль), что обычно работает. Чтобы поÑмотреть, какие варианты доÑтупны в ÑиÑтеме, наберите 'aspell config' и проверьте, какие .dat-файлы еÑть в каталоге 'data-dir'. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Ð˜Ð¼Ñ ÐºÐ°Ñ‚Ð°Ð»Ð¾Ð³Ð°, в котором хранитÑÑ Ð¸Ð½Ð´ÐµÐºÑ<br>ОтноÑительный путь берётÑÑ Ð¾Ñ‚ каталога конфигурации. Обычно 'xapiandb'. Unac exceptions Unac-иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Это иÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸Ð·Ð¼Ð° Unac, который удалÑет вÑÑŽ диакритику и выполнÑет каноничеÑкую декомпозицию. Можно переопределить механизм ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñзыка или добавить декомпозиции (напр., Ð´Ð»Ñ Ð»Ð¸Ð³Ð°Ñ‚ÑƒÑ€). ÐšÐ°Ð¶Ð´Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ отделÑетÑÑ Ð¿Ñ€Ð¾Ð±ÐµÐ»Ð°Ð¼Ð¸ и ÑоÑтоит из иÑходного Ñимвола и интерпретации. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences ÐŸÑ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ User interface Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КоличеÑтво запиÑей на Ñтраницу результатов If checked, results with the same content under different names will only be shown once. Показывать результаты Ñ Ñ‚ÐµÐ¼ же Ñодержанием под разными именами не более одного раза Hide duplicate results. ПрÑтать дубликаты Highlight color for query terms Цвет Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ñ‹Ñ… Ñлов Result list font Шрифт ÑпиÑка результатов Opens a dialog to select the result list font Открывает диалог выбора шрифта ÑпиÑка результатов Helvetica-10 Helvetica-10 Resets the result list font to the system default УÑтанавливает шрифт ÑпиÑка результатов в обычный Reset Вернуть Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> ОпределÑет формат каждого блока ÑпиÑка результатов. ИÑпользуйте html-формат qt и замены в Ñтиле printf:<br>%A аннотациÑ<br> %D дата<br> %I название пиктограммы<br> %K ключевые Ñлова (еÑли еÑть)<br> %L ÑÑылки предварительного проÑмотра и редактированиÑ<br> %M тип MIME<br> %N количеÑтво результатов<br> %R релевантноÑть<br> %S размер<br> %T заголовок<br> %U URL<br> Result paragraph<br>format string Строка форматированиÑ<br>блока результатов Texts over this size will not be highlighted in preview (too slow). ТекÑты большего размера не будут подÑвечиватьÑÑ Ð¿Ñ€Ð¸ предварительном проÑмотре (медленно). Maximum text size highlighted for preview (megabytes) МакÑимальный объём текÑта Ñ Ð²Ñ‹Ð´ÐµÐ»ÐµÐ½Ð¸ÐµÐ¼ при проÑмотре (Мб) Use desktop preferences to choose document editor. ИÑпользовать деÑктопные наÑтройки Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° редактора документов. Choose editor applications Выбор редакторов Display category filter as toolbar instead of button panel (needs restart). Показывать фильтр категории документа в виде выпадающего ÑпиÑка, а не панели Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°Ð¼Ð¸ (требуетÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð¿ÑƒÑк). Auto-start simple search on whitespace entry. Ðачинать проÑтой поиÑк по вводу пробела. Start with advanced search dialog open. Открывать диалог Ñложного поиÑка при запуÑке. Start with sort dialog open. Открывать диалог Ñортировки при запуÑке. Remember sort activation state. Запомнить ÑоÑтоÑние Ñортировки. Prefer Html to plain text for preview. Предпочитать HTML текÑту Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¿Ñ€Ð¾Ñмотра Search parameters Параметры поиÑка Stemming language Язык Ñловоформ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. ПоиÑк [rolling stones] (два Ñлова) будет изменён на [rolling или stones или (rolling phrase 2 stones)]. Это может поднÑть результаты, Ð´Ð»Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñлова Ñледуют именно в том порÑдке, как введены. Automatically add phrase to simple searches ÐвтоматичеÑки добавлÑть фразу при проÑтом поиÑке Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Следует ли пытатьÑÑ Ð¿Ð¾Ñтроить конÑпект из найденных документов, опираÑÑÑŒ на контекÑÑ‚ ключевых Ñлов? Может быть медленным Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… документов. Dynamically build abstracts ДинамичеÑкое выделение конÑпекта Do we synthetize an abstract even if the document seemed to have one? Создавать ли конÑпект, еÑли документ уже имеет его? Replace abstracts from documents Замещать конÑпект, ÑодержащийÑÑ Ð² документах Synthetic abstract size (characters) Размер Ñоздаваемого конÑпекта (в Ñимволах) Synthetic abstract context words КонтекÑтных Ñлов The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Слова в ÑпиÑке будут автоматичеÑки преобразованы к виду ext:xxx в запроÑе. Query language magic file name suffixes. МагичеÑкие раÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐ½Ð¸ файла Ð´Ð»Ñ Ñзыка запроÑов Enable Включить External Indexes Внешние индекÑÑ‹ Toggle selected Переключить выделенные Activate All Включить вÑе Deactivate All Выключить вÑе Remove from list. This has no effect on the disk index. Удалить из ÑпиÑка. Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° диÑке без изменений. Remove selected Удалить выделенные Click to add another index directory to the list Ðажмите, чтобы добавить ещё одну папку Ñ Ð¸Ð½Ð´ÐµÐºÑом в ÑпиÑок Add index Добавить Ð¸Ð½Ð´ÐµÐºÑ Apply changes Применить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &OK &OK Discard changes Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ &Cancel &Отмена Abstract snippet separator Разделитель фрагментов в результатах Use <PRE> tags instead of <BR>to display plain text as html. ИÑпользовать Ñ‚Ñги <PRE> вмеÑто <BR>Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñтого текÑта как html. Lines in PRE text are not folded. Using BR loses indentation. Строки в PRE-текÑте не переноÑÑÑ‚ÑÑ. При иÑпользовании BR терÑÑŽÑ‚ÑÑ Ð¾Ñ‚Ñтупы. Style sheet Ðабор Ñтилей Opens a dialog to select the style sheet file Открыть диалог выбора файла Ñтилей Choose Выбрать Resets the style sheet to default Вернуть Ñтили по умолчанию Lines in PRE text are not folded. Using BR loses some indentation. Строки текÑта PRE не переноÑÑÑ‚ÑÑ. ИÑпользование BR терÑет чать отÑтупов. Use <PRE> tags instead of <BR>to display plain text as html in preview. ИÑпользовать теги <PRE> вмеÑто <BR> Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ текÑта как HTML при предварительном проÑмотре. Result List СпиÑок результатов Edit result paragraph format string Править Ñтроку Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ð¾Ð² Edit result page html header insert Править HTML-заголовок результатов Date format (strftime(3)) Формат даты по strftime(3) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Порог чаÑтоты в процентах, поÑле которого мы не иÑпользуем термы в автофразе. ЧаÑтые термы ÑвлÑÑŽÑ‚ÑÑ ÑущеÑтвенной проблемой производительноÑти на фразах. Пропущенные термы дополнÑÑŽÑ‚ проÑадку фразы и уменьшают ÑффективноÑть ÐФ. Значение по умолчанию - 2 (процента). Autophrase term frequency threshold percentage Порог чаÑтоты термов автофразы в процентах Plain text to HTML line style Стиль Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑта в HTML Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Строки в PRE-текÑте не переноÑÑÑ‚ÑÑ. BR терÑет чаÑть отÑтупов. PRE + Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть хорошим выбором. <BR> <BR> (перевод Ñтроки) <PRE> <PRE> (преформат) <PRE> + wrap <PRE> + Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Disable Qt autocompletion in search entry. Отключить Qt-автозавершение при вводе Ñтроки поиÑка. Search as you type. ИÑкать по мере ввода. Paths translations Корректировка путей Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Щёлкните, чтобы добавить другой каталог индекÑа в ÑпиÑок. Можно выбрать каталог конфигурации Recoll или Ð¸Ð½Ð´ÐµÐºÑ Xapian. Snippets window CSS file CSS-файл Ð´Ð»Ñ Ð¾ÐºÐ½Ð° Фрагменты Opens a dialog to select the Snippets window CSS style sheet file Открывает диалог выбора таблицы Ñтилей CSS Ð´Ð»Ñ Ð¾ÐºÐ½Ð° Фрагменты Resets the Snippets window style СбраÑывает Ñтиль окна Фрагменты Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_xx.qm0000644000175000017500000000002013200270153014234 00000000000000<¸dÊÍ!¿`¡½Ýrecoll-1.23.7/qtgui/i18n/recoll_de.qm0000644000175000017500000026261313224431020014205 00000000000000<¸dÊÍ!¿`¡½ÝB`+ö¡-öίÁ+;*;G¤9HH,æH,Ð[HYЈIA³Zl mbÇ ^*j˜•ÕÁ¦yn ¨¥¾3¶E˜§ÐD JÙ] | ½ÙXLôÄÞLôÓáVEŸÿVEÑ<f¾Å lÀµþxÆÔ˜Å:H¬Ür¬ô¬ô¬°EîOÁ$—Ê;'HäÇ1*Ð%®7*ì0®ü+Lôj+f¾|Æ1øy:Îd«DAVŽ*œG…ÔJ6Gß²…H6óÕgH6õÕ”J+‚k¬J+‚ͲJ6• BJ6•ë¹L™b™gMzÓ±Ph¨ÀSŠ˜Ö S¸¹ã7T°5ÀÕWToWÈÕ )XÉÄK5Z0ƒF_[ %ÁÜ\ƒµÜŸe®lgwîÊ•sºñ7sºñ«zv8“¡Ïv®Âv®Â«Üzϳ©€€£5¦„jŒÏŒ!þë—¤´éÎ0œWÍè ªJ ø®½Þ+ä¯fSé ¶ÊðŒpº° ¦ÃÞÈfÐùƒª·ÐùƒÜýÐùƒèxãn Býgt©y:•F³ÕwEµ¨9nôºÉÂ.ê^ôºA0,… ;¸sÛ}>.cv»Do2›ÜN£ÎXM¹B‘X®©6H`Þ^à hˆ¸8ÊlÿtÑnÚpèwñ…Àœwñ…ê&€üÞ®¦‘vã.Ù•ñ“vl¢‰ N£cê%ÎxCq@ÞñƒxðëͺXó L¨þSI̦ÿµÝÿØ…×Ä çwp#våÅ™v奿Vw 5¿w 5Ìow 5ÐÃw 5áwî¿ØŒUŸ.?£¹Þó©Ö³ÜǪ6•Ô¢¯†”Žc»f3°µͼuCDÐgžÌÐgž¬ ÔÂõlq׸~ÿyì;U” ï¡©7¿úUmºúeî3 ¬UR!DM'&Á8Î.‡NyÒ=údMÐ?údÆ5G$ß‹ƒJUY˜WJUYÄWY ôÚ[–uo¦_nØ*º™QØu;–Ê·“u¢·ÔÊ—¥fÊ—¥«§ÎÅåE¢Ôä^>ùÝôL4 æõÎù½ìx‚ùJg9ìþA¢¼ÂþŠ¥CÊÿ%´ÞÛÿAî”B f<.ŠóçÞÍGõ»Qëd»â;[¾Ö><ÄöÈLƒì–NB™êµe 2ž?vhÕõ,€ã‡’m…(P’öŒ¯b¾’"3“’ZÓ¸˜I¼9˜I¼kx™n•КߤœŸf•àåŸf•ö_Ÿf•1–«±§«Íå¬,¥9»¯ƒW8¯ƒWg÷Äy%59Äy%:‹΄դOÐ: pÚ#:ËãX|ØåõW4"Ì”iÆviÔ; -Zÿ-¼½)ÖTLDB9€]BìSÒÇk¶ÞµÌoˆ•Ò`r?)Â4rža|ôò•„kå}»‹¦,·&‹ÜðÛ8ŒÇ<°ï"OM›ˆ˜Ï䛈˜Ôr¦ASҪâ£F·¨ Éó·¨ Þ»œRÖÇ¢•~ ×I^´8Ø~CœèêÈ™&éã>f„ðŒµP˜`³¶ÀMð<$•" ÐUKôNp h.Šu9R’v2ãnX–T#p]—BkÙšK!M¦ %E¦©n¯-¦öõ\¨«‡©=¶7Ƭ€*ÑÄÅ^öûÄÖ[žvÊXÔÈënDÌðw)Ò”þ( C0#!vôæy#+äPï7I^®h<ˆ~݉FW#ÑnF¯N72H:"|õ_guOØapä&f 9õ|§N#ŒÍw}…ŒÏ—Å6n„“’ž/6™ÅóÕ"¦š´¬I²ð ~\¾l¯¢ÓtÓt¬{ÈàɆtTýâ]88ŠåÅ %éŽ#¸úñÚQ3hc,öyñ„:uîGLGñîN‰Jýnü”QçÇu}}t»€;EÉA”ò“Q6¨0Î"Q©ÔÕKx¬¨”ð›°cëóÄÏ£È@ÃÖêÊÁ°%Ìí³jGͳÅi×°’ÝÜ)Däœc ¨ä´¥ŽÀæí:–gî?À™Ôö¨åÅú ÃUª ´H­ -(9 9ZyÏK ;´3œE D©à K¨óµn ]#—Ÿ1 c‡C€a k¨µp¦ lMˆh( ‰ŒîS§ ŸÁòc £qD×) «ƒÔ½Ï ­îL ®œ¯6 ²9 T ü>H¬ ä3˜Ó äîqº íåõ0ä *Nn¦ :^ßq Üc o *R6¡ +<”æ 6 –2 >V…ðM G.~Oe `P† `ç£ a·E³¸ c·E³ø d8éœ ymU ˜Iœ)ú ¤ž  ®VTº ²ëC~› Äãħ âæç³& æõ粺 ®±Ù ®ù². Ô…R ye4ü TH® ŽÚj‚ ,xƒ)¤ =!T‰ Kj×Áˆ h¹°j ’þƒØf ™÷§ž é Ù £Ü p ¨Î£´s ¬r »ïµ•‰ Ù·å¶* Û·å¶u ÛÓ1Ô ?¾@´ Vd- ïúìç 'И±= +bCú /¥Þ 97ÃE 9É X L*ÇÁ PÖ™ RVލ· T#yƒ Vü) \iCJ• ]æùò `F¥ { hôîÇx v—¥£ {lGü €!Y¢ª €!YÅØ ‚Wå¹» Š‘ Œïõ¹f ¬æà• ¶…ñ8 ¹iɆ Óͦ, Ú÷Ü Ýøì.< é—~?p õ­NëB ö†ÀÔÚ m£À^ 'RçP< -èôÁ 8þ+! FÁ›š OE°Næ ]„Ä:€ ]„Äí4 uò0¸¼ y·å° y¹~> ‚±3  …È©4- ‡uÍ ‡uá\ ‰Pæ ‰Pª† 5dDÇ ¤š„Ÿ¡ ¬Š©4e ½ý7cô ÇòÞ2N ÊÕ’88 ÕH Î ÛQ5ò´ û£Ûß q©­Ú€>¯%Ýn€ò/¸.ÿ8bóÚî9µ·X<ÞR‚<‡Qá~I=W"ù|‰Y~s°c[žs¼s\Н5qe3´èg3µ+pû~d;Õ %´™³4î!-¸­c[»m€È¾¿­c ¼Â|“y<Â|“NüÎÁ'£|ó l¬Øü©ÜÖü¶LiV alle Ausdrücke All clauses AdvSearch(irgendeinen Ausdruck Any clause AdvSearch`Ungültiger Multiplikator-Suffix im Größen-Filter$Bad multiplier suffix in size filter AdvSearch Medienmedia AdvSearchNachrichtmessage AdvSearch Andereother AdvSearchPräsentation presentation AdvSearchTabelle spreadsheet AdvSearchTabellen spreadsheets AdvSearchTexttext AdvSearch Textetexts AdvSearch<---- Alle <----- All AdvSearchBase<---- Auswahl <----- Sel AdvSearchBase&Ausdruck hinzufügen Add clause AdvSearchBase Erweiterte SucheAdvanced search AdvSearchBaseAlle ----> All ----> AdvSearchBase`Alle nicht-leeren Felder rechts werden mit UND ("alle Ausdrücke") oder ODER ("irgendeinen Ausdruck") verknüpft. <br>Felder des Typs "Irgendeines", "Alle" und "Keines" können eine Mischung aus Wörtern und in Anführungszeichen eingeschlossenen Phrasen enthalten. <br>Nicht gefüllte Felder werden ignoriert.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions.
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseDurchsuchenBrowse AdvSearchBaseNach Kategorien By categories AdvSearchBase`Auswählen, um Filterung nach Datum einzuschalten'Check this to enable filtering on dates AdvSearchBasejAuswählen, um Filterung nach Dateitypen einzuschalten,Check this to enable filtering on file types AdvSearchBasejAuswählen, um Filterung nach Dateigröße einzuschalten'Check this to enable filtering on sizes AdvSearchBasevAuswählen, um Dateikategorien statt Mime-Typen zu verwenden;Check this to use file categories instead of raw mime types AdvSearchBaseSchließenClose AdvSearchBase$Ausdruck entfernen Delete clause AdvSearchBasebGeben Sie das Basisverzeichnis für die Suche ein.Enter top directory for search AdvSearchBaseFilternFilter AdvSearchBase$Nach Datum filtern Filter dates AdvSearchBase$Nach Größe filtern Filter sizes AdvSearchBase FindenFind AdvSearchBasevonFrom AdvSearchBase8Nicht durchsuchte DateitypenIgnored file types AdvSearchBaseInvertierenInvert AdvSearchBaseMax. Größe: Max. Size AdvSearchBaseŽMaximale Größe. Sie können k/K, m/M, g/G als Multiplikatoren verwenden.4Maximum size. You can use k/K,m/M,g/G as multipliers AdvSearchBaseMin. Größe: Min. Size AdvSearchBaseŽMinimale Größe. Sie können k/K, m/M, g/G als Multiplikatoren verwenden.4Minimum size. You can use k/K,m/M,g/G as multipliers AdvSearchBase.Dateitypen einschränkenRestrict file types AdvSearchBase‚Ergebnisse auf Dateien in folgendem Verzeichnisbaum einschränken:%Restrict results to files in subtree: AdvSearchBase,Als Standard speichernSave as default AdvSearchBasedSuche nach Dokumenten, <br>die Folgendes erfüllen:'Search for
documents
satisfying: AdvSearchBase,Durchsuchte DateitypenSearched file types AdvSearchBaseAuswahl ----> Sel -----> AdvSearchBaseSuche starten Start Search AdvSearchBasebisTo AdvSearchBase<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Zeitplan für periodische Indizierung (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Jedes Feld kann eine Wildcard (*), eine einzelne Zahl, eine mit Kommata getrennte Liste (1,3,5) oder einen Bereich (1-7) enthalten. Die Felder werden <span style=" font-style:italic;">so wie sie sind</span> in der crontab-Datei verwendet und die gesamte crontab Syntax kann verwendet werden, siehe crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />Beispielsweise startet die Eingabe <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Wochentage, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Stunden</span> und <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minuten</span> recollindex jeden Tag um 12:15 Uhr und 19:15 Uhr.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Ein Zeitplan mit sehr häufigen Aktivierungen ist wahrscheinlich weniger effizient als Echtzeit-Indizierung.</p></body></html>Å

Recoll batch indexing schedule (cron)

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


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

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

 CronToolW†<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wählen Sie <span style=" font-style:italic;">Deaktivieren</span>, um die periodische Indizierung auszuschalten, <span style=" font-style:italic;">Aktivieren</span>, um sie einzuschalten, <span style=" font-style:italic;">Abbruch</span>, um nichts zu verändern.</p></body></html>š

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

 CronToolWCron-Zeitplan Cron Dialog CronToolWPWochentage (* oder 0-7, 0/7 ist Sonntag))Days of week (* or 0-7, 0 or 7 is Sunday) CronToolWDeaktivierenDisable CronToolWAktivierenEnable CronToolW†Fehler beim Erstellen des cron Eintrags. Falsche Syntax in Feldern?3Error installing cron entry. Bad syntax in fields ? CronToolW*Stunden (* oder 0-23)Hours (* or 0-23) CronToolW°Offenbar gibt es manuelle Einträge für recollindex, crontab kann nicht angepasst werden.PIt seems that manually edited entries exist for recollindex, cannot edit crontab CronToolWMinuten (0-59)Minutes (0-59) CronToolW DialogDialog EditDialog(Konfigurationsfehler Config error EditTransLokaler Pfad Local path EditTransOriginalpfad Original path EditTransQuellpfad Source path EditTransHinzufügenAdd EditTransBaseAbbrechenCancel EditTransBaseEntfernenDelete EditTransBase PfadumwandlungenPath Translations EditTransBaseSpeichernSave EditTransBaseWählen Sie einen oder mehrere Dateitypen aus. Nutzen Sie dann die Bedienelemente unten, um einzustellen wie sie verarbeitet werden.kSelect one or several file types, then use the controls in the frame below to change how they are processed EditTransBase4Setze Pfadumwandlungen fürSetting path translations for  EditTransBase R<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Es existiert noch kein Index für diese Konfiguration.</span><br /><br />Wenn Sie nur Ihr Home-Verzeichnis mit sinnvollen Voreinstellungen indizieren wollen, wählen Sie die Schaltfläche <span style=" font-style:italic;">Indizierung jetzt starten</span>. Sie können die Details später anpassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Wenn Sie das Verhalten genauer festlegen wollen, verwenden Sie die folgenden Verknüpfungen, um Einstellungen und Zeitplan für die Indizierung anzupassen.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Diese Werkzeuge können Sie später im Menü <span style=" font-style:italic;">Einstellungen</span> erreichen.</p></body></html>ê

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

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

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

These tools can be accessed later from the Preferences menu.

FirstIdxDialogHEinrichten für die erste IndizierungFirst indexing setupFirstIdxDialog:Einstellungen für IndizierungIndexing configurationFirstIdxDialog0Zeitplan für IndizierungIndexing scheduleFirstIdxDialog2Indizierung jetzt startenStart indexing nowFirstIdxDialog<Hier können Sie die zu indizierenden Verzeichnisse und andere Einstellungen (wie auszuschließende Dateipfade oder -namen, Standard-Zeichensatz usw.) anpassen.This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.FirstIdxDialogTHier können Sie zwischen regelmäßiger Indizierung und Echtzeit-Indizierung wählen und einen automatischen Zeitplan für die regelmäßige Indizierung einrichten (mit cron). €This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron).FirstIdxDialog Ž<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indizierung kann ständig laufen und Datein indizieren sobald sie verändert werden, oder aber nur zu bestimmten Zeitpunkten ablaufen.</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Im Handbuch finden Sie Informationen, anhand derer Sie sich für einen der Ansätze entscheiden können (drücken Sie F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dieses Werkzeug hilft Ihnen, einen Zeitplan für periodische Indizierungs-Läufe einzurichten oder die Echtzeit-Indizierung zu starten, wenn Sie sich anmelden (oder beides, was aber selten sinnvoll sein dürfte). </p></body></html>¿

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

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

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

 IdxSchedWCron-ZeitplanCron scheduling IdxSchedWÎEntscheiden Sie, ob die Echtzeit-Indizierung beim Anmelden gestartet wird (nur für den Standard-Index).ZDecide if real time indexing will be started when you log in (only for the default index). IdxSchedWZEinrichtung des Zeitplans für die IndizierungIndex scheduling setup IdxSchedW<Start der Echtzeit-IndizierungReal time indexing start up IdxSchedWöMit diesem Werkzeug können Sie festlegen, zu welchen Zeiten die Indizierung laufen soll, und einen crontab Eintrag anlegen._The tool will let you decide at what time indexing should run and will install a crontab entry. IdxSchedW DialogDialog ListDialogGruppenBoxGroupBox ListDialogÈ"history" Datei ist beschädigt oder nicht les-/schreibbar, bitte überprüfen oder entfernen Sie sie: K"history" file is damaged or un(read)writeable, please check or remove it: MainLKein Datenbankverzeichnis konfiguriert No db directory in configurationMain&Nächstes&NextPreview&Vorheriges &PreviousPreview&Suche nach: &Search for:PreviewjÜberführung in interne Darstellung nicht möglich für 0Can't turn doc into internal representation for PreviewAbbrechenCancelPreview LeerenClearPreviewTab schließen Close TabPreview(Erzeuge VorschautextCreating preview textPreview6Fehler beim Lesen der DateiError while loading filePreview>Lade Vorschautext in den Editor Loading preview text into editorPreview>Groß-/Kleinschreibung &beachten Match &CasePreview2Fehlendes Hilfsprogramm: Missing helper program: PreviewKopierenCopyPreviewTextEdit Zeilen umbrechen Fold linesPreviewTextEdit&Einrückung erhaltenPreserve indentationPreviewTextEditDruckenPrintPreviewTextEdit2Aktuelle Vorschau druckenPrint Current PreviewPreviewTextEdit2Dokument in Datei sichernSave document to filePreviewTextEditAlles auswählen Select AllPreviewTextEditFelder zeigen Show fieldsPreviewTextEditZeige Bild Show imagePreviewTextEdit&Vorschautext zeigenShow main textPreviewTextEditH<b>Angepasste<br> UnterverzeichnisseCustomised subtreesQObject<i>Die folgenden Parameter werden entweder global gesetzt (wenn nichts oder eine leere<br> Zeile in der Liste oben ausgewählt ist) oder für das ausgewählte Unterverzeichnis.<br> Sie können Verzeichnisse durch Anklicken von +/- hinzufügen oder entfernen.<br>ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject0Folge symbolischen LinksFollow symbolic linksQObjectàFolge symbolischen Links bei der Indizierung. Der Standardwert ist "Nein", um doppelte Indizierung zu vermeiden.TFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject"Globale ParameterGlobal parametersQObject2Indiziere alle DateinamenIndex all file namesQObject:Indiziere die Namen von Dateien, deren Inhalt nicht erkannt oder verarbeitet werden kann (kein oder nicht unterstützter Mime-Typ). Der Standardwert ist "Ja".}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject Lokale ParameterLocal parametersQObjectSuchparameterSearch parametersQObject&Auszulassende Namen Skipped namesQObjectDie Liste der Unterverzeichnisse in der indizierten Hierarchie, in denen einige Parameter anders gesetzt werden müssen. Voreinstellung: leer.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject¦Dies sind Muster für Dateien oder Verzeichnisse, die nicht indiziert werden sollen.LThese are patterns for file or directory names which should not be indexed.QObjectWeb-Chronik Web historyQObject&Öffnen&OpenQWidgetXÖ&ffnen des übergeordneten Dokuments/Ordners&Open Parent document/folderQWidget&Vorschau&PreviewQWidget$&Schreibe in Datei&Write to FileQWidget(&Dateinamen kopierenCopy &File NameQWidget&URL kopieren Copy &URLQWidget4&Ähnliche Dokumente findenFind &similar documentsQWidget0Öffne &Schnipsel-FensterOpen &Snippets windowQWidget\Vorschau des &übergeordneten Dokuments/OrdnersPreview P&arent document/folderQWidget4Auswahl in Dateien sichernSave selection to filesQWidgetVUntergeordnete Dokumente / Anhänge anzeigenShow subdocuments / attachmentsQWidget¶<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indizierung kann im Hintergrund laufen und den Index in Echtzeit aktualisieren sobald sich Dateien ändern. Sie erhalten so einen Index, der stets aktuell ist, aber die System-Resourcen werden ununterbrochen beansprucht.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></htm.

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

RTIToolWNIndizierungs-Dämon jetzt sofort starten%Also start indexing daemon right now.RTIToolWžAutotstart-Datei wurde entfernt. Soll auch der laufende Prozess beendet werden?2Autostart file deleted. Kill current process too ?RTIToolW4Fehler beim Erzeugen von: Can't create: RTIToolWJFehler beim Ausführen von recollindexCould not execute recollindexRTIToolWLösche Datei Deleting fileRTIToolWLösche:  Deleting: RTIToolWXAutomatischer Start der Echtzeit-Indizierung"Real time indexing automatic startRTIToolW.Autostart wird entferntRemoving autostartRTIToolWErsetze DateiReplacing fileRTIToolWErsetze:  Replacing: RTIToolW\Indizierungs-Dämon mit Desktop-Sitzung starten.Start indexing daemon with my desktop session.RTIToolWWarnungWarningRTIToolW(alle Sprachen)(all languages)RclMain(kein Stemming) (no stemming)RclMainÜber Recoll About RecollRclMainAlleAllRclMain”Fehlerhafter Anzeigebefehl für %1: [%2] Überprüfen Sie die Datei mimeview.CBad viewer command line for %1: [%2] Please check the mimeview fileRclMain>Fehler beim Zugriff auf Datei: Can't access file: RclMainRFehler beim Erzeugen des VorschaufenstersCan't create preview windowRclMainLFehler beim Dekomprimieren von Datei: Can't uncompress file: RclMainlFehler beim Aktualisieren des Index: Indizierung läuft#Can't update index: indexer runningRclMainšFehler beim Extrahieren des Dokuments oder beim Erzeugen der temporären Datei0Cannot extract document or create temporary fileRclMainLÜbergeordnetes Dokument nicht gefundenCannot find parent documentRclMainbKeine Informationen zum Dokument in der Datenbank+Cannot retrieve document info from databaseRclMainSchließenClosingRclMain^Inhalte mit diesen Mime-Typen wurden indiziert:.Content has been indexed for these mime types:RclMainäExterner Index konnte nicht geöffnet werden. Datenbank nicht offen. Überprüfen Sie die Liste der externen Indizes.HCould not open external index. Db not open. Check external indexes list.RclMain$Dokumenten-ChronikDocument historyRclMain FertigDoneRclMain$Doppelte DokumenteDuplicate documentsRclMainLösche Index Erasing indexRclMain FehlerErrorRclMainAusführen: [ Executing: [RclMain:Externe Anwendungen/Befehle, die zur Indizierung Ihrer Dateitypen gebraucht werden und nicht gefunden wurden - vom letzten Indizierungslauf hinterlegt unter pExternal applications/commands needed for your file types and not found, as stored by the last indexing pass in RclMainChronik-Daten History dataRclMain<Fehler beim Abfragen des IndexIndex query errorRclMain*Indizierte Mime-TypenIndexed MIME TypesRclMain\Indizierung ist noch nicht durchgeführt wordenIndexing did not run yetRclMain.Indizierung gescheitertIndexing failedRclMain&Indizierung läuft: Indexing in progress: RclMain.Fehlende HilfsprogrammeMissing helper programsRclMainÜberwachenMonitorRclMainrKein externes Anzeigeprogramm konfiguriert für Mime-Typ [-No external viewer configured for mime type [RclMain<Keine fehlenden HilfsprogrammeNo helpers found missingRclMain2Keine Ergebnisse gefundenNo results foundRclMain KeineNoneRclMainSäubernPurgeRclMainöSuche läuft.<br>Aufgrund von Einschränkungen der Indizierungs-Bibliothek<br>führt ein Abbruch zur Beendigung des Programms.eQuery in progress.
Due to limitations of the indexing library,
cancelling will exit the programRclMainSuchergebnisse Query resultsRclMainRIndex zurücksetzen und ganz neu aufbauen?(Reset the index and start from scratch ?RclMain.Anzahl Ergebnisse (ca.)Result count (est.)RclMainDatei sichern Save fileRclMainWortstämmeStemdbRclMain(&Indizierung stoppenStop &IndexingRclMainHUntergeordnete Dokumente und AnhängeSub-documents and attachmentsRclMainHDer laufende Indizierungs-Prozess wurde nicht aus diesem Programm gestartet. Drücken SIe OK, um ihn dennoch zu stoppen oder Abbrechen, um ihn unverändert zu lassen.yThe current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it aloneRclMainîDas in mimeview angegebene Anzeigeprogramm für %1: %2 wurde nicht gefunden. Wollen Sie den Einstellungs-Dialog starten?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMainRDiese URLs ( | ipath) sind inhaltsgleich:-These Urls ( | ipath) share the same content:RclMain@Diese Suche ist nicht mehr aktiv"This search is not active any moreRclMainUnbekanntUnknownRclMain(Index &aktualisieren Update &IndexRclMainAktualisiereUpdatingRclMain Anzeigebefehl für %1 legt Datei und übergeordnete Datei fest: nicht unterstützt QViewer command line for %1 specifies both file and parent file value: unsupportedRclMainWarnungWarningRclMainNFehler beim Holen der Stemming-Sprachen#error retrieving stemming languagesRclMaingefiltertfilteredRclMain MedienmediaRclMainNachrichtmessageRclMain AndereotherRclMainPräsentation presentationRclMainsortiertsortedRclMainTabelle spreadsheetRclMainTexttextRclMain&Über Recoll &About Recoll RclMainBase"&Erweiterte Suche&Advanced Search RclMainBase4Lösche &Dokumenten-Chronik&Erase document history RclMainBase(Lösche &Such-Chronik&Erase search history RclMainBase &Datei&File RclMainBase&Vollbild &Full Screen RclMainBase$&GUI-Einstellungen&GUI configuration RclMainBase &Hilfe&Help RclMainBase(&Index-Einstellungen&Index configuration RclMainBase&Einstellungen &Preferences RclMainBase&Index &neu aufbauen&Rebuild index RclMainBase&Ergebnisse&Results RclMainBase"&Sortierparameter&Sort parameters RclMainBase&Werkzeuge&Tools RclMainBase"&Benutzerhandbuch &User manual RclMainBase2Erweiterte/komplexe SucheAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$Dokumenten-ChronikDocument History RclMainBase&&Dokumenten-ChronikDocument &History RclMainBase&BeendenE&xit RclMainBase6Dialog für externe &IndizesE&xternal index dialog RclMainBase4Dialog für externe IndizesExternal index dialog RclMainBaseF11F11 RclMainBaseErste Seite First Page RclMainBaseErste Seite First page RclMainBaseVollbild Full Screen RclMainBase:Gehe zur ersten ErgebnisseiteGo to first page of results RclMainBaseNächste Seite Next Page RclMainBaseNächste Seite Next page RclMainBase*Nächste ErgebnisseiteNext page of results RclMainBase PgDownPgDown RclMainBasePgUpPgUp RclMainBaseVorherige Seite Previous Page RclMainBaseVorherige Seite Previous page RclMainBase.Vorherige ErgebnisseitePrevious page of results RclMainBase RecollRecoll RclMainBase>Tabelle als CSV Datei speichernSave as CSV (spreadsheet) file RclMainBaseˆSpeichert Resultate als Tabellenkalkulations-kompatible CSV-Datei ab@Saves the result into a file which you can load in a spreadsheet RclMainBaseShift+PgUp Shift+PgUp RclMainBase:Zeige Details zur SuchanfrageShow Query Details RclMainBase(Als Tabelle anzeigen Show as table RclMainBase>Zeigt Ergebnisse als Tabelle an(Show results in a spreadsheet-like table RclMainBaseNNach Datum sortieren (von neu nach alt)Sort by date, newest first RclMainBaseNNach Datum sortieren (von alt nach neu)Sort by date, oldest first RclMainBaseNNach Datum sortieren (von neu nach alt)#Sort by dates from newest to oldest RclMainBaseNNach Datum sortieren (von alt nach neu)#Sort by dates from oldest to newest RclMainBase SortierparameterSort parameters RclMainBase$&Ausdruck-ExplorerTerm &explorer RclMainBase4Ausdruck-Explorer-WerkzeugTerm explorer tool RclMainBase(&Index aktualisieren Update &index RclMainBase AuszugAbstract RecollModel AutorAuthor RecollModel DatumDate RecollModel"Datum und Uhrzeit Date and time RecollModel&Datum des Dokuments Document date RecollModel&Größe des Dokuments Document size RecollModelDatum der Datei File date RecollModelDateiname File name RecollModelGröße der Datei File size RecollModelInterner PfadIpath RecollModelSchlagworteKeywords RecollModelMime-Typ MIME type RecollModel$ÄnderungszeitpunktMtime RecollModel4Ursprünglicher ZeichensatzOriginal character set RecollModel$Relevanz-BewertungRelevancy rating RecollModel TitelTitle RecollModelURLURL RecollModel((Suchanfrage zeigen) (show query)ResListN<p><b>Keine Ergebnisse gefunden</b><br>

No results found
ResListv<p><i>Alternative Schreibweisen (Akzente unterdrückt): </i>4

Alternate spellings (accents suppressed): ResListJ<p><i>Alternative Schreibweisen: </i>

Alternate spellings: ResList$Dokumenten-ChronikDocument historyResListDokumente DocumentsResList WeiterNextResList ÖffnenOpenResListVorschauPreviewResList ZurückPreviousResListSuchdetails Query detailsResList.Anzahl Ergebnisse (ca.)Result count (est.)ResListErgebnisliste Result listResListSchnipselSnippetsResList0Dokument nicht verfügbarUnavailable documentResListfürforResListvon mindestensout of at leastResListSpalte &löschen&Delete columnResTable0Sortierung &zurücksetzen &Reset sortResTable$Als CSV &speichern &Save as CSVResTable,Spalte "%1" hinzufügenAdd "%1" columnResTableNFehler beim Öffnen/Erzeugen von Datei: Can't open/create file: ResTable>Tabelle als CSV Datei speichernSave table to CSV fileResTableAlle Ausdrücke All termsSSearch$Irgendein AusdruckAny termSSearch.Fehlerhafte SuchanfrageBad query stringSSearchjGeben Sie einen Wildcard-Ausdruck für Dateinamen ein.$Enter file name wildcard expression.SSearchÎSuchbegriffe hier eingeben. Drücken Sie ESC+Leerzeichen für Vervollständigungen des aktuellen Begriffs.FEnter search terms here. Type ESC SPC for completions of current term.SSearchDateiname File nameSSearch8Kein Speicher mehr verfügbar Out of memorySSearchSuchspracheQuery languageSSearch8Wählen Sie die Art der SucheChoose search type. SSearchBaseLöschenClear SSearchBase Ctrl+SCtrl+S SSearchBaseÎSuchbegriffe hier eingeben. Drücken Sie ESC+Leerzeichen für Vervollständigungen des aktuellen Begriffs.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase&Sucheintrag löschenErase search entry SSearchBaseSSearchBase SSearchBase SSearchBase SuchenSearch SSearchBaseSuche starten Start query SSearchBaseAlleAll SearchClauseWIrgendeinesAny SearchClauseWDateiname File name SearchClauseWKein FeldNo field SearchClauseW KeinesNone SearchClauseWˆAnzahl der Wörter, die sich zwischen den angegebenen befinden dürfenHNumber of additional words that may be interspersed with the chosen ones SearchClauseW PhrasePhrase SearchClauseWNähe Proximity SearchClauseWŠWählen Sie die Art der Suche aus, die mit den Wörtern gestartet wird.>Select the type of query that will be performed with the words SearchClauseWFinden:Find:Snippets WeiterNextSnippets ZurückPrevSnippetsSchnipselSnippetsSnippets SuchenSearch SnippetsW&Schließen&Close SpellBase"&Vervollständigen&Expand  SpellBase BetonungszeichenAccents SpellBase Alt+SAlt+C SpellBase Alt+VAlt+E SpellBase*Groß-/KleinschreibungCase SpellBaseBeachteMatch SpellBase6Keine Datenbank-Information No db info. SpellBase"Ausdruck-Explorer Term Explorer SpellBase%1 Ergebnisse %1 resultsSpellWfDurchschnittliche Zahl von Ausdrücken pro DokumentAverage terms per documentSpellW4Größe des DatenbankordnersDatabase directory sizeSpellWDok. / Ges. Doc. / Tot.SpellW Index: %1 Dokumente mit durchschnittlicher Länge von %2 Begriffen. %3 Ergebnisse7Index: %1 documents, average length %2 terms.%3 resultsSpellWEintragItemSpellW€Liste wurde alphabetisch abgeschnitten, einige häufige Begriffe 1List was truncated alphabetically, some frequent SpellWMime-Typen: MIME types:SpellW4Keine Erweiterung gefundenNo expansion foundSpellWDokumentenzahlNumber of documentsSpellW$Regulärer AusdruckRegexpSpellW2Indexstatistiken anzeigenShow index statisticsSpellWPhonetischSpelling/PhoneticSpellW*Wortstamm-ErweiterungStem expansionSpellWBegriffTermSpellWWertValueSpellWWildcards WildcardsSpellWNFehler beim Holen der Stemming-Sprachen#error retrieving stemming languagesSpellWtkönnen fehlen. Versuchen Sie es mit einer längeren Wurzel..terms may be missing. Try using a longer root.SpellWAlle Ausdrücke All terms UIPrefsDialog$Irgendein AusdruckAny term UIPrefsDialogPBitte wählen Sie maximal einen Index aus$At most one index should be selected UIPrefsDialogIndices mit unterschiedlichen Einstellungen zum Umgang mit Groß/-Kleinschreibung und diakritischen Zeichen können nicht hinzugefügt werden>Cant add index with different case/diacritics stripping option UIPrefsDialogAuswählenChoose UIPrefsDialogDateiname File name UIPrefsDialogSuchspracheQuery language UIPrefsDialogXHeader der Ergebnisliste (Standard ist leer)%Result list header (default is empty) UIPrefsDialog˜Format für Ergebnis-Absatz (alles löschen, um auf Standard zurück zu setzen)Neuer Wert</b>New Values:ViewActionBaseJAktion (leer !’ Recoll-Voreinstellung) Action (empty -> recoll default)ViewActionBase:Auf aktuelle Auswahl anwendenApply to current selectionViewActionBaseSchließenCloseViewActionBase`Von Desktopvoreinstellungen abweichende Ausnahme Exception to Desktop preferencesViewActionBase AnzeigeprogrammeNative ViewersViewActionBaseRecoll-Aktion:Recoll action:ViewActionBaseúWählen Sie einen oder mehrere Dateitypen aus. Nutzen Sie dann die Bedienelemente unten, um das Programm zum Öffnen anzupassenkSelect one or several file types, then use the controls in the frame below to change how they are processedViewActionBaseWählen Sie einen oder mehrere MIME-Typen aus und nutzen Sie dann die Bedienelemente unten, um das Programm zum Öffnen anzupassen.lSelect one or several mime types then use the controls in the bottom frame to change how they are processed.ViewActionBase Das Selbe wählen Select sameViewActionBaseXStandardmäßig Desktopvoreinstellungen nutzen"Use Desktop preferences by defaultViewActionBaseaktueller Wert current valueViewActionBaseÿÿÿÿ\Enables indexing Firefox visited pages.
(you need also install the Firefox Recoll plugin)confgui::ConfBeaglePanelWXMaximale Größe für Ablage von Webseiten (MB) Max. size for the web store (MB)confgui::ConfBeaglePanelWWeb-ChronikProcess the WEB history queueconfgui::ConfBeaglePanelWXDer Name eines Verzeichnisses, in dem Kopien der besuchten Webseiten gespeichert werden sollen.<br>Ein nicht-absoluter Pfad ist dabei relativ zum Konfigurationsverzeichnis.‘The name for a directory where to store the copies of visited web pages.
A non-absolute path is taken relative to the configuration directory.confgui::ConfBeaglePanelWHVerzeichnis zur Ablage von WebseitenWeb page store directory nameconfgui::ConfBeaglePanelWZFehler beim Schreiben der KonfigurationsdateiCan't write configuration fileconfgui::ConfIndexWAuswählenChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLW²<p> Automatisch die Beachtung von Groß-/Kleinschreibung einschalten, wenn der Eintrag Großbuchstaben enthält (außer an erster Stelle). Ansonsten müssen Sie dafür die Suchsprache und den <i>C</i> Modifikator verwenden.â

Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the C modifier to specify character-case sensitivity.confgui::ConfSearchPanelWÎ<p> Automatisch die Beachtung von diakritischen Zeichen einschalten, wenn der Suchbegriff Zeichen mit Akzenten enthält (nicht in unac_except_trans). Ansonsten müssen Sie dafür die Suchsprache und den <i>D</i> Modifikator verwenden.Û

Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the D modifier to specify diacritics sensitivity.confgui::ConfSearchPanelWô<p>Maximale Anzahl von Erweiterungen für einen einzelnen Ausdruck (z.B. bei der Verwendung von Wildcards). Der Standardwert 10 000 ist vernünftig und verhindert, dass Suchanfragen scheinbar einfrieren, während die Liste der Begriffe durchlaufen wird.Ã

Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.confgui::ConfSearchPanelW<p>Maximale Anzahl von elementaren Ausdrücken, die wir zu einer einzelnen Xapian Abfrage hinzufügen. In manchen Fällen können die Ergebnisse von Ausdruck-Erweiterungen sich ausmultiplizieren, und wir wollen übermäßigen Speicherverbrauch vermeiden. Der Standardwert 100 000 sollte in den meisten Fällen hoch genug sein und zugleich zu typischen derzeitigen Hardware-Ausstattungen passen.5

Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.confgui::ConfSearchPanelWTAutomatisch Groß-/Kleinschreibung beachten$Automatic character case sensitivityconfgui::ConfSearchPanelWRAutomatisch diakritische Zeichen beachten Automatic diacritics sensitivityconfgui::ConfSearchPanelWJMaximale Anzahl von Xapian-AusdrückenMaximum Xapian clauses countconfgui::ConfSearchPanelWTMaximale Anzahl von Ausdruck-ErweiterungenMaximum term expansion countconfgui::ConfSearchPanelW¨Externe Filter, die länger als diese Zeit laufen, werden abgebrochen. Das ist für den seltenen Fall (Postscript), in dem ein Dokument eine unendliche Schleife auslöst. Auf -1 setzen, um keine Obergrenze zu haben.­External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. confgui::ConfSubPanelW GlobalGlobalconfgui::ConfSubPanelWpWenn dieser Wert gesetzt ist (ungleich -1), werden Textdateien zur Indizierung in Stücke dieser Größe aufgeteilt. Das hilft bei der Suche in sehr großen Textdateien (z.B. Log-Dateien).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelW<Max. Größe kompr. Dateien (kB)Max. compressed file size (KB)confgui::ConfSubPanelW0Max. Zeit für Filter (s)Max. filter exec. time (S)confgui::ConfSubPanelW6Max. Größe Textdateien (MB)Max. text file size (MB)confgui::ConfSubPanelW8Seitengröße Textdateien (kB)Text file page size (KB)confgui::ConfSubPanelWXDies ist eine Obergrenze; komprimierte Dateien jenseits dieser Größe werden nicht verarbeitet. Auf -1 setzen, um keine Obergrenze zu haben, auf 0, um nie zu dekomprimieren.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelW‚Dies ist eine Obergrenze; Textdateien jenseits dieser Größe werden nicht verarbeitet Auf -1 setzen, um keine Obergrenze zu haben. Dies dient dazu, riesige Log-Dateien vom Index auszuschließen.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWT<p>Dies sind Ausnahmen für den unac Mechanismus, der standardmäßig alle diakritischen Zeichen entfernt und sie durch kanonische Entsprechungen ersetzt. Sie können (abhängig von Ihrer Sprache) dieses Entfernen von Akzenten für einige Zeichen übersteuern und zusätzliche Ersetzungen angeben, z.B. für Ligaturen. Bei jedem durch Leerzeichen getrennten Eintrag ist das erste Zeichen das Ausgangszeichen und der Rest die Ersetzung.l

These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.confgui::ConfTopPanelW$Sprache für AspellAspell languageconfgui::ConfTopPanelW>Verzeichnis für Index-DatenbankDatabase directory nameconfgui::ConfTopPanelWtDeaktiviert die Verwendung von Aspell für die Erzeugung von Schreibweisen-Näherungen im Ausdruck-Explorer-Werkzeug. <br>Nützlich, wenn Aspell nicht vorhanden ist oder nicht funktioniert.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWBInterval (MB) für SpeicherleerungIndex flush megabytes intervalconfgui::ConfTopPanelWLog-Datei Log file nameconfgui::ConfTopPanelW0Ausführlichkeit des LogsLog verbosity levelconfgui::ConfTopPanelW*Aspell nicht benutzenNo aspell usageconfgui::ConfTopPanelW&Auszulassende Pfade Skipped pathsconfgui::ConfTopPanelW"Stemming-SprachenStemming languagesconfgui::ConfTopPanelWÄDie Datei, in die Ausgaben geschrieben werden.<br>Für Ausgaben auf dem Terminal 'stderr' benutzen.PThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWÊDie Sprache des Aspell-Wörterbuchs (z.B. 'en' oder 'de' ...)<br>Wenn dieser Wert nicht gesetzt ist, wird die NLS-Umgebung verwendet, um die Sprache festzustellen, was im Allgemeinen funktioniert. Um eine Vorstellung zu bekommen, was auf Ihrem System installiert ist, geben Sie 'aspell config' ein und schauen Sie nach .dat Dateien im Verzeichnis 'data-dir'.3The language for the aspell dictionary. This should look like 'en' or 'fr' ...
If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. confgui::ConfTopPanelWDie Sprachen, für die Worstammerweiterungsverzeichnisse erstellt werden.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelWÈDie Liste der Verzeichnisse, in denen die rekursive Indizierung startet. Standard: Home-Verzeichnis.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelWdDer Name eines Verzeichnisses, in dem der Index gespeichert werden soll.<br>Ein nicht-absoluter Pfad ist dabei relativ zum Konfigurationsverzeichnis. Der Standard ist 'xapiandb'.•The name for a directory where to store the index
A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.confgui::ConfTopPanelW Dieser Wert steuert, wieviel Daten indiziert werden bevor die Indexinformationen auf Festplatte geschrieben werden.<br>Hierdurch kann der Speicherverbrauch des Indizierers gesteuert werden. Standardwert: 10MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelW´Dieser Wert steuert die Menge der Meldungen<br>(nur Fehler oder viele Debugging Ausgaben).ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW&Start-VerzeichnisseTop directoriesconfgui::ConfTopPanelWUnac AusnahmenUnac exceptionsconfgui::ConfTopPanelW&Abbrechen&CanceluiPrefsDialogBase&OK&OKuiPrefsDialogBase<BR>
uiPrefsDialogBase <PRE>

uiPrefsDialogBase<PRE> + Umbruch
 + wrapuiPrefsDialogBase Eine Suche nach [Rolling Stones] wird geändert zu [Rolling OR Stones OR (Rolling PHRASE 2 Stones)].
Dadurch sollten Ergebnisse, in denen die Suchworte genau wie eingegeben auftreten, stärker gewichtet werden.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseDTrenner für Zusammenfassungs-TeileAbstract snippet separatoruiPrefsDialogBaseAlle auswählenActivate AlluiPrefsDialogBase Index hinzufügen	Add indexuiPrefsDialogBase*Änderungen übernehmen
Apply changesuiPrefsDialogBasešAutomatisch eine einfache Suche starten, wenn ein Worttrenner eingegeben wird-Auto-start simple search on whitespace entry.uiPrefsDialogBasepAutomatisches Hinzufügen von Phrasen zu einfachen Suchen+Automatically add phrase to simple searchesuiPrefsDialogBase^Häufigkeitsschwellwert für automatische Phrasen.Autophrase term frequency threshold percentageuiPrefsDialogBaseAuswählenChooseuiPrefsDialogBase:Standardanwendungen auswählenChoose editor applicationsuiPrefsDialogBase>Klicken Sie hier um einen weiteren Indexordner zur Liste hinzuzufügen. Sie können entweder einen Recoll-Konfigurationsordner oder einen Xapian-Index auswählen.{Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.uiPrefsDialogBase4Datumsformat (strftime(3))Date format (strftime(3))uiPrefsDialogBaseAlle abwählenDeactivate AlluiPrefsDialogBasehQt-Autovervollständigung in Suchleiste deaktivieren.*Disable Qt autocompletion in search entry.uiPrefsDialogBase(Änderungen verwerfenDiscard changesuiPrefsDialogBaseÄErzeugen wir eine Zusammenfassung auch dann, wenn das Dokument schon eine Zusammenfassung enthält?EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseüVersuchen wir, Zusammenfassungen für Ergebnisse aus den Fundstellen zu erzeugen?
Dies kann bei großen Dokumenten langsam sein.zDo we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.uiPrefsDialogBaseHZusammenfassungen dynamisch erzeugenDynamically build abstractsuiPrefsDialogBaseLHTML-Header der Ergebnisseite ergänzen#Edit result page html header insertuiPrefsDialogBaseVFormat-String für Ergebnis-Absatz editieren#Edit result paragraph format stringuiPrefsDialogBaseAktivierenEnableuiPrefsDialogBaseExterne IndizesExternal IndexesuiPrefsDialogBaselHäufigkeitsschwellwert in Prozent, über dem Begriffe nicht beim automatischen
Hinzufügen von Phrasen verwendet werden. Häufige Begriffe beeinträchtigen die
Performance bei Phrasen stark. Weggelassene Begriffe erhöhen den Phrasen-Slack
und vermindern den Nutzender automatischen Phrasen. Der Standardwert ist 2.þFrequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). uiPrefsDialogBaseHelvetica-10Helvetica-10uiPrefsDialogBase:Verstecke doppelte ErgebnisseHide duplicate results.uiPrefsDialogBaseÆBei Auswahl werden Ergebnisse mit dem gleichen Inhalt unter verschiedenen Namen nur einmal gezeigt.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBaseNZeilen in PRE-Text werden nicht umgebrochen. Bei Verwendung von BR gehen manche Einrückungen verloren. Möglicherweise ist der Stil 'PRE + Umbruch' das, was Sie wollen.iLines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.uiPrefsDialogBaseXMaximale Textgröße für Vorschau-Hervorhebung5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBase>Anzahl der Ergebnisse pro Seite"Number of entries in a result pageuiPrefsDialogBase–Öffnet einen Dialog zur Auswahl der Schnipsel-Fenster CSS Style Sheet DateiAOpens a dialog to select the Snippets window CSS style sheet fileuiPrefsDialogBaseˆÖffnet einen Dialog zur Auswahl der Schriftart für die Ergebnisliste-Opens a dialog to select the result list fontuiPrefsDialogBasejÖffnet einen Dialog zur Auswahl der Style Sheet Datei-Opens a dialog to select the style sheet fileuiPrefsDialogBasePfadumwandlungPaths translationsuiPrefsDialogBaseVZeilen-Stil für Umwandlung von Text in HTMLPlain text to HTML line styleuiPrefsDialogBasedBei Vorschau HTML gegenüber reinem Text bevorzugen&Prefer Html to plain text for preview.uiPrefsDialogBasebMagische Dateinamen-Erweiterungen für Suchsprache(Query language magic file name suffixes.uiPrefsDialogBaseLSpeichern, ob Sortierung aktiviert istRemember sort activation state.uiPrefsDialogBaseœAus der Liste entfernen. Dies hat keinen Einfluss auf den gespeicherten Index.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase*Ausgewählte entfernenRemove selecteduiPrefsDialogBaseZErsetzen der Zusammenfassungen aus Dokumenten Replace abstracts from documentsuiPrefsDialogBaseZurücksetzenResetuiPrefsDialogBase†Setzt das Schnipsel-Fenster Style Sheet auf den Standardwert zurück Resets the Snippets window styleuiPrefsDialogBaseŒSetzt die Schriftart für die Ergebnisliste auf den Standardwert zurück1Resets the result list font to the system defaultuiPrefsDialogBasebSetzt das Style Sheet auf den Standardwert zurück!Resets the style sheet to defaultuiPrefsDialogBaseErgebnislisteResult ListuiPrefsDialogBase8Schriftart für ErgebnislisteResult list fontuiPrefsDialogBase:Suche beim Eintippen starten.Search as you type.uiPrefsDialogBaseSuchparameterSearch parametersuiPrefsDialogBase6Schnipsel-Fenster CSS DateiSnippets window CSS fileuiPrefsDialogBaseŠNach dem Start automatisch den Dialog für die erweiterte Suche öffnen'Start with advanced search dialog open.uiPrefsDialogBase Stemming-SpracheStemming languageuiPrefsDialogBaseStyle SheetStyle sheetuiPrefsDialogBase\Anzahl der Kontextworte in der Zusammenfassung Synthetic abstract context wordsuiPrefsDialogBase`Länge der erzeugten Zusammenfassung (in Zeichen)$Synthetic abstract size (characters)uiPrefsDialogBase¼Texte über dieser Größe werden in der Vorschau nicht mit Hervorhebungen versehen (zu langsam).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBaseÎDie Worte in dieser Liste werden automatisch zu ext:xxx Ausdrücken im Suchsprachen-Eintrag umgewandelt.bThe words in the list will be automatically turned to ext:xxx clauses in the query language entry.uiPrefsDialogBase Auswahl umkehrenToggle selecteduiPrefsDialogBase$BenutzeroberflächeUser interfaceuiPrefsDialogBase*BenutzereinstellungenUser preferencesuiPrefsDialogBaseˆrecoll-1.23.7/qtgui/i18n/recoll_zh.ts0000644000175000017500000043664013224431020014252 00000000000000



    AdvSearch
    
        All clauses
        全部æ¡ä»¶
    
    
        Any clause
        ä»»æ„æ¡ä»¶
    
    
        texts
        文本
    
    
        spreadsheets
        电å­è¡¨æ ¼
    
    
        presentations
        演示文稿
    
    
        media
        多媒体文件
    
    
        messages
        邮件
    
    
        other
        其它
    
    
        Bad multiplier suffix in size filter
        文件尺寸过滤器的åŽç¼€å•ä½ä¸æ­£ç¡®
    
    
        text
        文本文件
    
    
        spreadsheet
        电å­è¡¨æ ¼
    
    
        presentation
        演示文档
    
    
        message
        邮件
    


    AdvSearchBase
    
        Advanced search
        高端æœç´¢
    
    
        Search for <br>documents<br>satisfying:
        æœç´¢<br>满足以下æ¡ä»¶<br>的文档:
    
    
        Delete clause
        删除æ¡ä»¶
    
    
        Add clause
        添加æ¡ä»¶
    
    
        Restrict file types
        é™å®šæ–‡ä»¶ç±»åž‹
    
    
        Check this to enable filtering on file types
        选中这个,以便针对文件类型进行过滤
    
    
        By categories
        按大类æ¥è¿‡æ»¤
    
    
        Check this to use file categories instead of raw mime types
        选中这个,以便使用较大的分类,而ä¸ä½¿ç”¨å…·ä½“的文件类型
    
    
        Save as default
        ä¿å­˜ä¸ºé»˜è®¤å€¼
    
    
        Searched file types
        将被æœç´¢çš„æ–‡ä»¶ç±»åž‹
    
    
        All ---->
        移动全部→
    
    
        Sel ----->
        移动选中项→
    
    
        <----- Sel
        â†ç§»åЍ选䏭项
    
    
        <----- All
        â†ç§»åŠ¨å…¨éƒ¨
    
    
        Ignored file types
        è¦å¿½ç•¥çš„æ–‡ä»¶ç±»åž‹
    
    
        Enter top directory for search
        è¾“å…¥è¦æœç´¢çš„æœ€ä¸Šå±‚目录
    
    
        Browse
        æµè§ˆ
    
    
        Restrict results to files in subtree:
        将结果中的文件é™å®šåœ¨æ­¤å­ç›®å½•树中:
    
    
        Start Search
        开始æœç´¢
    
    
        Close
        关闭
    
    
        All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.
        å³è¾¹çš„æ‰€æœ‰éžç©ºå­—段都会按照逻辑与(“全部æ¡ä»¶â€é€‰é¡¹ï¼‰æˆ–é€»è¾‘æˆ–ï¼ˆâ€œä»»æ„æ¡ä»¶â€é€‰é¡¹ï¼‰æ¥ç»„åˆã€‚<br>“任æ„â€â€œå…¨éƒ¨â€å’Œâ€œæ— â€ä¸‰ç§å­—段类型都接å—输入简å•è¯è¯­å’ŒåŒå¼•å·å¼•用的è¯ç»„的组åˆã€‚<br>空的输入框会被忽略。
    
    
        Invert
        å转过滤æ¡ä»¶
    
    
        Minimum size. You can use k/K,m/M,g/G as multipliers
        最å°å°ºå¯¸ã€‚ä½ å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½
    
    
        Min. Size
        最å°å°ºå¯¸
    
    
        Maximum size. You can use k/K,m/M,g/G as multipliers
        最大尺寸。你å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½
    
    
        Max. Size
        最大尺寸
    
    
        Filter
        过滤
    
    
        From
        从
    
    
        To
        到
    
    
        Check this to enable filtering on dates
        选中这个,以便针对日期进行过滤
    
    
        Filter dates
        过滤日期
    
    
        Find
        查找
    
    
        Check this to enable filtering on sizes
        选中这个,以便针对文件尺寸进行过滤
    
    
        Filter sizes
        过滤尺寸
    


    CronToolW
    
        Cron Dialog
        è®¡åˆ’ä»»åŠ¡å¯¹è¯æ¡†
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	.T3 { font-style:italic; }
	.T4 { font-family:Courier New,courier; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 批é‡ç´¢å¼•计划任务(cron) </p><p class="P1">æ¯ä¸ªå­—段都å¯ä»¥åŒ…括一个通é…符(*)ã€å•个数字值ã€é€—å·åˆ†éš”的列表(1,3,5)和范围(1-7)。更准确地说,这些字段会被<span class="T3">按原样</span>输出到crontab 文件中,因此这里å¯ä»¥ä½¿ç”¨crontab 的所有语法,å‚考crontab(5)。</p><p class="P1"><br/>例如,在<span class="T3">日期</span>中输入<span class="T4">*</span>,<span class="T3">å°æ—¶</span>中输入<span class="T4">12,19</span>,<span class="T3">分钟</span>中输入<span class="T4">15 </span>çš„è¯ï¼Œä¼šåœ¨æ¯å¤©çš„12:15 AM å’Œ7:15 PMå¯åЍrecollindex。</p><p class="P1">ä¸€ä¸ªé¢‘ç¹æ‰§è¡Œçš„计划任务,其性能å¯èƒ½æ¯”ä¸ä¸Šå®žæ—¶ç´¢å¼•。</p></body></html>

    
    
        Days of week (* or 0-7, 0 or 7 is Sunday)
        星期日(*或0-7,0或7是指星期天)
    
    
        Hours (* or 0-23)
        å°æ—¶(*或0-23)
    
    
        Minutes (0-59)
        分钟(0-59)
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T2 { font-style:italic; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">点击<span class="T2">ç¦ç”¨</span>ä»¥åœæ­¢è¿›è¡Œè‡ªåŠ¨åŒ–çš„æ‰¹é‡ç´¢å¼•,点击<span class="T2">å¯ç”¨</span>以å¯ç”¨æ­¤åŠŸèƒ½ï¼Œç‚¹å‡»<span class="T2">å–æ¶ˆ</span>åˆ™ä¸æ”¹å˜ä»»ä½•东西。</p></body></html>

    
    
        Enable
        å¯ç”¨
    
    
        Disable
        ç¦ç”¨
    
    
        It seems that manually edited entries exist for recollindex, cannot edit crontab
        看起æ¥å·²ç»æœ‰æ‰‹åŠ¨ç¼–è¾‘è¿‡çš„recollindexæ¡ç›®äº†ï¼Œå› æ­¤æ— æ³•编辑crontab
    
    
        Error installing cron entry. Bad syntax in fields ?
        æ’å…¥cronæ¡ç›®æ—¶å‡ºé”™ã€‚请检查语法。
    


    EditDialog
    
        Dialog
        å¯¹è¯æ¡†
    


    EditTrans
    
        Source path
        
    
    
        Local path
        
    
    
        Config error
        
    
    
        Original path
        
    


    EditTransBase
    
        Path Translations
        
    
    
        Setting path translations for 
        
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        
    
    
        Add
        
    
    
        Delete
        
    
    
        Cancel
        å–æ¶ˆ
    
    
        Save
        
    


    FirstIdxDialog
    
        First indexing setup
        第一次索引设置
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T2 { font-weight:bold; }
	.T4 { font-style:italic; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">未找到对应于此é…置实例的索引数æ®ã€‚</span><br/><br/>å¦‚æžœä½ åªæƒ³ä»¥ä¸€ç»„åˆç†çš„é»˜è®¤å‚æ•°æ¥ç´¢å¼•你的家目录的è¯ï¼Œå°±ç›´æŽ¥æŒ‰<span class="T4">ç«‹å³å¼€å§‹ç´¢å¼•</span>按钮。以åŽè¿˜å¯ä»¥è°ƒæ•´é…ç½®å‚æ•°çš„。</p><p class="P1">如果你想调整æŸäº›ä¸œè¥¿çš„è¯ï¼Œå°±ä½¿ç”¨ä¸‹é¢çš„链接æ¥è°ƒæ•´å…¶ä¸­çš„索引é…置和定时计划å§ã€‚</p><p class="P1">这些工具å¯åœ¨ä»¥åŽé€šè¿‡<span class="T4">选项</span>èœå•访问。</p></body></html>

    
    
        Indexing configuration
        索引é…ç½®
    
    
        This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.
        在这里å¯ä»¥è°ƒæ•´ä½ æƒ³è¦å¯¹å…¶è¿›è¡Œç´¢å¼•的目录,以åŠå…¶å®ƒå‚æ•°ï¼Œä¾‹å¦‚ï¼šè¦æŽ’é™¤å’Œè·¯å¾„æˆ–åå­—ã€é»˜è®¤å­—符集……
    
    
        Indexing schedule
        定时索引任务
    
    
        This will let you chose between batch and real-time indexing, and set up an automatic  schedule for batch indexing (using cron).
        在这里å¯ä»¥é€‰æ‹©æ˜¯è¦è¿›è¡Œæ‰¹é‡ç´¢å¼•还是实时索引,还å¯ä»¥è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨åŒ–çš„å®šæ—¶ï¼ˆä½¿ç”¨cron)批é‡ç´¢å¼•任务。
    
    
        Start indexing now
        ç«‹å³å¼€å§‹ç´¢å¼•
    


    FragButs
    
        %1 not found.
        
    
    
        %1:
 %2
        
    
    
        Query Fragments
        
    


    IdxSchedW
    
        Index scheduling setup
        定时索引设置
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯æŒç»­è¿è¡Œå¹¶ä¸”在文件å‘生å˜åŒ–时对其进行索引,也å¯ä»¥é—´éš”一定时间è¿è¡Œä¸€æ¬¡ã€‚</p><p class="P1">ä½ å¯ä»¥è¯»ä¸€ä¸‹æ‰‹å†Œï¼Œä»¥ä¾¿æ›´å¥½åœ°åšå‡ºæŠ‰æ‹©ï¼ˆæŒ‰F1)。</p><p class="P1">这个工具å¯å¸®åŠ©ä½ è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨è¿›è¡Œæ‰¹é‡ç´¢å¼•的定时任务,或者设置æˆå½“你登录时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆæˆ–è€…ä¸¤è€…åŒæ—¶è¿›è¡Œï¼Œå½“然那几乎没有æ„义)。</p></body></html>

    
    
        Cron scheduling
        定时任务
    
    
        The tool will let you decide at what time indexing should run and will install a crontab entry.
        这个工具帮助你确定一个让索引è¿è¡Œçš„æ—¶é—´ï¼Œå®ƒä¼šæ’入一个crontabæ¡ç›®ã€‚
    
    
        Real time indexing start up
        实时索引设置
    
    
        Decide if real time indexing will be started when you log in (only for the default index).
        作出决定,是å¦è¦åœ¨ç™»å½•时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆåªå¯¹é»˜è®¤ç´¢å¼•有效)。
    


    ListDialog
    
        Dialog
        å¯¹è¯æ¡†
    
    
        GroupBox
        分组框
    


    Main
    
        No db directory in configuration
        é…置实例中没有数æ®åº“目录
    
    
        "history" file is damaged or un(read)writeable, please check or remove it: 
        "history"文件被æŸå,或者ä¸å¯ï¼ˆè¯»ï¼‰å†™ï¼Œè¯·æ£€æŸ¥ä¸€ä¸‹æˆ–者删除它:
    


    Preview
    
        Close Tab
        关闭标签页
    
    
        Cancel
        å–æ¶ˆ
    
    
        Missing helper program: 
        缺少辅助程åºï¼š
    
    
        Can't turn doc into internal representation for 
        æ— æ³•ä¸ºæ­¤æ–‡ä»¶å°†æ–‡æ¡£è½¬æ¢æˆå†…部表示方å¼ï¼š
    
    
        Creating preview text
        正在创建预览文本
    
    
        Loading preview text into editor
        正在将预览文本载入到编辑器中
    
    
        &Search for:
        æœç´¢ï¼ˆ&S):
    
    
        &Next
        下一个(&N)
    
    
        &Previous
        上一个(&P)
    
    
        Clear
        清空
    
    
        Match &Case
        匹é…大å°å†™ï¼ˆ&C)
    
    
        Cannot create temporary directory: 
        无法创建临时目录:
    
    
        Error while loading file
        文件载入出错
    


    PreviewTextEdit
    
        Show fields
        显示字段
    
    
        Show main text
        显示主文本
    
    
        Print
        打å°
    
    
        Print Current Preview
        打å°å½“å‰é¢„览文本
    
    
        Show image
        显示图片
    
    
        Select All
        全选
    
    
        Copy
        å¤åˆ¶
    
    
        Save document to file
        将文档ä¿å­˜åˆ°æ–‡ä»¶
    
    
        Fold lines
        自动æ¢è¡Œ
    
    
        Preserve indentation
        ä¿ç•™ç¼©è¿›ç¬¦
    


    QObject
    
        Global parameters
        免局傿•°
    
    
        Local parameters
        å±€éƒ¨å‚æ•°
    
    
        <b>Customised subtrees
        <b>自定义的å­ç›®å½•æ ‘
    
    
        The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty.
        这是已索引的目录树中的一些å­ç›®å½•组æˆçš„列表<br>,它们的æŸäº›å‚数需è¦é‡å®šä¹‰ã€‚默认:空白。
    
    
        <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons.
        <i>ä»¥ä¸‹çš„å‚æ•°ï¼Œå½“你在上é¢çš„列表中ä¸é€‰ä¸­ä»»ä½•æ¡ç›®æˆ–者选中一个空行时,<br>就是针对顶级目录起作用的,å¦åˆ™ä¾¿æ˜¯å¯¹é€‰ä¸­çš„å­ç›®å½•起作用的。<br>ä½ å¯ä»¥ç‚¹å‡»+/-按钮,以便添加或删除目录。
    
    
        Skipped names
        è¦ç•¥è¿‡çš„æ–‡ä»¶å
    
    
        These are patterns for file or directory  names which should not be indexed.
        具有这些模å¼çš„æ–‡ä»¶æˆ–目录ä¸ä¼šè¢«ç´¢å¼•。
    
    
        Default character set
        默认字符集
    
    
        This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        这是用æ¥è¯»å–那些未标明自身的字符集的文件时所使用的字符集,例如纯文本文件。<br>é»˜è®¤å€¼æ˜¯ç©ºï¼Œä¼šä½¿ç”¨ç³»ç»Ÿé‡Œçš„è‡ªç„¶è¯­è¨€çŽ¯å¢ƒå‚æ•°ä¸­çš„值。
    
    
        Follow symbolic links
        跟踪符å·é“¾æŽ¥
    
    
        Follow symbolic links while indexing. The default is no, to avoid duplicate indexing
        在索引时跟踪符å·é“¾æŽ¥ã€‚默认是ä¸è·Ÿè¸ªçš„,以é¿å…é‡å¤ç´¢å¼•
    
    
        Index all file names
        对所有文件å进行索引
    
    
        Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true
        对那些无法判断或处ç†å…¶å†…容(未知类型或其类型ä¸è¢«æ”¯æŒï¼‰çš„æ–‡ä»¶çš„å字进行索引。默认为是
    
    
        Beagle web history
        Beagle网页历å²
    
    
        Search parameters
        æœç´¢å‚æ•°
    
    
        Web history
        
    
    
        Default<br>character set
        
    
    
        Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        
    
    
        Ignored endings
        
    
    
        These are file name endings for files which will be indexed by name only 
(no MIME type identification attempt, no decompression, no content indexing).
        
    


    QWidget
    
        Create or choose save directory
        
    
    
        Choose exactly one directory
        
    
    
        Could not read directory: 
        
    
    
        Unexpected file name collision, cancelling.
        
    
    
        Cannot extract document: 
        
    
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Open With
        
    
    
        Run Script
        
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Save selection to files
        
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Open &Snippets window
        
    
    
        Show subdocuments / attachments
        
    


    QxtConfirmationMessage
    
        Do not show again.
        
    


    RTIToolW
    
        Real time indexing automatic start
        实时索引自动å¯åЍ
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯ä»¥ä»¥å®ˆæŠ¤è¿›ç¨‹çš„æ–¹å¼è¿è¡Œï¼Œåœ¨æ–‡ä»¶å‘生å˜åŒ–æ—¶ä¾¿å®žæ—¶æ›´æ–°ç´¢å¼•ã€‚è¿™æ ·ä½ çš„ç´¢å¼•ä¸€ç›´æ˜¯ä¸Žæ–‡ä»¶åŒæ­¥çš„,但是会å ç”¨ä¸€å®šçš„系统资æºã€‚</p></body></html>

    
    
        Start indexing daemon with my desktop session.
        在我的桌é¢ä¼šè¯å¯åŠ¨æ—¶ä¾¿å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚
    
    
        Also start indexing daemon right now.
        åŒæ—¶æ­¤æ¬¡ä¹Ÿç«‹å³å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚
    
    
        Replacing: 
        正在替æ¢ï¼š
    
    
        Replacing file
        æ­£åœ¨æ›¿æ¢æ–‡ä»¶
    
    
        Can't create: 
        无法创建:
    
    
        Warning
        警告
    
    
        Could not execute recollindex
        无法执行recollindex
    
    
        Deleting: 
        正在删除:
    
    
        Deleting file
        正在删除文件
    
    
        Removing autostart
        正在删除自动å¯åЍ项
    
    
        Autostart file deleted. Kill current process too ?
        自动å¯åŠ¨æ–‡ä»¶å·²ç»åˆ é™¤ã€‚ä¹Ÿè¦æ€æ­»å½“å‰è¿›ç¨‹å—?
    


    RclMain
    
        (no stemming)
        (ä¸è¿›è¡Œè¯æ ¹è®¡ç®—)
    
    
        (all languages)
        ï¼ˆå¯¹å…¨éƒ¨è¯­è¨€è¿›è¡Œè¯æ ¹è®¡ç®—)
    
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        Indexing in progress: 
        正在索引:
    
    
        Purge
        删除
    
    
        Stemdb
        Stemæ•°æ®åº“
    
    
        Closing
        正在关闭
    
    
        Unknown
        未知
    
    
        Query results
        查询结果
    
    
        Cannot retrieve document info from database
        无法从数æ®åº“èŽ·å–æ–‡æ¡£ä¿¡æ¯
    
    
        Warning
        警告
    
    
        Can't create preview window
        无法创建预览窗å£
    
    
        This search is not active any more
        这个查询已ç»ä¸æ˜¯æ´»è·ƒçš„了
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeconf file
        针对%1的查看命令[%2]é…置出错
请检查mimeconf文件
    
    
        Cannot extract document or create temporary file
        无法æå–文档或创建临时文件
    
    
        Executing: [
        正在执行:[
    
    
        About Recoll
        Recoll说明
    
    
        History data
        åŽ†å²æ•°æ®
    
    
        Document history
        文档历å²
    
    
        Update &Index
        更新索引(&I)
    
    
        Stop &Indexing
        åœæ­¢ç´¢å¼•(&I)
    
    
        All
        全部
    
    
        media
        多媒体文件
    
    
        message
        邮件
    
    
        other
        其它
    
    
        presentation
        演示文档
    
    
        spreadsheet
        电å­è¡¨æ ¼
    
    
        text
        文本文件
    
    
        sorted
        已排åº
    
    
        filtered
        已过滤
    
    
        External applications/commands needed and not found for indexing your file types:


        需è¦ç”¨æ¥è¾…助对你的文件进行索引,å´åˆæ‰¾ä¸åˆ°çš„外部程åº/命令:


    
    
        No helpers found missing
        ç›®å‰ä¸ç¼ºå°‘任何辅助程åº
    
    
        Missing helper programs
        未找到的辅助程åº
    
    
        Document category filter
        文档分类过滤器
    
    
        No external viewer configured for mime type [
        é’ˆå¯¹æ­¤ç§æ–‡ä»¶ç±»åž‹æ²¡æœ‰é…置外部查看器[
    
    
        The viewer specified in mimeview for %1: %2 is not found.
Do you want to start the  preferences dialog ?
        没有找到mimeview中为%1: %2é…置的查看器。
是å¦è¦æ‰“å¼€é€‰é¡¹å¯¹è¯æ¡†ï¼Ÿ
    
    
        Can't access file: 
        无法访问文件:
    
    
        Can't uncompress file: 
        无法解压缩此文件:
    
    
        Save file
        ä¿å­˜æ–‡ä»¶
    
    
        Result count (est.)
        结果数(估计值)
    
    
        Query details
        查询语å¥ç»†èŠ‚
    
    
        Could not open external index. Db not open. Check external indexes list.
        无法打开外部索引。数æ®åº“未打开。请检查外部索引列表。
    
    
        No results found
        未找到结果
    
    
        None
        æ— 
    
    
        Updating
        正在更新
    
    
        Done
        已完æˆ
    
    
        Monitor
        监视器
    
    
        Indexing failed
        索引失败
    
    
        The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone
        当å‰ç´¢å¼•è¿›ç¨‹ä¸æ˜¯ç”±æ­¤ç•Œé¢å¯åŠ¨çš„ã€‚ç‚¹å‡»ç¡®å®šä»¥æ€æ­»å®ƒï¼Œæˆ–è€…ç‚¹å‡»å–æ¶ˆä»¥è®©å®ƒè‡ªç”±è¿è¡Œ
    
    
        Erasing index
        正在删除索引
    
    
        Reset the index and start from scratch ?
        ä»Žå¤´é‡æ–°å¼€å§‹ç´¢å¼•å—?
    
    
        Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program
        查询正在进行中。<br>由于索引库的æŸäº›é™åˆ¶ï¼Œ<br>å–æ¶ˆçš„è¯ä¼šå¯¼è‡´ç¨‹åºé€€å‡º
    
    
        Error
        错误
    
    
        Index not open
        索引未打开
    
    
        Index query error
        索引查询出错
    
    
        Content has been indexed for these mime types:
        å·²ç»ä¸ºè¿™äº›æ–‡ä»¶ç±»åž‹ç´¢å¼•其内容:
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.
        æ­¤æ–‡ä»¶çš„ç´¢å¼•å·²è¿‡æ—¶ã€‚ç¨‹åºæ‹’ç»æ˜¾ç¤ºé”™è¯¯çš„æ¡ç›®ã€‚è¯·ç‚¹å‡»ç¡®å®šä»¥æ›´æ–°æ­¤æ–‡ä»¶çš„ç´¢å¼•ï¼Œç­‰å¾…ç´¢å¼•å®Œæˆä¹‹åŽå†æŸ¥è¯¢ã€‚æˆ–è€…ï¼Œå–æ¶ˆã€‚
    
    
        Can't update index: indexer running
        无法更新索引:索引程åºå·²åœ¨è¿è¡Œ
    
    
        Indexed MIME Types
        已索引的文件类型
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeview file
        
    
    
        Viewer command line for %1 specifies both file and parent file value: unsupported
        
    
    
        Cannot find parent document
        
    
    
        Indexing did not run yet
        
    
    
        External applications/commands needed for your file types and not found, as stored by the last indexing pass in 
        
    
    
        Sub-documents and attachments
        
    
    
        Document filter
        
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry. 
        
    
    
        Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. 
        
    
    
        The indexer is running so things should improve when it's done. 
        
    
    
        Duplicate documents
        
    
    
        These Urls ( | ipath) share the same content:
        
    
    
        Bad desktop app spec for %1: [%2]
Please check the desktop file
        
    
    
        Indexing interrupted
        
    
    
        The current indexing process was not started from this interface, can't kill it
        
    
    
        Bad paths
        
    
    
        Bad paths in configuration file:

        
    
    
        Selection patterns need topdir
        
    
    
        Selection patterns can only be used with a start directory
        
    
    
        No search
        
    
    
        No preserved previous search
        
    
    
        Choose file to save
        
    
    
        Saved Queries (*.rclq)
        
    
    
        Write failed
        
    
    
        Could not write to file
        
    
    
        Read failed
        
    
    
        Could not open file: 
        
    
    
        Load error
        
    
    
        Could not load saved query
        
    
    
        Index scheduling
        
    
    
        Sorry, not available under Windows for now, use the File menu entries to update the index
        
    
    
        Disabled because the real time indexer was not compiled in.
        
    
    
        This configuration tool only works for the main index.
        
    
    
        Can't set synonyms file (parse error?)
        
    
    
        The document belongs to an external index which I can't update. 
        
    
    
        Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session).
        
    
    
        Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location.
        
    
    
        Do not show this warning next time (use GUI preferences to restore).
        
    
    
        Index locked
        
    
    
        Unknown indexer state. Can't access webcache file.
        
    
    
        Indexer is running. Can't access webcache file.
        
    
    
         with additional message: 
        
    
    
        Non-fatal indexing message: 
        
    
    
        Types list empty: maybe wait for indexing to progress?
        
    


    RclMainBase
    
        Recoll
        Recoll
    
    
        Search tools
        æœç´¢å·¥å…·
    
    
        Result list
        结果列表
    
    
        &File
        文件(&F)
    
    
        &Tools
        工具(&T)
    
    
        &Preferences
        选项(&P)
    
    
        &Help
        帮助(&H)
    
    
        E&xit
        退出(&x)
    
    
        Ctrl+Q
        Ctrl+Q
    
    
        Update &index
        更新索引(&i)
    
    
        &Erase document history
        删除文档历å²ï¼ˆ&E)
    
    
        &About Recoll
        Recoll说明(&A)
    
    
        &User manual
        用户手册(&U)
    
    
        Document &History
        文档历å²ï¼ˆ&H)
    
    
        Document  History
        文档历å²
    
    
        &Advanced Search
        高端æœç´¢ï¼ˆ&A)
    
    
        Advanced/complex  Search
        高端/夿‚æœç´¢
    
    
        &Sort parameters
        排åºå‚数(&S)
    
    
        Sort parameters
        排åºå‚æ•°
    
    
        Term &explorer
        è¯è¯­æŽ¢ç´¢å™¨ï¼ˆ&e)
    
    
        Term explorer tool
        è¯è¯­æŽ¢ç´¢å™¨
    
    
        Next page
        下一页
    
    
        Next page of results
        下一页结果
    
    
        First page
        第一页
    
    
        Go to first page of results
        跳转到结果的第一页
    
    
        Previous page
        上一页
    
    
        Previous page of results
        上一页结果
    
    
        &Query configuration
        查询é…置(&Q)
    
    
        External index dialog
        å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†
    
    
        &Indexing configuration
        索引é…置(&I)
    
    
        All
        全部
    
    
        &Show missing helpers
        显示缺少的辅助程åºåˆ—表(&S)
    
    
        PgDown
        å‘下翻页
    
    
        PgUp
        å‘上翻页
    
    
        &Full Screen
        å…¨å±ï¼ˆ&F)
    
    
        F11
        F11
    
    
        Full Screen
        å…¨å±
    
    
        &Erase search history
        删除æœç´¢åކå²ï¼ˆ&E)
    
    
        sortByDateAsc
        按日期å‡åºæŽ’列
    
    
        Sort by dates from oldest to newest
        按日期排列,最旧的在å‰é¢
    
    
        sortByDateDesc
        按日期é™åºæŽ’列
    
    
        Sort by dates from newest to oldest
        按日期排列,最新的在å‰é¢
    
    
        Show Query Details
        显示查询语å¥ç»†èŠ‚
    
    
        Show results as table
        ä»¥è¡¨æ ¼çš„å½¢å¼æ˜¾ç¤ºç»“æžœ
    
    
        &Rebuild index
        釿–°æž„造索引(&R)
    
    
        &Show indexed types
        显示已索引的文件类型(&S)
    
    
        Shift+PgUp
        Shift+å‘上翻页
    
    
        &Indexing schedule
        定时索引(&I)
    
    
        E&xternal index dialog
        å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†ï¼ˆ&x)
    
    
        &Index configuration
        
    
    
        &GUI configuration
        
    
    
        &Results
        
    
    
        Sort by date, oldest first
        
    
    
        Sort by date, newest first
        
    
    
        Show as table
        
    
    
        Show results in a spreadsheet-like table
        
    
    
        Save as CSV (spreadsheet) file
        
    
    
        Saves the result into a file which you can load in a spreadsheet
        
    
    
        Next Page
        
    
    
        Previous Page
        
    
    
        First Page
        
    
    
        Query Fragments
        
    
    
            With failed files retrying
        
    
    
        Next update will retry previously failed files
        
    
    
        Indexing &schedule
        
    
    
        Enable synonyms
        
    
    
        Save last query
        
    
    
        Load saved query
        
    
    
        Special Indexing
        
    
    
        Indexing with special options
        
    
    
        &View
        
    
    
        Missing &helpers
        
    
    
        Indexed &MIME types
        
    
    
        Index &statistics
        
    
    
        Webcache Editor
        
    


    RclTrayIcon
    
        Restore
        
    
    
        Quit
        
    


    RecollModel
    
        Abstract
        摘è¦
    
    
        Author
        作者
    
    
        Document size
        文档尺寸
    
    
        Document date
        文档日期
    
    
        File size
        文件尺寸
    
    
        File name
        文件å
    
    
        File date
        文件日期
    
    
        Keywords
        关键è¯
    
    
        Original character set
        原字符集
    
    
        Relevancy rating
        相关度
    
    
        Title
        标题
    
    
        URL
        路径
    
    
        Mtime
        修改时间
    
    
        Date
        日期
    
    
        Date and time
        æ—¥æœŸåŠæ—¶é—´
    
    
        Ipath
        内部路径
    
    
        MIME type
        文件类型
    


    ResList
    
        Result list
        结果列表
    
    
        (show query)
        (显示查询语å¥ç»†èŠ‚ï¼‰
    
    
        &Preview
        预览(&P)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Document history
        文档历å²
    
    
        <p><b>No results found</b><br>
        <p><b>未找到结果</b><br>
    
    
        Previous
        上一页
    
    
        Next
        下一页
    
    
        Unavailable document
        无法访问文档
    
    
        Preview
        预览
    
    
        Open
        打开
    
    
        <p><i>Alternate spellings (accents suppressed): </i>
        <p><i>其它拼写形å¼ï¼ˆå¿½è§†å£éŸ³ï¼‰ï¼š</i>
    
    
        &Write to File
        写入文件(&W)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        &Open
        打开(&O)
    
    
        Documents
        第
    
    
        out of at least
        个文档,最少共有
    
    
        for
        个文档,查询æ¡ä»¶ï¼š
    
    
        <p><i>Alternate spellings: </i>
        
    
    
        Result count (est.)
        结果数(估计值)
    
    
        Query details
        查询语å¥ç»†èŠ‚
    
    
        Snippets
        
    


    ResTable
    
        &Reset sort
        é‡ç½®æŽ’åºæ¡ä»¶ï¼ˆ&R)
    
    
        &Delete column
        删除此列(&D)
    
    
        Save table to CSV file
        将表格ä¿å­˜æˆCSV文件
    
    
        Can't open/create file: 
        无法打开/创建文件:
    
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        &Save as CSV
        ä¿å­˜ä¸ºCSV(&S)
    
    
        Add "%1" column
        添加"%1"列
    


    ResTableDetailArea
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    


    ResultPopup
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        Find &similar documents
        查找类似的文档(&s)
    


    SSearch
    
        Any term
        任一è¯è¯­
    
    
        All terms
        全部è¯è¯­
    
    
        File name
        文件å
    
    
        Query language
        查询语言
    
    
        Bad query string
        查询语言格å¼ä¸æ­£ç¡®
    
    
        Out of memory
        内存ä¸è¶³
    
    
        Too many completions
        有太多与之相关的补全选项啦
    
    
        Completions
        补全选项
    
    
        Select an item:
        选择一个æ¡ç›®ï¼š
    
    
        Enter query language expression. Cheat sheet:<br>
<i>term1 term2</i> : 'term1' and 'term2' in any field.<br>
<i>field:term1</i> : 'term1' in field 'field'.<br>
 Standard field names/synonyms:<br>
  title/subject/caption, author/from, recipient/to, filename, ext.<br>
 Pseudo-fields: dir, mime/format, type/rclcat, date.<br>
 Two date interval exemples: 2009-03-01/2009-05-20  2009-03-01/P2M.<br>
<i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br>
  No actual parentheses allowed.<br>
<i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br>
<i>"term1 term2"p</i> : unordered proximity search with default distance.<br>
Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail.

        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; }
	.T1 { font-style:italic; }
	.T2 { font-style:italic; }
	.T4 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">输入查询语言表达å¼ã€‚简è¦è¯´æ˜Žï¼š<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2</span> : 'è¯è¯­1'å’Œ'è¯è¯­2'åŒæ—¶å‡ºçŽ°åœ¨ä»»æ„字段中。<br/><span class="T2">字段</span><span class="T1">:</span><span class="T2">è¯è¯­</span><span class="T1">1</span> : 'è¯è¯­1'出现在字段'字段'中。<br/>标准字段å/åŒä¹‰å:<br/>title/subject/captionã€author/fromã€recipient/toã€filenameã€ext。<br/>伪字段å:dirã€mime/formatã€type/rclcatã€date。<br/>日期段的两个示例:2009-03-01/2009-05-20 2009-03-01/P2M。<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2 OR </span><span class="T2">è¯è¯­</span><span class="T1">3</span> : è¯è¯­1 <span class="T4">与</span> (è¯è¯­2 <span class="T4">或</span> è¯è¯­3)。<br/>ä¸å…è®¸ç”¨çœŸæ­£çš„æ‹¬å·æ¥è¡¨ç¤ºé€»è¾‘关系。<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"</span> : è¯ç»„(必须按原样出现)。å¯ç”¨çš„修饰è¯ï¼š<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"p</span> : 以默认è·ç¦»è¿›è¡Œçš„æ— åºè¿‘ä¼¼æœç´¢ã€‚<br/>有疑问时å¯ä½¿ç”¨<span class="T4">显示查询语å¥ç»†èŠ‚</span>é“¾æŽ¥æ¥æŸ¥çœ‹æŸ¥è¯¢è¯­å¥çš„细节,å¦å¤–请查看手册(&lt;F1&gt;)以了解更多内容。</p></body></html>

    
    
        Enter file name wildcard expression.
        输入文件å通é…符表达å¼ã€‚
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。
    
    
        Enter query language expression. Cheat sheet:<br>
<i>term1 term2</i> : 'term1' and 'term2' in any field.<br>
<i>field:term1</i> : 'term1' in field 'field'.<br>
 Standard field names/synonyms:<br>
  title/subject/caption, author/from, recipient/to, filename, ext.<br>
 Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br>
 Two date interval exemples: 2009-03-01/2009-05-20  2009-03-01/P2M.<br>
<i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br>
  You can use parentheses to make things clearer.<br>
<i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br>
<i>"term1 term2"p</i> : unordered proximity search with default distance.<br>
Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail.

        
    
    
        Stemming languages for stored query: 
        
    
    
         differ from current preferences (kept)
        
    
    
        Auto suffixes for stored query: 
        
    
    
        External indexes for stored query: 
        
    
    
        Autophrase is set but it was unset for stored query
        
    
    
        Autophrase is unset but it was set for stored query
        
    


    SSearchBase
    
        SSearchBase
        SSearchBase
    
    
        Clear
        清空
    
    
        Ctrl+S
        Ctrl+S
    
    
        Erase search entry
        删除æœç´¢æ¡ç›®
    
    
        Search
        æœç´¢
    
    
        Start query
        开始查询
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。
    
    
        Choose search type.
        选择æœç´¢ç±»åž‹ã€‚
    


    SearchClauseW
    
        Select the type of query that will be performed with the words
        选择è¦å¯¹å³è¾¹çš„è¯è¯­è¿›è¡Œçš„æŸ¥è¯¢ç±»åž‹
    
    
        Number of additional words that may be interspersed with the chosen ones
        å…许在选中的è¯è¯­ä¹‹é—´å‡ºçŽ°çš„é¢å¤–è¯è¯­çš„个数
    
    
        No field
        ä¸é™å­—段
    
    
        Any
        ä»»æ„
    
    
        All
        全部
    
    
        None
        æ— 
    
    
        Phrase
        è¯ç»„
    
    
        Proximity
        è¿‘ä¼¼
    
    
        File name
        文件å
    


    Snippets
    
        Snippets
        
    
    
        Find:
        
    
    
        Next
        下一页
    
    
        Prev
        
    


    SnippetsW
    
        Search
        æœç´¢
    
    
        <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p>
        
    


    SpecIdxW
    
        Special Indexing
        
    
    
        Do not retry previously failed files.
        
    
    
        Else only modified or failed files will be processed.
        
    
    
        Erase selected files data before indexing.
        
    
    
        Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs).
        
    
    
        Browse
        æµè§ˆ
    
    
        Start directory (else use regular topdirs):
        
    
    
        Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set.
        
    
    
        Selection patterns:
        
    
    
        Top indexed entity
        
    


    SpellBase
    
        Term Explorer
        è¯è¯­æŽ¢ç´¢å™¨
    
    
        &Expand 
        展开(&E)
    
    
        Alt+E
        Alt+E
    
    
        &Close
        关闭(&C)
    
    
        Alt+C
        Alt+C
    
    
        No db info.
        未找到数æ®åº“ä¿¡æ¯ã€‚
    
    
        Match
        
    
    
        Case
        
    
    
        Accents
        
    


    SpellW
    
        Wildcards
        通é…符
    
    
        Regexp
        正则表达å¼
    
    
        Stem expansion
        è¯æ ¹æ‰©å±•
    
    
        Spelling/Phonetic
        拼写/å‘音检查
    
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        Aspell init failed. Aspell not installed?
        Aspellåˆå§‹åŒ–å¤±è´¥ã€‚æ˜¯å¦æœªå®‰è£…Aspell?
    
    
        Aspell expansion error. 
        Aspell扩展出错。
    
    
        No expansion found
        未找到扩展
    
    
        Term
        è¯è¯­
    
    
        Doc. / Tot.
        文档数/总数
    
    
        Index: %1 documents, average length %2 terms
        索引:%1个文档,平å‡é•¿åº¦ä¸º%2个è¯è¯­
    
    
        Index: %1 documents, average length %2 terms.%3 results
        
    
    
        %1 results
        
    
    
        List was truncated alphabetically, some frequent 
        
    
    
        terms may be missing. Try using a longer root.
        
    
    
        Show index statistics
        
    
    
        Number of documents
        
    
    
        Average terms per document
        
    
    
        Database directory size
        
    
    
        MIME types:
        
    
    
        Item
        
    
    
        Value
        
    
    
        Smallest document length (terms)
        
    
    
        Longest document length (terms)
        
    
    
        Results from last indexing:
        
    
    
          Documents created/updated
        
    
    
          Files tested
        
    
    
          Unindexed files
        
    
    
        List files which could not be indexed (slow)
        
    
    
        Spell expansion error. 
        
    


    UIPrefsDialog
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        The selected directory does not appear to be a Xapian index
        é€‰ä¸­çš„ç›®å½•ä¸æ˜¯Xapian索引
    
    
        This is the main/local index!
        这是主è¦/本地索引ï¼
    
    
        The selected directory is already in the index list
        选中的目录已ç»åœ¨ç´¢å¼•列表中
    
    
        Select xapian index directory (ie: /home/buddy/.recoll/xapiandb)
        选择xapian索引目录(例如:/home/buddy/.recoll/xapiandb)
    
    
        Choose
        选择
    
    
        Result list paragraph format (erase all to reset to default)
        
    
    
        Result list header (default is empty)
        
    
    
        Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb)
        
    
    
        The selected directory looks like a Recoll configuration directory but the configuration could not be read
        
    
    
        At most one index should be selected
        
    
    
        Cant add index with different case/diacritics stripping option
        
    
    
        Default QtWebkit font
        
    
    
        Any term
        任一è¯è¯­
    
    
        All terms
        全部è¯è¯­
    
    
        File name
        文件å
    
    
        Query language
        查询语言
    
    
        Value from previous program exit
        
    


    ViewAction
    
        Changing actions with different current values
        正在针对ä¸åŒçš„当å‰å€¼è€Œæ”¹å˜åŠ¨ä½œ
    
    
        Command
        命令
    
    
        MIME type
        文件类型
    
    
        Desktop Default
        
    
    
        Changing entries with different current values
        
    


    ViewActionBase
    
        Native Viewers
        本地查看器
    
    
        Select one or several file types, then click Change Action to modify the program used to open them
        选中一个或多个文件类型,然åŽç‚¹å‡»â€œä¿®æ”¹åŠ¨ä½œâ€æ¥ä¿®æ”¹ç”¨æ¥æ‰“开这些文件的程åº
    
    
        Change Action
        修改动作
    
    
        Close
        关闭
    
    
        Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults.
        选中一个或多个文件类型祟点击“修改动作â€<br>或者å¯ä»¥å…³é—­è¿™ä¸ªå¯¹è¯æ¡†ï¼Œè€Œåœ¨ä¸»é¢æ¿ä¸­é€‰ä¸­â€œä½¿ç”¨æ¡Œé¢é»˜è®¤è®¾ç½®â€<br>那样就会无视这个列表而使用桌é¢çš„默认设置。
    
    
        Select one or several mime types then use the controls in the bottom frame to change how they are processed.
        
    
    
        Use Desktop preferences by default
        
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        
    
    
        Exception to Desktop preferences
        
    
    
        Action (empty -> recoll default)
        
    
    
        Apply to current selection
        
    
    
        Recoll action:
        
    
    
        current value
        
    
    
        Select same
        
    
    
        <b>New Values:</b>
        
    


    Webcache
    
        Webcache editor
        
    
    
        Search regexp
        
    


    WebcacheEdit
    
        Copy URL
        
    
    
        Unknown indexer state. Can't edit webcache file.
        
    
    
        Indexer is running. Can't edit webcache file.
        
    
    
        Delete selection
        
    
    
        Webcache was modified, you will need to run the indexer after closing this window.
        
    


    WebcacheModel
    
        MIME
        
    
    
        Url
        
    


    confgui::ConfBeaglePanelW
    
        Steal Beagle indexing queue
        窃å–Beagle索引队列
    
    
        Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin)
        ä¸å¯è¿è¡ŒBeagle。å¯ç”¨å¯¹beagle队列的处ç†ï¼Œä»¥ç´¢å¼•ç«ç‹ç½‘页历å²ã€‚<br>(你还需è¦å®‰è£…ç«ç‹Beagleæ’件)
    
    
        Entries will be recycled once the size is reached
        当尺寸达到设定值时,这些æ¡ç›®ä¼šè¢«å¾ªçŽ¯ä½¿ç”¨
    
    
        Web page store directory name
        网页储存目录å
    
    
        The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory.
        用æ¥å‚¨å­˜å¤åˆ¶è¿‡æ¥çš„已访问网页的目录å。<br>如果使用相对路径,则会相对于é…置目录的路径进行处ç†ã€‚
    
    
        Max. size for the web store (MB)
        网页存储的最大尺寸(MB)
    
    
        Process the WEB history queue
        
    
    
        Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin)
        
    
    
        Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).
        
    


    confgui::ConfIndexW
    
        Can't write configuration file
        无法写入é…置文件
    


    confgui::ConfParamFNW
    
        Choose
        选择
    


    confgui::ConfParamSLW
    
        +
        +
    
    
        -
        -
    


    confgui::ConfSearchPanelW
    
        Automatic diacritics sensitivity
        
    
    
        <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity.
        
    
    
        Automatic character case sensitivity
        
    
    
        <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity.
        
    
    
        Maximum term expansion count
        
    
    
        <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.
        
    
    
        Maximum Xapian clauses count
        
    
    
        <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.
        
    


    confgui::ConfSubPanelW
    
        Global
        全局
    
    
        Max. compressed file size (KB)
        压缩文件最大尺寸(KB)
    
    
        This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.
        尺寸大于这个值的压缩文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åР任何é™åˆ¶ï¼Œè®¾ç½®æˆ0以表示根本ä¸å¤„ç†åŽ‹ç¼©æ–‡ä»¶ã€‚
    
    
        Max. text file size (MB)
        文本文件最大尺寸(MB)
    
    
        This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. 
This is for excluding monster log files from the index.
        尺寸大于这个值的文本文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚
其作用是从索引中排除巨型的记录文件。
    
    
        Text file page size (KB)
        文本文件å•页尺寸(KB)
    
    
        If this value is set (not equal to -1), text files will be split in chunks of this size for indexing.
This will help searching very big text  files (ie: log files).
        如果设置咯这个值(ä¸ç­‰äºŽ-1),则文本文件会被分割æˆè¿™ä¹ˆå¤§çš„å—,并且进行索引。
è¿™æ˜¯ç”¨æ¥æœç´¢å¤§åž‹æ–‡æœ¬æ–‡ä»¶çš„(例如记录文件)。
    
    
        Max. filter exec. time (S)
        过滤器的最长执行时间(S)
    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit.

        外部过滤器的执行时间如果超过这个值,则会被强行中断。在罕è§çš„æƒ…况下,æŸäº›æ–‡æ¡£ï¼ˆä¾‹å¦‚postscript)会导致过滤器陷入死循环。设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚

    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit.

        
    
    
        Only mime types
        
    
    
        An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive
        
    
    
        Exclude mime types
        
    
    
        Mime types not to be indexed
        
    


    confgui::ConfTopPanelW
    
        Top directories
        顶级目录
    
    
        The list of directories where recursive indexing starts. Default: your home.
        索引从这个列表中的目录开始,递归地进行。默认:你的家目录。
    
    
        Skipped paths
        略过的路径
    
    
        These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        索引进程ä¸ä¼šè¿›å…¥å…·æœ‰è¿™äº›å字的目录。<br>å¯ä»¥åŒ…å«é€šé…符。必须匹é…索引进程自身所è§åˆ°çš„路径(例如:如果topdirs包å«'/home/me',而实际上'/home'是到'/usr/home'的链接,则正确的skippedPathæ¡ç›®åº”当是'/home/me/tmp*'ï¼Œè€Œä¸æ˜¯'/usr/home/me/tmp*')
    
    
        Stemming languages
        è¯æ ¹è¯­è¨€
    
    
        The languages for which stemming expansion<br>dictionaries will be built.
        将会针对这些语言<br>æž„é€ è¯æ ¹æ‰©å±•è¯å…¸ã€‚
    
    
        Log file name
        记录文件å
    
    
        The file where the messages will be written.<br>Use 'stderr' for terminal output
        程åºè¾“出的消æ¯ä¼šè¢«ä¿å­˜åˆ°è¿™ä¸ªæ–‡ä»¶ã€‚<br>使用'stderr'以表示将消æ¯è¾“出到终端
    
    
        Log verbosity level
        记录的è¯ç—¨çº§åˆ«
    
    
        This value adjusts the amount of messages,<br>from only errors to a lot of debugging data.
        这个值调整的是输出的消æ¯çš„æ•°é‡ï¼Œ<br>其级别从仅输出报错信æ¯åˆ°è¾“出一大堆调试信æ¯ã€‚
    
    
        Index flush megabytes interval
        刷新索引的间隔,兆字节
    
    
        This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB 
        è¿™ä¸ªå€¼è°ƒæ•´çš„æ˜¯ï¼Œå½“ç§¯ç´¯å’¯å¤šå°‘ç´¢å¼•æ•°æ®æ—¶ï¼Œæ‰å°†æ•°æ®åˆ·æ–°åˆ°ç¡¬ç›˜ä¸ŠåŽ»ã€‚<br>ç”¨æ¥æŽ§åˆ¶ç´¢å¼•è¿›ç¨‹çš„å†…å­˜å ç”¨æƒ…况。默认为10MB
    
    
        Max disk occupation (%)
        最大硬盘å ç”¨çŽ‡ï¼ˆ%)
    
    
        This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default).
        当硬盘的å ç”¨çŽ‡è¾¾åˆ°è¿™ä¸ªæ•°æ—¶ï¼Œç´¢å¼•ä¼šå¤±è´¥å¹¶ä¸”åœæ­¢ï¼ˆä»¥é¿å…塞满你的硬盘)。<br>设为0则表示ä¸åŠ é™åˆ¶ï¼ˆè¿™æ˜¯é»˜è®¤å€¼ï¼‰ã€‚
    
    
        No aspell usage
        ä¸ä½¿ç”¨aspell
    
    
        Aspell language
        Aspell语言
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        aspellè¯å…¸çš„è¯­è¨€ã€‚è¡¨ç¤ºæ–¹å¼æ˜¯'en'或'fr'……<br>如果ä¸è®¾ç½®è¿™ä¸ªå€¼ï¼Œåˆ™ä¼šä½¿ç”¨ç³»ç»ŸçŽ¯å¢ƒä¸­çš„è‡ªç„¶è¯­è¨€è®¾ç½®ä¿¡æ¯ï¼Œè€Œé‚£ä¸ªé€šå¸¸æ˜¯æ­£ç¡®çš„ã€‚è¦æƒ³æŸ¥çœ‹ä½ çš„系统中安装咯哪些语言的è¯ï¼Œå°±æ‰§è¡Œ'aspell config',å†åœ¨'data-dir'目录中找.dat文件。
    
    
        Database directory name
        æ•°æ®åº“目录å
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the  configuration directory. The default is 'xapiandb'.
        用æ¥å‚¨å­˜ç´¢å¼•æ•°æ®çš„目录的åå­—<br>如果使用相对路径,则路径会相对于é…置目录进行计算。默认值是'xapiandb'。
    
    
        Use system's 'file' command
        使用系统里的'file'命令
    
    
        Use the system's 'file' command if internal<br>mime type identification fails.
        当内部的文件类型识别功能失效时<br>使用系统里的'file'命令。
    
    
        Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. 
        ç¦æ­¢åœ¨è¯è¯­æŽ¢ç´¢å™¨ä¸­ä½¿ç”¨aspellæ¥ç”Ÿæˆæ‹¼å†™ç›¸è¿‘çš„è¯è¯­ã€‚<br>在没有安装aspellæˆ–è€…å®ƒå·¥ä½œä¸æ­£å¸¸æ—¶ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ã€‚
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.
        
    
    
        Unac exceptions
        
    
    
        <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.
        
    
    
        These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        
    
    
        Max disk occupation (%, 0 means no limit)
        
    
    
        This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit.
        
    


    uiPrefsDialogBase
    
        User preferences
        用户选项
    
    
        User interface
        用户界é¢
    
    
        Number of entries in a result page
        一个结果页é¢ä¸­æ˜¾ç¤ºçš„ç»“æžœæ¡æ•°
    
    
        If checked, results with the same content under different names will only be shown once.
        å¦‚æžœé€‰ä¸­è¿™ä¸ªï¼Œåˆ™æ‹¥æœ‰ç›¸åŒæ–‡ä»¶å†…容的ä¸åŒæ–‡ä»¶ååªä¼šæ˜¾ç¤ºä¸€ä¸ªã€‚
    
    
        Hide duplicate results.
        éšè—é‡å¤ç»“果。
    
    
        Highlight color for query terms
        查询è¯è¯­çš„高亮颜色
    
    
        Result list font
        结果列表字体
    
    
        Opens a dialog to select the result list font
        æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©ç”¨äºŽç»“果列表的字体
    
    
        Helvetica-10
        文泉驿微米黑-12
    
    
        Resets the result list font to the system default
        将结果列表中的字体é‡è®¾ä¸ºç³»ç»Ÿé»˜è®¤å€¼
    
    
        Reset
        é‡ç½®
    
    
        Texts over this size will not be highlighted in preview (too slow).
        超过这个长度的文本ä¸ä¼šåœ¨é¢„览窗å£é‡Œé«˜äº®æ˜¾ç¤ºï¼ˆå¤ªæ…¢ï¼‰ã€‚
    
    
        Maximum text size highlighted for preview (megabytes)
        在预览中对其进行高亮显示的最大文本尺寸(兆字节)
    
    
        Use desktop preferences to choose document editor.
        使用桌é¢ç³»ç»Ÿçš„设置æ¥é€‰æ‹©æ–‡æ¡£ç¼–辑器。
    
    
        Choose editor applications
        选择编辑器程åº
    
    
        Display category filter as toolbar instead of button panel (needs restart).
        将文件类型过滤器显示æˆå·¥å…·æ¡ï¼Œè€Œä¸æ˜¯æŒ‰é’®é¢æ¿ï¼ˆéœ€è¦é‡å¯ç¨‹åºï¼‰ã€‚
    
    
        Auto-start simple search on whitespace entry.
        è¾“å…¥ç©ºæ ¼æ—¶è‡ªåŠ¨å¼€å§‹è¿›è¡Œç®€å•æœç´¢ã€‚
    
    
        Start with advanced search dialog open.
        å¯åŠ¨æ—¶æ‰“å¼€é«˜ç«¯æœç´¢å¯¹è¯æ¡†ã€‚
    
    
        Remember sort activation state.
        è®°ä½æŽ’åºçжæ€ã€‚
    
    
        Prefer Html to plain text for preview.
        预览中优先使用Html。
    
    
        Search parameters
        æœç´¢å‚æ•°
    
    
        Stemming language
        è¯æ ¹è¯­è¨€
    
    
        A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.
        对[滚 石] (2个è¯è¯­)çš„æœç´¢ä¼šå˜æˆ[滚 or 石 or (滚 2个è¯è¯­ 石)]。
对于那些æœç´¢è¯è¯­åœ¨å…¶ä¸­æŒ‰ç…§åŽŸæ ·å‡ºçŽ°çš„ç»“æžœï¼Œå…¶ä¼˜å…ˆçº§ä¼šé«˜ä¸€äº›ã€‚
    
    
        Automatically add phrase to simple searches
        自动将è¯ç»„æ·»åŠ åˆ°ç®€å•æœç´¢ä¸­
    
    
        Do we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.
        是å¦è¦ä½¿ç”¨æŸ¥è¯¢è¯è¯­å‘¨å›´çš„ä¸Šä¸‹æ–‡æ¥æž„造结果列表æ¡ç›®ä¸­çš„æ‘˜è¦ï¼Ÿ
对于大的文档å¯èƒ½ä¼šå¾ˆæ…¢ã€‚
    
    
        Dynamically build abstracts
        åŠ¨æ€æž„造摘è¦
    
    
        Do we synthetize an abstract even if the document seemed to have one?
        å³ä½¿æ–‡æ¡£æœ¬èº«æ‹¥æœ‰ä¸€ä¸ªæ‘˜è¦ï¼Œæˆ‘们ä»ç„¶è‡ªè¡Œåˆæˆæ‘˜è¦ä¿¡æ¯ï¼Ÿ
    
    
        Replace abstracts from documents
        å–代文档中自带的摘è¦
    
    
        Synthetic abstract size (characters)
        åˆæˆæ‘˜è¦é•¿åº¦ï¼ˆå­—符个数)
    
    
        Synthetic abstract context words
        åˆæˆæ‘˜è¦ä¸Šä¸‹æ–‡
    
    
        The words in the list will be automatically turned to ext:xxx clauses in the query language entry.
        这个列表中的è¯è¯­ä¼šåœ¨æŸ¥è¯¢è¯­è¨€è¾“å…¥æ¡†é‡Œè‡ªåŠ¨å˜æˆext:xxx语å¥ã€‚
    
    
        Query language magic file name suffixes.
        查询语言神奇文件ååŽç¼€ã€‚
    
    
        Enable
        å¯ç”¨
    
    
        External Indexes
        外部索引
    
    
        Toggle selected
        切æ¢é€‰ä¸­é¡¹
    
    
        Activate All
        全部激活
    
    
        Deactivate All
        全部ç¦ç”¨
    
    
        Remove from list. This has no effect on the disk index.
        从列表中删除。这ä¸ä¼šå¯¹ç¡¬ç›˜ä¸Šçš„ç´¢å¼•é€ æˆæŸå®³ã€‚
    
    
        Remove selected
        删除选中项
    
    
        Click to add another index directory to the list
        点击这里,以将å¦ä¸€ä¸ªç´¢å¼•目录添加到列表中
    
    
        Add index
        添加索引
    
    
        Apply changes
        使改å˜ç”Ÿæ•ˆ
    
    
        &OK
        确定(&O)
    
    
        Discard changes
        放弃这些改å˜
    
    
        &Cancel
        å–æ¶ˆï¼ˆ&C)
    
    
        Abstract snippet separator
        摘è¦ä¸­çš„片段的分隔符
    
    
        Style sheet
        æ ·å¼å•
    
    
        Opens a dialog to select the style sheet file
        æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©æ ·å¼å•文件
    
    
        Choose
        选择
    
    
        Resets the style sheet to default
        将样å¼å•é‡ç½®ä¸ºé»˜è®¤å€¼
    
    
        Lines in PRE text are not folded. Using BR loses some indentation.
        PRE中的文字ä¸ä¼šæ¢è¡Œã€‚使用BRçš„è¯ä¼šä½¿ä¸€äº›ç¼©è¿›å¤±æ•ˆã€‚
    
    
        Use <PRE> tags instead of <BR>to display plain text as html in preview.
        在将纯文本显示æˆhtml预览的时候,使用<PRE>æ ‡ç­¾ï¼Œè€Œä¸æ˜¯<BR>标签。
    
    
        Result List
        结果列表
    
    
        Edit result paragraph format string
        编辑结果段è½çš„æ ¼å¼å­—符串
    
    
        Edit result page html header insert
        编辑结果页é¢çš„html头部æ’入项
    
    
        Date format (strftime(3))
        日期格å¼ï¼ˆstrftime(3))
    
    
        Frequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). 
        这是一个频率阈值,超过这个值的è¯ï¼Œæˆ‘们就ä¸ä¼šæŠŠè¯è¯­æ”¾åˆ°è‡ªåЍè¯ç»„中。
高频è¯è¯­æ˜¯è¯ç»„ä¸­æ€§èƒ½é—®é¢˜çš„ä¸»è¦æ¥æºã€‚
略过的è¯è¯­ä¼šå¢žåŠ è¯ç»„的空缺值,因此会é™ä½Žè‡ªåЍè¯ç»„功能的效率。
默认值是2(百分比)。
    
    
        Autophrase term frequency threshold percentage
        自动è¯ç»„频率阈值百分比
    
    
        Plain text to HTML line style
        
    
    
        Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.
        
    
    
        <BR>
        
    
    
        <PRE>
        
    
    
        <PRE> + wrap
        
    
    
        Disable Qt autocompletion in search entry.
        
    
    
        Search as you type.
        
    
    
        Paths translations
        
    
    
        Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.
        
    
    
        Snippets window CSS file
        
    
    
        Opens a dialog to select the Snippets window CSS style sheet file
        
    
    
        Resets the Snippets window style
        
    
    
        Decide if document filters are shown as radio buttons, toolbar combobox, or menu.
        
    
    
        Document filter choice style:
        
    
    
        Buttons Panel
        
    
    
        Toolbar Combobox
        
    
    
        Menu
        
    
    
        Show system tray icon.
        
    
    
        Close to tray instead of exiting.
        
    
    
        Start with simple search mode
        
    
    
        User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header.
        
    
    
        Synonyms file
        
    
    
        Show warning when opening temporary file.
        
    
    
        Highlight CSS style for query terms
        
    


recoll-1.23.7/qtgui/i18n/recoll_zh_CN.ts0000644000175000017500000045125213224431020014626 00000000000000



    AdvSearch
    
        All clauses
        全部æ¡ä»¶
    
    
        Any clause
        ä»»æ„æ¡ä»¶
    
    
        texts
        文本
    
    
        spreadsheets
        电å­è¡¨æ ¼
    
    
        presentations
        演示文稿
    
    
        media
        多媒体文件
    
    
        messages
        邮件
    
    
        other
        其它
    
    
        Bad multiplier suffix in size filter
        文件尺寸过滤器的åŽç¼€å•ä½ä¸æ­£ç¡®
    
    
        text
        文本
    
    
        spreadsheet
        电å­è¡¨æ ¼
    
    
        presentation
        演示文档
    
    
        message
        邮件
    


    AdvSearchBase
    
        Advanced search
        高端æœç´¢
    
    
        Search for <br>documents<br>satisfying:
        æœç´¢<br>满足以下æ¡ä»¶<br>的文档:
    
    
        Delete clause
        删除æ¡ä»¶
    
    
        Add clause
        添加æ¡ä»¶
    
    
        Restrict file types
        é™å®šæ–‡ä»¶ç±»åž‹
    
    
        Check this to enable filtering on file types
        选中这个,以便针对文件类型进行过滤
    
    
        By categories
        按大类æ¥è¿‡æ»¤
    
    
        Check this to use file categories instead of raw mime types
        选中这个,以便使用较大的分类,而ä¸ä½¿ç”¨å…·ä½“的文件类型
    
    
        Save as default
        ä¿å­˜ä¸ºé»˜è®¤å€¼
    
    
        Searched file types
        将被æœç´¢çš„æ–‡ä»¶ç±»åž‹
    
    
        All ---->
        移动全部→
    
    
        Sel ----->
        移动选中项→
    
    
        <----- Sel
        â†ç§»åЍ选䏭项
    
    
        <----- All
        â†ç§»åŠ¨å…¨éƒ¨
    
    
        Ignored file types
        è¦å¿½ç•¥çš„æ–‡ä»¶ç±»åž‹
    
    
        Enter top directory for search
        è¾“å…¥è¦æœç´¢çš„æœ€ä¸Šå±‚目录
    
    
        Browse
        æµè§ˆ
    
    
        Restrict results to files in subtree:
        将结果中的文件é™å®šåœ¨æ­¤å­ç›®å½•树中:
    
    
        Start Search
        开始æœç´¢
    
    
        Close
        关闭
    
    
        All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored.
        å³è¾¹çš„æ‰€æœ‰éžç©ºå­—段都会按照逻辑与(“全部æ¡ä»¶â€é€‰é¡¹ï¼‰æˆ–é€»è¾‘æˆ–ï¼ˆâ€œä»»æ„æ¡ä»¶â€é€‰é¡¹ï¼‰æ¥ç»„åˆã€‚<br>“任æ„â€â€œå…¨éƒ¨â€å’Œâ€œæ— â€ä¸‰ç§å­—段类型都接å—输入简å•è¯è¯­å’ŒåŒå¼•å·å¼•用的è¯ç»„的组åˆã€‚<br>空的输入框会被忽略。
    
    
        Invert
        å转过滤æ¡ä»¶
    
    
        Minimum size. You can use k/K,m/M,g/G as multipliers
        最å°å°ºå¯¸ã€‚ä½ å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½
    
    
        Min. Size
        最å°å°ºå¯¸
    
    
        Maximum size. You can use k/K,m/M,g/G as multipliers
        最大尺寸。你å¯ä½¿ç”¨k/Kã€m/Mã€g/G作为å•ä½
    
    
        Max. Size
        最大尺寸
    
    
        Filter
        过滤
    
    
        From
        从
    
    
        To
        到
    
    
        Check this to enable filtering on dates
        选中这个,以便针对日期进行过滤
    
    
        Filter dates
        过滤日期
    
    
        Find
        查找
    
    
        Check this to enable filtering on sizes
        选中这个,以便针对文件尺寸进行过滤
    
    
        Filter sizes
        过滤尺寸
    


    CronToolW
    
        Cron Dialog
        è®¡åˆ’ä»»åŠ¡å¯¹è¯æ¡†
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T19:47:37" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T19:56:53" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	.T3 { font-style:italic; }
	.T4 { font-family:Courier New,courier; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 批é‡ç´¢å¼•计划任务(cron) </p><p class="P1">æ¯ä¸ªå­—段都å¯ä»¥åŒ…括一个通é…符(*)ã€å•个数字值ã€é€—å·åˆ†éš”的列表(1,3,5)和范围(1-7)。更准确地说,这些字段会被<span class="T3">按原样</span>输出到crontab 文件中,因此这里å¯ä»¥ä½¿ç”¨crontab 的所有语法,å‚考crontab(5)。</p><p class="P1"><br/>例如,在<span class="T3">日期</span>中输入<span class="T4">*</span>,<span class="T3">å°æ—¶</span>中输入<span class="T4">12,19</span>,<span class="T3">分钟</span>中输入<span class="T4">15 </span>çš„è¯ï¼Œä¼šåœ¨æ¯å¤©çš„12:15 AM å’Œ7:15 PMå¯åЍrecollindex。</p><p class="P1">ä¸€ä¸ªé¢‘ç¹æ‰§è¡Œçš„计划任务,其性能å¯èƒ½æ¯”ä¸ä¸Šå®žæ—¶ç´¢å¼•。</p></body></html>

    
    
        Days of week (* or 0-7, 0 or 7 is Sunday)
        星期日(*或0-7,0或7是指星期天)
    
    
        Hours (* or 0-23)
        å°æ—¶(*或0-23)
    
    
        Minutes (0-59)
        分钟(0-59)
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:08:00" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:11:47" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T2 { font-style:italic; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1">点击<span class="T2">ç¦ç”¨</span>ä»¥åœæ­¢è¿›è¡Œè‡ªåŠ¨åŒ–çš„æ‰¹é‡ç´¢å¼•,点击<span class="T2">å¯ç”¨</span>以å¯ç”¨æ­¤åŠŸèƒ½ï¼Œç‚¹å‡»<span class="T2">å–æ¶ˆ</span>åˆ™ä¸æ”¹å˜ä»»ä½•东西。</p></body></html>

    
    
        Enable
        å¯ç”¨
    
    
        Disable
        ç¦ç”¨
    
    
        It seems that manually edited entries exist for recollindex, cannot edit crontab
        看起æ¥å·²ç»æœ‰æ‰‹åŠ¨ç¼–è¾‘è¿‡çš„recollindexæ¡ç›®äº†ï¼Œå› æ­¤æ— æ³•编辑crontab
    
    
        Error installing cron entry. Bad syntax in fields ?
        æ’å…¥cronæ¡ç›®æ—¶å‡ºé”™ã€‚请检查语法。
    


    EditDialog
    
        Dialog
        å¯¹è¯æ¡†
    


    EditTrans
    
        Source path
        æºè·¯å¾„
    
    
        Local path
        本地路径
    
    
        Config error
        é…置错误
    
    
        Original path
        原始路径
    


    EditTransBase
    
        Path Translations
        è·¯å¾„å˜æ¢
    
    
        Setting path translations for 
        针对å³ä¾§äº‹åŠ¡è®¾ç½®è·¯å¾„å˜æ¢
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        选中一个或多个文件类型,然åŽä½¿ç”¨ä¸‹é¢æ¡†æ¡†ä¸­çš„æŽ§ä»¶æ¥è®¾ç½®è¦å¦‚何处ç†å®ƒä»¬
    
    
        Add
        添加
    
    
        Delete
        删除
    
    
        Cancel
        å–æ¶ˆ
    
    
        Save
        ä¿å­˜
    


    FirstIdxDialog
    
        First indexing setup
        第一次索引设置
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:14:44" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:23:13" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T2 { font-weight:bold; }
	.T4 { font-style:italic; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T2">未找到对应于此é…置实例的索引数æ®ã€‚</span><br/><br/>å¦‚æžœä½ åªæƒ³ä»¥ä¸€ç»„åˆç†çš„é»˜è®¤å‚æ•°æ¥ç´¢å¼•你的家目录的è¯ï¼Œå°±ç›´æŽ¥æŒ‰<span class="T4">ç«‹å³å¼€å§‹ç´¢å¼•</span>按钮。以åŽè¿˜å¯ä»¥è°ƒæ•´é…ç½®å‚æ•°çš„。</p><p class="P1">如果你想调整æŸäº›ä¸œè¥¿çš„è¯ï¼Œå°±ä½¿ç”¨ä¸‹é¢çš„链接æ¥è°ƒæ•´å…¶ä¸­çš„索引é…置和定时计划å§ã€‚</p><p class="P1">这些工具å¯åœ¨ä»¥åŽé€šè¿‡<span class="T4">选项</span>èœå•访问。</p></body></html>

    
    
        Indexing configuration
        索引é…ç½®
    
    
        This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc.
        在这里å¯ä»¥è°ƒæ•´ä½ æƒ³è¦å¯¹å…¶è¿›è¡Œç´¢å¼•的目录,以åŠå…¶å®ƒå‚æ•°ï¼Œä¾‹å¦‚ï¼šè¦æŽ’é™¤å’Œè·¯å¾„æˆ–åå­—ã€é»˜è®¤å­—符集……
    
    
        Indexing schedule
        定时索引任务
    
    
        This will let you chose between batch and real-time indexing, and set up an automatic  schedule for batch indexing (using cron).
        在这里å¯ä»¥é€‰æ‹©æ˜¯è¦è¿›è¡Œæ‰¹é‡ç´¢å¼•还是实时索引,还å¯ä»¥è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨åŒ–çš„å®šæ—¶ï¼ˆä½¿ç”¨cron)批é‡ç´¢å¼•任务。
    
    
        Start indexing now
        ç«‹å³å¼€å§‹ç´¢å¼•
    


    FragButs
    
        %1 not found.
        
    
    
        %1:
 %2
        
    
    
        Query Fragments
        
    


    IdxSchedW
    
        Index scheduling setup
        定时索引设置
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T20:27:11" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T20:30:49" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯æŒç»­è¿è¡Œå¹¶ä¸”在文件å‘生å˜åŒ–时对其进行索引,也å¯ä»¥é—´éš”一定时间è¿è¡Œä¸€æ¬¡ã€‚</p><p class="P1">ä½ å¯ä»¥è¯»ä¸€ä¸‹æ‰‹å†Œï¼Œä»¥ä¾¿æ›´å¥½åœ°åšå‡ºæŠ‰æ‹©ï¼ˆæŒ‰F1)。</p><p class="P1">这个工具å¯å¸®åŠ©ä½ è®¾ç½®ä¸€ä¸ªè‡ªåŠ¨è¿›è¡Œæ‰¹é‡ç´¢å¼•的定时任务,或者设置æˆå½“你登录时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆæˆ–è€…ä¸¤è€…åŒæ—¶è¿›è¡Œï¼Œå½“然那几乎没有æ„义)。</p></body></html>

    
    
        Cron scheduling
        定时任务
    
    
        The tool will let you decide at what time indexing should run and will install a crontab entry.
        这个工具帮助你确定一个让索引è¿è¡Œçš„æ—¶é—´ï¼Œå®ƒä¼šæ’入一个crontabæ¡ç›®ã€‚
    
    
        Real time indexing start up
        实时索引设置
    
    
        Decide if real time indexing will be started when you log in (only for the default index).
        作出决定,是å¦è¦åœ¨ç™»å½•时便å¯åŠ¨å®žæ—¶ç´¢å¼•ï¼ˆåªå¯¹é»˜è®¤ç´¢å¼•有效)。
    


    ListDialog
    
        Dialog
        å¯¹è¯æ¡†
    
    
        GroupBox
        分组框
    


    Main
    
        No db directory in configuration
        é…置实例中没有数æ®åº“目录
    
    
        "history" file is damaged or un(read)writeable, please check or remove it: 
        "history"文件被æŸå,或者ä¸å¯ï¼ˆè¯»ï¼‰å†™ï¼Œè¯·æ£€æŸ¥ä¸€ä¸‹æˆ–者删除它:
    


    Preview
    
        Close Tab
        关闭标签页
    
    
        Cancel
        å–æ¶ˆ
    
    
        Missing helper program: 
        缺少辅助程åºï¼š
    
    
        Can't turn doc into internal representation for 
        æ— æ³•ä¸ºæ­¤æ–‡ä»¶å°†æ–‡æ¡£è½¬æ¢æˆå†…部表示方å¼ï¼š
    
    
        Creating preview text
        正在创建预览文本
    
    
        Loading preview text into editor
        正在将预览文本载入到编辑器中
    
    
        &Search for:
        æœç´¢ï¼ˆ&S):
    
    
        &Next
        下一个(&N)
    
    
        &Previous
        上一个(&P)
    
    
        Clear
        清空
    
    
        Match &Case
        匹é…大å°å†™ï¼ˆ&C)
    
    
        Cannot create temporary directory: 
        无法创建临时目录:
    
    
        Error while loading file
        文件载入出错
    


    PreviewTextEdit
    
        Show fields
        显示字段
    
    
        Show main text
        显示主文本
    
    
        Print
        打å°
    
    
        Print Current Preview
        打å°å½“å‰é¢„览文本
    
    
        Show image
        显示图片
    
    
        Select All
        全选
    
    
        Copy
        å¤åˆ¶
    
    
        Save document to file
        将文档ä¿å­˜åˆ°æ–‡ä»¶
    
    
        Fold lines
        自动æ¢è¡Œ
    
    
        Preserve indentation
        ä¿ç•™ç¼©è¿›ç¬¦
    


    QObject
    
        Global parameters
        免局傿•°
    
    
        Local parameters
        å±€éƒ¨å‚æ•°
    
    
        <b>Customised subtrees
        <b>自定义的å­ç›®å½•æ ‘
    
    
        The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty.
        这是已索引的目录树中的一些å­ç›®å½•组æˆçš„列表<br>,它们的æŸäº›å‚数需è¦é‡å®šä¹‰ã€‚默认:空白。
    
    
        <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons.
        <i>ä»¥ä¸‹çš„å‚æ•°ï¼Œå½“你在上é¢çš„列表中ä¸é€‰ä¸­ä»»ä½•æ¡ç›®æˆ–者选中一个空行时,<br>就是针对顶级目录起作用的,å¦åˆ™ä¾¿æ˜¯å¯¹é€‰ä¸­çš„å­ç›®å½•起作用的。<br>ä½ å¯ä»¥ç‚¹å‡»+/-按钮,以便添加或删除目录。
    
    
        Skipped names
        è¦ç•¥è¿‡çš„æ–‡ä»¶å
    
    
        These are patterns for file or directory  names which should not be indexed.
        具有这些模å¼çš„æ–‡ä»¶æˆ–目录ä¸ä¼šè¢«ç´¢å¼•。
    
    
        Default character set
        默认字符集
    
    
        This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        这是用æ¥è¯»å–那些未标明自身的字符集的文件时所使用的字符集,例如纯文本文件。<br>é»˜è®¤å€¼æ˜¯ç©ºï¼Œä¼šä½¿ç”¨ç³»ç»Ÿé‡Œçš„è‡ªç„¶è¯­è¨€çŽ¯å¢ƒå‚æ•°ä¸­çš„值。
    
    
        Follow symbolic links
        跟踪符å·é“¾æŽ¥
    
    
        Follow symbolic links while indexing. The default is no, to avoid duplicate indexing
        在索引时跟踪符å·é“¾æŽ¥ã€‚默认是ä¸è·Ÿè¸ªçš„,以é¿å…é‡å¤ç´¢å¼•
    
    
        Index all file names
        对所有文件å进行索引
    
    
        Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true
        对那些无法判断或处ç†å…¶å†…容(未知类型或其类型ä¸è¢«æ”¯æŒï¼‰çš„æ–‡ä»¶çš„å字进行索引。默认为是
    
    
        Beagle web history
        Beagle网页历å²
    
    
        Search parameters
        æœç´¢å‚æ•°
    
    
        Web history
        网页历å²
    
    
        Default<br>character set
        
    
    
        Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used.
        
    
    
        Ignored endings
        
    
    
        These are file name endings for files which will be indexed by name only 
(no MIME type identification attempt, no decompression, no content indexing).
        
    


    QWidget
    
        Create or choose save directory
        
    
    
        Choose exactly one directory
        
    
    
        Could not read directory: 
        
    
    
        Unexpected file name collision, cancelling.
        
    
    
        Cannot extract document: 
        
    
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Open With
        
    
    
        Run Script
        
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Save selection to files
        将选中内容ä¿å­˜åˆ°æ–‡ä»¶ä¸­
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Open &Snippets window
        打开片断窗å£ï¼ˆ&S)
    
    
        Show subdocuments / attachments
        æ˜¾ç¤ºå­æ–‡æ¡£/附件
    


    QxtConfirmationMessage
    
        Do not show again.
        
    


    RTIToolW
    
        Real time indexing automatic start
        实时索引自动å¯åЍ
    
    
        <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p>
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html>
        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-22T21:00:38" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-22T21:02:43" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.P1 { font-size:12pt; margin-bottom:0cm; margin-top:0cm; font-family:Nimbus Roman No9 L; writing-mode:page; margin-left:0cm; margin-right:0cm; text-indent:0cm; }
	.T1 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="P1"><span class="T1">Recoll</span> 索引程åºå¯ä»¥ä»¥å®ˆæŠ¤è¿›ç¨‹çš„æ–¹å¼è¿è¡Œï¼Œåœ¨æ–‡ä»¶å‘生å˜åŒ–æ—¶ä¾¿å®žæ—¶æ›´æ–°ç´¢å¼•ã€‚è¿™æ ·ä½ çš„ç´¢å¼•ä¸€ç›´æ˜¯ä¸Žæ–‡ä»¶åŒæ­¥çš„,但是会å ç”¨ä¸€å®šçš„系统资æºã€‚</p></body></html>

    
    
        Start indexing daemon with my desktop session.
        在我的桌é¢ä¼šè¯å¯åŠ¨æ—¶ä¾¿å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚
    
    
        Also start indexing daemon right now.
        åŒæ—¶æ­¤æ¬¡ä¹Ÿç«‹å³å¯åŠ¨ç´¢å¼•è¿›ç¨‹ã€‚
    
    
        Replacing: 
        正在替æ¢ï¼š
    
    
        Replacing file
        æ­£åœ¨æ›¿æ¢æ–‡ä»¶
    
    
        Can't create: 
        无法创建:
    
    
        Warning
        警告
    
    
        Could not execute recollindex
        无法执行recollindex
    
    
        Deleting: 
        正在删除:
    
    
        Deleting file
        正在删除文件
    
    
        Removing autostart
        正在删除自动å¯åЍ项
    
    
        Autostart file deleted. Kill current process too ?
        自动å¯åŠ¨æ–‡ä»¶å·²ç»åˆ é™¤ã€‚ä¹Ÿè¦æ€æ­»å½“å‰è¿›ç¨‹å—?
    


    RclMain
    
        (no stemming)
        (ä¸è¿›è¡Œè¯æ ¹è®¡ç®—)
    
    
        (all languages)
        ï¼ˆå¯¹å…¨éƒ¨è¯­è¨€è¿›è¡Œè¯æ ¹è®¡ç®—)
    
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        Indexing in progress: 
        正在索引:
    
    
        Purge
        删除
    
    
        Stemdb
        Stemæ•°æ®åº“
    
    
        Closing
        正在关闭
    
    
        Unknown
        未知
    
    
        Query results
        查询结果
    
    
        Cannot retrieve document info from database
        无法从数æ®åº“èŽ·å–æ–‡æ¡£ä¿¡æ¯
    
    
        Warning
        警告
    
    
        Can't create preview window
        无法创建预览窗å£
    
    
        This search is not active any more
        这个查询已ç»ä¸æ˜¯æ´»è·ƒçš„了
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeconf file
        针对%1的查看命令[%2]é…置出错
请检查mimeconf文件
    
    
        Cannot extract document or create temporary file
        无法æå–文档或创建临时文件
    
    
        Executing: [
        正在执行:[
    
    
        About Recoll
        Recoll说明
    
    
        History data
        åŽ†å²æ•°æ®
    
    
        Document history
        文档历å²
    
    
        Update &Index
        更新索引(&I)
    
    
        Stop &Indexing
        åœæ­¢ç´¢å¼•(&I)
    
    
        All
        全部
    
    
        media
        多媒体文件
    
    
        message
        邮件
    
    
        other
        其它
    
    
        presentation
        演示文档
    
    
        spreadsheet
        电å­è¡¨æ ¼
    
    
        text
        文本文件
    
    
        sorted
        已排åº
    
    
        filtered
        已过滤
    
    
        External applications/commands needed and not found for indexing your file types:


        需è¦ç”¨æ¥è¾…助对你的文件进行索引,å´åˆæ‰¾ä¸åˆ°çš„外部程åº/命令:


    
    
        No helpers found missing
        ç›®å‰ä¸ç¼ºå°‘任何辅助程åº
    
    
        Missing helper programs
        未找到的辅助程åº
    
    
        Document category filter
        文档分类过滤器
    
    
        No external viewer configured for mime type [
        é’ˆå¯¹æ­¤ç§æ–‡ä»¶ç±»åž‹æ²¡æœ‰é…置外部查看器[
    
    
        The viewer specified in mimeview for %1: %2 is not found.
Do you want to start the  preferences dialog ?
        没有找到mimeview中为%1: %2é…置的查看器。
是å¦è¦æ‰“å¼€é€‰é¡¹å¯¹è¯æ¡†ï¼Ÿ
    
    
        Can't access file: 
        无法访问文件:
    
    
        Can't uncompress file: 
        无法解压缩此文件:
    
    
        Save file
        ä¿å­˜æ–‡ä»¶
    
    
        Result count (est.)
        结果数(估计值)
    
    
        Query details
        查询语å¥ç»†èŠ‚
    
    
        Could not open external index. Db not open. Check external indexes list.
        无法打开外部索引。数æ®åº“未打开。请检查外部索引列表。
    
    
        No results found
        未找到结果
    
    
        None
        æ— 
    
    
        Updating
        正在更新
    
    
        Done
        已完æˆ
    
    
        Monitor
        监视器
    
    
        Indexing failed
        索引失败
    
    
        The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone
        当å‰ç´¢å¼•è¿›ç¨‹ä¸æ˜¯ç”±æ­¤ç•Œé¢å¯åŠ¨çš„ã€‚ç‚¹å‡»ç¡®å®šä»¥æ€æ­»å®ƒï¼Œæˆ–è€…ç‚¹å‡»å–æ¶ˆä»¥è®©å®ƒè‡ªç”±è¿è¡Œ
    
    
        Erasing index
        正在删除索引
    
    
        Reset the index and start from scratch ?
        ä»Žå¤´é‡æ–°å¼€å§‹ç´¢å¼•å—?
    
    
        Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program
        查询正在进行中。<br>由于索引库的æŸäº›é™åˆ¶ï¼Œ<br>å–æ¶ˆçš„è¯ä¼šå¯¼è‡´ç¨‹åºé€€å‡º
    
    
        Error
        错误
    
    
        Index not open
        索引未打开
    
    
        Index query error
        索引查询出错
    
    
        Content has been indexed for these mime types:
        å·²ç»ä¸ºè¿™äº›æ–‡ä»¶ç±»åž‹ç´¢å¼•其内容:
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.
        æ­¤æ–‡ä»¶çš„ç´¢å¼•å·²è¿‡æ—¶ã€‚ç¨‹åºæ‹’ç»æ˜¾ç¤ºé”™è¯¯çš„æ¡ç›®ã€‚è¯·ç‚¹å‡»ç¡®å®šä»¥æ›´æ–°æ­¤æ–‡ä»¶çš„ç´¢å¼•ï¼Œç­‰å¾…ç´¢å¼•å®Œæˆä¹‹åŽå†æŸ¥è¯¢ã€‚æˆ–è€…ï¼Œå–æ¶ˆã€‚
    
    
        Can't update index: indexer running
        无法更新索引:索引程åºå·²åœ¨è¿è¡Œ
    
    
        Indexed MIME Types
        已索引的文件类型
    
    
        Bad viewer command line for %1: [%2]
Please check the mimeview file
        针对%1的查看程åºå‘½ä»¤ä¸å¯¹ï¼š%2
请检查mimeview文件
    
    
        Viewer command line for %1 specifies both file and parent file value: unsupported
        针对%1的查看程åºå‘½ä»¤ä¸­åŒæ—¶æŒ‡å®šäº†æ–‡ä»¶åŠäº²ä»£æ–‡ä»¶å€¼ï¼šè¿™æ˜¯ä¸æ”¯æŒçš„
    
    
        Cannot find parent document
        无法找到亲代文档
    
    
        Indexing did not run yet
        还未开始索引
    
    
        External applications/commands needed for your file types and not found, as stored by the last indexing pass in 
        在上次的索引过程中å‘现,针对妳的文件类型,还缺少一些外部的程åº/命令,它们储存在å³ä¾§æ–‡ä»¶ä¸­
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry.
        æ­¤æ–‡ä»¶çš„ç´¢å¼•å†…å®¹ä¸æ˜¯æœ€æ–°çš„。如果妳按拒ç»ï¼Œåˆ™éœ€è¦è‡ªè¡Œæ‰¿æ‹…显示错误æ¡ç›®çš„风险。
    
    
        Click Ok to update the index for this file, then re-run the query when indexing is done. Else, Cancel.
        ç‚¹å‡»ç¡®å®šæ¥æ›´æ–°æ­¤æ–‡ä»¶çš„索引,在索引完æˆä¹‹åŽé‡æ–°æ‰§è¡Œæ­¤æŸ¥è¯¢ã€‚å¦åˆ™ï¼Œè¯·æŒ‰å–消。
    
    
        Indexer running so things should improve when it's done
        索引器正在è¿è¡Œï¼Œæ‰€ä»¥ï¼Œå½“它完毕之åŽä¸–界将å˜å¾—更美好
    
    
        Sub-documents and attachments
        å­æ–‡æ¡£åŠé™„ä»¶
    
    
        Document filter
        
    
    
        Indexing interrupted
        
    
    
        Index not up to date for this file. Refusing to risk showing the wrong entry. 
        
    
    
        Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. 
        
    
    
        The indexer is running so things should improve when it's done. 
        
    
    
        Duplicate documents
        é‡å¤æ–‡æ¡£
    
    
        These Urls ( | ipath) share the same content:
        以下路径(|内部路径)之间共享ç€ç›¸åŒçš„内容:
    
    
        Bad desktop app spec for %1: [%2]
Please check the desktop file
        
    
    
        The current indexing process was not started from this interface, can't kill it
        
    
    
        Bad paths
        
    
    
        Bad paths in configuration file:

        
    
    
        Selection patterns need topdir
        
    
    
        Selection patterns can only be used with a start directory
        
    
    
        No search
        
    
    
        No preserved previous search
        
    
    
        Choose file to save
        
    
    
        Saved Queries (*.rclq)
        
    
    
        Write failed
        
    
    
        Could not write to file
        
    
    
        Read failed
        
    
    
        Could not open file: 
        
    
    
        Load error
        
    
    
        Could not load saved query
        
    
    
        Index scheduling
        
    
    
        Sorry, not available under Windows for now, use the File menu entries to update the index
        
    
    
        Disabled because the real time indexer was not compiled in.
        
    
    
        This configuration tool only works for the main index.
        
    
    
        Can't set synonyms file (parse error?)
        
    
    
        The document belongs to an external index which I can't update. 
        
    
    
        Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session).
        
    
    
        Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location.
        
    
    
        Do not show this warning next time (use GUI preferences to restore).
        
    
    
        Index locked
        
    
    
        Unknown indexer state. Can't access webcache file.
        
    
    
        Indexer is running. Can't access webcache file.
        
    
    
         with additional message: 
        
    
    
        Non-fatal indexing message: 
        
    
    
        Types list empty: maybe wait for indexing to progress?
        
    


    RclMainBase
    
        Recoll
        Recoll
    
    
        Search tools
        æœç´¢å·¥å…·
    
    
        Result list
        结果列表
    
    
        &File
        文件(&F)
    
    
        &Tools
        工具(&T)
    
    
        &Preferences
        选项(&P)
    
    
        &Help
        帮助(&H)
    
    
        E&xit
        退出(&x)
    
    
        Ctrl+Q
        Ctrl+Q
    
    
        Update &index
        更新索引(&i)
    
    
        &Erase document history
        删除文档历å²ï¼ˆ&E)
    
    
        &About Recoll
        Recoll说明(&A)
    
    
        &User manual
        用户手册(&U)
    
    
        Document &History
        文档历å²ï¼ˆ&H)
    
    
        Document  History
        文档历å²
    
    
        &Advanced Search
        高端æœç´¢ï¼ˆ&A)
    
    
        Advanced/complex  Search
        高端/夿‚æœç´¢
    
    
        &Sort parameters
        排åºå‚数(&S)
    
    
        Sort parameters
        排åºå‚æ•°
    
    
        Term &explorer
        è¯è¯­æŽ¢ç´¢å™¨ï¼ˆ&e)
    
    
        Term explorer tool
        è¯è¯­æŽ¢ç´¢å™¨
    
    
        Next page
        下一页
    
    
        Next page of results
        下一页结果
    
    
        First page
        第一页
    
    
        Go to first page of results
        跳转到结果的第一页
    
    
        Previous page
        上一页
    
    
        Previous page of results
        上一页结果
    
    
        &Query configuration
        查询é…置(&Q)
    
    
        External index dialog
        å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†
    
    
        &Indexing configuration
        索引é…置(&I)
    
    
        All
        全部
    
    
        &Show missing helpers
        显示缺少的辅助程åºåˆ—表(&S)
    
    
        PgDown
        å‘下翻页
    
    
        PgUp
        å‘上翻页
    
    
        &Full Screen
        å…¨å±ï¼ˆ&F)
    
    
        F11
        F11
    
    
        Full Screen
        å…¨å±
    
    
        &Erase search history
        删除æœç´¢åކå²ï¼ˆ&E)
    
    
        sortByDateAsc
        按日期å‡åºæŽ’列
    
    
        Sort by dates from oldest to newest
        按日期排列,最旧的在å‰é¢
    
    
        sortByDateDesc
        按日期é™åºæŽ’列
    
    
        Sort by dates from newest to oldest
        按日期排列,最新的在å‰é¢
    
    
        Show Query Details
        显示查询语å¥ç»†èŠ‚
    
    
        Show results as table
        ä»¥è¡¨æ ¼çš„å½¢å¼æ˜¾ç¤ºç»“æžœ
    
    
        &Rebuild index
        釿–°æž„造索引(&R)
    
    
        &Show indexed types
        显示已索引的文件类型(&S)
    
    
        Shift+PgUp
        Shift+å‘上翻页
    
    
        &Indexing schedule
        定时索引(&I)
    
    
        E&xternal index dialog
        å¤–éƒ¨ç´¢å¼•å¯¹è¯æ¡†ï¼ˆ&x)
    
    
        &Index configuration
        索引设置(&I)
    
    
        &GUI configuration
        界é¢è®¾ç½®ï¼ˆ&G)
    
    
        &Results
        结果(&R)
    
    
        Sort by date, oldest first
        按日期排åºï¼Œæ—§æ–‡æ¡£åœ¨å‰
    
    
        Sort by date, newest first
        按日期排åºï¼Œæ–°æ–‡æ¡£åœ¨å‰
    
    
        Show as table
        ä»¥è¡¨æ ¼å½¢å¼æ˜¾ç¤º
    
    
        Show results in a spreadsheet-like table
        以一个类似于电å­è¡¨æ ¼çš„形弿¥æ˜¾ç¤ºç»“æžœ
    
    
        Save as CSV (spreadsheet) file
        ä¿å­˜ä¸ºCSV(电å­è¡¨æ ¼ï¼‰æ–‡ä»¶
    
    
        Saves the result into a file which you can load in a spreadsheet
        将结果ä¿å­˜åˆ°ä¸€ä¸ªå¯ç”¨ç”µå­è¡¨æ ¼æ‰“开的文件中
    
    
        Next Page
        下一页
    
    
        Previous Page
        上一页
    
    
        First Page
        第一页
    
    
        Query Fragments
        
    
    
            With failed files retrying
        
    
    
        Next update will retry previously failed files
        
    
    
        Indexing &schedule
        
    
    
        Enable synonyms
        
    
    
        Save last query
        
    
    
        Load saved query
        
    
    
        Special Indexing
        
    
    
        Indexing with special options
        
    
    
        &View
        
    
    
        Missing &helpers
        
    
    
        Indexed &MIME types
        
    
    
        Index &statistics
        
    
    
        Webcache Editor
        
    


    RclTrayIcon
    
        Restore
        
    
    
        Quit
        
    


    RecollModel
    
        Abstract
        摘è¦
    
    
        Author
        作者
    
    
        Document size
        文档尺寸
    
    
        Document date
        文档日期
    
    
        File size
        文件尺寸
    
    
        File name
        文件å
    
    
        File date
        文件日期
    
    
        Keywords
        关键è¯
    
    
        Original character set
        原字符集
    
    
        Relevancy rating
        相关度
    
    
        Title
        标题
    
    
        URL
        路径
    
    
        Mtime
        修改时间
    
    
        Date
        日期
    
    
        Date and time
        æ—¥æœŸåŠæ—¶é—´
    
    
        Ipath
        内部路径
    
    
        MIME type
        文件类型
    


    ResList
    
        Result list
        结果列表
    
    
        (show query)
        (显示查询语å¥ç»†èŠ‚ï¼‰
    
    
        &Preview
        预览(&P)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Document history
        文档历å²
    
    
        <p><b>No results found</b><br>
        <p><b>未找到结果</b><br>
    
    
        Previous
        上一个
    
    
        Next
        下一个
    
    
        Unavailable document
        无法访问文档
    
    
        Preview
        预览
    
    
        Open
        打开
    
    
        <p><i>Alternate spellings (accents suppressed): </i>
        <p><i>其它拼写形å¼ï¼ˆå¿½è§†å£éŸ³ï¼‰ï¼š</i>
    
    
        &Write to File
        写入文件(&W)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        &Open
        打开(&O)
    
    
        Documents
        第
    
    
        out of at least
        个文档,最少共有
    
    
        for
        个文档,查询æ¡ä»¶ï¼š
    
    
        <p><i>Alternate spellings: </i>
        <p><i>其它拼写形å¼ï¼š</i>
    
    
        Duplicate documents
        é‡å¤æ–‡æ¡£
    
    
        These Urls ( | ipath) share the same content:
        以下路径(|内部路径)之间共享ç€ç›¸åŒçš„内容:
    
    
        Result count (est.)
        结果数(估计值)
    
    
        Query details
        查询语å¥ç»†èŠ‚
    
    
        Snippets
        片断
    


    ResTable
    
        &Reset sort
        é‡ç½®æŽ’åºæ¡ä»¶ï¼ˆ&R)
    
    
        &Delete column
        删除此列(&D)
    
    
        Save table to CSV file
        将表格ä¿å­˜æˆCSV文件
    
    
        Can't open/create file: 
        无法打开/创建文件:
    
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        &Save as CSV
        ä¿å­˜ä¸ºCSV(&S)
    
    
        Add "%1" column
        添加"%1"列
    


    ResTableDetailArea
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    


    ResultPopup
    
        &Preview
        预览(&P)
    
    
        &Open
        打开(&O)
    
    
        Copy &File Name
        å¤åˆ¶æ–‡ä»¶å(&F)
    
    
        Copy &URL
        å¤åˆ¶è·¯å¾„(&U)
    
    
        &Write to File
        写入文件(&W)
    
    
        Save selection to files
        将选中内容ä¿å­˜åˆ°æ–‡ä»¶ä¸­
    
    
        Preview P&arent document/folder
        预览上一级文档/目录(&a)
    
    
        &Open Parent document/folder
        打开上一级文档/目录(&O)
    
    
        Find &similar documents
        查找类似的文档(&s)
    
    
        Open &Snippets window
        打开片断窗å£ï¼ˆ&S)
    
    
        Show subdocuments / attachments
        æ˜¾ç¤ºå­æ–‡æ¡£/附件
    


    SSearch
    
        Any term
        任一è¯è¯­
    
    
        All terms
        全部è¯è¯­
    
    
        File name
        文件å
    
    
        Query language
        查询语言
    
    
        Bad query string
        查询语言格å¼ä¸æ­£ç¡®
    
    
        Out of memory
        内存ä¸è¶³
    
    
        Too many completions
        有太多与之相关的补全选项啦
    
    
        Completions
        补全选项
    
    
        Select an item:
        选择一个æ¡ç›®ï¼š
    
    
        Enter query language expression. Cheat sheet:<br>
<i>term1 term2</i> : 'term1' and 'term2' in any field.<br>
<i>field:term1</i> : 'term1' in field 'field'.<br>
 Standard field names/synonyms:<br>
  title/subject/caption, author/from, recipient/to, filename, ext.<br>
 Pseudo-fields: dir, mime/format, type/rclcat, date.<br>
 Two date interval exemples: 2009-03-01/2009-05-20  2009-03-01/P2M.<br>
<i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br>
  No actual parentheses allowed.<br>
<i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br>
<i>"term1 term2"p</i> : unordered proximity search with default distance.<br>
Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail.

        <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><!--This file was converted to xhtml by OpenOffice.org - see http://xml.openoffice.org/odf2xhtml for more info.--><head profile="http://dublincore.org/documents/dcmi-terms/"><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8"/><title xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="en-US">- no title specified</title><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.title" content="" ns_1:lang="en-US"/><meta name="DCTERMS.language" content="en-US" scheme="DCTERMS.RFC4646"/><meta name="DCTERMS.source" content="http://xml.openoffice.org/odf2xhtml"/><meta name="DCTERMS.issued" content="2012-03-23T08:43:25" scheme="DCTERMS.W3CDTF"/><meta name="DCTERMS.modified" content="2012-03-23T09:07:39" scheme="DCTERMS.W3CDTF"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.provenance" content="" ns_1:lang="en-US"/><meta xmlns:ns_1="http://www.w3.org/XML/1998/namespace" name="DCTERMS.subject" content="," ns_1:lang="en-US"/><link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" hreflang="en"/><link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" hreflang="en"/><link rel="schema.DCTYPE" href="http://purl.org/dc/dcmitype/" hreflang="en"/><link rel="schema.DCAM" href="http://purl.org/dc/dcam/" hreflang="en"/><style type="text/css">
	@page {  }
	table { border-collapse:collapse; border-spacing:0; empty-cells:show }
	td, th { vertical-align:top; font-size:12pt;}
	h1, h2, h3, h4, h5, h6 { clear:both }
	ol, ul { margin:0; padding:0;}
	li { list-style: none; margin:0; padding:0;}
	<!-- "li span.odfLiEnd" - IE 7 issue-->
	li span. { clear: both; line-height:0; width:0; height:0; margin:0; padding:0; }
	span.footnodeNumber { padding-right:1em; }
	span.annotation_style_by_filter { font-size:95%; font-family:Arial; background-color:#fff000;  margin:0; border:0; padding:0;  }
	* { margin:0;}
	.Standard { font-size:12pt; font-family:Nimbus Roman No9 L; writing-mode:page; }
	.T1 { font-style:italic; }
	.T2 { font-style:italic; }
	.T4 { font-weight:bold; }
	<!-- ODF styles with no properties representable as CSS -->
	{ }
	</style></head><body dir="ltr" style="max-width:21.001cm;margin-top:2cm; margin-bottom:2cm; margin-left:2cm; margin-right:2cm; writing-mode:lr-tb; "><p class="Standard">输入查询语言表达å¼ã€‚简è¦è¯´æ˜Žï¼š<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2</span> : 'è¯è¯­1'å’Œ'è¯è¯­2'åŒæ—¶å‡ºçŽ°åœ¨ä»»æ„字段中。<br/><span class="T2">字段</span><span class="T1">:</span><span class="T2">è¯è¯­</span><span class="T1">1</span> : 'è¯è¯­1'出现在字段'字段'中。<br/>标准字段å/åŒä¹‰å:<br/>title/subject/captionã€author/fromã€recipient/toã€filenameã€ext。<br/>伪字段å:dirã€mime/formatã€type/rclcatã€date。<br/>日期段的两个示例:2009-03-01/2009-05-20 2009-03-01/P2M。<br/><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2 OR </span><span class="T2">è¯è¯­</span><span class="T1">3</span> : è¯è¯­1 <span class="T4">与</span> (è¯è¯­2 <span class="T4">或</span> è¯è¯­3)。<br/>ä¸å…è®¸ç”¨çœŸæ­£çš„æ‹¬å·æ¥è¡¨ç¤ºé€»è¾‘关系。<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"</span> : è¯ç»„(必须按原样出现)。å¯ç”¨çš„修饰è¯ï¼š<br/><span class="T1">"</span><span class="T2">è¯è¯­</span><span class="T1">1 </span><span class="T2">è¯è¯­</span><span class="T1">2"p</span> : 以默认è·ç¦»è¿›è¡Œçš„æ— åºè¿‘ä¼¼æœç´¢ã€‚<br/>有疑问时å¯ä½¿ç”¨<span class="T4">显示查询语å¥ç»†èŠ‚</span>é“¾æŽ¥æ¥æŸ¥çœ‹æŸ¥è¯¢è¯­å¥çš„细节,å¦å¤–请查看手册(&lt;F1&gt;)以了解更多内容。</p></body></html>

    
    
        Enter file name wildcard expression.
        输入文件å通é…符表达å¼ã€‚
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。
    
    
        Enter query language expression. Cheat sheet:<br>
<i>term1 term2</i> : 'term1' and 'term2' in any field.<br>
<i>field:term1</i> : 'term1' in field 'field'.<br>
 Standard field names/synonyms:<br>
  title/subject/caption, author/from, recipient/to, filename, ext.<br>
 Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br>
 Two date interval exemples: 2009-03-01/2009-05-20  2009-03-01/P2M.<br>
<i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br>
  You can use parentheses to make things clearer.<br>
<i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br>
<i>"term1 term2"p</i> : unordered proximity search with default distance.<br>
Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail.

        
    
    
        Stemming languages for stored query: 
        
    
    
         differ from current preferences (kept)
        
    
    
        Auto suffixes for stored query: 
        
    
    
        External indexes for stored query: 
        
    
    
        Autophrase is set but it was unset for stored query
        
    
    
        Autophrase is unset but it was set for stored query
        
    


    SSearchBase
    
        SSearchBase
        SSearchBase
    
    
        Clear
        清空
    
    
        Ctrl+S
        Ctrl+S
    
    
        Erase search entry
        删除æœç´¢æ¡ç›®
    
    
        Search
        æœç´¢
    
    
        Start query
        开始查询
    
    
        Enter search terms here. Type ESC SPC for completions of current term.
        åœ¨æ­¤è¾“å…¥è¦æœç´¢çš„è¯è¯­ã€‚按Esc ç©ºæ ¼æ¥æŸ¥çœ‹é’ˆå¯¹å½“å‰è¯è¯­çš„补全选项。
    
    
        Choose search type.
        选择æœç´¢ç±»åž‹ã€‚
    


    SearchClauseW
    
        Select the type of query that will be performed with the words
        选择è¦å¯¹å³è¾¹çš„è¯è¯­è¿›è¡Œçš„æŸ¥è¯¢ç±»åž‹
    
    
        Number of additional words that may be interspersed with the chosen ones
        å…许在选中的è¯è¯­ä¹‹é—´å‡ºçŽ°çš„é¢å¤–è¯è¯­çš„个数
    
    
        No field
        ä¸é™å­—段
    
    
        Any
        ä»»æ„
    
    
        All
        全部
    
    
        None
        æ— 
    
    
        Phrase
        è¯ç»„
    
    
        Proximity
        è¿‘ä¼¼
    
    
        File name
        文件å
    


    Snippets
    
        Snippets
        片断
    
    
        Find:
        查找:
    
    
        Next
        下一个
    
    
        Prev
        上一个
    


    SnippetsW
    
        Search
        æœç´¢
    
    
        <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p>
        
    


    SpecIdxW
    
        Special Indexing
        
    
    
        Do not retry previously failed files.
        
    
    
        Else only modified or failed files will be processed.
        
    
    
        Erase selected files data before indexing.
        
    
    
        Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs).
        
    
    
        Browse
        æµè§ˆ
    
    
        Start directory (else use regular topdirs):
        
    
    
        Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set.
        
    
    
        Selection patterns:
        
    
    
        Top indexed entity
        
    


    SpellBase
    
        Term Explorer
        è¯è¯­æŽ¢ç´¢å™¨
    
    
        &Expand 
        展开(&E)
    
    
        Alt+E
        Alt+E
    
    
        &Close
        关闭(&C)
    
    
        Alt+C
        Alt+C
    
    
        No db info.
        未找到数æ®åº“ä¿¡æ¯ã€‚
    
    
        Match
        匹é…
    
    
        Case
        大å°å†™
    
    
        Accents
        å£éŸ³
    


    SpellW
    
        Wildcards
        通é…符
    
    
        Regexp
        正则表达å¼
    
    
        Stem expansion
        è¯æ ¹æ‰©å±•
    
    
        Spelling/Phonetic
        拼写/å‘音检查
    
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        Aspell init failed. Aspell not installed?
        Aspellåˆå§‹åŒ–å¤±è´¥ã€‚æ˜¯å¦æœªå®‰è£…Aspell?
    
    
        Aspell expansion error. 
        Aspell扩展出错。
    
    
        No expansion found
        未找到扩展
    
    
        Term
        è¯è¯­
    
    
        Doc. / Tot.
        文档数/总数
    
    
        Index: %1 documents, average length %2 terms
        索引:%1个文档,平å‡é•¿åº¦ä¸º%2个è¯è¯­
    
    
        Index: %1 documents, average length %2 terms.%3 results
        索引:%1个文档,平å‡é•¿åº¦ä¸º%2个å•è¯ã€‚%3个结果
    
    
        %1 results
        %1个结果
    
    
        List was truncated alphabetically, some frequent 
        列表已按字æ¯é¡ºåºæˆªæ–­ï¼ŒæŸä¸ªå¸¸è§
    
    
        terms may be missing. Try using a longer root.
        çš„å•è¯å¯èƒ½ä¼šç¼ºå¤±ã€‚请å°è¯•ä½¿ç”¨ä¸€ä¸ªæ›´é•¿çš„è¯æ ¹ã€‚
    
    
        Show index statistics
        显示索引统计信æ¯
    
    
        Number of documents
        文档个数
    
    
        Average terms per document
        æ¯ä¸ªæ–‡æ¡£ä¸­çš„å¹³å‡å•è¯ä¸ªæ•°
    
    
        Smallest document length
        æœ€å°æ–‡æ¡£é•¿åº¦
    
    
        Longest document length
        最大文档长度
    
    
        Database directory size
        æ•°æ®åº“目录尺寸
    
    
        MIME types:
        多媒体文档类型列表:
    
    
        Item
        æ¡ç›®
    
    
        Value
        值
    
    
        Smallest document length (terms)
        
    
    
        Longest document length (terms)
        
    
    
        Results from last indexing:
        
    
    
          Documents created/updated
        
    
    
          Files tested
        
    
    
          Unindexed files
        
    
    
        List files which could not be indexed (slow)
        
    
    
        Spell expansion error. 
        
    


    UIPrefsDialog
    
        error retrieving stemming languages
        æå–è¯æ ¹è¯­è¨€æ—¶å‡ºé”™
    
    
        The selected directory does not appear to be a Xapian index
        é€‰ä¸­çš„ç›®å½•ä¸æ˜¯Xapian索引
    
    
        This is the main/local index!
        这是主è¦/本地索引ï¼
    
    
        The selected directory is already in the index list
        选中的目录已ç»åœ¨ç´¢å¼•列表中
    
    
        Select xapian index directory (ie: /home/buddy/.recoll/xapiandb)
        选择xapian索引目录(例如:/home/buddy/.recoll/xapiandb)
    
    
        Choose
        选择
    
    
        Result list paragraph format (erase all to reset to default)
        ç»“æžœåˆ—è¡¨çš„æ®µè½æ ¼å¼ï¼ˆåˆ é™¤å…¨éƒ¨å†…容å³å¯é‡ç½®ä¸ºé»˜è®¤çжæ€ï¼‰
    
    
        Result list header (default is empty)
        结果列表表头(默认为空)
    
    
        Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb)
        选择recollé…置目录或xapian索引目录(例如:/home/me/.recoll 或 /home/me/.recoll/xapiandb)
    
    
        The selected directory looks like a Recoll configuration directory but the configuration could not be read
        所选中的目录看起æ¥åƒæ˜¯ä¸€ä¸ªRecollé…置目录,但是其中的é…置内容无法读å–
    
    
        At most one index should be selected
        最多应当选中一个索引
    
    
        Cant add index with different case/diacritics stripping option
        无法添加带有ä¸åŒçš„大å°å†™/诊断信æ¯è£å‰ªæ–¹å¼çš„索引
    
    
        Default QtWebkit font
        
    
    
        Any term
        任一è¯è¯­
    
    
        All terms
        全部è¯è¯­
    
    
        File name
        文件å
    
    
        Query language
        查询语言
    
    
        Value from previous program exit
        
    


    ViewAction
    
        Changing actions with different current values
        正在针对ä¸åŒçš„当å‰å€¼è€Œæ”¹å˜åŠ¨ä½œ
    
    
        Command
        命令
    
    
        MIME type
        文件类型
    
    
        Desktop Default
        桌é¢é»˜è®¤å€¼
    
    
        Changing entries with different current values
        正在使用ä¸åŒçš„当å‰å€¼æ¥ä¿®æ”¹æ¡ç›®
    


    ViewActionBase
    
        Native Viewers
        本地查看器
    
    
        Select one or several file types, then click Change Action to modify the program used to open them
        选中一个或多个文件类型,然åŽç‚¹å‡»â€œä¿®æ”¹åŠ¨ä½œâ€æ¥ä¿®æ”¹ç”¨æ¥æ‰“开这些文件的程åº
    
    
        Change Action
        修改动作
    
    
        Close
        关闭
    
    
        Select one or several mime types then click "Change Action"<br>You can also close this dialog and check "Use desktop preferences"<br>in the main panel to ignore this list and use your desktop defaults.
        选中一个或多个文件类型祟点击“修改动作â€<br>或者å¯ä»¥å…³é—­è¿™ä¸ªå¯¹è¯æ¡†ï¼Œè€Œåœ¨ä¸»é¢æ¿ä¸­é€‰ä¸­â€œä½¿ç”¨æ¡Œé¢é»˜è®¤è®¾ç½®â€<br>那样就会无视这个列表而使用桌é¢çš„默认设置。
    
    
        Select one or several mime types then use the controls in the bottom frame to change how they are processed.
        选中一个或多个文件类型,然åŽä½¿ç”¨ä¸‹é¢æ¡†æ¡†ä¸­çš„æŽ§ä»¶æ¥è®¾ç½®è¦å¦‚何处ç†å®ƒä»¬ã€‚
    
    
        Use Desktop preferences by default
        é»˜è®¤ä½¿ç”¨æ¡Œé¢æœ¬èº«çš„设置
    
    
        Select one or several file types, then use the controls in the frame below to change how they are processed
        选中一个或多个文件类型,然åŽä½¿ç”¨ä¸‹é¢æ¡†æ¡†ä¸­çš„æŽ§ä»¶æ¥è®¾ç½®è¦å¦‚何处ç†å®ƒä»¬
    
    
        Exception to Desktop preferences
        针对桌é¢é»˜è®¤å€¼çš„例外
    
    
        Action (empty -> recoll default)
        动作(空白则表示使用recoll的默认值)
    
    
        Apply to current selection
        应用到当å‰é€‰ä¸­é¡¹ä¸Š
    
    
        Recoll action:
        Recoll动作:
    
    
        current value
        当å‰å€¼
    
    
        Select same
        选中相åŒçš„项
    
    
        <b>New Values:</b>
        <b>新的值:</b>
    


    Webcache
    
        Webcache editor
        
    
    
        Search regexp
        
    


    WebcacheEdit
    
        Copy URL
        
    
    
        Unknown indexer state. Can't edit webcache file.
        
    
    
        Indexer is running. Can't edit webcache file.
        
    
    
        Delete selection
        
    
    
        Webcache was modified, you will need to run the indexer after closing this window.
        
    


    WebcacheModel
    
        MIME
        
    
    
        Url
        
    


    confgui::ConfBeaglePanelW
    
        Steal Beagle indexing queue
        窃å–Beagle索引队列
    
    
        Beagle MUST NOT be running. Enables processing the beagle queue to index Firefox web history.<br>(you should also install the Firefox Beagle plugin)
        ä¸å¯è¿è¡ŒBeagle。å¯ç”¨å¯¹beagle队列的处ç†ï¼Œä»¥ç´¢å¼•ç«ç‹ç½‘页历å²ã€‚<br>(你还需è¦å®‰è£…ç«ç‹Beagleæ’件)
    
    
        Entries will be recycled once the size is reached
        当尺寸达到设定值时,这些æ¡ç›®ä¼šè¢«å¾ªçŽ¯ä½¿ç”¨
    
    
        Web page store directory name
        网页储存目录å
    
    
        The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory.
        用æ¥å‚¨å­˜å¤åˆ¶è¿‡æ¥çš„已访问网页的目录å。<br>如果使用相对路径,则会相对于é…置目录的路径进行处ç†ã€‚
    
    
        Max. size for the web store (MB)
        网页存储的最大尺寸(MB)
    
    
        Process the WEB history queue
        处ç†ç½‘页历å²é˜Ÿåˆ—
    
    
        Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin)
        å¯ç”¨å¯¹ç«ç‹çš„已访问页é¢è¿›è¡Œç´¢å¼•。<br>(妳还需è¦å®‰è£…ç«ç‹çš„Recollæ’件)
    
    
        Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end).
        
    


    confgui::ConfIndexW
    
        Can't write configuration file
        无法写入é…置文件
    


    confgui::ConfParamFNW
    
        Choose
        选择
    


    confgui::ConfParamSLW
    
        +
        +
    
    
        -
        -
    


    confgui::ConfSearchPanelW
    
        Automatic diacritics sensitivity
        自动判断大å°å†™
    
    
        <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity.
        <p>如果æœç´¢è¯­å¥ä¸­åŒ…å«å¸¦æœ‰å£éŸ³ç‰¹å¾(ä¸åœ¨unac_except_trans中)çš„è¯ï¼Œåˆ™è‡ªåŠ¨è§¦å‘大å°å†™çš„判断。å¦åˆ™ï¼Œå¦³éœ€è¦ä½¿ç”¨æŸ¥è¯¢è¯­è¨€å’Œ<i>D</i>ä¿®é¥°ç¬¦æ¥æŒ‡å®šå¯¹å¤§å°å†™çš„判断。
    
    
        Automatic character case sensitivity
        自动调整字符的大å°å†™æ•感性
    
    
        <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity.
        <p>如果æœç´¢è¯­å¥ä¸­é™¤é¦–å­—æ¯ä¹‹å¤–åŒ…å«æœ‰å¤§å†™å­—æ¯çš„è¯ï¼Œåˆ™è‡ªåŠ¨è§¦å‘大å°å†™çš„判断。å¦åˆ™ï¼Œå¦³éœ€è¦ä½¿ç”¨æŸ¥è¯¢è¯­è¨€å’Œ<i>C</i>ä¿®é¥°ç¬¦æ¥æŒ‡å®šå¯¹å¤§å°å†™çš„判断。
    
    
        Maximum term expansion count
        æœ€å¤§è¯æ ¹æ‰©å±•æ•°ç›®
    
    
        <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list.
        <p>针对å•个å•è¯çš„æœ€å¤§è¯æ ¹æ‰©å±•æ•°ç›®(例如:此选项在使用通é…符时会生效)。默认的10000是一个狠åˆç†çš„值,能够é¿å…当引擎éåŽ†è¯æ ¹åˆ—表时引起查询界é¢å‡æ­»ã€‚
    
    
        Maximum Xapian clauses count
        最大的Xapianå­å¥æ•°ç›®
    
    
        <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations.
        <p>我们å‘å•个Xapian查询语å¥ä¸­åŠ å…¥çš„æœ€å¤§çš„å­å¥æ•°ç›®ã€‚æŸäº›æƒ…å†µä¸‹ï¼Œè¯æ ¹æ‰©å±•的结果会是å€å¢žçš„,而我们想è¦é¿å…使用过多内存。默认的100000åº”å½“æ—¢èƒ½æ»¡è¶³æ—¥å¸¸çš„å¤§éƒ¨åˆ†è¦æ±‚,åˆèƒ½ä¸Žå½“å‰çš„典型硬件é…置相兼容。
    


    confgui::ConfSubPanelW
    
        Global
        全局
    
    
        Max. compressed file size (KB)
        压缩文件最大尺寸(KB)
    
    
        This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.
        尺寸大于这个值的压缩文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åР任何é™åˆ¶ï¼Œè®¾ç½®æˆ0以表示根本ä¸å¤„ç†åŽ‹ç¼©æ–‡ä»¶ã€‚
    
    
        Max. text file size (MB)
        文本文件最大尺寸(MB)
    
    
        This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. 
This is for excluding monster log files from the index.
        尺寸大于这个值的文本文件ä¸ä¼šè¢«å¤„ç†ã€‚设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚
其作用是从索引中排除巨型的记录文件。
    
    
        Text file page size (KB)
        文本文件å•页尺寸(KB)
    
    
        If this value is set (not equal to -1), text files will be split in chunks of this size for indexing.
This will help searching very big text  files (ie: log files).
        如果设置咯这个值(ä¸ç­‰äºŽ-1),则文本文件会被分割æˆè¿™ä¹ˆå¤§çš„å—,并且进行索引。
è¿™æ˜¯ç”¨æ¥æœç´¢å¤§åž‹æ–‡æœ¬æ–‡ä»¶çš„(例如记录文件)。
    
    
        Max. filter exec. time (S)
        过滤器的最长执行时间(S)
    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loopSet to -1 for no limit.

        外部过滤器的执行时间如果超过这个值,则会被强行中断。在罕è§çš„æƒ…况下,æŸäº›æ–‡æ¡£ï¼ˆä¾‹å¦‚postscript)会导致过滤器陷入死循环。设置æˆ-1以表示ä¸åŠ é™åˆ¶ã€‚

    
    
        External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit.

        工作时间长于这个值的外部过滤器会被中断。这是针对æŸç§ç‰¹æ®Šæƒ…况的,该情况下,一个文档å¯èƒ½å¼•起过滤器无é™å¾ªçŽ¯ä¸‹åŽ»ï¼ˆä¾‹å¦‚ï¼špostscript)。设置为-1则表示ä¸è®¾é™åˆ¶ã€‚

    
    
        Only mime types
        
    
    
        An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive
        
    
    
        Exclude mime types
        
    
    
        Mime types not to be indexed
        
    


    confgui::ConfTopPanelW
    
        Top directories
        顶级目录
    
    
        The list of directories where recursive indexing starts. Default: your home.
        索引从这个列表中的目录开始,递归地进行。默认:你的家目录。
    
    
        Skipped paths
        略过的路径
    
    
        These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        索引进程ä¸ä¼šè¿›å…¥å…·æœ‰è¿™äº›å字的目录。<br>å¯ä»¥åŒ…å«é€šé…符。必须匹é…索引进程自身所è§åˆ°çš„路径(例如:如果topdirs包å«'/home/me',而实际上'/home'是到'/usr/home'的链接,则正确的skippedPathæ¡ç›®åº”当是'/home/me/tmp*'ï¼Œè€Œä¸æ˜¯'/usr/home/me/tmp*')
    
    
        Stemming languages
        è¯æ ¹è¯­è¨€
    
    
        The languages for which stemming expansion<br>dictionaries will be built.
        将会针对这些语言<br>æž„é€ è¯æ ¹æ‰©å±•è¯å…¸ã€‚
    
    
        Log file name
        记录文件å
    
    
        The file where the messages will be written.<br>Use 'stderr' for terminal output
        程åºè¾“出的消æ¯ä¼šè¢«ä¿å­˜åˆ°è¿™ä¸ªæ–‡ä»¶ã€‚<br>使用'stderr'以表示将消æ¯è¾“出到终端
    
    
        Log verbosity level
        记录的è¯ç—¨çº§åˆ«
    
    
        This value adjusts the amount of messages,<br>from only errors to a lot of debugging data.
        这个值调整的是输出的消æ¯çš„æ•°é‡ï¼Œ<br>其级别从仅输出报错信æ¯åˆ°è¾“出一大堆调试信æ¯ã€‚
    
    
        Index flush megabytes interval
        刷新索引的间隔,兆字节
    
    
        This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB 
        è¿™ä¸ªå€¼è°ƒæ•´çš„æ˜¯ï¼Œå½“ç§¯ç´¯å’¯å¤šå°‘ç´¢å¼•æ•°æ®æ—¶ï¼Œæ‰å°†æ•°æ®åˆ·æ–°åˆ°ç¡¬ç›˜ä¸ŠåŽ»ã€‚<br>ç”¨æ¥æŽ§åˆ¶ç´¢å¼•è¿›ç¨‹çš„å†…å­˜å ç”¨æƒ…况。默认为10MB
    
    
        Max disk occupation (%)
        最大硬盘å ç”¨çŽ‡ï¼ˆ%)
    
    
        This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default).
        当硬盘的å ç”¨çŽ‡è¾¾åˆ°è¿™ä¸ªæ•°æ—¶ï¼Œç´¢å¼•ä¼šå¤±è´¥å¹¶ä¸”åœæ­¢ï¼ˆä»¥é¿å…塞满你的硬盘)。<br>设为0则表示ä¸åŠ é™åˆ¶ï¼ˆè¿™æ˜¯é»˜è®¤å€¼ï¼‰ã€‚
    
    
        No aspell usage
        ä¸ä½¿ç”¨aspell
    
    
        Aspell language
        Aspell语言
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        aspellè¯å…¸çš„è¯­è¨€ã€‚è¡¨ç¤ºæ–¹å¼æ˜¯'en'或'fr'……<br>如果ä¸è®¾ç½®è¿™ä¸ªå€¼ï¼Œåˆ™ä¼šä½¿ç”¨ç³»ç»ŸçŽ¯å¢ƒä¸­çš„è‡ªç„¶è¯­è¨€è®¾ç½®ä¿¡æ¯ï¼Œè€Œé‚£ä¸ªé€šå¸¸æ˜¯æ­£ç¡®çš„ã€‚è¦æƒ³æŸ¥çœ‹ä½ çš„系统中安装咯哪些语言的è¯ï¼Œå°±æ‰§è¡Œ'aspell config',å†åœ¨'data-dir'目录中找.dat文件。
    
    
        Database directory name
        æ•°æ®åº“目录å
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the  configuration directory. The default is 'xapiandb'.
        用æ¥å‚¨å­˜ç´¢å¼•æ•°æ®çš„目录的åå­—<br>如果使用相对路径,则路径会相对于é…置目录进行计算。默认值是'xapiandb'。
    
    
        Use system's 'file' command
        使用系统里的'file'命令
    
    
        Use the system's 'file' command if internal<br>mime type identification fails.
        当内部的文件类型识别功能失效时<br>使用系统里的'file'命令。
    
    
        Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. 
        ç¦æ­¢åœ¨è¯è¯­æŽ¢ç´¢å™¨ä¸­ä½¿ç”¨aspellæ¥ç”Ÿæˆæ‹¼å†™ç›¸è¿‘çš„è¯è¯­ã€‚<br>在没有安装aspellæˆ–è€…å®ƒå·¥ä½œä¸æ­£å¸¸æ—¶ä½¿ç”¨è¿™ä¸ªé€‰é¡¹ã€‚
    
    
        The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. 
        aspellè¯å…¸çš„è¯­è¨€ã€‚è¡¨ç¤ºæ–¹å¼æ˜¯'en'或'fr'……<br>如果ä¸è®¾ç½®è¿™ä¸ªå€¼ï¼Œåˆ™ä¼šä½¿ç”¨ç³»ç»ŸçŽ¯å¢ƒä¸­çš„è‡ªç„¶è¯­è¨€è®¾ç½®ä¿¡æ¯ï¼Œè€Œé‚£ä¸ªé€šå¸¸æ˜¯æ­£ç¡®çš„ã€‚è¦æƒ³æŸ¥çœ‹ä½ çš„系统中安装咯哪些语言的è¯ï¼Œå°±æ‰§è¡Œ'aspell config',å†åœ¨'data-dir'目录中找.dat文件。
    
    
        The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'.
        用æ¥å‚¨å­˜ç´¢å¼•æ•°æ®çš„目录的åå­—<br>如果使用相对路径,则路径会相对于é…置目录进行计算。默认值是'xapiandb'。
    
    
        Unac exceptions
        Unac例外
    
    
        <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation.
        <p>这是针对unac机制的例外,默认情况下,该机制会删除所有的判断信æ¯ï¼Œå¹¶è¿›è¡Œæ­£è§„的分解。妳å¯ä»¥æŒ‰ç…§è‡ªå·±çš„语言的特点针对æŸä¸ªå­—符覆盖掉å£éŸ³è§£é™¤è®¾ç½®ï¼Œä»¥åŠæŒ‡å®šé¢å¤–çš„åˆ†è§£ï¼ˆä¾‹å¦‚ï¼Œé’ˆå¯¹å¤æ•°ï¼‰ã€‚在æ¯ä¸ªç”±ç©ºæ ¼åˆ†éš”çš„æ¡ç›®ä¸­ï¼Œç¬¬ä¸€ä¸ªå­—符是æºå­—符,剩下的就是翻译。
    
    
        These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*')
        
    
    
        Max disk occupation (%, 0 means no limit)
        
    
    
        This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit.
        
    


    uiPrefsDialogBase
    
        User preferences
        用户选项
    
    
        User interface
        用户界é¢
    
    
        Number of entries in a result page
        一个结果页é¢ä¸­æ˜¾ç¤ºçš„ç»“æžœæ¡æ•°
    
    
        If checked, results with the same content under different names will only be shown once.
        å¦‚æžœé€‰ä¸­è¿™ä¸ªï¼Œåˆ™æ‹¥æœ‰ç›¸åŒæ–‡ä»¶å†…容的ä¸åŒæ–‡ä»¶ååªä¼šæ˜¾ç¤ºä¸€ä¸ªã€‚
    
    
        Hide duplicate results.
        éšè—é‡å¤ç»“果。
    
    
        Highlight color for query terms
        查询è¯è¯­çš„高亮颜色
    
    
        Result list font
        结果列表字体
    
    
        Opens a dialog to select the result list font
        æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©ç”¨äºŽç»“果列表的字体
    
    
        Helvetica-10
        文泉驿微米黑-12
    
    
        Resets the result list font to the system default
        将结果列表中的字体é‡è®¾ä¸ºç³»ç»Ÿé»˜è®¤å€¼
    
    
        Reset
        é‡ç½®
    
    
        Texts over this size will not be highlighted in preview (too slow).
        超过这个长度的文本ä¸ä¼šåœ¨é¢„览窗å£é‡Œé«˜äº®æ˜¾ç¤ºï¼ˆå¤ªæ…¢ï¼‰ã€‚
    
    
        Maximum text size highlighted for preview (megabytes)
        在预览中对其进行高亮显示的最大文本尺寸(兆字节)
    
    
        Use desktop preferences to choose document editor.
        使用桌é¢ç³»ç»Ÿçš„设置æ¥é€‰æ‹©æ–‡æ¡£ç¼–辑器。
    
    
        Choose editor applications
        选择编辑器程åº
    
    
        Display category filter as toolbar instead of button panel (needs restart).
        将文件类型过滤器显示æˆå·¥å…·æ¡ï¼Œè€Œä¸æ˜¯æŒ‰é’®é¢æ¿ï¼ˆéœ€è¦é‡å¯ç¨‹åºï¼‰ã€‚
    
    
        Auto-start simple search on whitespace entry.
        è¾“å…¥ç©ºæ ¼æ—¶è‡ªåŠ¨å¼€å§‹è¿›è¡Œç®€å•æœç´¢ã€‚
    
    
        Start with advanced search dialog open.
        å¯åŠ¨æ—¶æ‰“å¼€é«˜ç«¯æœç´¢å¯¹è¯æ¡†ã€‚
    
    
        Remember sort activation state.
        è®°ä½æŽ’åºçжæ€ã€‚
    
    
        Prefer Html to plain text for preview.
        预览中优先使用Html。
    
    
        Search parameters
        æœç´¢å‚æ•°
    
    
        Stemming language
        è¯æ ¹è¯­è¨€
    
    
        A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. 
This should give higher precedence to the results where the search terms appear exactly as entered.
        对[滚 石] (2个è¯è¯­)çš„æœç´¢ä¼šå˜æˆ[滚 or 石 or (滚 2个è¯è¯­ 石)]。
对于那些æœç´¢è¯è¯­åœ¨å…¶ä¸­æŒ‰ç…§åŽŸæ ·å‡ºçŽ°çš„ç»“æžœï¼Œå…¶ä¼˜å…ˆçº§ä¼šé«˜ä¸€äº›ã€‚
    
    
        Automatically add phrase to simple searches
        自动将è¯ç»„æ·»åŠ åˆ°ç®€å•æœç´¢ä¸­
    
    
        Do we try to build abstracts for result list entries by using the context of query terms ? 
May be slow for big documents.
        是å¦è¦ä½¿ç”¨æŸ¥è¯¢è¯è¯­å‘¨å›´çš„ä¸Šä¸‹æ–‡æ¥æž„造结果列表æ¡ç›®ä¸­çš„æ‘˜è¦ï¼Ÿ
对于大的文档å¯èƒ½ä¼šå¾ˆæ…¢ã€‚
    
    
        Dynamically build abstracts
        åŠ¨æ€æž„造摘è¦
    
    
        Do we synthetize an abstract even if the document seemed to have one?
        å³ä½¿æ–‡æ¡£æœ¬èº«æ‹¥æœ‰ä¸€ä¸ªæ‘˜è¦ï¼Œæˆ‘们ä»ç„¶è‡ªè¡Œåˆæˆæ‘˜è¦ä¿¡æ¯ï¼Ÿ
    
    
        Replace abstracts from documents
        å–代文档中自带的摘è¦
    
    
        Synthetic abstract size (characters)
        åˆæˆæ‘˜è¦é•¿åº¦ï¼ˆå­—符个数)
    
    
        Synthetic abstract context words
        åˆæˆæ‘˜è¦ä¸Šä¸‹æ–‡
    
    
        The words in the list will be automatically turned to ext:xxx clauses in the query language entry.
        这个列表中的è¯è¯­ä¼šåœ¨æŸ¥è¯¢è¯­è¨€è¾“å…¥æ¡†é‡Œè‡ªåŠ¨å˜æˆext:xxx语å¥ã€‚
    
    
        Query language magic file name suffixes.
        查询语言神奇文件ååŽç¼€ã€‚
    
    
        Enable
        å¯ç”¨
    
    
        External Indexes
        外部索引
    
    
        Toggle selected
        切æ¢é€‰ä¸­é¡¹
    
    
        Activate All
        全部激活
    
    
        Deactivate All
        全部ç¦ç”¨
    
    
        Remove from list. This has no effect on the disk index.
        从列表中删除。这ä¸ä¼šå¯¹ç¡¬ç›˜ä¸Šçš„ç´¢å¼•é€ æˆæŸå®³ã€‚
    
    
        Remove selected
        删除选中项
    
    
        Click to add another index directory to the list
        点击这里,以将å¦ä¸€ä¸ªç´¢å¼•目录添加到列表中
    
    
        Add index
        添加索引
    
    
        Apply changes
        使改å˜ç”Ÿæ•ˆ
    
    
        &OK
        确定(&O)
    
    
        Discard changes
        放弃这些改å˜
    
    
        &Cancel
        å–æ¶ˆï¼ˆ&C)
    
    
        Abstract snippet separator
        摘è¦ä¸­çš„片段的分隔符
    
    
        Style sheet
        æ ·å¼å•
    
    
        Opens a dialog to select the style sheet file
        æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©æ ·å¼å•文件
    
    
        Choose
        选择
    
    
        Resets the style sheet to default
        将样å¼å•é‡ç½®ä¸ºé»˜è®¤å€¼
    
    
        Lines in PRE text are not folded. Using BR loses some indentation.
        PRE中的文字ä¸ä¼šæ¢è¡Œã€‚使用BRçš„è¯ä¼šä½¿ä¸€äº›ç¼©è¿›å¤±æ•ˆã€‚
    
    
        Use <PRE> tags instead of <BR>to display plain text as html in preview.
        在将纯文本显示æˆhtml预览的时候,使用<PRE>æ ‡ç­¾ï¼Œè€Œä¸æ˜¯<BR>标签。
    
    
        Result List
        结果列表
    
    
        Edit result paragraph format string
        编辑结果段è½çš„æ ¼å¼å­—符串
    
    
        Edit result page html header insert
        编辑结果页é¢çš„html头部æ’入项
    
    
        Date format (strftime(3))
        日期格å¼ï¼ˆstrftime(3))
    
    
        Frequency percentage threshold over which we do not use terms inside autophrase. 
Frequent terms are a major performance issue with phrases. 
Skipped terms augment the phrase slack, and reduce the autophrase efficiency.
The default value is 2 (percent). 
        这是一个频率阈值,超过这个值的è¯ï¼Œæˆ‘们就ä¸ä¼šæŠŠè¯è¯­æ”¾åˆ°è‡ªåЍè¯ç»„中。
高频è¯è¯­æ˜¯è¯ç»„ä¸­æ€§èƒ½é—®é¢˜çš„ä¸»è¦æ¥æºã€‚
略过的è¯è¯­ä¼šå¢žåŠ è¯ç»„的空缺值,因此会é™ä½Žè‡ªåЍè¯ç»„功能的效率。
默认值是2(百分比)。
    
    
        Autophrase term frequency threshold percentage
        自动è¯ç»„频率阈值百分比
    
    
        Plain text to HTML line style
        纯文本转æ¢ä¸ºHTMLæ¢è¡Œç¬¦çš„风格
    
    
        Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want.
        PRE文本中的那些行是ä¸ä¼šè¢«æŠ˜å çš„。使用BR会丢失一些缩进信æ¯ã€‚PRE+æ¢è¡Œé£Žæ ¼å¯èƒ½æ‰æ˜¯å¦³æƒ³è¦çš„。
    
    
        <BR>
        <BR>
    
    
        <PRE>
        <PRE>
    
    
        <PRE> + wrap
        <PRE>+æ¢è¡Œ
    
    
        Disable Qt autocompletion in search entry.
        ç¦æ­¢åœ¨æŸ¥è¯¢è¾“入框中使用Qt的自动补全
    
    
        Search as you type.
        åœ¨è¾“å…¥çš„åŒæ—¶è¿›è¡Œæœç´¢ã€‚
    
    
        Paths translations
        è·¯å¾„å˜æ¢
    
    
        Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index.
        点击此处以å‘列表中加入å¦ä¸€ä¸ªç´¢å¼•目录。妳å¯ä»¥é€‰æ‹©ä¸€ä¸ªRecollé…置目录或一个Xapian索引。
    
    
        Snippets window CSS file
        片断窗å£çš„CSS文件
    
    
        Opens a dialog to select the Snippets window CSS style sheet file
        æ‰“å¼€ä¸€ä¸ªå¯¹è¯æ¡†ï¼Œä»¥é€‰æ‹©ç‰‡æ–­çª—å£çš„CSSæ ·å¼å•文件
    
    
        Resets the Snippets window style
        é‡ç½®ç‰‡æ–­çª—å£çš„æ ·å¼
    
    
        Decide if document filters are shown as radio buttons, toolbar combobox, or menu.
        
    
    
        Document filter choice style:
        
    
    
        Buttons Panel
        
    
    
        Toolbar Combobox
        
    
    
        Menu
        
    
    
        Show system tray icon.
        
    
    
        Close to tray instead of exiting.
        
    
    
        Start with simple search mode
        
    
    
        User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header.
        
    
    
        Synonyms file
        
    
    
        Show warning when opening temporary file.
        
    
    
        Highlight CSS style for query terms
        
    


recoll-1.23.7/qtgui/i18n/recoll_lt.qm0000644000175000017500000007750413224431020014237 00000000000000<¸dÊÍ!¿`¡½ÝBð+Ià-J
+;`RH, †H,>Œ¨¥4ULô6µLô@´f¾6߬Cz¬ôá¬ô+ÄEîrè$—9L'Hä8n*Ð%,ú*ì0-)+Lô
â1øÑ:Îd*JG…ÔpGß/¼H6óA°H6õAÝJ+‚bJ+‚;õJ6•ÚJ6•HwWTŠWÈÕ&BXÉÄqe®Úsºñ‰sºñ*‚v8“&sv®Âïv®Â*äzϳ€€£fT0œVºÍGuÐùƒ)ÅÐùƒCëÐùƒGìãnOEµ(˜0,…Vb>.côXM¹l`Þ^5„nÚ‹‘vãc…•ñ“¡¢‰Mþ£cê§ÎxCíÞñƒ§ó
L HþSI:ùÿµSf
çZp#vå7|w54w5:¼w5>¹w5EVŒUS©Ö³Cµª6•AB»f3-üͼulÓÐgžÐgž+
ì;U!(úUúeî‘¬v†&Ái0.‡N•?úd7ÇJUY"æJUY6,Y ôBkº™tfÊ—¥¶Ê—¥*­Ôä^jOÝôLeþìxUÅþA¢3&çÞ;ŽLƒH¯XË4$
€ã‡ ­˜I¼
˜I¼0™n•Ì™n•AŸf•E Ÿf•I¢Ÿf•eD«.Þ«<*Ú#i«ãX|J:
-Z
³-¼3Œ)ÖTqnB9€SêBìS?ôr?)4Ârž „kåž‹¦,2›‹ÜðB¼ŒÇ<.4›ˆ˜>
›ˆ˜@ߦAS:ªÃ¢&Ä·¨
8ø·¨
DÆ»œRB
Ç¢•æØ~C
XðŒµs`³2)"	>AUKôr%p
hc8–T#B—B“šKYê¦	%C¦öõĶ78ÄÖ[$ÓÊXÔDþ]ôCd©FW#>üF¯Ng”H:"ÊŒÍwhŒÏ—7n5“’žc⦚´+O²ð=Ót^Ót+…Ɇtv:uîmøQçÇO}}ì”ò“sÔ¨0ÎZÔÄ=ÌÌí³Í³7DÝÜ_Wäœc	üö¨åWúÃvÜ	´H,7	9Zy=l	K¨ó1b	]#—%°	ŸÁòå	­îQ	®œ¯f³	²9LÞ	ü>n 	äîo
Ücÿ
+<”X·
6 "³
`P#¾
`ç£
c·E0R
yÏ
˜Iœ`
¤žJ{
²ëC~
Äã6|
âæç/ï®/®ù/eTHŽÚPh¹°ŠéMq¨Î£0š»ïµ!ìÛ·å1ÌÛÓe~'И.„/¥$j97ßPÖ™¾RVŽ)T#JVüW„\iCpy`F¥	ÓÍ'JÚ÷C5Ýøìbèé—~jÒö†ÀAx
8þ`‡
FÁ#r
y·FÆ
y¹~ž
‚±3S
‡u;H
‡uE™
‰Pˆ
‰P)
5dm_
ÕH	^
û£Bé€j/¸._<Þu=Â-^G7ÒAJ›#6R„ÇÇbÙ,‹zc8§zcDo‚3.9°‚3.<\“ÝèEå›P¾
U¦Àè4ÆÀè)AɾäË6YNË“X,;IQá~oMY~s- [žs2Íg31Õ \	Â|“÷Â|“r‹ÎÁ'&òó
l+òü©ÜBü¶L„iw:Visos slygosAll clauses	AdvSearchBet kuri slyga
Any clause	AdvSearch
mediamedia	AdvSearchpraneaimasmessage	AdvSearchkitaother	AdvSearchprezentacijospresentation	AdvSearchskai
iuoklsspreadsheet	AdvSearchskai
iuoklsspreadsheets	AdvSearchtekstastext	AdvSearchtekstaitexts	AdvSearch<----- Visi
<----- All
AdvSearchBase<----- Pas
<----- Sel
AdvSearchBasePridti slyg
Add clause
AdvSearchBase"Iasamesn paieakaAdvanced search
AdvSearchBaseVisi ---->	All ---->
AdvSearchBaseüVisi kairje esantys netuati laukai bus sujungiami AND (visi) arba OR (bet kuris) pagalba. <br> "Bet kuris" "Visi" ir "Nei vienas" lauks tipai gali priimti paprasts ~od~is miain/ ir frazes pa~ymtas dvigubomis kabutmis. <br> Tuati laukeliai ignoruojami.All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. 
"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.
Fields with no data are ignored. AdvSearchBaseNaraytiBrowse AdvSearchBase"Pagal kategorijas By categories AdvSearchBase^Pa~ymti, jei norite filtruoti pagal byls tipus,Check this to enable filtering on file types AdvSearchBase~Pa~ymti, jei norite naudoti byls kategorijas vietoje mime tips;Check this to use file categories instead of raw mime types AdvSearchBaseU~darytiClose AdvSearchBaseIatrinti slyg Delete clause AdvSearchBase^.raaykite virautinio lygio direktorij paieakaiEnter top directory for search AdvSearchBase(Ignoruoti byls tipaiIgnored file types AdvSearchBase&Apriboti byls tipusRestrict file types AdvSearchBaseJPateikti rezultatus byloms submedyje:%Restrict results to files in subtree: AdvSearchBase2Iasaugoti kaip numatytj/Save as default AdvSearchBaseJIeakoti <br>dokuments<br>tenkinan is:'Search for
documents
satisfying: AdvSearchBase"Ieakota byls tipsSearched file types AdvSearchBasePas -----> Sel -----> AdvSearchBasePradti paieak Start Search AdvSearchBaseAtaauktiCancel EditTransBaseTNustatymuose nerandama duomens bazs bylos No db directory in configurationMain&Sekantis&NextPreview&Ankstesnis &PreviousPreview&Ieakoti: &Search for:PreviewZNepavyksta pervesti dokumento / vidin busen0Can't turn doc into internal representation for PreviewAtaauktiCancelPreviewIavalytiClearPreview"U~darykite ausel Close TabPreview6Kuriamas per~valgos tekstasCreating preview textPreviewR.keliamas / redaktoris per~valgos tekstas Loading preview text into editorPreview&Atitaikyti &Atvej/  Match &CasePreview:Trkksta pagalbins programos:Missing helper program: PreviewSpausdintiPrintPreviewTextEditBSpausdinti kaip matoma per~ikrojePrint Current PreviewPreviewTextEditRodyti laukus Show fieldsPreviewTextEdit0Rodyti pagrindin/ tekstShow main textPreviewTextEditP<b>Pritaikyti direktorijs<br> submed~iaiCustomised subtreesQObject~<i>Nurodyti parametrai taikomi arba visoms direktorijoms, arba subdirektorijoms,<br> jei kuri js priea tai pa~ymimos. Pridti ir iatrinti direktorijs vardus galite<br> spausdami +/- mygtukus.ãThe parameters that follow are set either at the top level, if nothing
or an empty line is selected in the listbox above, or for the selected subdirectory.
You can add or remove directories by clicking the +/- buttons.QObject2Sekti simbolines nuorodasFollow symbolic linksQObjectâIndeksavimo metu sekti simbolines nuorodas. Numatytasis elgesys yra nesekti, bandant iavengti dvigubo indeksavimoTFollow symbolic links while indexing. The default is no, to avoid duplicate indexingQObject&Globalks parametraiGlobal parametersQObject6Indeksuoti viss byls vardusIndex all file namesQObject´Indeksuoti byls, kuris turinio nepavyksta perskaityti, vardus. Numatytoji reikam: teisyb}Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default trueQObject$Lokalks parametraiLocal parametersQObject&Paieakos parametraiSearch parametersQObject"Ne/traukti vardai Skipped namesQObjectÀSubdirektorijs, kuriose dal/ parametrs reikia pakeisti, sraaas.<br> Numatytoji reikam: tua ia.sThe list of subdirectories in the indexed hierarchy
where some parameters need to be redefined. Default: empty.QObject~Byls arba direktorijs, kuris nedera indeksuoti, vards aablonai.LThese are patterns for file or directory names which should not be indexed.QObjectfAtidaryti &Aukatesnio lygio dokumentus/direktorijas&Open Parent document/folderQWidget&Per~ikra&PreviewQWidget&.raayti / byl&Write to FileQWidget,Kopijuoti &Bylos vardCopy &File NameQWidgetKopijuoti &URL Copy &URLQWidget4Rasti &panaaius dokumentusFind &similar documentsQWidgethPer~ikrti &Aukatesnio lygio dokumentus/direktorijasPreview P&arent document/folderQWidget.spjimasWarningRTIToolW(visos kalbos)(all languages)RclMain(no stemming) (no stemming)RclMainApie Recoll About RecollRclMainVisiAllRclMainDNepavyksta sukurti per~ikros langoCan't create preview windowRclMainxNepavyksta perskaityti dokumento arba sukurti laikinos bylos0Cannot extract document or create temporary fileRclMain€Nepavyksta iagauti ia duomens bazs informacijos apie dokument +Cannot retrieve document info from databaseRclMainU~daromaClosingRclMain$Dokuments istorijaDocument historyRclMainVykdoma: [ Executing: [RclMain$Istorijos duomenys History dataRclMainIndeksuojama:Indexing in progress: RclMain0indeksavimas pertrauktasIndexing interruptedRclMain6Trkksta pagalbinis programsMissing helper programsRclMain”Nustatymuose nenumatyta jokia iaorin per~ikros programa aiam mime tipui [-No external viewer configured for mime type [RclMain^Randamos visos reikalingos pagalbins programosNo helpers found missingRclMainIavalytiPurgeRclMain(U~klausos rezultatai Query resultsRclMain StemdbStemdbRclMain.Sustabdyti &IndeksavimStop &IndexingRclMainÊNurodyta per~ikros programa aiam mime tipui %1: %2 nerandama. Ar nortumete iaaaukti nustatyms lang?hThe viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ?RclMain8`i paieaka daugiau nevykdoma"This search is not active any moreRclMainNe~inomaUnknownRclMain&Atnaujinti &Indeks Update &IndexRclMain.spjimasWarningRclMainFerror retrieving stemming languages#error retrieving stemming languagesRclMainfiltruotasfilteredRclMain mediamediaRclMainpraneaimasmessageRclMainkitaotherRclMainprezentacijos presentationRclMainsurkaiuotasortedRclMainskai iuokls spreadsheetRclMaintekstastextRclMain&Apie Recoll &About Recoll RclMainBase$&Iasamesn Paieaka&Advanced Search RclMainBase8&Iatrinti dokuments istorij&Erase document history RclMainBase &Byla&File RclMainBase&Pagalba&Help RclMainBase&Nustatymai &Preferences RclMainBase,&Surkaiuoti parametrai&Sort parameters RclMainBase&.rankiai&Tools RclMainBase$&Vartotojo vadovas &User manual RclMainBase"Iasamesn PaieakaAdvanced/complex Search RclMainBase Ctrl+QCtrl+Q RclMainBase$Dokuments IstorijaDocument History RclMainBase&Dokuments &IstorijaDocument &History RclMainBaseI&aeitiE&xit RclMainBase.Iaorinis indekss langasExternal index dialog RclMainBasePirmas puslapis First page RclMainBaseBPereiti / pirm rezultats puslap/Go to first page of results RclMainBase"Sekantis puslapis Next page RclMainBase6Sekantis rezultats puslapisNext page of results RclMainBase0Priea tai buvs puslapis Previous page RclMainBase:Ankstesnis rezultats puslapisPrevious page of results RclMainBase RecollRecoll RclMainBase*Surkaiuoti parametrusSort parameters RclMainBase8Raktinis ~od~is &tyrintojasTerm &explorer RclMainBaseDRaktinis ~od~is tyrinjimo /rankisTerm explorer tool RclMainBase&Atnaujinti &Indeks Update &index RclMainBaseDataDate RecollModelBylos vardas File name RecollModel"(rodyti u~klaus) (show query)ResList><p><b>Nerasta rezultats</b><br>

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

Alternate spellings (accents suppressed): ResList$Dokuments istorijaDocument historyResListDokumentai DocumentsResList KitasNextResListAtidarytiOpenResListPer~ikraPreviewResListAnkstesnisPreviousResList"U~klausos detals Query detailsResList"Rezultats sraaas Result listResList.Neprieinamas dokumentasUnavailable documentResListia bentout of at leastResList,Visi raktiniai ~od~iai All termsSSearch0Bet kuris raktinis ~odisAny termSSearch8Netinkamai pateikta u~klausaBad query stringSSearchª ia /veskite paieakos raktinius ~od~ius. .raaykite ESC SPC raaomo termino u~baigimui.FEnter search terms here. Type ESC SPC for completions of current term.SSearchBylos vardas File nameSSearch&Nepakanka atminties Out of memorySSearchU~klauss kalbaQuery languageSSearch4Pasirinkite paieakos tip.Choose search type. SSearchBaseIavalytiClear SSearchBase Ctrl+SCtrl+S SSearchBaseª ia /veskite paieakos raktinius ~od~ius. .raaykite ESC SPC raaomo termino u~baigimui.FEnter search terms here. Type ESC SPC for completions of current term. SSearchBase.Iatrinti paieakos /raaErase search entry SSearchBaseSSearchBase SSearchBase SSearchBaseIeakotiSearch SSearchBase Pradti u~klaus Start query SSearchBaseVisiAll SearchClauseWBylos vardas File name SearchClauseWŽPapildoms ~od~is skai ius kurie gali interspersed with the chosen onesHNumber of additional words that may be interspersed with the chosen ones SearchClauseW`Pasirinkite u~klausos tip atliekam su ~od~iais>Select the type of query that will be performed with the words SearchClauseW KitasNextSnippetsIeakotiSearch SnippetsWNaraytiBrowseSpecIdxW&U~daryti&Close SpellBase&Iaplsti&Expand  SpellBase Alt+CAlt+C SpellBase Alt+EAlt+E SpellBase6Raktinis ~od~is tyrinjimas Term Explorer SpellBase$Nerasta prapltimsNo expansion foundSpellW RegexpRegexpSpellW Tarimas/FonetikaSpelling/PhoneticSpellWStem expansionStem expansionSpellWRaktinis ~odisTermSpellWWildcards WildcardsSpellWFerror retrieving stemming languages#error retrieving stemming languagesSpellW,Visi raktiniai ~od~iai All terms UIPrefsDialog0Bet kuris raktinis ~odisAny term UIPrefsDialogNaraytiChoose UIPrefsDialogBylos vardas File name UIPrefsDialogU~klauss kalbaQuery language UIPrefsDialog„Atrodo, jog pasirinkta direktorija nra Xapian indekso direktorija;The selected directory does not appear to be a Xapian index UIPrefsDialogZPasirinkta direktorija jau yra indekso sraae3The selected directory is already in the index list UIPrefsDialog8Pagrindinis/localus indekas!This is the main/local index! UIPrefsDialogFerror retrieving stemming languages#error retrieving stemming languages UIPrefsDialogU~darytiCloseViewActionBase8Sistemos per~ikros programosNative ViewersViewActionBaseDNepavyksta /raayti nustatyms bylosCan't write configuration fileconfgui::ConfIndexWNaraytiChooseconfgui::ConfParamFNW++confgui::ConfParamSLW--confgui::ConfParamSLWGlobalusGlobalconfgui::ConfSubPanelW”Jei vert nurodyta (nelgyi -1) tekstins bylos bus suskaidytos / nurodyto dyd~io bylas, kurios bus atskirai indeksuojamos. Naudinga atliekant paieak labai dideliose tekstinse bylose (pav. log bylose).¤If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files).confgui::ConfSubPanelWJDid~iausias suspausts byls dydis (KB)Max. compressed file size (KB)confgui::ConfSubPanelWHIlgiausias filtrs veikimo laikas (S)Max. filter exec. time (S)confgui::ConfSubPanelWLDid~iausias tekstins bylos dydis (MB)Max. text file size (MB)confgui::ConfSubPanelW4Tekstins bylos dydis (KB)Text file page size (KB)confgui::ConfSubPanelWLViraijus pasirinkt suspausts byls dyd/, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bkts indeksuojamos.‡This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever.confgui::ConfSubPanelWLViraijus pasirinkt tekstinis byls dyd/, jie nebus indeksuojami. Pasirinkite -1 jei nenorite nurodyti ribos, 0, jei nenorite, jog suspaustos bylos bkts indeksuojamos.›This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index.confgui::ConfSubPanelWAspell kalbaAspell languageconfgui::ConfTopPanelWBDuomens bazs direktorijos vardasDatabase directory nameconfgui::ConfTopPanelW*Nurodo nenaudoti aspell programos kuriant tarimo aproksimacijas raktinis ~od~is tyrinjimo /rankyje.<br>Naudinga, jei aspell neveikia arba ne/diegta.†Disables use of aspell to generate spelling approximation in the term explorer tool.
Useful if aspell is absent or does not work. confgui::ConfTopPanelWTIndekso dalis, /raaoms / disk, dydis (MB)Index flush megabytes intervalconfgui::ConfTopPanelW Log bylos vardas Log file nameconfgui::ConfTopPanelW&Log iasamumo lygmuoLog verbosity levelconfgui::ConfTopPanelW,Aspell nebus naudojamaNo aspell usageconfgui::ConfTopPanelWpDirektorijs, kuris turinys nein-<br>deksuojamas, sraaas Skipped pathsconfgui::ConfTopPanelWNKalbos naudojamos stemming<br> procesuiStemming languagesconfgui::ConfTopPanelW¸Byla, kurioje bus /raaomos ~inuts.<br>Naudokite 'stderr' nordami iavesti / terminalo langPThe file where the messages will be written.
Use 'stderr' for terminal outputconfgui::ConfTopPanelWvKalbos, kurioms bus sukurti stemming <br>expansion ~odynai.IThe languages for which stemming expansion
dictionaries will be built.confgui::ConfTopPanelW¾Direktorijs, kuriose pradedamas rekursinis indeksavimas, sraaas. Numatytoji: nams direktorija.LThe list of directories where recursive indexing starts. Default: your home.confgui::ConfTopPanelW4Vert nustato duomens, kurie indeksuojami tarp /raaymo / disk, apimt/.<br>Padeda valdyti indeksavimo dalies atminties naudojim. Numatyta vert yra 10 MBŒThis value adjust the amount of data which is indexed between flushes to disk.
This helps control the indexer memory usage. Default 10MB confgui::ConfTopPanelWÞVert nustato ~iniu is apimt/, nuo vien tik <br>klaids fiksavimo iki didels apimties duomens skirts debugging.ZThis value adjusts the amount of messages,
from only errors to a lot of debugging data.confgui::ConfTopPanelW‚Auka iausio lygmens direktorijos<br>kuriose vykdomas indeksavimasTop directoriesconfgui::ConfTopPanelW&Ataaukti&CanceluiPrefsDialogBase &Gerai&OKuiPrefsDialogBasejPaieaka bus pakeista (pav. rolling stones -> rolling or stones or (rolling phrase 2 stones)). Teikiama aiaki pirmenyb rezultatams kuriuose rasti raktiniai ~od~iai atitinka /vestus.ÑA search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered.uiPrefsDialogBaseVisus aktyvuoti Activate AlluiPrefsDialogBasePridti indeks Add indexuiPrefsDialogBase*Pritaikyti pakeitimus Apply changesuiPrefsDialogBasetPradti paprastj paieak /vedus tua io tarpelio simobl/.-Auto-start simple search on whitespace entry.uiPrefsDialogBaseJPridti prie paprastos paieakos fraz+Automatically add phrase to simple searchesuiPrefsDialogBaseNaraytiChooseuiPrefsDialogBase@Pasirinkite redaktoris programasChoose editor applicationsuiPrefsDialogBase"Visus deaktyvuotiDeactivate AlluiPrefsDialogBase*Panaikinti pakeitimusDiscard changesuiPrefsDialogBasevAr sukuriame dirbtin santrauk, jei dokumente jau ji yra? EDo we synthetize an abstract even if the document seemed to have one?uiPrefsDialogBaseüAr pabandome sukurti santraukas remdamiesi u~klauss raktinis ~od~is kontekstu? Didels apimties dokumentams gali ltai veikti.zDo we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents.uiPrefsDialogBase:Dinamiakai sukurti santraukasDynamically build abstractsuiPrefsDialogBase$Iaoriniai indeksaiExternal IndexesuiPrefsDialogBaseHelvetica-10 Helvetica-10uiPrefsDialogBaseFSlpti pasikartojan ius rezultatus.Hide duplicate results.uiPrefsDialogBase²Pa~ymjus, bus rodoma tik viena ia byls su tuo pa iu turiniu, ta iau skirtingais vardais.XIf checked, results with the same content under different names will only be shown once.uiPrefsDialogBasevDid~iausia teksto, pa~ymto per~ikrai, apimtis (megabaitai)5Maximum text size highlighted for preview (megabytes)uiPrefsDialogBaseD.raas skai ius rezultats puslapyje"Number of entries in a result pageuiPrefsDialogBaseFPasirinkite rezultats sraao arift-Opens a dialog to select the result list fontuiPrefsDialogBase\Pirmenyb teikti Html formatui per~ikros metu.&Prefer Html to plain text for preview.uiPrefsDialogBaseh.siminti rkaiavimo pasirinkimus (nedings perkrovus).Remember sort activation state.uiPrefsDialogBasetPaaalinti ia sraao. Neturi jokio poveikio indeksui diske.7Remove from list. This has no effect on the disk index.uiPrefsDialogBase&Pa~ymtus paaalintiRemove selecteduiPrefsDialogBaseRPakeisti dokumentuose randamas santraukas Replace abstracts from documentsuiPrefsDialogBase2Gra~inti numatytj formResetuiPrefsDialogBase`Gra~ina numatytj rezultats sraao srifto vert1Resets the result list font to the system defaultuiPrefsDialogBase0Rezultats sraao ariftasResult list fontuiPrefsDialogBase&Paieakos parametraiSearch parametersuiPrefsDialogBaseLPradti nuo iasamesns paieakos lango.'Start with advanced search dialog open.uiPrefsDialogBaseStemming kalbaStemming languageuiPrefsDialogBaseLDirbtins santraukos konteksto ~od~iai Synthetic abstract context wordsuiPrefsDialogBase\Dirbtins santraukos dydis (simbolis skai ius)$Synthetic abstract size (characters)uiPrefsDialogBase¦Tekstai viraijantys a/ dyd/ nebus nuspalvinami per~ikros metu (per didel apkrova).CTexts over this size will not be highlighted in preview (too slow).uiPrefsDialogBase6.jungti/Iajungti pasirinktToggle selecteduiPrefsDialogBase"Vartotoja aplinkaUser interfaceuiPrefsDialogBase(Vartotojo nustatymaiUser preferencesuiPrefsDialogBaserecoll-1.23.7/qtgui/i18n/recoll_uk.ts0000644000175000017500000041055113224431020014241 00000000000000 AdvSearch All clauses Ð’ÑÑ– Ð¿Ð¾Ð»Ñ Any clause Будь-Ñке поле texts текÑти spreadsheets таблиці presentations презентації media мультимедіа messages Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ other інше Bad multiplier suffix in size filter text текÑÑ‚ spreadsheet таблиці presentation презентації message Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ AdvSearchBase Advanced search Складний пошук Restrict file types Обмежити типи файлів Save as default Зберегти Ñк типові Searched file types Бажані All ----> Ð’ÑÑ– -----> Sel -----> Виб -----> <----- Sel <----- Виб <----- All <----- Ð’ÑÑ– Ignored file types Ігноровані Enter top directory for search Шукати тільки у каталозі Browse ПереглÑд Restrict results to files in subtree: Обмежити пошук по файлах з піддерева: Start Search Шукати Search for <br>documents<br>satisfying: Шукати<br>документи,</br>що задовільнÑють: Delete clause Прибрати поле Add clause Додати поле Check this to enable filtering on file types ВикориÑтовувати фільтрацію по типах файлів By categories По категоріÑÑ… Check this to use file categories instead of raw mime types ВикориÑтовувати категорії заміÑть типів MIME Close Закрити All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Ð’ÑÑ– непуÑті Ð¿Ð¾Ð»Ñ Ð±ÑƒÐ´Ðµ об'єднано за допомогою ÐБО ("уÑÑ– Ñлова") або ТР("будь-Ñкі Ñлова").<br>ÐŸÐ¾Ð»Ñ Ñ‚Ð¸Ð¿Ñƒ "будь-Ñкі Ñлова", "уÑÑ– Ñлова" та "без цих Ñлів" приймають Ñуміш Ñлів та фраз у подвійних лапках.<br>ÐŸÐ¾Ð»Ñ Ð±ÐµÐ· даних не берутьÑÑ Ð´Ð¾ уваги. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog EditTrans Source path Local path Config error Original path EditTransBase Path Translations Setting path translations for Select one or several file types, then use the controls in the frame below to change how they are processed Add Delete Cancel Відмінити Save FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration Ð’ конфігурації немає каталогу БД Could not open database in Ðе можу відкрити базу даних в . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. . ÐатиÑніть Відміна, Ñкщо бажаєте відредагувати конфіґурацію до початку індекÑуваннÑ, чи OK Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð²Ð¶ÐµÐ½Ð½Ñ. Configuration problem (dynconf Проблема конфігурації (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Preview &Search for: &Шукати: &Next &ÐаÑтупне &Previous &Попереднє Clear Стерти Match &Case &ЧутливіÑть до реєÑтру Cannot create temporary directory Ðе можу Ñтворити тимчаÑову теку Cancel Відмінити Creating preview text Створюю текÑÑ‚ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду Loading preview text into editor Завантажую текÑÑ‚ переглÑду в редактор Close Tab Закрити вкладку Missing helper program: Ðе знайдено допоміжну програму: Can't turn doc into internal representation for Ðеможливо перетворити документ на внутрішнє предÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð½Ñ Ð´Ð»Ñ Error while loading file PreviewTextEdit Show fields Показувати Ð¿Ð¾Ð»Ñ Show main text Показувати оÑновний текÑÑ‚ Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Загальні параметри Local parameters МіÑцеві параметри <b>Customised subtrees <b>Піддерева з налаштуваннÑми The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. СпиÑок тек у індекÑованій ієрархії,<br>Ð´Ð»Ñ Ñких деÑкі параметри потрібно змінити. Типово: пуÑтий. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>Ðижченаведені параметри змінюютьÑÑ Ð°Ð±Ð¾ на верхньому рівні, Ñкщо<br>не вибрано нічого або пуÑтий Ñ€Ñдок, або Ð´Ð»Ñ Ð²Ð¸Ð±Ñ€Ð°Ð½Ð¾Ñ— теки.<br>Ви можете додати або прибрати теки кнопками +/-. Skipped names ПропуÑкати назви These are patterns for file or directory names which should not be indexed. Шаблони назв файлів або тек, Ñкі не буде індекÑовано. Default character set Типове ÐºÐ¾Ð´ÑƒÐ²Ð°Ð½Ð½Ñ This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. КодуваннÑ, Ñке буде заÑтоÑовано при читанні файлів, Ñкі не вказують таке оÑобливо (наприклад, чиÑто текÑтових файлів).<br>Типово невказане, тоді викориÑтовуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð· Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ (локалі). Follow symbolic links Розкривати Ñимволічні поÑÐ¸Ð»Ð°Ð½Ð½Ñ Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Ходити по Ñимлінках при індекÑації. Типово "ні" Ð´Ð»Ñ ÑƒÐ½Ð¸ÐºÐ½ÐµÐ½Ð½Ñ Ð´ÑƒÐ±Ð»Ñ–ÐºÐ°Ñ‚Ñ–Ð² Index all file names ІндекÑувати вÑÑ– назви файлів Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true ІндекÑувати також назви файлів, вміÑÑ‚ Ñких не може бути впізнано чи оброблено (невідомий або непідтримуваний тип MIME). Типово "так" Search parameters Параметри пошуку Web history Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &ПереглÑнути &Open Open With Run Script Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL &Write to File Save selection to files Preview P&arent document/folder &Open Parent document/folder Find &similar documents Знайти &Ñхожі документи Open &Snippets window Show subdocuments / attachments QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain Indexing in progress: ІндекÑуєтьÑÑ: Query results Результати запиту Cannot retrieve document info from database Ðе можу здобути документ з бази даних Warning ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð¶ÐµÐ½Ð½Ñ Can't create preview window Ðе можу Ñтворити вікно переглÑду Executing: [ Виконую: [ About Recoll Про Recoll Document history ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² History data Дані Ñ–Ñторії Files Файли Purge ОчиÑтити Stemdb База коренів Closing Закриваю Unknown Ðевідомо This search is not active any more Цей пошук вже неактивний Bad viewer command line for %1: [%2] Please check the mimeconf file Ðевірний командний Ñ€Ñдок Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñдача %1: [%2] Перевірте файл mimeconf Cannot extract document or create temporary file Ðеможливо здобути документ чи Ñтворити тимчаÑовий файл (no stemming) (без Ñловоформ) (all languages) (вÑÑ– мови) error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов Update &Index Поновити &Ñ–Ð½Ð´ÐµÐºÑ Indexing interrupted ІндекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÑ€Ð²Ð°Ð½Ð¾ Stop &Indexing Пе&рервати індекÑÑƒÐ²Ð°Ð½Ð½Ñ Can't start query: Ðеможливо почати запит: All вÑÑ– media медіа message Ð¿Ð¾Ð²Ñ–Ð´Ð¾Ð¼Ð»ÐµÐ½Ð½Ñ other інше presentation презентації spreadsheet таблиці text текÑÑ‚ sorted Ñортоване filtered фільтроване External applications/commands needed and not found for indexing your file types: ВідÑутні зовнішні додатки/команди, що потрібні Ð´Ð»Ñ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ Ð²Ð°ÑˆÐ¸Ñ… документів: No helpers found missing Ð’ÑÑ– додаткові програми наÑвні Missing helper programs ВідÑутні додаткові програми Save file dialog Зберегти файл Choose a file name to save under Оберіть ім'Ñ Ñ„Ð°Ð¹Ð»Ð° Ð´Ð»Ñ Ð·Ð±ÐµÑ€ÐµÐ¶ÐµÐ½Ð½Ñ No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Деталі запиту Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index query error Content has been indexed for these mime types: Can't update index: indexer running Indexed MIME Types Bad viewer command line for %1: [%2] Please check the mimeview file Viewer command line for %1 specifies both file and parent file value: unsupported Cannot find parent document Indexing did not run yet External applications/commands needed for your file types and not found, as stored by the last indexing pass in Sub-documents and attachments Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents These Urls ( | ipath) share the same content: Bad desktop app spec for %1: [%2] Please check the desktop file The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll Recoll &File &Файл &Tools &ІнÑтрументи &Preferences &ÐÐ°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ &Help &Довідка Search tools ІнÑтрументи пошуку Result list СпиÑок результатів E&xit &Вихід Ctrl+Q Ctrl+Q &About Recoll Про &Recoll &User manual &Довідник кориÑтувача Document &History &ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² Document History ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² &Advanced Search &Складний пошук Advanced/complex Search Складний (поглиблений) пошук &Sort parameters &Параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Sort parameters Параметри ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Next page ÐаÑтупна Ñторінка Next page of results ÐаÑтупна Ñторінка результатів Previous page ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка Previous page of results ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Ñторінка результатів &Query configuration ÐšÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ &запиту Update &index &Поновити Ñ–Ð½Ð´ÐµÐºÑ Term &explorer &Ðавіґатор термінів Term explorer tool ІнÑтрумент Ð´Ð»Ñ Ð²Ð¸Ð²Ñ‡Ð°Ð½Ð½Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ñ–Ð² External index dialog Діалог зовнішнього індекÑу &Erase document history &ОчиÑтити Ñ–Ñторію документів First page Перша Ñторінка Go to first page of results Перейти до першої Ñторінки результатів &Indexing configuration &ÐšÐ¾Ð½Ñ„Ñ–Ò‘ÑƒÑ€Ð°Ñ†Ñ–Ñ Ñ–Ð½Ð´ÐµÐºÑÑƒÐ²Ð°Ð½Ð½Ñ All вÑÑ– &Show missing helpers ВідÑутні програми PgDown PgUp &Full Screen F11 Full Screen &Erase search history Sort by dates from oldest to newest Sort by dates from newest to oldest Show Query Details &Rebuild index Shift+PgUp E&xternal index dialog &Index configuration &GUI configuration &Results Sort by date, oldest first Sort by date, newest first Show as table Show results in a spreadsheet-like table Save as CSV (spreadsheet) file Saves the result into a file which you can load in a spreadsheet Next Page Previous Page First Page Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Mime type Тип MIME Date Дата Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list СпиÑок результатів Unavailable document Документ недоÑÑжний Previous ÐŸÐ¾Ð¿ÐµÑ€ÐµÐ´Ð½Ñ Next ÐаÑтупна <p><b>No results found</b><br> <p><b>Ðе знайдено</b><br> &Preview &ПереглÑнути Find &similar documents Знайти &Ñхожі документи Query details Деталі запиту (show query) (показати запит) Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL filtered фільтроване sorted Ñортоване Document history ІÑÑ‚Ð¾Ñ€Ñ–Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ñ–Ð² Preview ПереглÑд Open Відкрити <p><i>Alternate spellings (accents suppressed): </i> Documents Документи out of at least з принаймні for по <p><i>Alternate spellings: </i> Result count (est.) Snippets ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &ПереглÑнути Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL Find &similar documents Знайти &Ñхожі документи &Save as CSV Add "%1" column ResTableDetailArea &Preview &ПереглÑнути Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL Find &similar documents Знайти &Ñхожі документи ResultPopup &Preview &ПереглÑнути Copy &File Name Копіювати &назву файла Copy &URL Копіювати &URL Find &similar documents Знайти &Ñхожі документи SSearch Any term Будь-Ñке Ñлово All terms УÑÑ– Ñлова File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Completions Ð”Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Select an item: Оберіть: Too many completions Занадто багато доповнень Query language Мова запиту Bad query string Ðевірний Ñ€Ñдок запиту Out of memory ÐедоÑтатньо пам'Ñті Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Введіть пошукові Ñлова. Можна викориÑтовувати Esc-пробіл Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear Стерти Ctrl+S Ctrl+S Erase search entry Стерти вміÑÑ‚ Ñ€Ñдка запита Search Знайти Start query Почати запит Enter search terms here. Type ESC SPC for completions of current term. Введіть пошукові Ñлова. Можна викориÑтовувати Esc-пробіл Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ. Choose search type. Оберіть тип пошуку. SearchClauseW Any of these будь-Ñкі Ñлова All of these уÑÑ– Ñлова None of these без цих Ñлів This phrase фраза Terms in proximity Ñлова поблизу File name matching назва файлу Select the type of query that will be performed with the words Виберіть тип запиту, Ñкий буде зроблено по цих Ñловах Number of additional words that may be interspersed with the chosen ones КількіÑть додаткових Ñлів, що можуть бути між обраними No field Any All вÑÑ– None Phrase Proximity File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Snippets Snippets Find: Next ÐаÑтупна Prev SnippetsW Search Знайти <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SortForm Date Дата Mime type Тип MIME SortFormBase Sort Criteria Критерії ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Sort the Сортувати most relevant results by: кращих результатів за: Descending ÑпаданнÑм Close Закрити Apply ЗаÑтоÑувати SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse ПереглÑд Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer Ðавіґатор термінів &Expand &Розкрити Alt+E &Close &Закрити Alt+C Alt+C Term Слово No db info. Match Case Accents SpellW Wildcards Шаблони Regexp Регвираз Spelling/Phonetic ÐапиÑ/Ð·Ð²ÑƒÑ‡Ð°Ð½Ð½Ñ Aspell init failed. Aspell not installed? Ðе вдалоÑÑ Ð·Ð°Ð¿ÑƒÑтити aspell. Воно взагалі вÑтановлене? Aspell expansion error. Помилка Ñ€Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ aspell. Stem expansion Ð Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñловоформ error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов No expansion found Ð Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ð½Ðµ знайдене Term Слово Doc. / Tot. Index: %1 documents, average length %2 terms.%3 results %1 results List was truncated alphabetically, some frequent terms may be missing. Try using a longer root. Show index statistics Number of documents Average terms per document Database directory size MIME types: Item Value Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog The selected directory does not appear to be a Xapian index Обрана тека не Ñхожа на Ñ–Ð½Ð´ÐµÐºÑ Xapian This is the main/local index! Це оÑновний/локальний індекÑ! The selected directory is already in the index list Обрана тека вже у ÑпиÑку індекÑів Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Оберіть теку із індекÑом Xapian (наприклад, /home/приÑтель/.recoll/xapiandb) error retrieving stemming languages помилка Ð·Ð´Ð¾Ð±ÑƒÐ²Ð°Ð½Ð½Ñ ÑпиÑку мов Choose ПереглÑд Result list paragraph format (erase all to reset to default) Result list header (default is empty) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read At most one index should be selected Cant add index with different case/diacritics stripping option Default QtWebkit font Any term Будь-Ñке Ñлово All terms УÑÑ– Ñлова File name Ім'Ñ Ñ„Ð°Ð¹Ð»Ñƒ Query language Мова запиту Value from previous program exit UIPrefsDialogBase User interface Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КількіÑть результатів на Ñторінку Result list font Шрифт ÑпиÑку результатів Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Відкриває діалог вибору шрифту ÑпиÑку результатів Reset Скинути Resets the result list font to the system default Повертає шрифт у типовий ÑиÑтемний Auto-start simple search on whitespace entry. Починати проÑтий пошук при введенні пробілу. Start with advanced search dialog open. Відкривати діалог Ñкладного пошуку при Ñтарті. Start with sort dialog open. Відкривати діалог ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ Ñтарті. Search parameters Параметри пошуку Stemming language Мова Ñловоформ Dynamically build abstracts Динамічно будувати конÑпекти Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Чи намагатиÑÑ Ð±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ конÑпекти Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² пошуку, викориÑтовуючі контекÑÑ‚ знайдених Ñлів? Може працювати повільно Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… документів. Replace abstracts from documents ЗамінÑти наÑвні у документах конÑпекти Do we synthetize an abstract even if the document seemed to have one? Чи робити новий конÑпект, навіть Ñкщо ÑкийÑÑŒ вже Ñ” в документі? Synthetic abstract size (characters) Розмір Ñинтетичного конÑпекту (у Ñимволах) Synthetic abstract context words КонтекÑтних Ñлів у конÑпекті External Indexes Зовнішні індекÑи Add index Додати Ñ–Ð½Ð´ÐµÐºÑ Select the xapiandb directory for the index you want to add, then click Add Index Оберіть потрібну теку із індекÑом Xapian та натиÑніть "Додати індекÑ" Browse ПереглÑд &OK &OK Apply changes ЗаÑтоÑувати зміни &Cancel &Відміна Discard changes Відмінити зміни Result paragraph<br>format string РÑдок форматуваннÑ<br>блоку результатів Automatically add phrase to simple searches Ðвтоматично додавати фразу до проÑтих пошуків A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Пошук [rolling stones] (2 Ñлова) буде змінено на [rolling or stones or (rolling phrase 2 stones)]. Це може піднÑти результати, в Ñких пошукові Ñлова зуÑтрічаютьÑÑ Ñаме в такій поÑлідовноÑті, Ñк в запиті. User preferences Ð’Ð¿Ð¾Ð´Ð¾Ð±Ð°Ð½Ð½Ñ Use desktop preferences to choose document editor. ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑктопу щодо редактору документів. External indexes Зовнішні індекÑи Toggle selected Переключити вибране Activate All Включити вÑе Remove selected Видалити вибране Remove from list. This has no effect on the disk index. Видалити зі ÑпиÑку. Ðе впливає на диÑковий індекÑ. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Визначає формат Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ блоку ÑпиÑку результатів. ВикориÑтовуйте html-формат qt та Ñхожі на printf заміни:<br>%A анотаціÑ<br> %D дата<br> %I назва піктограми<br> %K ключові Ñлова (Ñкщо Ñ”)<br> %L поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду та редагуваннÑ<br> %M тип MIME<br> %N кількіÑть результатів<br> %R релевантніÑть<br> %S розмір<br> %T назва<br> %U URL<br> Remember sort activation state. Запам'Ñтати Ñтан ÑортуваннÑ. Maximum text size highlighted for preview (megabytes) МакÑимальний розмір текÑту із підÑвічуваннÑм (Мб) Texts over this size will not be highlighted in preview (too slow). ТекÑти із розміром, більшим за вказаний, не буде підÑвічено у попередньому переглÑді (повільно). Highlight color for query terms Колір Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів Deactivate All Виключити вÑе Prefer Html to plain text for preview. Віддавати перевагу HTML над текÑтом Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду. If checked, results with the same content under different names will only be shown once. Якщо увімкнене, результати Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñамим зміÑтом та різними назвами буде показано не більше одного разу. Hide duplicate results. Ховати дублікати Choose editor applications Оберіть редактори ViewAction Changing actions with different current values Зміна дій із різними поточними значеннÑми Mime type Тип MIME Command MIME type Desktop Default Changing entries with different current values ViewActionBase File type Тип файлу Action Ð”Ñ–Ñ Select one or several file types, then click Change Action to modify the program used to open them Оберіть один або декілька типів файлів, потім натиÑніть "Змінити дію", щоб змінити програму Ð´Ð»Ñ Ð½Ð¸Ñ… Change Action Змінити дію Close Закрити Native Viewers Рідні переглÑдачі Select one or several mime types then use the controls in the bottom frame to change how they are processed. Use Desktop preferences by default Select one or several file types, then use the controls in the frame below to change how they are processed Exception to Desktop preferences Action (empty -> recoll default) Apply to current selection Recoll action: current value Select same <b>New Values:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) Process the WEB history queue Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file Ðеможливо запиÑати файл конфіґурації confgui::ConfParamFNW Browse ПереглÑд Choose ПереглÑд confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. Automatic character case sensitivity <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. Maximum term expansion count <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. Maximum Xapian clauses count <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. confgui::ConfSubPanelW Global Глобальні Max. compressed file size (KB) Межа розміру ÑтиÑнених файлів (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Це Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð²Ñтановлює поріг розміру ÑтиÑнених файлів, більші за нього не буде опрацьовано. -1 вимикає ліміт, 0 вимикає декомпреÑÑ–ÑŽ. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories Верхні теки The list of directories where recursive indexing starts. Default: your home. СпиÑок тек, з Ñких починаєтьÑÑ Ñ€ÐµÐºÑƒÑ€Ñивне індекÑуваннÑ. Типово: Ð´Ð¾Ð¼Ð°ÑˆÐ½Ñ Ñ‚ÐµÐºÐ°. Skipped paths ПропуÑкати шлÑхи Stemming languages Мови зі Ñловоформами The languages for which stemming expansion<br>dictionaries will be built. Мови, Ð´Ð»Ñ Ñких буде побудовано<br>Ñловники Ñ€Ð¾Ð·ÐºÑ€Ð¸Ñ‚Ñ‚Ñ Ñловоформ. Log file name Файл журналу The file where the messages will be written.<br>Use 'stderr' for terminal output Файл, куди підуть повідомленнÑ.<br>'stderr' Ð´Ð»Ñ Ñ‚ÐµÑ€Ð¼Ñ–Ð½Ð°Ð»Ñƒ Log verbosity level ДокладніÑть журналу This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Ð’Ñтановити обÑÑг повідомлень,<br>від помилок до даних зневадженнÑ. Index flush megabytes interval Інтервал ÑÐºÐ¸Ð´Ð°Ð½Ð½Ñ Ñ–Ð½Ð´ÐµÐºÑу (Мб) Max disk occupation (%) МакÑимальне викориÑÑ‚Ð°Ð½Ð½Ñ Ð´Ð¸Ñку (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). ВідÑоток зайнÑтого диÑку, коли індекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð±ÑƒÐ´Ðµ зупинено (щоб уникнути Ð·Ð°Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð´Ð¾Ñтупного проÑтору).<br>Типово: 0 (без ліміту). No aspell usage Ðе викориÑтовувати aspell Aspell language Мова aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Мова Ñловника aspell. Має виглÑдати Ñк 'en' або 'uk'...<br>Якщо не вÑтановлене, буде викориÑтане Ð¾Ñ‚Ð¾Ñ‡ÐµÐ½Ð½Ñ (локаль), що зазвичай робить. Щоб з'ÑÑувати, що маємо на ÑиÑтемі, наберіть 'aspell config' та переглÑньте файли .dat у теці 'data-dir'. Database directory name Тека бази даних The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Ðазва теки, де міÑтитьÑÑ Ñ–Ð½Ð´ÐµÐºÑ<br>ВідноÑний шлÑÑ… буде трактовано відноÑно теки конфіґурації. Типово: 'xapiandb'. Use system's 'file' command ВикориÑтовувати ÑиÑтемну 'file' Use the system's 'file' command if internal<br>mime type identification fails. ВикориÑтовувати команду 'file' з ÑиÑтеми, коли внутрішнє<br>Ð²Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ñƒ MIME дає збій. These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Це назви тек, у Ñкі індекÑÑƒÐ²Ð°Ð½Ð½Ñ Ð½Ðµ потрапить.<br> Може міÑтити шаблони. Має Ñпівпадати із шлÑхами, що бачить індекÑатор (наприклад, Ñкщо topdirs міÑтить '/home/me' та '/home' Ñ” поÑиланнÑм на '/usr/home', то вірний Ð·Ð°Ð¿Ð¸Ñ Ð±ÑƒÐ´Ðµ '/home/me/tmp*', а не '/usr/home/me/tmp*') This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Скільки даних буде проіндекÑовано між ÑкиданнÑми індекÑу на диÑк.<br>Допомагає контролювати викориÑÑ‚Ð°Ð½Ð½Ñ Ð¿Ð°Ð¼'Ñті індекÑатором. Типово: 10Мб Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Вимикає викориÑÑ‚Ð°Ð½Ð½Ñ aspell Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ñ–Ñ— наближень у напиÑÐ°Ð½Ð½Ñ Ð² навіґаторі термінів.<br>КориÑне, коли aspell відÑутній або зламаний. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Unac exceptions <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Ð’Ð¿Ð¾Ð´Ð¾Ð±Ð°Ð½Ð½Ñ User interface Ð†Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Number of entries in a result page КількіÑть результатів на Ñторінку If checked, results with the same content under different names will only be shown once. Якщо увімкнене, результати Ñ Ñ‚Ð°ÐºÐ¸Ð¼ Ñамим зміÑтом та різними назвами буде показано не більше одного разу. Hide duplicate results. Ховати дублікати Highlight color for query terms Колір Ð²Ð¸Ð´Ñ–Ð»ÐµÐ½Ð½Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð²Ð¸Ñ… Ñлів Result list font Шрифт ÑпиÑку результатів Opens a dialog to select the result list font Відкриває діалог вибору шрифту ÑпиÑку результатів Helvetica-10 Helvetica-10 Resets the result list font to the system default Повертає шрифт у типовий ÑиÑтемний Reset Скинути Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Визначає формат Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ блоку ÑпиÑку результатів. ВикориÑтовуйте html-формат qt та Ñхожі на printf заміни:<br>%A анотаціÑ<br> %D дата<br> %I назва піктограми<br> %K ключові Ñлова (Ñкщо Ñ”)<br> %L поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду та редагуваннÑ<br> %M тип MIME<br> %N кількіÑть результатів<br> %R релевантніÑть<br> %S розмір<br> %T назва<br> %U URL<br> Result paragraph<br>format string РÑдок форматуваннÑ<br>блоку результатів Texts over this size will not be highlighted in preview (too slow). ТекÑти із розміром, більшим за вказаний, не буде підÑвічено у попередньому переглÑді (повільно). Maximum text size highlighted for preview (megabytes) МакÑимальний розмір текÑту із підÑвічуваннÑм (Мб) Use desktop preferences to choose document editor. ВикориÑтовувати Ð½Ð°Ð»Ð°ÑˆÑ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð´ÐµÑктопу щодо редактору документів. Choose editor applications Оберіть редактори Auto-start simple search on whitespace entry. Починати проÑтий пошук при введенні пробілу. Start with advanced search dialog open. Відкривати діалог Ñкладного пошуку при Ñтарті. Start with sort dialog open. Відкривати діалог ÑÐ¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ Ð¿Ñ€Ð¸ Ñтарті. Remember sort activation state. Запам'Ñтати Ñтан ÑортуваннÑ. Prefer Html to plain text for preview. Віддавати перевагу HTML над текÑтом Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду. Search parameters Параметри пошуку Stemming language Мова Ñловоформ A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Пошук [rolling stones] (2 Ñлова) буде змінено на [rolling or stones or (rolling phrase 2 stones)]. Це може піднÑти результати, в Ñких пошукові Ñлова зуÑтрічаютьÑÑ Ñаме в такій поÑлідовноÑті, Ñк в запиті. Automatically add phrase to simple searches Ðвтоматично додавати фразу до проÑтих пошуків Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Чи намагатиÑÑ Ð±ÑƒÐ´ÑƒÐ²Ð°Ñ‚Ð¸ конÑпекти Ð´Ð»Ñ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚Ñ–Ð² пошуку, викориÑтовуючі контекÑÑ‚ знайдених Ñлів? Може працювати повільно Ð´Ð»Ñ Ð²ÐµÐ»Ð¸ÐºÐ¸Ñ… документів. Dynamically build abstracts Динамічно будувати конÑпекти Do we synthetize an abstract even if the document seemed to have one? Чи робити новий конÑпект, навіть Ñкщо ÑкийÑÑŒ вже Ñ” в документі? Replace abstracts from documents ЗамінÑти наÑвні у документах конÑпекти Synthetic abstract size (characters) Розмір Ñинтетичного конÑпекту (у Ñимволах) Synthetic abstract context words КонтекÑтних Ñлів у конÑпекті The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Зовнішні індекÑи Toggle selected Переключити вибране Activate All Включити вÑе Deactivate All Виключити вÑе Remove from list. This has no effect on the disk index. Видалити зі ÑпиÑку. Ðе впливає на диÑковий індекÑ. Remove selected Видалити вибране Add index Додати Ñ–Ð½Ð´ÐµÐºÑ Apply changes ЗаÑтоÑувати зміни &OK &OK Discard changes Відмінити зміни &Cancel &Відміна Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose ПереглÑд Resets the style sheet to default Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage Plain text to HTML line style Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. <BR> <PRE> <PRE> + wrap Disable Qt autocompletion in search entry. Search as you type. Paths translations Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Snippets window CSS file Opens a dialog to select the Snippets window CSS style sheet file Resets the Snippets window style Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_da.ts0000644000175000017500000037167513224431020014223 00000000000000 AdvSearch All clauses Alle sætninger Any clause VilkÃ¥rlig sætning media medier other andet Bad multiplier suffix in size filter Forkert multiplikator suffiks i størrelsefilter text tekst spreadsheet regneark presentation præsentation message besked texts tekster spreadsheets regneark AdvSearchBase Advanced search Avanceret søgning Search for <br>documents<br>satisfying: Søg efter <br>dokumenter<br>der opfylder: Delete clause Slet sætning Add clause Tilføj sætning Restrict file types Begræns filtyper Check this to enable filtering on file types Afkryds dette for at aktivere filtrering pÃ¥ filtyper By categories Efter kategorier Check this to use file categories instead of raw mime types Afkryds dette for at bruge filkategorier i stedet for rÃ¥ mime-typer Save as default Gem som standard Searched file types Søgte filtyper All ----> Alle ----> Sel -----> Valg -----> <----- Sel <----- Valg <----- All <----- Alle Ignored file types Ignorerede filtyper Enter top directory for search Indtast øverste mappe for søgning Browse Gennemse Restrict results to files in subtree: Begræns resultater til filer i undermapper: Start Search Start søgning Close Luk All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Alle felter med indhold til højre vil blive kombineret med AND ("Alle sætninger" valgt) eller OR ("VilkÃ¥rlig sætning" valgt) bindeord. <br>"Enhver" "Alle" og "Ingen" felttyper kan acceptere en blanding af simple ord, og fraser i dobbelte anførselstegn.<br>Felter uden data ignoreres. Invert Inverter Minimum size. You can use k/K,m/M,g/G as multipliers Mindste størrelse. Du kan bruge k/K,m/M,g/G som multiplikatorer Min. Size Min. størrelse Maximum size. You can use k/K,m/M,g/G as multipliers Maksimal størrelse. Du kan bruge k/K,m/M g/G som multiplikatorer Max. Size Maks. størrelse Filter Filter From Fra To Til Check this to enable filtering on dates Afkryds dette for at aktivere filtrering pÃ¥ datoer Filter dates Filtrer datoer Find Find Check this to enable filtering on sizes Afkryds dette for at aktivere filtrering pÃ¥ størrelser Filter sizes Filtrer størrelser CronToolW Cron Dialog Cron vindue <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indekseringstidsplan (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hvert felt kan indeholde et jokertegn (*), en enkelt numerisk værdi, kommaseparerede lister (1,3,5) og intervaller (1-7). Mere generelt vil felterne blive brugt <span style=" font-style:italic;"> som de er</span> inde i crontabfilen, og den fulde crontab syntaks kan bruges, se crontab (5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For eksempel, indtastning af <span style=" font-family:'Courier New,courier';">*</span> i <span style=" font-style:italic;">Dage, </span><span style=" font-family:'Courier New,courier';">12,19</span> i <span style=" font-style:italic;">Timer</span> og <span style=" font-family:'Courier New,courier';">15</span> i <span style=" font-style:italic;">Minutter</span> ville starte recollindex hver dag kl. 00:15 og 19:15 </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En tidsplan med meget hyppige aktiveringer er formentlig mindre effektiv end realtid indeksering.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Ugens dage (* eller 0-7, 0 eller 7 er Søndag) Hours (* or 0-23) Timer (* eller 0-23) Minutes (0-59) Minutter (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Deaktiver</span> for at stoppe automatisk batch indeksering, <span style=" font-style:italic;">Aktiver</span> for at aktivere den, <span style=" font-style:italic;">Annuller</span> for ikke at ændre noget.</p></body></html> Enable Aktiver Disable Deaktiver It seems that manually edited entries exist for recollindex, cannot edit crontab Det ser ud til, at manuelt redigerede indgange findes for recollindeks, kan ikke redigere crontab Error installing cron entry. Bad syntax in fields ? Fejl ved installation af cron-indgange. Forkert syntaks i felter? EditDialog Dialog Vindue EditTrans Source path Kildesti Local path Lokal sti Config error Konfigureringsfejl Original path Original sti EditTransBase Path Translations Oversættelse af stier Setting path translations for Indstilling af oversættelser af stier for Select one or several file types, then use the controls in the frame below to change how they are processed Vælg en eller flere filtyper, brug derefter knapperne i rammen nedenfor for at ændre, hvordan de skal behandles Add Tilføj Delete Slet Cancel Annuller Save Gem FirstIdxDialog First indexing setup Opsætning af første indeksering <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Det fremgÃ¥r, at indekset for denne konfiguration ikke eksisterer.</span><br /><br />Hvis du blot ønsker at indeksere din hjemmemappe med et sæt fornuftige standardindstillinger, skal du trykke pÃ¥ <span style=" font-style:italic;">Start indeksering nu</span> knappen. Du vil være i stand til at justere detaljerne senere. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Hvis du ønsker mere kontrol, kan du bruge følgende link til at justere indekseringskonfiguration og tidsplan.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Disse værktøjer kan tilgÃ¥s senere fra <span style=" font-style:italic;">Præference</span> menuen.</p></body></html> Indexing configuration Konfiguration af indeksering This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Dette vil lade dig justere de mapper, du vil indeksere, og andre parametre som udelukkede filstier eller navne, standard tegnsæt etc. Indexing schedule Tidsplan for indeksering This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Dette vil lade dig vælge mellem batch og realtime indeksering, og oprette en automatisk tidsplan for batch indeksering (ved hjælp af cron). Start indexing now Start indeksering nu FragButs %1 not found. %1 ikke fundet. %1: %2 %1: %2 Fragment Buttons Fragment Knapper Query Fragments Forespørgsel efter fragmenter IdxSchedW Index scheduling setup Opsætning af indeks skedulering <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indeksering kan køre permanent, indeksere filer nÃ¥r de ændrer sig, eller køre med adskilte intervaller. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Læsning af manualen kan hjælpe dig med at vælge mellem disse tilgange (tryk F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Dette værktøj kan hjælpe dig med at oprette en tidsplan for at automatisere kørsler af batch indeksering, eller starte realtid indeksering nÃ¥r du logger ind (eller begge dele, hvilket sjældent giver mening). </p></body></html> Cron scheduling Cron skedulering The tool will let you decide at what time indexing should run and will install a crontab entry. Værktøjet vil lade dig afgøre, pÃ¥ hvilket tidspunkt indeksering skal køre og det vil installere en crontab indgang. Real time indexing start up Opstart af realtid indeksering Decide if real time indexing will be started when you log in (only for the default index). Beslut, om realtid indeksering skal startes nÃ¥r du logger ind (kun for standard-indekset). ListDialog Dialog Vindue GroupBox Gruppeboks Main No db directory in configuration Ingen dbmappe i konfigurationen "history" file is damaged or un(read)writeable, please check or remove it: Filen med "historik" er beskadiget eller den kan ikke læses eller skrives til, undersøg det venligst, eller fjern den: Preview Close Tab Luk faneblad Cancel Annuller Missing helper program: Manglende hjælpeprogram: Can't turn doc into internal representation for Kan ikke lave dok til intern repræsentation for Creating preview text Laver forhÃ¥ndsvisningstekst Loading preview text into editor Henter forhÃ¥ndsvisningstekst for redigering &Search for: &Søger efter: &Next &Næste &Previous &Forrige Clear Ryd Match &Case Store/smÃ¥ &Bogstaver Error while loading file Fejl ved indlæsning af filen PreviewTextEdit Show fields Vis felter Show main text Vis hovedtekst Print Udskriv Print Current Preview Udskriv denne Visning Show image Vis billede Select All Vælg alle Copy Kopier Save document to file Gem dokument til fil Fold lines Ombryd linjer Preserve indentation Bevar indrykning QObject Global parameters Globale parametre Local parameters Lokale parametre <b>Customised subtrees <b>Tilpassede undermapper The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Listen over undermapper i det indekserede hierarki <br>hvor nogle parametre behøver at blive omdefineret. Standard: tom. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>De parametre, der følger er angivet enten pÃ¥ øverste niveau, hvis intet<br>eller en tom linje er valgt i listefeltet ovenfor, eller for den valgte undermappe. <br> Du kan tilføje eller fjerne mapper ved at klikke pÃ¥ +/- knapperne. Skipped names Udeladte navne These are patterns for file or directory names which should not be indexed. Dette er mønstre for fil- eller mappenavne, der ikke skal indekseres. Follow symbolic links Følg symbolske links Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Følg symbolske link under indeksering. Standarden er nej, for at undgÃ¥ dobbelt indeksering Index all file names Indekser alle filnavne Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indekser navnene pÃ¥ filer, hvor indholdet ikke kan identificeres eller behandles (ingen eller ikke-understøttet mime-type). Standard er true Search parameters Søgeparametre Web history Webhistorik Default<br>character set Standard<br>tegnsæt Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Tegnsæt, der bruges til at læse filer, hvor tegnsættet ikke kan identificeres ud fra indholdet, f.eks. rene tekstfiler.<br>Standardværdien er tom, og værdien fra NLS-omgivelserne anvendes. Ignored endings ignorerede endelser These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). Dette er endelser pÃ¥ filnavne for filer, hvor kun navnet vil blive indekseret (ingen forsøg pÃ¥ identifikation af MIME-type, ingen dekomprimering, ingen indeksering af indhold). QWidget Create or choose save directory Opret eller vælg mappe til at gemme i Choose exactly one directory Vælg præcis en mappe Could not read directory: Kunne ikke læse mappe: Unexpected file name collision, cancelling. Uventet kollision af filnavn, annullerer. Cannot extract document: Kan ikke udtrække dokument: &Preview &ForhÃ¥ndsvisning &Open &Ã…bn Open With Ã…bn med Run Script Kør skript Copy &File Name Kopier &Filnavn Copy &URL Kopier &URL &Write to File &Skriv til fil Save selection to files Gem det valgte til filer Preview P&arent document/folder ForhÃ¥ndsvis &Forælderdokument/mappe &Open Parent document/folder &Ã…bn Forælderdokument/mappe Find &similar documents Find &lignende dokumenter Open &Snippets window Ã…bn vindue til &tekststumper Show subdocuments / attachments Vis underdokumenter / vedhæftede filer QxtConfirmationMessage Do not show again. Vis ikke igen. RTIToolW Real time indexing automatic start Automatisk start af realtid indeksering <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> Indeksering kan sættes til at køre som en dæmon, der opdatere indekset nÃ¥r filer ændres, i realtid. Du fÃ¥r et indeks, som altid er opdateret, men systemressourcer anvendes permanent..</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Start indekseringsdæmonen med min skrivebordssession. Also start indexing daemon right now. Start ogsÃ¥ indekseringsdæmon lige nu. Replacing: Erstatter: Replacing file Erstatter fil Can't create: Kan ikke oprette: Warning Advarsel Could not execute recollindex Kunne ikke køre recollindex Deleting: Sletter: Deleting file Sletter fil Removing autostart Fjerner autostart Autostart file deleted. Kill current process too ? Autostartfil er slettet. Stop ogsÃ¥ nuværende proces? RclMain (no stemming) (Ingen ordstammer) (all languages) (alle sprog) error retrieving stemming languages fejl under hentning af ordstammer for sprogene Indexing in progress: Indeksering i gang: Purge Rydder op Stemdb stammedb Closing Afslutter Unknown Ukendt Query results Resultater af forespørgsel Cannot retrieve document info from database Kan ikke hente dokumentinfo fra databasen Warning Advarsel Can't create preview window Kan ikke oprette forhÃ¥ndsvisningsvindue This search is not active any more Denne søgning er ikke længere aktiv Cannot extract document or create temporary file Kan ikke udtrække dokument eller oprette midlertidig fil Executing: [ Udfører: [ About Recoll Om Recoll History data Historik-data Document history Dokumenthistorik Update &Index Opdater &Indeks Stop &Indexing Stop &Indeksering All Alle media medier message besked other andet presentation præsentation spreadsheet regneark text tekst sorted sorteret filtered filtreret No helpers found missing Ingen hjælpere mangler Missing helper programs Manglende hjælpeprogrammer No external viewer configured for mime type [ Ingen ekstern fremviser konfigureret for mime-type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Fremviseren angivet i mimeview for %1: %2 er ikke fundet. Ønsker du at Ã¥bne indstillingsvinduet? Can't access file: Kan ikke tilgÃ¥ fil: Can't uncompress file: Kan ikke dekomprimere fil: Save file Gem fil Result count (est.) Optælling af resultat (est.) Could not open external index. Db not open. Check external indexes list. Kunne ikke Ã¥bne ekstern indeks. DB er ikke Ã¥ben. Tjek liste over eksterne indekser. No results found Ingen resultater fundet None Ingen Updating Opdaterer Done Færdig Monitor Monitor Indexing failed Indeksering mislykkedes The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Den nuværende indekseringsproces blev ikke startet fra denne grænseflade. Klik pÃ¥ OK for at stoppe den alligevel, eller Annuller for at lade den køre Erasing index Sletter indeks Reset the index and start from scratch ? Nulstil indekset og start forfra? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Forespørgsel er i gang<br>PÃ¥ grund af begrænsninger i indekseringsbiblioteket,<br>vil en annullering afslutte programmet Error Fejl Index not open Indeks ikke Ã¥ben Index query error Indeks forespørgselsfejl Content has been indexed for these mime types: Indholdet er blevet indekseret for disse mime-typer: Can't update index: indexer running Kan ikke opdatere indeks: indeksering kører Indexed MIME Types Indekserede MIME-typer Bad viewer command line for %1: [%2] Please check the mimeview file Forkert kommandolinje for fremviser for %1: [%2] Kontroller venligst mimeview-filen Viewer command line for %1 specifies both file and parent file value: unsupported Fremviser kommandolinje for %1 angiver bÃ¥de fil og forælderfil værdier: er ikke understøttet Cannot find parent document Kan ikke finde forælderdokument Indexing did not run yet Indeksering har ikke kørt endnu External applications/commands needed for your file types and not found, as stored by the last indexing pass in Eksterne programmer/kommandoer nødvendige for dine filtyper blev ikke fundet, som gemt af den sidste indeksering Sub-documents and attachments Underdokumenter og vedhæftede filer Document filter Dokumentfilter Index not up to date for this file. Refusing to risk showing the wrong entry. Indeks er ikke opdateret for denne fil. Nægter at risikere at vise den forkerte indgang. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. Klik OK for at opdatere indekset for denne fil, du bliver sÃ¥ nødt til at gentage forespørgslen nÃ¥r indeksering er færdig. The indexer is running so things should improve when it's done. Indeksering kører, sÃ¥ ting burde være bedre, nÃ¥r den er færdig. The document belongs to an external indexwhich I can't update. Dokumentet tilhører et ekstern indeks, som jeg ikke kan opdatere. Click Cancel to return to the list. Click Ignore to show the preview anyway. Klik pÃ¥ Annuller for at vende tilbage til listen. Klik pÃ¥ Ignorer for at vise forhÃ¥ndsvisningen alligevel. Duplicate documents Identiske dokumenter These Urls ( | ipath) share the same content: Disse webadresser ( | ipath) deler samme indhold: Bad desktop app spec for %1: [%2] Please check the desktop file Forkert desktop app spec for %1: [%2] Tjek venligst desktopfilen Indexing interrupted indeksering afbrudt Disabled because the real time indexer was not compiled in. Deaktiveret fordi realtid indeksering ikke blev kompileret ind. This configuration tool only works for the main index. Dette konfigurationsværktøj virker kun for hovedindekset. The current indexing process was not started from this interface, can't kill it Den nuværende indekseringsproces blev ikke startet fra denne grænseflade, kan ikke stoppe den Bad paths Ugyldige stier Bad paths in configuration file: Ugyldige stier i konfigurationsfil: Selection patterns need topdir Mønstre for udvælgelse skal have en øverste mappe Selection patterns can only be used with a start directory Mønstre for udvælgelse kan kun bruges med en startmappe No search Ingen søgning No preserved previous search Ingen tidligere søgning er bevaret Choose file to save Vælg fil, der skal gemmes Saved Queries (*.rclq) Gemte forespørgsler (*.rclq) Write failed Skrivning mislykkedes Could not write to file Kunne ikke skrive til fil Read failed Læsning mislykkedes Could not open file: Kunne ikke Ã¥bne fil: Load error Indlæsningsfejl Could not load saved query Kunne ikke indlæse gemte forespørgsel Index scheduling Indeks skedulering Sorry, not available under Windows for now, use the File menu entries to update the index Beklager, er endnu ikke tilgængelig for Windows, bruge Fil menuindgange for at opdatere indekset Can't set synonyms file (parse error?) Kan ikke aktivere synonymer-fil (analysefejl?) The document belongs to an external index which I can't update. Dokumentet tilhører et eksternt indeks, som jeg ikke kan opdatere. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Klik pÃ¥ Annuller for at vende tilbage til listen. <br>Klik pÃ¥ Ignorer for at vise forhÃ¥ndsvisningen alligevel. (og husk for denne session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Ã…bner en midlertidig kopi. Ændringer vil gÃ¥ tabt, hvis du ikke gemmer<br/>dem til et permanent sted. Do not show this warning next time (use GUI preferences to restore). Vis ikke denne advarsel næste gang (brug GUI præferencer for at gendanne). Index locked Indeks lÃ¥st Unknown indexer state. Can't access webcache file. Indeksering i ukendt tilstand. Kan ikke tilgÃ¥ webcachefil. Indexer is running. Can't access webcache file. Indeksering kører. Kan ikke tilgÃ¥ webcachefil. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Recoll Recoll &File &Fil &Tools &Værktøjer &Preferences &Præferencer &Help &Hjælp E&xit A&fslut Ctrl+Q Ctrl+Q Update &index Opdater &Indeks &Erase document history &Slet dokumenthistorik &About Recoll &Om Recoll &User manual &Brugermanual Document &History Dokument&historik Document History Dokumenthistorik &Advanced Search &Avanceret søgning Advanced/complex Search Avanceret/kompleks søgning &Sort parameters &Sorterings-parametre Sort parameters Sorterings-parametre Term &explorer &Søg efter ord Term explorer tool Værktøj for søgning efter ord Next page Næste side Next page of results Næste side med resultater First page Første side Go to first page of results GÃ¥ til første side med resultater Previous page Forrige side Previous page of results Forrige side med resultater External index dialog Eksterne indekser &Show missing helpers &Vis manglende hjælpere PgDown PgDown PgUp PgUp &Full Screen &Fuld skærm F11 F11 Full Screen Fuld skærm &Erase search history &Slet søgehistorik Sort by dates from oldest to newest Sorter efter dato fra ældste til nyeste Sort by dates from newest to oldest Sorter efter dato fra nyeste til ældste Show Query Details Vis Detaljer i forespørgsel &Rebuild index &Genopbyg indeks &Show indexed types &Vis indekserede typer Shift+PgUp Shift+PgUp &Indexing schedule &Tidsplan for Indeksering E&xternal index dialog E&ksterne indekser &Index configuration &Konfiguration for Indeks &GUI configuration &Konfiguration for GUI &Results &Resultater Sort by date, oldest first Sorter efter dato, ældste først Sort by date, newest first Sorter efter dato, nyeste først Show as table Vis som tabel Show results in a spreadsheet-like table Vis resultater i en regneark-lignende tabel Save as CSV (spreadsheet) file Gem som CSV (regneark) fil Saves the result into a file which you can load in a spreadsheet Gemmer resultatet i en fil, som du kan indlæse i et regneark Next Page Næste side Previous Page Forrige side First Page Første side Query Fragments Forespørgsel efter fragmenter With failed files retrying Forsøg igen med filer der mislykkedes Next update will retry previously failed files Næste opdatering vil igen forsøge med filer, der tidligere mislykkedes Indexing &schedule Tid&splan for Indeksering Enable synonyms Aktiver synonymer Save last query Gem sidste forespørgsel Load saved query Indlæs gemte forespørgsel Special Indexing Særlig indeksering Indexing with special options Indeksering med særlige indstillinger &View &Vis Missing &helpers Manglende &hjælpere Indexed &MIME types Indekserede &MIME-typer Index &statistics Indeks&statistik Webcache Editor Rediger webcache RclTrayIcon Restore Gendan Quit Afslut RecollModel Abstract Sammendrag Author Forfatter Document size Dokumentets størrelse Document date Dokumentets dato File size Filstørrelse File name Filnavn File date Fildato Keywords Nøgleord Original character set Originale tegnsæt Relevancy rating Relevans bedømmelse Title Titel URL URL Mtime Mtid Date Dato Date and time Dato og tid Ipath Ipath MIME type MIME-type ResList Result list Resultatliste (show query) (vis forespørgsel) Document history Dokumenthistorik <p><b>No results found</b><br> <p><b>Ingen resultater fundet</b><br> Previous Forrige Next Næste Unavailable document Dokument ikke tilgængelig Preview ForhÃ¥ndsvisning Open Ã…bn <p><i>Alternate spellings (accents suppressed): </i> <p><i>Alternative stavemÃ¥der (accenter undertrykt): </i> Documents Dokumenter out of at least ud af mindst for for <p><i>Alternate spellings: </i> <p><i>Alternative stavemÃ¥der: </i> Result count (est.) Optælling af resultat (est.) Query details Detaljer i Forespørgsel Snippets Tekststumper ResTable &Reset sort &Nulstil sortering &Delete column &Slet kolonne Save table to CSV file Gem tabel til CSV-fil Can't open/create file: Kan ikke Ã¥bne/oprette fil: &Save as CSV &Gem som CSV Add "%1" column Tilføj "%1" kolonne ResultPopup &Preview &ForhÃ¥ndsvisning &Open &Ã…bn Copy &File Name Kopier &Filnavn Copy &URL Kopier &URL &Write to File &Skriv til fil Save selection to files Gem det valgte til filer Preview P&arent document/folder ForhÃ¥ndsvis &Forældre-dokument/mappe &Open Parent document/folder &Ã…bn Forældre-dokument/mappe Find &similar documents Find &lignende dokumenter Open &Snippets window Ã…bn vindue til &tekststumper Show subdocuments / attachments Vis underdokumenter / vedhæftede filer Open With Ã…bn med Run Script Kør skript SSearch Any term VilkÃ¥rlig ord All terms Alle ord File name Filnavn Query language Forespørgselssprog Bad query string Forkert forespørgselsstreng Out of memory Ikke mere hukommelse Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> No actual parentheses allowed.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Indtast forespørgselssprogudtryk. Snydeark:<br> <i>ord1 ord2</i> : 'ord1' og 'ord2' i et hvilken som helst felt.<br> <i>felt:ord1</i> : 'ord1' i feltet 'felt'.<br> Standard feltnavne/synonymer:<br> titel/emne/billedtekst, forfatter/fra, modtager/til, filnavn, ekst.<br> Pseudofelter: dir, mime/format, type/rclcat, dato.<br> To datointerval-eksempler: 2009-03-01/2009-05-20 2009-03-01/P2M:<br>. <i>ord1 ord2 ELLER ord3</i>: ord1 OG (ord2 ELLER ord3).<br> Ingen egentlige parenteser er tilladt.<br> <i>"ord1 ord2"</i> : frase (skal forekomme nøjagtigt). Mulige modifikatorer:<br> <i>"ord1 ord2"p </i> : uordnet nærheds-søgning med standard afstand.<br> Brug <b>Vis Forespørgsel</b> link nÃ¥r i tvivl om resultatet og se manual (&lt;F1>) for flere detaljer. Enter file name wildcard expression. Indtast filnavn jokertegn udtryk. Enter search terms here. Type ESC SPC for completions of current term. Indtast søgeord her. Tast ESC SPC for færdiggørelse af nuværende ord. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Indtast forespørgselssprogets udtryk. Snydeark:<br> <i>ord1 ord2</i> : 'ord1' og 'ord2' i et hvilken som helst felt.<br> <i>felt:ord1</i> : 'ord1' i feltet 'felt'.<br> Standard feltnavne/synonymer:<br> titel/emne/billedtekst, forfatter/fra, modtager/til, filnavn, ekst.<br> Pseudofelter: dir, mime/format, type/rclcat, dato, størrelse.<br> To datointerval-eksempler: 2009-03-01/2009-05-20 2009-03-01/P2M:<br>. <i>ord1 ord2 OR ord3</i>: ord1 AND (ord2 OR ord3).<br> Du kan bruge parenteser for at gøre tingene klarere.<br> <i>"ord1 ord2"</i> : frase (skal forekomme nøjagtigt). Mulige modifikatorer:<br> <i>"ord1 ord2"p </i> : uordnet nærheds-søgning med standard afstand.<br> Brug <b>Vis Forespørgsel</b> link nÃ¥r i tvivl om resultatet og se manual (&lt;F1>) for flere detaljer. Stemming languages for stored query: Ordstammer til sprogene for gemte forespørgsel: differ from current preferences (kept) adskiller sig fra de nuværende præferencer (beholdt) Auto suffixes for stored query: Automatiske suffikser for gemte forespørgsel: External indexes for stored query: Eksterne Indekser for gemte forespørgsel: Autophrase is set but it was unset for stored query Autofrase er aktiveret, men var deaktiveret for gemte forespørgsel Autophrase is unset but it was set for stored query Autofrase er deaktiveret, men var aktiveret for gemte forespørgsel SSearchBase SSearchBase SSøgeBase Clear Ryd Ctrl+S Ctrl+S Erase search entry Slet søgeindgang Search Søg Start query Start forespørgsel Enter search terms here. Type ESC SPC for completions of current term. Indtast søgeord her. Type ESC SPC for færdiggørelse af nuværende ord. Choose search type. Vælg søgetype. SearchClauseW Select the type of query that will be performed with the words Vælg den type forespørgsel, der vil blive udført med ordene Number of additional words that may be interspersed with the chosen ones Antal yderligere ord, der kan være blandet med de udvalgte No field Intet felt Any VilkÃ¥rlig All Alle None Ingen Phrase Frase Proximity Nærhed File name Filnavn Snippets Snippets Tekststumper Find: Find: Next Næste Prev Forrige SnippetsW Search Søg <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> <p>Desværre blev der ikke, inden for rimelige grænser, fundet en nøjagtig match. Sandsynligvis fordi dokumentet er meget stort, sÃ¥ tekststump-generatoren for vild i mængden...</ p> SpecIdxW Special Indexing Særlig indeksering Do not retry previously failed files. Forsøg ikke igen med filer, der tidligere mislykkedes. Else only modified or failed files will be processed. Ellers vil kun ændrede eller mislykkede filer blive behandlet. Erase selected files data before indexing. Slet udvalgte filers data, før indeksering. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Mappe for rekursiv indeksering. Dette skal være indenfor det regulære indekserede omrÃ¥de<br> som defineret i konfigurationsfilen (øverste mapper). Browse Gennemse Start directory (else use regular topdirs): Startmappe (ellers brug de regulære øverste mapper): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Lad stÃ¥ tomt for at vælge alle filer. Du kan bruge adskillige mellemrums-adskilte shell-type mønstre.<br>Mønstre med indlejrede mellemrum skal citeres med dobbelte anførselstegn.<br>Kan kun bruges, hvis startmÃ¥let er angivet. Selection patterns: Mønstre for udvælgelse: Top indexed entity Top indekserede enhed SpellBase Term Explorer Søg efter ord &Expand &Udvid Alt+E Alt+E &Close &Luk Alt+C Alt+C No db info. Ingen dbinfo. Match Sammenlign Case Stor/SmÃ¥ bogstaver Accents Accenter SpellW Wildcards Jokertegn Regexp Regex Stem expansion Udvidelse af stamme Spelling/Phonetic Stavning/Fonetisk error retrieving stemming languages fejl under hentning af ordstammer for sprogene Aspell init failed. Aspell not installed? Aspell init mislykkedes. Aspell ikke installeret? Aspell expansion error. Aspell udvidelsesfejl. No expansion found Ingen udvidelse fundet Term Ord Doc. / Tot. Dok. / Tot. Index: %1 documents, average length %2 terms.%3 results Index: %1 dokumenter, gennemsnitslængde %2 ord %3 resultater %1 results %1 resultater List was truncated alphabetically, some frequent Liste blev afkortet alfabetisk, nogle ofte terms may be missing. Try using a longer root. Der kan mangle ord. Prøv at bruge en længere rod. Show index statistics Vis statistik for indeks Number of documents Antal dokumenter Average terms per document Gennemsnitlige ord pr dokument Smallest document length Mindste dokumentlængde Longest document length Længste dokumentlængde Database directory size Mappestørrelse for database MIME types: MIME-typer: Item Element Value Værdi Smallest document length (terms) Mindste dokumentlængde (ord) Longest document length (terms) Længste dokumentlængde (ord) Results from last indexing: Resultater fra sidste indeksering: Documents created/updated Dokumenter oprettet/opdateret Files tested Filer testet Unindexed files ikke-indekserede filer List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog error retrieving stemming languages fejl under hentning af ordstammer for sprogene The selected directory does not appear to be a Xapian index Den valgte mappe synes ikke at være et Xapianindeks This is the main/local index! Dette er hoved/lokal indekset! The selected directory is already in the index list Den valgte mappe er allerede i indekslisten Choose Vælg Result list paragraph format (erase all to reset to default) Afsnitformat for resultatliste (slet alt for at nulstille til standard) Result list header (default is empty) Overskrift for resultatliste (standard er tom) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) Vælg recoll konfigmappe eller xapian indeksmappe (f.eks: /home/me/.recoll eller /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read Den valgte mappe ligner en Recoll konfigurationmappe, men konfigurationen kunne ikke læses At most one index should be selected Der burde vælges højst et indeks Cant add index with different case/diacritics stripping option Kan ikke tilføje indeks med en anden indstilling for fjernelse af store-bogstaver/diakritiske tegn Default QtWebkit font Standard skrifttype for QtWebkit Any term VilkÃ¥rlig ord All terms Alle ord File name Filnavn Query language Forespørgselssprog Value from previous program exit Værdi fra tidligere programafslutning ViewAction Command Kommando MIME type MIME-type Desktop Default Desktop standard Changing entries with different current values Ændrer indgange med forskellige aktuelle værdier ViewActionBase Native Viewers Oprindelige fremvisere Close Luk Select one or several mime types then use the controls in the bottom frame to change how they are processed. Vælg en eller flere Mime-typer og brug derefter knapperne i bundrammen til at ændre, hvordan de behandles. Use Desktop preferences by default Brug indstillinger for Desktop som standard Select one or several file types, then use the controls in the frame below to change how they are processed Vælg en eller flere filtyper, og brug derefter knapperne i rammen nedenfor for at ændre, hvordan de behandles Exception to Desktop preferences Undtagelse til indstillinger for Desktop Action (empty -> recoll default) Handling (tom -> recoll standard) Apply to current selection Anvend pÃ¥ aktuelle udvalg Recoll action: Recoll handling: current value aktuelle værdi Select same Vælg det samme <b>New Values:</b> <b>Nye værdier:</b> Webcache Webcache editor Rediger webcache Search regexp Regex søgning WebcacheEdit Copy URL Kopier URL Unknown indexer state. Can't edit webcache file. Indeksering i ukendt tilstand. Kan ikke redigere webcachefil. Indexer is running. Can't edit webcache file. Indeksering kører. Kan ikke redigere webcachefil. Delete selection Slet det valgte Webcache was modified, you will need to run the indexer after closing this window. WebCache blev ændret, du er nød til at køre indeksering efter lukning af dette vindue. WebcacheModel MIME MIME Url Url confgui::ConfBeaglePanelW Entries will be recycled once the size is reached Indgangene vil blive genbrugt, nÃ¥r størrelsen er nÃ¥et Web page store directory name Mappenavn for lageret til Websider The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Navnet pÃ¥ en mappe hvor du vil gemme kopier af besøgte websider.<br>En relativ sti er taget i forhold til konfigurationsmappen. Max. size for the web store (MB) Max. størrelse til web-lager (MB) Process the WEB history queue Behandl køen for WEB-historik Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Aktiverer indeksering af sider besøgt af Firefox.<br>(Du skal ogsÃ¥ installere Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). Indgangene vil blive genbrugt, nÃ¥r størrelsen er nÃ¥et.<br>Kun en øgning af størrelsen giver god mening, da en reducering af værdien ikke vil afkorte en eksisterende fil (kun spildplads i slutningen). confgui::ConfIndexW Can't write configuration file Kan ikke skrive konfigurationsfil confgui::ConfParamFNW Choose Vælg confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity Automatisk følsomhed over for diakritiske tegn <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. <p>Udløser automatisk følsomhed over for diakritiske tegn, hvis søgeordet har accent tegn (ikke i unac_except_trans). Ellers er du nød til bruge forespørgselssproget og <i>D</i> modifikatoren, for at angive følsomhed over for diakritiske tegn. Automatic character case sensitivity Automatisk følsomhed over for store/smÃ¥ bogstaver <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. <p>Udløser automatisk følsomhed over for store/smÃ¥ bogstaver, hvis indgangen har store bogstaver i andet end den første position. Ellers er du nød til bruge forespørgselssproget og <i>C</i> modifikatoren, for at angive følsomhed over for store/smÃ¥ bogstaver. Maximum term expansion count Maksimale antal ordudvidelser <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. <p>Maksimal antal udvidelser-for et enkelt ord (fx: nÃ¥r der bruges jokertegn). Standarden pÃ¥ 10 000 er rimeligt og vil undgÃ¥ forespørgsler, der synes at fryse mens motoren arbejder sig igennem ordlisten. Maximum Xapian clauses count Maksimale antal Xapiansætninger <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. <p>Maksimalt antal grundlæggende sætninger vi føjer til en enkel Xapian forespørgsel. I nogle tilfælde kan resultatet af ordudvidelse være multiplikativ, og vi ønsker at undgÃ¥ at bruge overdreven hukommelse. Standarden pÃ¥ 100 000 bør være bÃ¥de høj nok i de fleste tilfælde og kompatibel med de nuværende typiske hardware konfigurationer. confgui::ConfSubPanelW Global Global Max. compressed file size (KB) Maks. komprimeret filstørrelse (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Denne værdi angiver en grænse for, hvornÃ¥r komprimerede filer ikke vil blive behandlet. Indstil til -1 for ingen grænse, til 0 for ingen dekomprimering nogensinde. Max. text file size (MB) Maks. størrelse pÃ¥ tekstfil (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Denne værdi angiver en grænse for, hvornÃ¥r tekstfiler ikke vil blive behandlet. Indstil til -1 for ingen grænse. Dette er for at udelukke monster logfiler fra indekset. Text file page size (KB) Sidestørrelse pÃ¥ tekstfil (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Hvis denne værdi er angivet (ikke lig med -1), vil tekstfiler opdeles i bidder af denne størrelse for indeksering. Dette vil hjælpe søgning i meget store tekstfiler (dvs.: log-filer). Max. filter exec. time (S) Maks. udførelsestid for filtre (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Eksterne filtre der arbejder længere end dette vil blive afbrudt. Dette er for det sjældne tilfælde (dvs.: postscript) hvor et dokument kan forÃ¥rsage, at et filter laver et loop. Indstil til -1 for ingen grænse. Only mime types Kun mime-typer An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive En eksklusiv liste over indekserede MIME-typer.<br>Intet andet vil blive indekseret. Normalt tom og inaktiv Exclude mime types Udeluk mime-typer Mime types not to be indexed Mime-typer der ikke skal indekseres confgui::ConfTopPanelW Top directories Øverste mapper The list of directories where recursive indexing starts. Default: your home. Listen over mapper hvor rekursiv indeksering starter. Standard: din hjemme-mappe (home). Skipped paths Udeladte stier These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Dette er navne pÃ¥ mapper, som indeksering ikke gÃ¥r ind i.<br>Kan indeholde jokertegn. Skal stemme overens med stierne, som de ses af indekseringsprogrammet (dvs. hvis de øverste mapper omfatter '/home/mig' og '/home' er et link til '/usr/home', en korrekt udeladtSti indgang ville være '/home/mig/tmp * ', ikke '/usr/home/mig/tmp * ') Stemming languages Ordstammer for sprogene The languages for which stemming expansion<br>dictionaries will be built. De sprog, hvor ordstamme-udvidelses<br>ordbøger vil blive bygget. Log file name Navn pÃ¥ logfil The file where the messages will be written.<br>Use 'stderr' for terminal output Filen hvor meddelelser vil blive skrevet.<br>Brug 'stderr' for terminal output Log verbosity level Log informationsniveau This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Denne værdi justerer mængden af meddelelser,<br>fra kun fejl til en masse fejlretningsdata. Index flush megabytes interval Megabyte interval for skrivning af Index This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Denne værdi justere mængden af data, der er indekseret mellem skrivning til disken.<br>Dette hjælper med at kontrollere indekseringsprogrammets brug af hukommelse. Standard 10MB Max disk occupation (%) Maks brug af disk (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Dette er den procentdel af diskforbrug hvor indeksering vil mislykkes, og stoppe (for at undgÃ¥ at fylde dit disk).<br>0 betyder ingen grænse (dette er standard). No aspell usage Brug ikke aspell Aspell language Aspell sprog Database directory name Databasens mappenavn Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. Deaktiver brug af aspell til at generere stavnings-tilnærmelse i værktøj for søgning efter ord. <br> Nyttigt hvis aspell er fraværende eller ikke virker. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Sproget for aspell ordbog. Det skal se ud som "en" eller "fr" ...<br>Hvis denne værdi ikke er angivet, sÃ¥ vil NLS omgivelser blive brugt til at finde det, det fungerer normalt. For at fÃ¥ en idé om, hvad der er installeret pÃ¥ dit system, kan du skrive 'aspell konfig "og se efter .dat filer inde i 'data-dir' mappen. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Navnet pÃ¥ en mappe hvor du vil gemme indekset<br>En relativ sti er taget i forhold til konfigurationsmappen. Standard er "xapiandb. Unac exceptions Unac-undtagelser <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. <p>Disse er undtagelser fra unac mekanismen, der, som standard, fjerner alle diakritiske tegn, og udfører kanonisk nedbrydning. Du kan tilsidesætte fjernelse af accent for nogle tegn, afhængigt af dit sprog, og angive yderligere nedbrydninger, f.eks. for ligaturer. I hver indgang adskilt af mellemrum, er det første tegn kildedelen, og resten er oversættelsen. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Brugerindstillinger User interface brugergrænseflade Number of entries in a result page Antal indgange i en resultatside If checked, results with the same content under different names will only be shown once. Afkryds forÃ¥rsager, at resultater med samme indhold under forskellige navne kun bliver rapporteret en gang. Hide duplicate results. Skjul identiske resultater. Highlight color for query terms Farve for fremhævning af søgeord Result list font Skrifttype for resultatliste Opens a dialog to select the result list font Ã…bner et vindue til at vælge resultatlistens skrifttype Helvetica-10 Helvetica-10 Resets the result list font to the system default Nulstiller resultatlistens skrifttype til systemets standard Reset Nulstil Texts over this size will not be highlighted in preview (too slow). Tekster over denne størrelse vil ikke blive fremhævet i forhÃ¥ndsvisning (for langsom). Maximum text size highlighted for preview (megabytes) Maksimal tekststørrelse der fremhæves for forhÃ¥ndsvisning (megabyte) Choose editor applications Vælg redigeringsprogrammer Auto-start simple search on whitespace entry. Autostart simpel søgning ved blanktegn. Start with advanced search dialog open. Start med Ã¥bent avanceret søgevindue. Remember sort activation state. Husk sorteringens aktiveringstilstand. Prefer Html to plain text for preview. Foretræk Html til almindelig tekst for forhÃ¥ndsvisning. Search parameters Søgeparametre Stemming language Ordstammer for sprog A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. En søgning efter [Rullende Sten] (2 ord) vil blive ændret til [rullende eller sten eller (rullende frase 2 sten)]. Dette skulle give højere forrang til resultaterne, hvor søgeordene vises nøjagtigt som angivet. Automatically add phrase to simple searches Tilføj automatisk frase til simple søgninger Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Skal vi forsøge at lave sammendrag af indgange til resultatliste ved at bruge sammenhænget med forespørgselsordene? Kan være langsomt for store dokumenter. Dynamically build abstracts Lav dynamisk sammendrag Do we synthetize an abstract even if the document seemed to have one? Skal vi sammenfatte et sammendrag, selvom dokumentet synes at have et? Replace abstracts from documents Erstat sammendrag fra dokumenter Synthetic abstract size (characters) Størrelse pÃ¥ det genererede sammendrag (tegn) Synthetic abstract context words Sammenhængende ord for det genererede sammendrag The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Ordene pÃ¥ listen bliver automatisk vendt til ext: xxx sætninger i forespørgselssprogets indgang. Query language magic file name suffixes. Forespørgselssprogets magiske filnavnendelser. Enable Aktiver External Indexes Eksterne Indekser Toggle selected Skift det valgte Activate All Aktiver alle Deactivate All Deaktiver alle Remove from list. This has no effect on the disk index. Fjern fra listen. Dette har ingen virkning pÃ¥ indeks pÃ¥ disken. Remove selected Fjern valgte Add index Tilføj index Apply changes Anvend ændringer &OK &OK Discard changes Kassere ændringer &Cancel &Annuller Abstract snippet separator Separator mellem sammendragets tekststumper Style sheet Stilark Opens a dialog to select the style sheet file Ã…bn et vindue for at vælge stilark-filen Choose Vælg Resets the style sheet to default Nulstil stilark til standard Result List Resultatliste Edit result paragraph format string Rediger formatstreng for resultatafsnit Edit result page html header insert Rediger kode for indsætnig i html-hoved for resultatside Date format (strftime(3)) Datoformat (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Hyppighedens procentvise tærskel, hvorover vi ikke bruger ord inde i autofrase. Hyppige ord er et stort problem for ydeevnen med fraser. Udeladte ord forøger frase stilstand, og reducere effektiviteten af autofrase. Standardværdien er 2 (procent). Autophrase term frequency threshold percentage Tærskelprocentsats for ordhyppighed ved autofrase Plain text to HTML line style Almindelig tekst til HTML linjetype Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. Linjer i PRE tekst ombrydes ikke. Brug af BR mister en del indrykning. PRE + Wrap stil kunne være, hvad du ønsker. <BR> <BR> <PRE> <PRE> <PRE> + wrap <PRE> + wrap Disable Qt autocompletion in search entry. Deaktiver Qt autofuldførelse i søgeindgange. Search as you type. Søg mens du skriver. Paths translations Oversættelser af stier Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Klik for at tilføje endnu en indeksmappe til listen. Du kan vælge enten en Recoll konfigurationsmappe eller et Xapianindeks. Snippets window CSS file CSS-fil for vindue til tekststumper Opens a dialog to select the Snippets window CSS style sheet file Ã…bner et vindue til at vælge CSS stilark-fil for vinduet til tekststumper Resets the Snippets window style Nulstil stilen for vinduet til tekststumper Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Bestemmer om dokumentfiltre er vist som radioknapper, værktøjslinje kombinationsfelt eller menu. Document filter choice style: Valgmetode for dokumentfilter: Buttons Panel Panel med knapper Toolbar Combobox værktøjslinje kombinationsfelt Menu Menu Show system tray icon. Vis statusikon. Close to tray instead of exiting. Luk til systembakke i stedet for at afslutte. Start with simple search mode Start med enkel søgetilstand User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Brugerstil der skal anvendes pÃ¥ vinduet til tekststumper.<br>Bemærk: Det færdige sidehoved-indstik er ogsÃ¥ inkluderet i tekststumper-vinduets hoved. Synonyms file Synonymer-fil Show warning when opening temporary file. Vis advarsel, nÃ¥r der Ã¥bnes en midlertidig fil. Highlight CSS style for query terms recoll-1.23.7/qtgui/i18n/recoll_it.ts0000644000175000017500000036614613224431020014250 00000000000000 AdvSearch All clauses Tutti i termini Any clause Qualsiasi termine texts testi spreadsheets fogli di calcolo presentations presentazioni media multimediali messages messaggi other altri Bad multiplier suffix in size filter text spreadsheet presentation message AdvSearchBase Advanced search Ricerca avanzata Restrict file types Limita i tipi di file Save as default Salva come default Searched file types Ricerca tipo file All ----> Tutti ----> Sel -----> Sel -----> <----- Sel <----- Sel <----- All <----- Tutti Ignored file types Ignora i file di questo tipo Enter top directory for search Scrivi la directory base per la ricerca Browse Esplora Restrict results to files in subtree: Limita i risultati alla sotto-directory: Start Search Cerca Search for <br>documents<br>satisfying: Cerca i documenti<br>che contengono: Delete clause Elimina condizione Add clause Aggiungi condizione Check this to enable filtering on file types Contrassegna per abilitare la ricerca sul tipo di file By categories Per categorie Check this to use file categories instead of raw mime types Contrassegna per usare le categorie al posto dei tipi mime Close Chiudi All non empty fields on the right will be combined with AND ("All clauses" choice) or OR ("Any clause" choice) conjunctions. <br>"Any" "All" and "None" field types can accept a mix of simple words, and phrases enclosed in double quotes.<br>Fields with no data are ignored. Invert Minimum size. You can use k/K,m/M,g/G as multipliers Min. Size Maximum size. You can use k/K,m/M,g/G as multipliers Max. Size Filter From To Check this to enable filtering on dates Filter dates Find Check this to enable filtering on sizes Filter sizes CronToolW Cron Dialog <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> batch indexing schedule (cron) </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Each field can contain a wildcard (*), a single numeric value, comma-separated lists (1,3,5) and ranges (1-7). More generally, the fields will be used <span style=" font-style:italic;">as is</span> inside the crontab file, and the full crontab syntax can be used, see crontab(5).</p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br />For example, entering <span style=" font-family:'Courier New,courier';">*</span> in <span style=" font-style:italic;">Days, </span><span style=" font-family:'Courier New,courier';">12,19</span> in <span style=" font-style:italic;">Hours</span> and <span style=" font-family:'Courier New,courier';">15</span> in <span style=" font-style:italic;">Minutes</span> would start recollindex every day at 12:15 AM and 7:15 PM</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A schedule with very frequent activations is probably less efficient than real time indexing.</p></body></html> Days of week (* or 0-7, 0 or 7 is Sunday) Hours (* or 0-23) Minutes (0-59) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Click <span style=" font-style:italic;">Disable</span> to stop automatic batch indexing, <span style=" font-style:italic;">Enable</span> to activate it, <span style=" font-style:italic;">Cancel</span> to change nothing.</p></body></html> Enable Disable It seems that manually edited entries exist for recollindex, cannot edit crontab Error installing cron entry. Bad syntax in fields ? EditDialog Dialog EditTrans Source path Local path Config error Original path EditTransBase Path Translations Setting path translations for Select one or several file types, then use the controls in the frame below to change how they are processed Add Delete Cancel Annulla Save FirstIdxDialog First indexing setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">It appears that the index for this configuration does not exist.</span><br /><br />If you just want to index your home directory with a set of reasonable defaults, press the <span style=" font-style:italic;">Start indexing now</span> button. You will be able to adjust the details later. </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you want more control, use the following links to adjust the indexing configuration and schedule.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">These tools can be accessed later from the <span style=" font-style:italic;">Preferences</span> menu.</p></body></html> Indexing configuration This will let you adjust the directories you want to index, and other parameters like excluded file paths or names, default character sets, etc. Indexing schedule This will let you chose between batch and real-time indexing, and set up an automatic schedule for batch indexing (using cron). Start indexing now FragButs %1 not found. %1: %2 Query Fragments IdxSchedW Index scheduling setup <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can run permanently, indexing files as they change, or run at discrete intervals. </p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Reading the manual may help you to decide between these approaches (press F1). </p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This tool can help you set up a schedule to automate batch indexing runs, or start real time indexing when you log in (or both, which rarely makes sense). </p></body></html> Cron scheduling The tool will let you decide at what time indexing should run and will install a crontab entry. Real time indexing start up Decide if real time indexing will be started when you log in (only for the default index). ListDialog Dialog GroupBox Main No db directory in configuration Nessuna directory per il DB di base nella configurazione Could not open database in Impossibile aprire il database in . Click Cancel if you want to edit the configuration file before indexing starts, or Ok to let it proceed. Clicca 'Annulla' se vuoi editare il file di configurazione prima di iniziare l'indicizzazione, oppure 'OK' se vuoi procedere. Configuration problem (dynconf Problema di configurazione (dynconf "history" file is damaged or un(read)writeable, please check or remove it: Preview &Search for: &Cerca: &Next &Successivo &Previous &Precedente Match &Case Rispetta &Maiuscole/minuscole Clear Cancella Creating preview text Creazione del testo per l'anteprima Loading preview text into editor Caricamento anteprima del testo nell'editor Cannot create temporary directory Impossibile creare directory temporanea Cancel Annulla Close Tab Chiudi Tab Missing helper program: Manca il programma di filtro esterno: Can't turn doc into internal representation for Impossibile tradurre il documento per la rappresentazione interna Error while loading file PreviewTextEdit Show fields Show main text Print Print Current Preview Show image Select All Copy Save document to file Fold lines Preserve indentation QObject Global parameters Parametri globali Local parameters Parametri locali <b>Customised subtrees <b>Ramificazioni personalizzate The list of subdirectories in the indexed hierarchy <br>where some parameters need to be redefined. Default: empty. Lista delle sottocartelle nella gerarchia indicizzata<br>ove alcuni parametri devono essere ridefiniti. Predefinita: vuota. <i>The parameters that follow are set either at the top level, if nothing<br>or an empty line is selected in the listbox above, or for the selected subdirectory.<br>You can add or remove directories by clicking the +/- buttons. <i>I parametri che seguono sono postii al livello superiore, se niente <br> o una linea vuota è selezionata nella casella sovrastante, oppure al livello della cartella selezionata.<br> Puoi aggiungere/rimuovere cartelle cliccando i bottoni +/-. Skipped names Nomi saltati These are patterns for file or directory names which should not be indexed. Questi sono modelli per i nomi delle cartelle e/o dei files che non devono vebire indicizzati. Default character set Set di caratteri di default This is the character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Questa è la codifica caratteri usata per leggere i file che non contengono indicazioni interne sulla codifica usata, ad esempio file di testo semplice.<br>Il valore predefinito è vuoto, in modo che venga usata l'impostazione locale del sistema. Follow symbolic links Segue il link simbolico Follow symbolic links while indexing. The default is no, to avoid duplicate indexing Segue il link simbolico durante l'indicizzazione. Di default è no, per evitare la duplicazione dell'indice Index all file names Indicizza tutti i nomi dei files Index the names of files for which the contents cannot be identified or processed (no or unsupported mime type). Default true Indicizza il nome di quei files il cui contenuto non può essere identificato o processato (tipo mime non supportato). Di default è impostato a vero Search parameters Parametri per la ricerca Web history Default<br>character set Character set used for reading files which do not identify the character set internally, for example pure text files.<br>The default value is empty, and the value from the NLS environnement is used. Ignored endings These are file name endings for files which will be indexed by name only (no MIME type identification attempt, no decompression, no content indexing). QWidget Create or choose save directory Choose exactly one directory Could not read directory: Unexpected file name collision, cancelling. Cannot extract document: &Preview &Anteprima &Open Open With Run Script Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url &Write to File Save selection to files Preview P&arent document/folder &Open Parent document/folder Find &similar documents Trova documenti &simili Open &Snippets window Show subdocuments / attachments QxtConfirmationMessage Do not show again. RTIToolW Real time indexing automatic start <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Recoll</span> indexing can be set up to run as a daemon, updating the index as files change, in real time. You gain an always up to date index, but system resources are used permanently.</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></body></html> Start indexing daemon with my desktop session. Also start indexing daemon right now. Replacing: Replacing file Can't create: Warning Attenzione Could not execute recollindex Deleting: Deleting file Removing autostart Autostart file deleted. Kill current process too ? RclMain About Recoll Informazioni su Recoll Executing: [ Esecuzione di: [ Cannot retrieve document info from database Impossibile caricare informazioni del documento dal database Warning Attenzione Can't create preview window Non posso creare la finestra di anteprima Query results Risultati della ricerca Document history Cronologia dei documenti History data Cronologia dei dati Indexing in progress: Indicizzazione in corso: Files Files Purge Pulisco Stemdb Database espansioni Closing Chiusura Unknown Sconosciuto This search is not active any more Questa ricerca non e' piu' attiva Can't start query: Non posso iniziare la ricerca: Bad viewer command line for %1: [%2] Please check the mimeconf file Errata linea di comando per %1: [%2] Verifica il file mimeconf Cannot extract document or create temporary file Non posso estrarre il documento o creare il file temporaneo (no stemming) (nessuna espansione) (all languages) (tutte le lingue) error retrieving stemming languages errore nel recupero delle lingue per l'espansione Update &Index Stop &Indexing All media multimediali message other altri presentation spreadsheet text sorted filtered No helpers found missing Missing helper programs No external viewer configured for mime type [ The viewer specified in mimeview for %1: %2 is not found. Do you want to start the preferences dialog ? Can't access file: Can't uncompress file: Save file Result count (est.) Query details Dettagli ricerca Could not open external index. Db not open. Check external indexes list. No results found None Updating Done Monitor Indexing failed The current indexing process was not started from this interface. Click Ok to kill it anyway, or Cancel to leave it alone Erasing index Reset the index and start from scratch ? Query in progress.<br>Due to limitations of the indexing library,<br>cancelling will exit the program Error Index query error Content has been indexed for these mime types: Can't update index: indexer running Indexed MIME Types Bad viewer command line for %1: [%2] Please check the mimeview file Viewer command line for %1 specifies both file and parent file value: unsupported Cannot find parent document Indexing did not run yet External applications/commands needed for your file types and not found, as stored by the last indexing pass in Sub-documents and attachments Document filter Index not up to date for this file. Refusing to risk showing the wrong entry. Click Ok to update the index for this file, then you will need to re-run the query when indexing is done. The indexer is running so things should improve when it's done. Duplicate documents These Urls ( | ipath) share the same content: Bad desktop app spec for %1: [%2] Please check the desktop file Indexing interrupted The current indexing process was not started from this interface, can't kill it Bad paths Bad paths in configuration file: Selection patterns need topdir Selection patterns can only be used with a start directory No search No preserved previous search Choose file to save Saved Queries (*.rclq) Write failed Could not write to file Read failed Could not open file: Load error Could not load saved query Index scheduling Sorry, not available under Windows for now, use the File menu entries to update the index Disabled because the real time indexer was not compiled in. This configuration tool only works for the main index. Can't set synonyms file (parse error?) The document belongs to an external index which I can't update. Click Cancel to return to the list. <br>Click Ignore to show the preview anyway (and remember for this session). Opening a temporary copy. Edits will be lost if you don't save<br/>them to a permanent location. Do not show this warning next time (use GUI preferences to restore). Index locked Unknown indexer state. Can't access webcache file. Indexer is running. Can't access webcache file. with additional message: Non-fatal indexing message: Types list empty: maybe wait for indexing to progress? RclMainBase Previous page Pagina precedente Next page Pagina seguente &File &File E&xit &Esci &Tools &Strumenti &Help &Aiuto &Preferences &Preferenze Search tools Strumenti di ricerca Result list Lista risultati &About Recoll &Informazioni su Recoll Document &History C&ronologia documenti Document History Visualizza la cronologia dei documenti &Advanced Search Ricerca &Avanzata Advanced/complex Search Mostra la finestra di Ricerca avanzata &Sort parameters &Parametri ordinamento Sort parameters Configurazione dei parametri di ordinamento Next page of results Pagina seguente Previous page of results Pagina precedente &Query configuration &Configurazione ricerca &User manual &Manuale utente Recoll Recoll Ctrl+Q Ctrl+Q Update &index Aggiorna &indice Term &explorer &Esplora l'indice Term explorer tool Strumento di esplorazione indice External index dialog Configurazione indici esterni &Erase document history &Cancella la cronologia dei documenti First page Prima pagina Go to first page of results Vai alla prima pagina dei risultati &Indexing configuration Conf&igurazione indicizzazione PgDown PgUp &Full Screen F11 Full Screen &Erase search history Sort by dates from oldest to newest Sort by dates from newest to oldest Show Query Details &Rebuild index Shift+PgUp E&xternal index dialog &Index configuration &GUI configuration &Results Sort by date, oldest first Sort by date, newest first Show as table Show results in a spreadsheet-like table Save as CSV (spreadsheet) file Saves the result into a file which you can load in a spreadsheet Next Page Previous Page First Page Query Fragments With failed files retrying Next update will retry previously failed files Indexing &schedule Enable synonyms Save last query Load saved query Special Indexing Indexing with special options &View Missing &helpers Indexed &MIME types Index &statistics Webcache Editor RclTrayIcon Restore Quit RecollModel File name Nome file Mime type Tipo MIME Date Data Abstract Author Document size Document date File size File date Keywords Original character set Relevancy rating Title URL Mtime Date and time Ipath MIME type ResList Result list Lista dei risultati Unavailable document Documento inaccessible Previous Precedente Next Successivo <p><b>No results found</b><br> <p><b>Nessun risultato</b><br> &Preview &Anteprima Copy &URL Copia l'&Url Find &similar documents Trova documenti &simili Query details Dettagli ricerca (show query) (mostra dettagli di ricerca) Copy &File Name Copia il nome del &File Document history Cronologia dei documenti Preview Open <p><i>Alternate spellings (accents suppressed): </i> Documents Risultati out of at least totale di almeno for per <p><i>Alternate spellings: </i> Result count (est.) Snippets ResTable &Reset sort &Delete column Save table to CSV file Can't open/create file: &Preview &Anteprima Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url Find &similar documents Trova documenti &simili &Save as CSV Add "%1" column ResTableDetailArea &Preview &Anteprima Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url Find &similar documents Trova documenti &simili ResultPopup &Preview &Anteprima Copy &File Name Copia il nome del &File Copy &URL Copia l'&Url Find &similar documents Trova documenti &simili SSearch Any term Qualsiasi All terms Tutti File name Nome file Completions Espansione Select an item: Seleziona una voce: Too many completions Troppe possibilita' di espansione Query language Linguaggio di interrogazione Bad query string Stringa di ricerca malformata Out of memory Memoria esaurita Enter file name wildcard expression. Enter search terms here. Type ESC SPC for completions of current term. Inserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini. Enter query language expression. Cheat sheet:<br> <i>term1 term2</i> : 'term1' and 'term2' in any field.<br> <i>field:term1</i> : 'term1' in field 'field'.<br> Standard field names/synonyms:<br> title/subject/caption, author/from, recipient/to, filename, ext.<br> Pseudo-fields: dir, mime/format, type/rclcat, date, size.<br> Two date interval exemples: 2009-03-01/2009-05-20 2009-03-01/P2M.<br> <i>term1 term2 OR term3</i> : term1 AND (term2 OR term3).<br> You can use parentheses to make things clearer.<br> <i>"term1 term2"</i> : phrase (must occur exactly). Possible modifiers:<br> <i>"term1 term2"p</i> : unordered proximity search with default distance.<br> Use <b>Show Query</b> link when in doubt about result and see manual (&lt;F1>) for more detail. Stemming languages for stored query: differ from current preferences (kept) Auto suffixes for stored query: External indexes for stored query: Autophrase is set but it was unset for stored query Autophrase is unset but it was set for stored query SSearchBase SSearchBase SSearchBase Clear Cancella Ctrl+S Ctrl+S Erase search entry Cancella voce di ricerca Search Cerca Start query Inizia ricerca Enter search terms here. Type ESC SPC for completions of current term. Inserisci qui i termini di ricerca. Premi ESC Spazio per il completamento automatico dei termini. Choose search type. SearchClauseW SearchClauseW SearchClauseW Any of these Qualsiasi parola All of these Tutte le parole None of these Nessuna di queste This phrase Questa frase Terms in proximity Parole in prossimita' File name matching Nome del file Select the type of query that will be performed with the words Seleziona il tipo di ricerca da effettuare con i termini indicati Number of additional words that may be interspersed with the chosen ones Numero di parole che possono frapporsi tra i termini di ricerca indicati No field Any All None Phrase Proximity File name Nome file Snippets Snippets Find: Next Successivo Prev SnippetsW Search Cerca <p>Sorry, no exact match was found within limits. Probably the document is very big and the snippets generator got lost in a maze...</p> SortForm Date Data Mime type Tipo MIME SortFormBase Sort Criteria Criterio di ordinamento Sort the Ordina i most relevant results by: risultati piu' rilevanti per: Descending Discendente Close Chiudi Apply Applica SpecIdxW Special Indexing Do not retry previously failed files. Else only modified or failed files will be processed. Erase selected files data before indexing. Directory to recursively index. This must be inside the regular indexed area<br> as defined in the configuration file (topdirs). Browse Esplora Start directory (else use regular topdirs): Leave empty to select all files. You can use multiple space-separated shell-type patterns.<br>Patterns with embedded spaces should be quoted with double quotes.<br>Can only be used if the start target is set. Selection patterns: Top indexed entity SpellBase Term Explorer Esplorazione dei termini &Expand &Espandi Alt+E Alt+E &Close &Chiudi Alt+C Alt+C Term Termine No db info. Match Case Accents SpellW Wildcards Caratteri jolly Regexp Espressione regolare Spelling/Phonetic Ortografia/Fonetica Aspell init failed. Aspell not installed? Errore di inizializzazione aspell. Aspell e' installato? Aspell expansion error. Errore di espansione di Aspell. Stem expansion Espansione grammaticale error retrieving stemming languages Impossibile formare la lista di espansione per la lingua No expansion found Nessun epansione trovata Term Termine Doc. / Tot. Index: %1 documents, average length %2 terms.%3 results %1 results List was truncated alphabetically, some frequent terms may be missing. Try using a longer root. Show index statistics Number of documents Average terms per document Database directory size MIME types: Item Value Smallest document length (terms) Longest document length (terms) Results from last indexing: Documents created/updated Files tested Unindexed files List files which could not be indexed (slow) Spell expansion error. UIPrefsDialog The selected directory does not appear to be a Xapian index La directory selezionata non sembra essera un indice Xapian This is the main/local index! Questo e' l'indice principale! The selected directory is already in the index list La directory selezionata e' gia' nella lista Select xapian index directory (ie: /home/buddy/.recoll/xapiandb) Seleziona la directory indice Xapian (es.: /home/ciccio/.recoll/xapiandb) error retrieving stemming languages Impossibile formare la lista delle lingue per l'espansione grammaticale Choose Result list paragraph format (erase all to reset to default) Result list header (default is empty) Select recoll config directory or xapian index directory (e.g.: /home/me/.recoll or /home/me/.recoll/xapiandb) The selected directory looks like a Recoll configuration directory but the configuration could not be read At most one index should be selected Cant add index with different case/diacritics stripping option Default QtWebkit font Any term Qualsiasi All terms Tutti File name Nome file Query language Linguaggio di interrogazione Value from previous program exit UIPrefsDialogBase User interface Interfaccia utente Number of entries in a result page Numero di risultati per pagina Result list font Fonts per la lista dei risultati Helvetica-10 Helvetica-10 Opens a dialog to select the result list font Apre una finestra di dialogo per selezionare i fonts della lista dei risultati Reset Ripristina Resets the result list font to the system default Ripristina i font della lista dei risultati Auto-start simple search on whitespace entry. Inizia automaticamente una ricerca semplice digitando uno spazio. Start with advanced search dialog open. Inizia aprendo la finestra di ricerca avanzata. Start with sort dialog open. Inizia con la finestra di ordinamento aperta. Search parameters Parametri per la ricerca Stemming language Linguaggio per l'espansione Dynamically build abstracts Costruisci dinamicamente i riassunti Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti.. Replace abstracts from documents Sostituisci i riassunti dei documenti Do we synthetize an abstract even if the document seemed to have one? Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno? Synthetic abstract size (characters) Numero caratteri per il riassunto Synthetic abstract context words Numero di parole di contesto per il riassunto External Indexes Indici esterni Add index Aggiungi indice Select the xapiandb directory for the index you want to add, then click Add Index Seleziona nella directory Xapiandb l'indice che vuoi aggiungere e clicca su 'Aggiungi indice' Browse Esplora &OK &OK Apply changes Applica modifiche &Cancel &Annulla Discard changes Annulla modifiche Result paragraph<br>format string Stringa di formattazione<br>dei risultati Automatically add phrase to simple searches Aggiungi automaticamente frase alle ricerche semplici A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti. User preferences Preferenze utente Use desktop preferences to choose document editor. Usa le preferenze del desktop per scegliere l'editor dei documenti. External indexes Indici esterni Toggle selected Commuta selezionati Activate All Seleziona tutti Deactivate All Deseleziona tutti Remove selected Rimuovi selezionati Remove from list. This has no effect on the disk index. Rimuovi dalla lista. Non ha effetto sull'indice del disco. Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definisce il formato per ogni paragrafo dell'elenco dei risultati. Usare il formato qt html e le sostituzioni tipo printf:<br>%A Riassunto<br> %D Data<br> %I Icona<br> %K Parole chiave (se esistono)<br> %L Link per anteprima e modifica<br> %M Tipo MIME<br> %N Numero del risultato<br> %R Percentuale di rilevanza<br> %S Informazioni sulla dimensione<br> %T Titolo<br> %U Url<br> Remember sort activation state. Ricorda lo stato dell'impostazione di ordinamento. Maximum text size highlighted for preview (megabytes) Dimensione massima del testo da evidenziare nell'anteprima (megabytes) Texts over this size will not be highlighted in preview (too slow). Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento). ViewAction Changing actions with different current values Modifica di azioni con valori differenti da quelli attuali Mime type Tipo MIME Command MIME type Desktop Default Changing entries with different current values ViewActionBase File type Tipo di file Action Azione Select one or several file types, then click Change Action to modify the program used to open them Seleziona uno o piu' tipi di file e poi clicca su 'Cambia Azione' per modificare il programma usato per aprirli Change Action Cambia Azione Close Chiudi Native Viewers Applicazione di visualizzazione Select one or several mime types then use the controls in the bottom frame to change how they are processed. Use Desktop preferences by default Select one or several file types, then use the controls in the frame below to change how they are processed Exception to Desktop preferences Action (empty -> recoll default) Apply to current selection Recoll action: current value Select same <b>New Values:</b> Webcache Webcache editor Search regexp WebcacheEdit Copy URL Unknown indexer state. Can't edit webcache file. Indexer is running. Can't edit webcache file. Delete selection Webcache was modified, you will need to run the indexer after closing this window. WebcacheModel MIME Url confgui::ConfBeaglePanelW Web page store directory name The name for a directory where to store the copies of visited web pages.<br>A non-absolute path is taken relative to the configuration directory. Max. size for the web store (MB) Process the WEB history queue Enables indexing Firefox visited pages.<br>(you need also install the Firefox Recoll plugin) Entries will be recycled once the size is reached.<br>Only increasing the size really makes sense because reducing the value will not truncate an existing file (only waste space at the end). confgui::ConfIndexW Can't write configuration file Impossibile scrivere il file di configurazione confgui::ConfParamFNW Browse Esplora Choose confgui::ConfParamSLW + + - - confgui::ConfSearchPanelW Automatic diacritics sensitivity <p>Automatically trigger diacritics sensitivity if the search term has accented characters (not in unac_except_trans). Else you need to use the query language and the <i>D</i> modifier to specify diacritics sensitivity. Automatic character case sensitivity <p>Automatically trigger character case sensitivity if the entry has upper-case characters in any but the first position. Else you need to use the query language and the <i>C</i> modifier to specify character-case sensitivity. Maximum term expansion count <p>Maximum expansion count for a single term (e.g.: when using wildcards). The default of 10 000 is reasonable and will avoid queries that appear frozen while the engine is walking the term list. Maximum Xapian clauses count <p>Maximum number of elementary clauses we add to a single Xapian query. In some cases, the result of term expansion can be multiplicative, and we want to avoid using excessive memory. The default of 100 000 should be both high enough in most cases and compatible with current typical hardware configurations. confgui::ConfSubPanelW Global Globale Max. compressed file size (KB) This value sets a threshold beyond which compressedfiles will not be processed. Set to -1 for no limit, to 0 for no decompression ever. Max. text file size (MB) This value sets a threshold beyond which text files will not be processed. Set to -1 for no limit. This is for excluding monster log files from the index. Text file page size (KB) If this value is set (not equal to -1), text files will be split in chunks of this size for indexing. This will help searching very big text files (ie: log files). Max. filter exec. time (S) External filters working longer than this will be aborted. This is for the rare case (ie: postscript) where a document could cause a filter to loop. Set to -1 for no limit. Only mime types An exclusive list of indexed mime types.<br>Nothing else will be indexed. Normally empty and inactive Exclude mime types Mime types not to be indexed confgui::ConfTopPanelW Top directories Cartella superiore The list of directories where recursive indexing starts. Default: your home. Lista delle cartelle in cui inizia lìindicizzazione recorsiva. Di default è la tua home. Skipped paths Indirizzi saltati These are names of directories which indexing will not enter.<br> May contain wildcards. Must match the paths seen by the indexer (ie: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Questi sono i nomi delle cartelle in cui l'indicizzazione non entra<br>Possono contenere caratteri speciali. Devono corrispondere agli indirizzi visti dal motore di indicizzazione (ad esempio, se la cartella superiore include '/home/io' e '/home' è in realtà un link a '/usr/home', l'indirizzo corretto che si vuole sltare dovrebbe essere '/home/me/tmp*' e non ì/home/usr/tmp*') Stemming languages Lingue per la radice The languages for which stemming expansion<br>dictionaries will be built. Lingue per le quali verrà costruito<br>il dizionario delle espansioni radicali. Log file name Nome del file di log The file where the messages will be written.<br>Use 'stderr' for terminal output Il file dove verranno scritti i messaggi.<br>Usa 'stderr' per il terminale Log verbosity level Livello di verbosità del log This value adjusts the amount of messages,<br>from only errors to a lot of debugging data. Questo valore regola il numero dei messaggi,>br>dai soli errori a mole indicazioni per il debug. Index flush megabytes interval Intervallo in megabite per il salvataggio intermedio dell'indice This value adjust the amount of data which is indexed between flushes to disk.<br>This helps control the indexer memory usage. Default 10MB Questo valore regola il volume di dati da indicizzare tra un salvataggio e l'altro.<br>Aiuta a controllare l'uso della memoria. Di default è post uguale a 10Mb Max disk occupation (%) Massima occupazione del disco fisso (%) This is the percentage of disk occupation where indexing will fail and stop (to avoid filling up your disk).<br>0 means no limit (this is the default). Questa è la percentuale fi occupazione del disco fisso oltre la quale l'indicizzazione si ferma con un errore (per evitare di riempire il disco).<br>0 significa nessun limite (questo è il valore di default). No aspell usage Non usare aspell Aspell language Lingua di aspell The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works.To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. Lingua per il dizionario aspell. Dovrebbe essere simile a 'en' o 'it' ...<br>Se questo valore non è impostato verrà usato l'ambiente NLS per calcolarlo, cosa che generalmente funziona. Per avere un'idea di cosa sia installato sul tuo sistema, dai il comando 'aspell config' e guarda il nome dei files .dat nella cartella 'data-dir'. Database directory name Nome della cartella del database The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Nome della cartella in cui salvare l'indice<br>Un indirizzo non assoluto viene interpretato come relativo alla cartella di congigurazione. Di default è 'xapiandb'. Use system's 'file' command Usa il comando di sistema 'file' Use the system's 'file' command if internal<br>mime type identification fails. Usa il comando di sistema 'file' se fallisce<br>l'identificazione interna del tipo mime. Disables use of aspell to generate spelling approximation in the term explorer tool.<br> Useful if aspell is absent or does not work. The language for the aspell dictionary. This should look like 'en' or 'fr' ...<br>If this value is not set, the NLS environment will be used to compute it, which usually works. To get an idea of what is installed on your system, type 'aspell config' and look for .dat files inside the 'data-dir' directory. The name for a directory where to store the index<br>A non-absolute path is taken relative to the configuration directory. The default is 'xapiandb'. Unac exceptions <p>These are exceptions to the unac mechanism which, by default, removes all diacritics, and performs canonic decomposition. You can override unaccenting for some characters, depending on your language, and specify additional decompositions, e.g. for ligatures. In each space-separated entry, the first character is the source one, and the rest is the translation. These are pathnames of directories which indexing will not enter.<br>Path elements may contain wildcards. The entries must match the paths seen by the indexer (e.g.: if topdirs includes '/home/me' and '/home' is actually a link to '/usr/home', a correct skippedPath entry would be '/home/me/tmp*', not '/usr/home/me/tmp*') Max disk occupation (%, 0 means no limit) This is the percentage of disk usage - total disk usage, not index size - at which indexing will fail and stop.<br>The default value of 0 removes any limit. uiPrefsDialogBase User preferences Preferenze utente User interface Interfaccia utente Number of entries in a result page Numero di risultati per pagina If checked, results with the same content under different names will only be shown once. Hide duplicate results. Result list font Fonts per la lista dei risultati Opens a dialog to select the result list font Apre una finestra di dialogo per selezionare i fonts della lista dei risultati Helvetica-10 Helvetica-10 Resets the result list font to the system default Ripristina i font della lista dei risultati Reset Ripristina Defines the format for each result list paragraph. Use qt html format and printf-like replacements:<br>%A Abstract<br> %D Date<br> %I Icon image name<br> %K Keywords (if any)<br> %L Preview and Edit links<br> %M Mime type<br> %N Result number<br> %R Relevance percentage<br> %S Size information<br> %T Title<br> %U Url<br> Definisce il formato per ogni paragrafo dell'elenco dei risultati. Usare il formato qt html e le sostituzioni tipo printf:<br>%A Riassunto<br> %D Data<br> %I Icona<br> %K Parole chiave (se esistono)<br> %L Link per anteprima e modifica<br> %M Tipo MIME<br> %N Numero del risultato<br> %R Percentuale di rilevanza<br> %S Informazioni sulla dimensione<br> %T Titolo<br> %U Url<br> Result paragraph<br>format string Stringa di formattazione<br>dei risultati Texts over this size will not be highlighted in preview (too slow). Testi di lunghezza superiore a questa non vengono evidenziati nella preview (troppo lento). Maximum text size highlighted for preview (megabytes) Dimensione massima del testo da evidenziare nell'anteprima (megabytes) Use desktop preferences to choose document editor. Usa le preferenze del desktop per scegliere l'editor dei documenti. Choose editor applications Auto-start simple search on whitespace entry. Inizia automaticamente una ricerca semplice digitando uno spazio. Start with advanced search dialog open. Inizia aprendo la finestra di ricerca avanzata. Start with sort dialog open. Inizia con la finestra di ordinamento aperta. Remember sort activation state. Ricorda lo stato dell'impostazione di ordinamento. Prefer Html to plain text for preview. Search parameters Parametri per la ricerca Stemming language Linguaggio per l'espansione A search for [rolling stones] (2 terms) will be changed to [rolling or stones or (rolling phrase 2 stones)]. This should give higher precedence to the results where the search terms appear exactly as entered. Una ricerca per [vino rosso] (2 parole) sara' completata come [vino O rosso O (vino FRASE 2 rosso)]. Questo dovrebbe dare la precedenza ai risultati che contengono i termini esattamente come sono stati scritti. Automatically add phrase to simple searches Aggiungi automaticamente frase alle ricerche semplici Do we try to build abstracts for result list entries by using the context of query terms ? May be slow for big documents. Devo cercare di costruire i riassunti per le voci nell'elenco dei risultati usando il contesto dei termini di ricerca? Puo' essere lento per grossi documenti.. Dynamically build abstracts Costruisci dinamicamente i riassunti Do we synthetize an abstract even if the document seemed to have one? Devo sintetizzare un riassunto anche se il documento sembra ne abbia uno? Replace abstracts from documents Sostituisci i riassunti dei documenti Synthetic abstract size (characters) Numero caratteri per il riassunto Synthetic abstract context words Numero di parole di contesto per il riassunto The words in the list will be automatically turned to ext:xxx clauses in the query language entry. Query language magic file name suffixes. Enable External Indexes Indici esterni Toggle selected Commuta selezionati Activate All Seleziona tutti Deactivate All Deseleziona tutti Remove from list. This has no effect on the disk index. Rimuovi dalla lista. Non ha effetto sull'indice del disco. Remove selected Rimuovi selezionati Add index Aggiungi indice Apply changes Applica modifiche &OK &OK Discard changes Annulla modifiche &Cancel &Annulla Abstract snippet separator Style sheet Opens a dialog to select the style sheet file Choose Resets the style sheet to default Result List Edit result paragraph format string Edit result page html header insert Date format (strftime(3)) Frequency percentage threshold over which we do not use terms inside autophrase. Frequent terms are a major performance issue with phrases. Skipped terms augment the phrase slack, and reduce the autophrase efficiency. The default value is 2 (percent). Autophrase term frequency threshold percentage Plain text to HTML line style Lines in PRE text are not folded. Using BR loses some indentation. PRE + Wrap style may be what you want. <BR> <PRE> <PRE> + wrap Disable Qt autocompletion in search entry. Search as you type. Paths translations Click to add another index directory to the list. You can select either a Recoll configuration directory or a Xapian index. Snippets window CSS file Opens a dialog to select the Snippets window CSS style sheet file Resets the Snippets window style Decide if document filters are shown as radio buttons, toolbar combobox, or menu. Document filter choice style: Buttons Panel Toolbar Combobox Menu Show system tray icon. Close to tray instead of exiting. Start with simple search mode User style to apply to the snippets window.<br> Note: the result page header insert is also included in the snippets window header. Synonyms file Show warning when opening temporary file. Highlight CSS style for query terms recoll-1.23.7/qtgui/recoll.h0000644000175000017500000000370313125637102012572 00000000000000/* Copyright (C) 2004 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RECOLL_H_INCLUDED_ #define _RECOLL_H_INCLUDED_ #include #include "rclconfig.h" #include "rcldb.h" #include "rclutil.h" #include // Misc declarations in need of sharing between the UI files // Open the database if needed. We now force a close/open by default extern bool maybeOpenDb(std::string &reason, bool force = true, bool *maindberror = 0); /** Retrieve configured stemming languages */ bool getStemLangs(vector& langs); extern RclConfig *theconfig; extern void rememberTempFile(TempFile); extern void forgetTempFile(string &fn); extern void deleteAllTempFiles(); extern Rcl::Db *rcldb; extern int recollNeedsExit; extern void startManual(const string& helpindex); extern void applyStyleSheet(const QString&); inline std::string qs2utf8s(const QString& qs) { return std::string((const char *)qs.toUtf8()); } inline QString u8s2qs(const std::string us) { return QString::fromUtf8(us.c_str()); } /** Specialized version of the qt file dialog. Can't use getOpenFile() etc. cause they hide dot files... */ extern QString myGetFileName(bool isdir, QString caption = QString(), bool filenosave = false); #endif /* _RECOLL_H_INCLUDED_ */ recoll-1.23.7/qtgui/fragbuts.h0000644000175000017500000000330713125527323013132 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _FRAGBUTS_H_INCLUDED_ #define _FRAGBUTS_H_INCLUDED_ #include #include #include #include class QAbstractButton; /* * Display a series of user-defined buttons which activate query * language fragments to augment the current search */ class FragButs : public QWidget { Q_OBJECT; public: FragButs(QWidget* parent = 0); virtual ~FragButs(); struct ButFrag { QAbstractButton *button; std::string fragment; ButFrag(QAbstractButton *but, const std::string& frag) : button(but), fragment(frag) { } }; void getfrags(std::vector&); bool ok() {return m_ok;} bool isStale(time_t *reftime); private slots: void onButtonClicked(bool); signals: void fragmentsChanged(); private: std::vector m_buttons; std::string m_fn; time_t m_reftime; bool m_ok; }; #endif /* _FRAGBUTS_H_INCLUDED_ */ recoll-1.23.7/qtgui/confgui/0000755000175000017500000000000013224670235012654 500000000000000recoll-1.23.7/qtgui/confgui/confguiindex.h0000644000175000017500000000530013125527323015424 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _confguiindex_h_included_ #define _confguiindex_h_included_ /** * Classes to handle the gui for the indexing configuration. These group * confgui elements, linked to configuration parameters, into panels. */ #include #include #include #include #include #include #include #include #include using std::string; using std::list; class ConfNull; class RclConfig; class ConfParamW; class ConfParamDNLW; namespace confgui { class ConfIndexW : public QDialog { Q_OBJECT public: ConfIndexW(QWidget *parent, RclConfig *config); public slots: void acceptChanges(); void rejectChanges(); void reloadPanels(); private: RclConfig *m_rclconf; ConfNull *m_conf; list m_widgets; QTabWidget *tabWidget; QDialogButtonBox *buttonBox; }; /** * A panel with the top-level parameters which can't be redefined in * subdirectoriess: */ class ConfTopPanelW : public QWidget { Q_OBJECT public: ConfTopPanelW(QWidget *parent, ConfNull *config); }; /** * A panel for the parameters that can be changed in subdirectories: */ class ConfSubPanelW : public QWidget { Q_OBJECT public: ConfSubPanelW(QWidget *parent, ConfNull *config, RclConfig *rclconf); private slots: void subDirChanged(QListWidgetItem *, QListWidgetItem *); void subDirDeleted(QString); void restoreEmpty(); private: string m_sk; ConfParamDNLW *m_subdirs; list m_widgets; ConfNull *m_config; QGroupBox *m_groupbox; void reloadAll(); }; class ConfBeaglePanelW : public QWidget { Q_OBJECT public: ConfBeaglePanelW(QWidget *parent, ConfNull *config); }; class ConfSearchPanelW : public QWidget { Q_OBJECT public: ConfSearchPanelW(QWidget *parent, ConfNull *config); }; } // Namespace confgui #endif /* _confguiindex_h_included_ */ recoll-1.23.7/qtgui/confgui/confgui.cpp0000644000175000017500000003160713125637102014735 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "confgui.h" #include "smallut.h" #include "log.h" #include "rcldb.h" #include "guiutils.h" #include #include using std::list; using std::vector; namespace confgui { static const int spacing = 2; static const int margin = 2; void ConfParamW::setValue(const QString& value) { if (m_fsencoding) m_cflink->set(string((const char *)value.toLocal8Bit())); else m_cflink->set(string((const char *)value.toUtf8())); } void ConfParamW::setValue(int value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void ConfParamW::setValue(bool value) { char buf[30]; sprintf(buf, "%d", value); m_cflink->set(string(buf)); } void setSzPol(QWidget *w, QSizePolicy::Policy hpol, QSizePolicy::Policy vpol, int hstretch, int vstretch) { QSizePolicy policy(hpol, vpol); policy.setHorizontalStretch(hstretch); policy.setVerticalStretch(vstretch); policy.setHeightForWidth(w->sizePolicy().hasHeightForWidth()); w->setSizePolicy(policy); } bool ConfParamW::createCommon(const QString& lbltxt, const QString& tltptxt) { m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); m_hl->addWidget(tl); return true; } ConfParamIntW::ConfParamIntW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, int minvalue, int maxvalue, int defaultvalue) : ConfParamW(parent, cflink), m_defaultvalue(defaultvalue) { if (!createCommon(lbltxt, tltptxt)) return; m_sb = new QSpinBox(this); m_sb->setMinimum(minvalue); m_sb->setMaximum(maxvalue); setSzPol(m_sb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(m_sb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_sb, SIGNAL(valueChanged(int)), this, SLOT(setValue(int))); } void ConfParamIntW::loadValue() { string s; if (m_cflink->get(s)) m_sb->setValue(atoi(s.c_str())); else m_sb->setValue(m_defaultvalue); } ConfParamStrW::ConfParamStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_le = new QLineEdit(this); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); loadValue(); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamStrW::loadValue() { string s; m_cflink->get(s); if (m_fsencoding) m_le->setText(QString::fromLocal8Bit(s.c_str())); else m_le->setText(QString::fromUtf8(s.c_str())); } ConfParamCStrW::ConfParamCStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList &sl ) : ConfParamW(parent, cflink) { if (!createCommon(lbltxt, tltptxt)) return; m_cmb = new QComboBox(this); m_cmb->setEditable(false); m_cmb->insertItems(0, sl); setSzPol(m_cmb, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_cmb); loadValue(); QObject::connect(m_cmb, SIGNAL(activated(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamCStrW::loadValue() { string s; m_cflink->get(s); QString cs; if (m_fsencoding) cs = QString::fromLocal8Bit(s.c_str()); else cs = QString::fromUtf8(s.c_str()); for (int i = 0; i < m_cmb->count(); i++) { if (!cs.compare(m_cmb->itemText(i))) { m_cmb->setCurrentIndex(i); break; } } } ConfParamBoolW::ConfParamBoolW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // No createCommon because the checkbox has a label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); m_cb = new QCheckBox(lbltxt, this); setSzPol(m_cb, QSizePolicy::Fixed, QSizePolicy::Fixed, 0, 0); m_cb->setToolTip(tltptxt); m_hl->addWidget(m_cb); QFrame *fr = new QFrame(this); setSzPol(fr, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(fr); loadValue(); QObject::connect(m_cb, SIGNAL(toggled(bool)), this, SLOT(setValue(bool))); } void ConfParamBoolW::loadValue() { string s; m_cflink->get(s); m_cb->setChecked(stringToBool(s)); } ConfParamFNW::ConfParamFNW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, bool isdir ) : ConfParamW(parent, cflink), m_isdir(isdir) { if (!createCommon(lbltxt, tltptxt)) return; m_fsencoding = true; m_le = new QLineEdit(this); m_le->setMinimumSize(QSize(150, 0 )); setSzPol(m_le, QSizePolicy::Preferred, QSizePolicy::Fixed, 1, 0); m_hl->addWidget(m_le); m_pb = new QPushButton(this); QString text = tr("Choose"); m_pb->setText(text); int width = m_pb->fontMetrics().boundingRect(text).width() + 15; m_pb->setMaximumWidth(width); setSzPol(m_pb, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); m_hl->addWidget(m_pb); loadValue(); QObject::connect(m_pb, SIGNAL(clicked()), this, SLOT(showBrowserDialog())); QObject::connect(m_le, SIGNAL(textChanged(const QString&)), this, SLOT(setValue(const QString&))); } void ConfParamFNW::loadValue() { string s; m_cflink->get(s); m_le->setText(QString::fromLocal8Bit(s.c_str())); } void ConfParamFNW::showBrowserDialog() { QString s = myGetFileName(m_isdir); if (!s.isEmpty()) m_le->setText(s); } class SmallerListWidget: public QListWidget { public: SmallerListWidget(QWidget *parent) : QListWidget(parent) {} virtual QSize sizeHint() const {return QSize(150, 40);} }; ConfParamSLW::ConfParamSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamW(parent, cflink) { // Can't use createCommon here cause we want the buttons below the label m_hl = new QHBoxLayout(this); m_hl->setSpacing(spacing); QVBoxLayout *vl1 = new QVBoxLayout(); QHBoxLayout *hl1 = new QHBoxLayout(); QLabel *tl = new QLabel(this); setSzPol(tl, QSizePolicy::Preferred, QSizePolicy::Fixed, 0, 0); tl->setText(lbltxt); tl->setToolTip(tltptxt); vl1->addWidget(tl); QPushButton *pbA = new QPushButton(this); QString text = tr("+"); pbA->setText(text); int width = pbA->fontMetrics().boundingRect(text).width() + 15; pbA->setMaximumWidth(width); setSzPol(pbA, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbA); QPushButton *pbD = new QPushButton(this); text = tr("-"); pbD->setText(text); width = pbD->fontMetrics().boundingRect(text).width() + 15; pbD->setMaximumWidth(width); setSzPol(pbD, QSizePolicy::Minimum, QSizePolicy::Fixed, 0, 0); hl1->addWidget(pbD); vl1->addLayout(hl1); m_hl->addLayout(vl1); m_lb = new SmallerListWidget(this); m_lb->setSelectionMode(QAbstractItemView::ExtendedSelection); setSzPol(m_lb, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); m_hl->addWidget(m_lb); setSzPol(this, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); loadValue(); QObject::connect(pbA, SIGNAL(clicked()), this, SLOT(showInputDialog())); QObject::connect(pbD, SIGNAL(clicked()), this, SLOT(deleteSelected())); } void ConfParamSLW::loadValue() { string s; m_cflink->get(s); list ls; stringToStrings(s, ls); QStringList qls; for (list::const_iterator it = ls.begin(); it != ls.end(); it++) { if (m_fsencoding) qls.push_back(QString::fromLocal8Bit(it->c_str())); else qls.push_back(QString::fromUtf8(it->c_str())); } m_lb->clear(); m_lb->insertItems(0, qls); } void ConfParamSLW::showInputDialog() { bool ok; QString s = QInputDialog::getText (this, "", // title "", // label, QLineEdit::Normal, // EchoMode mode "", // const QString & text &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } void ConfParamSLW::listToConf() { list ls; LOGDEB2("ConfParamSLW::listToConf. m_fsencoding " << (int(m_fsencoding)) << "\n" ); for (int i = 0; i < m_lb->count(); i++) { // General parameters are encoded as utf-8. File names as // local8bit There is no hope for 8bit file names anyway // except for luck: the original encoding is unknown. // As a special Windows hack, if fsencoding is set, we convert // backslashes to slashes. This is an awful hack because // fsencoding does not necessarily imply that the values are // paths, and it will come back to haunt us one day. QString text = m_lb->item(i)->text(); if (m_fsencoding) { #ifdef _WIN32 string pth((const char *)(text.toLocal8Bit())); path_slashize(pth); ls.push_back(pth); #else ls.push_back((const char *)(text.toLocal8Bit())); #endif } else { ls.push_back((const char *)(text.toUtf8())); } } string s; stringsToString(ls, s); m_cflink->set(s); } void ConfParamSLW::deleteSelected() { // We used to repeatedly go through the list and delete the first // found selected item (then restart from the beginning). But it // seems (probably depends on the qt version), that, when deleting // a selected item, qt will keep the selection active at the same // index (now containing the next item), so that we'd end up // deleting the whole list. // // Instead, we now build a list of indices, and delete it starting // from the top so as not to invalidate lower indices vector idxes; for (int i = 0; i < m_lb->count(); i++) { if (m_lb->item(i)->isSelected()) { idxes.push_back(i); } } for (vector::reverse_iterator it = idxes.rbegin(); it != idxes.rend(); it++) { LOGDEB0("deleteSelected: " << (*it) << " was selected\n" ); QListWidgetItem *item = m_lb->takeItem(*it); emit entryDeleted(item->text()); delete item; } listToConf(); } // "Add entry" dialog for a file name list void ConfParamDNLW::showInputDialog() { QString s = myGetFileName(true); if (!s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (m_lb->selectionMode() == QAbstractItemView::SingleSelection && !items.empty()) m_lb->setCurrentItem(*items.begin()); listToConf(); } } } // "Add entry" dialog for a constrained string list void ConfParamCSLW::showInputDialog() { bool ok; QString s = QInputDialog::getItem (this, // parent "", // title "", // label, m_sl, // items, 0, // current = 0 false, // editable = true, &ok); if (ok && !s.isEmpty()) { QListitems = m_lb->findItems(s, Qt::MatchFixedString|Qt::MatchCaseSensitive); if (items.empty()) { m_lb->insertItem(0, s); m_lb->sortItems(); listToConf(); } } } } // Namespace confgui recoll-1.23.7/qtgui/confgui/confguiindex.cpp0000644000175000017500000006344513224431020015761 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using std::list; using std::set; using std::string; #include "confgui.h" #include "recoll.h" #include "confguiindex.h" #include "smallut.h" #include "log.h" #include "rcldb.h" #include "execmd.h" #include "rclconfig.h" namespace confgui { static const int spacing = 3; static const int margin = 3; /** * A Gui-to-Data link class for ConfTree * Has a subkey pointer member which makes it easy to change the * current subkey for a number at a time. */ class ConfLinkRclRep : public ConfLinkRep { public: ConfLinkRclRep(ConfNull *conf, const string& nm, string *sk = 0) : m_conf(conf), m_nm(nm), m_sk(sk) /* KEEP THE POINTER, shared data */ { } virtual ~ConfLinkRclRep() {} virtual bool set(const string& val) { if (!m_conf) return false; LOGDEB1("Setting [" << m_nm << "] value to [" << val << "]\n"); bool ret = m_conf->set(m_nm, val, getSk()); if (!ret) LOGERR("Value set failed\n" ); return ret; } virtual bool get(string& val) { if (!m_conf) return false; bool ret = m_conf->get(m_nm, val, getSk()); LOGDEB1("ConfLinkRcl::get: [" << m_nm << "] sk [" << getSk() << "] -> [" << (ret ? val : "no value") << "]\n" ); return ret; } private: string getSk() { return m_sk ? *m_sk : string(); } ConfNull *m_conf; const string m_nm; const string *m_sk; }; typedef std::function()> RclConfVecValueGetter; /* Special link for skippedNames and noContentSuffixes which are computed as set differences */ class ConfLinkPlusMinus : public ConfLinkRep { public: ConfLinkPlusMinus(RclConfig *rclconf, ConfNull *conf, const string& basename, RclConfVecValueGetter getter, string *sk = 0) : m_rclconf(rclconf), m_conf(conf), m_basename(basename), m_getter(getter), m_sk(sk) /* KEEP THE POINTER, shared data */ { } virtual ~ConfLinkPlusMinus() {} virtual bool set(const string& snval) { if (!m_conf || !m_rclconf) return false; string sbase; m_conf->get(m_basename, sbase, getSk()); std::set nval; stringToStrings(snval, nval); string splus, sminus; RclConfig::setPlusMinus(sbase, nval, splus, sminus); LOGDEB1("ConfLinkPlusMinus: base [" << sbase << "] nvalue [" << snval << "] splus [" << splus << "] sminus [" << sminus << "]\n"); if (!m_conf->set(m_basename + "-", sminus, getSk())) { return false; } if (!m_conf->set(m_basename + "+", splus, getSk())) { return false; } return true; } virtual bool get(string& val) { if (!m_conf || !m_rclconf) return false; m_rclconf->setKeyDir(getSk()); vector vval = m_getter(); val = stringsToString(vval); LOGDEB1("ConfLinkPlusMinus: "< " << val <getConfDir().c_str())); tabWidget = new QTabWidget; reloadPanels(); buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(tabWidget); mainLayout->addWidget(buttonBox); setLayout(mainLayout); resize(QSize(600, 450).expandedTo(minimumSizeHint())); connect(buttonBox, SIGNAL(accepted()), this, SLOT(acceptChanges())); connect(buttonBox, SIGNAL(rejected()), this, SLOT(rejectChanges())); } void ConfIndexW::acceptChanges() { LOGDEB("ConfIndexW::acceptChanges()\n" ); if (!m_conf) { LOGERR("ConfIndexW::acceptChanges: no config\n" ); return; } // Let the changes to disk if (!m_conf->holdWrites(false)) { QMessageBox::critical(0, "Recoll", tr("Can't write configuration file")); } // Delete local copy and update the main one from the file delete m_conf; m_conf = 0; m_rclconf->updateMainConfig(); hide(); } void ConfIndexW::rejectChanges() { LOGDEB("ConfIndexW::rejectChanges()\n" ); // Discard local changes. delete m_conf; m_conf = 0; hide(); } void ConfIndexW::reloadPanels() { if ((m_conf = m_rclconf->cloneMainConfig()) == 0) return; m_conf->holdWrites(true); tabWidget->clear(); m_widgets.clear(); QWidget *w = new ConfTopPanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Global parameters")); w = new ConfSubPanelW(this, m_conf, m_rclconf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Local parameters")); w = new ConfBeaglePanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Web history")); w = new ConfSearchPanelW(this, m_conf); m_widgets.push_back(w); tabWidget->addTab(w, QObject::tr("Search parameters")); } ConfBeaglePanelW::ConfBeaglePanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); ConfLink lnk1(new ConfLinkRclRep(config, "processwebqueue")); ConfParamBoolW* cp1 = new ConfParamBoolW(this, lnk1, tr("Process the WEB history queue"), tr("Enables indexing Firefox visited pages.
" "(you need also install the Firefox Recoll plugin)" )); vboxLayout->addWidget(cp1); ConfLink lnk2(new ConfLinkRclRep(config, "webcachedir")); ConfParamFNW* cp2 = new ConfParamFNW(this, lnk2, tr("Web page store directory name"), tr("The name for a directory where to store the copies " "of visited web pages.
" "A non-absolute path is taken relative to the " "configuration directory."), true); cp2->setEnabled(cp1->m_cb->isChecked()); connect(cp1->m_cb, SIGNAL(toggled(bool)), cp2, SLOT(setEnabled(bool))); vboxLayout->addWidget(cp2); ConfLink lnk3(new ConfLinkRclRep(config, "webcachemaxmbs")); ConfParamIntW *cp3 = new ConfParamIntW(this, lnk3, tr("Max. size for the web store (MB)"), tr("Entries will be recycled once the size is reached." "
" "Only increasing the size really makes sense because " "reducing the value will not truncate an existing " "file (only waste space at the end)." ), -1, 1000*1000); // Max 1TB... cp3->setEnabled(cp1->m_cb->isChecked()); connect(cp1->m_cb, SIGNAL(toggled(bool)), cp3, SLOT(setEnabled(bool))); vboxLayout->addWidget(cp3); vboxLayout->insertStretch(-1); } ConfSearchPanelW::ConfSearchPanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); if (!o_index_stripchars) { ConfLink lnk1(new ConfLinkRclRep(config, "autodiacsens")); ConfParamBoolW* cp1 = new ConfParamBoolW(this, lnk1, tr("Automatic diacritics sensitivity"), tr("

Automatically trigger diacritics sensitivity " "if the search term has accented characters " "(not in unac_except_trans). Else you need to " "use the query language and the D " "modifier to specify " "diacritics sensitivity." )); vboxLayout->addWidget(cp1); ConfLink lnk2(new ConfLinkRclRep(config, "autocasesens")); ConfParamBoolW* cp2 = new ConfParamBoolW(this, lnk2, tr("Automatic character case sensitivity"), tr("

Automatically trigger character case " "sensitivity if the entry has upper-case " "characters in any but the first position. " "Else you need to use the query language and " "the C modifier to specify character-case " "sensitivity." )); vboxLayout->addWidget(cp2); } ConfLink lnk3(new ConfLinkRclRep(config, "maxTermExpand")); ConfParamIntW* cp3 = new ConfParamIntW(this, lnk3, tr("Maximum term expansion count"), tr("

Maximum expansion count for a single term " "(e.g.: when using wildcards). The default " "of 10 000 is reasonable and will avoid " "queries that appear frozen while the engine is " "walking the term list." )); vboxLayout->addWidget(cp3); ConfLink lnk4(new ConfLinkRclRep(config, "maxXapianClauses")); ConfParamIntW* cp4 = new ConfParamIntW(this, lnk4, tr("Maximum Xapian clauses count"), tr("

Maximum number of elementary clauses we " "add to a single Xapian query. In some cases, " "the result of term expansion can be " "multiplicative, and we want to avoid using " "excessive memory. The default of 100 000 " "should be both high enough in most cases " "and compatible with current typical hardware " "configurations." )); vboxLayout->addWidget(cp4); vboxLayout->insertStretch(-1); } ConfTopPanelW::ConfTopPanelW(QWidget *parent, ConfNull *config) : QWidget(parent) { QWidget *w = 0; QGridLayout *gl1 = new QGridLayout(this); gl1->setSpacing(spacing); gl1->setMargin(margin); int gridrow = 0; w = new ConfParamDNLW(this, ConfLink(new ConfLinkRclRep(config, "topdirs")), tr("Top directories"), tr("The list of directories where recursive " "indexing starts. Default: your home.")); setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); gl1->addWidget(w, gridrow++, 0, 1, 2); ConfParamSLW *eskp = new ConfParamSLW(this, ConfLink(new ConfLinkRclRep(config, "skippedPaths")), tr("Skipped paths"), tr("These are pathnames of directories which indexing " "will not enter.
" "Path elements may contain wildcards. " "The entries must match the paths seen by the indexer " "(e.g.: if topdirs includes '/home/me' and '/home' is " "actually a link " "to '/usr/home', a correct skippedPath entry " "would be '/home/me/tmp*', not '/usr/home/me/tmp*')")); eskp->setFsEncoding(true); setSzPol(eskp, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); gl1->addWidget(eskp, gridrow++, 0, 1, 2); vector cstemlangs = Rcl::Db::getStemmerNames(); QStringList stemlangs; for (vector::const_iterator it = cstemlangs.begin(); it != cstemlangs.end(); it++) { stemlangs.push_back(QString::fromUtf8(it->c_str())); } w = new ConfParamCSLW(this, ConfLink(new ConfLinkRclRep(config, "indexstemminglanguages")), tr("Stemming languages"), tr("The languages for which stemming expansion
" "dictionaries will be built."), stemlangs); setSzPol(w, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 1); gl1->addWidget(w, gridrow, 0); w = new ConfParamFNW(this, ConfLink(new ConfLinkRclRep(config, "logfilename")), tr("Log file name"), tr("The file where the messages will be written.
" "Use 'stderr' for terminal output"), false); gl1->addWidget(w, gridrow++, 1); w = new ConfParamIntW(this, ConfLink(new ConfLinkRclRep(config, "loglevel")), tr("Log verbosity level"), tr("This value adjusts the amount of " "messages,
from only errors to a " "lot of debugging data."), 0, 6); gl1->addWidget(w, gridrow, 0); w = new ConfParamIntW(this, ConfLink(new ConfLinkRclRep(config, "idxflushmb")), tr("Index flush megabytes interval"), tr("This value adjust the amount of " "data which is indexed between flushes to disk.
" "This helps control the indexer memory usage. " "Default 10MB "), 0, 1000); gl1->addWidget(w, gridrow++, 1); w = new ConfParamIntW(this, ConfLink(new ConfLinkRclRep(config, "maxfsoccuppc")), tr("Max disk occupation (%, 0 means no limit)"), tr("This is the percentage of disk usage " "- total disk usage, not index size - at which " "indexing will fail and stop.
" "The default value of 0 removes any limit."), 0, 100); gl1->addWidget(w, gridrow++, 0); ConfParamBoolW* cpasp = new ConfParamBoolW(this, ConfLink(new ConfLinkRclRep(config, "noaspell")), tr("No aspell usage"), tr("Disables use of aspell to generate spelling " "approximation in the term explorer tool.
" "Useful if aspell is absent or does not work. ")); gl1->addWidget(cpasp, gridrow, 0); ConfParamStrW* cpaspl = new ConfParamStrW(this, ConfLink(new ConfLinkRclRep(config, "aspellLanguage")), tr("Aspell language"), tr("The language for the aspell dictionary. " "This should look like 'en' or 'fr' ...
" "If this value is not set, the NLS environment " "will be used to compute it, which usually works. " "To get an idea of what is installed on your system, " "type 'aspell config' and look for .dat files inside " "the 'data-dir' directory. ")); cpaspl->setEnabled(!cpasp->m_cb->isChecked()); connect(cpasp->m_cb, SIGNAL(toggled(bool)), cpaspl,SLOT(setDisabled(bool))); gl1->addWidget(cpaspl, gridrow++, 1); w = new ConfParamFNW(this, ConfLink(new ConfLinkRclRep(config, "dbdir")), tr("Database directory name"), tr("The name for a directory where to store the index
" "A non-absolute path is taken relative to the " "configuration directory. The default is 'xapiandb'." ), true); gl1->addWidget(w, gridrow++, 0, 1, 2); w = new ConfParamStrW(this, ConfLink(new ConfLinkRclRep(config, "unac_except_trans")), tr("Unac exceptions"), tr("

These are exceptions to the unac mechanism " "which, by default, removes all diacritics, " "and performs canonic decomposition. You can override " "unaccenting for some characters, depending on your " "language, and specify additional decompositions, " "e.g. for ligatures. In each space-separated entry, " "the first character is the source one, and the rest " "is the translation." )); gl1->addWidget(w, gridrow++, 0, 1, 2); } ConfSubPanelW::ConfSubPanelW(QWidget *parent, ConfNull *config, RclConfig *rclconf) : QWidget(parent), m_config(config) { QVBoxLayout *vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(spacing); vboxLayout->setMargin(margin); m_subdirs = new ConfParamDNLW(this, ConfLink(new ConfLinkNullRep()), QObject::tr("Customised subtrees"), QObject::tr("The list of subdirectories in the indexed " "hierarchy
where some parameters need " "to be redefined. Default: empty.")); m_subdirs->getListBox()->setSelectionMode(QAbstractItemView::SingleSelection); connect(m_subdirs->getListBox(), SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(subDirChanged(QListWidgetItem *, QListWidgetItem *))); connect(m_subdirs, SIGNAL(entryDeleted(QString)), this, SLOT(subDirDeleted(QString))); // We only retrieve the subkeys from the user's config (shallow), // no use to confuse the user by showing the subtrees which are // customized in the system config like .thunderbird or // .purple. This doesn't prevent them to add and customize them // further. vector allkeydirs = config->getSubKeys(true); QStringList qls; for (vector::const_iterator it = allkeydirs.begin(); it != allkeydirs.end(); it++) { qls.push_back(QString::fromUtf8(it->c_str())); } m_subdirs->getListBox()->insertItems(0, qls); vboxLayout->addWidget(m_subdirs); QFrame *line2 = new QFrame(this); line2->setFrameShape(QFrame::HLine); line2->setFrameShadow(QFrame::Sunken); vboxLayout->addWidget(line2); QLabel *explain = new QLabel(this); explain->setText( QObject:: tr("The parameters that follow are set either at the " "top level, if nothing
" "or an empty line is selected in the listbox above, " "or for the selected subdirectory.
" "You can add or remove directories by clicking " "the +/- buttons.")); vboxLayout->addWidget(explain); m_groupbox = new QGroupBox(this); setSzPol(m_groupbox, QSizePolicy::Preferred, QSizePolicy::Preferred, 1, 3); QGridLayout *gl1 = new QGridLayout(m_groupbox); gl1->setSpacing(spacing); gl1->setMargin(margin); int gridy = 0; ConfParamSLW *eskn = new ConfParamSLW( m_groupbox, ConfLink(new ConfLinkPlusMinus( rclconf, config, "skippedNames", std::bind(&RclConfig::getSkippedNames, rclconf), &m_sk)), QObject::tr("Skipped names"), QObject::tr("These are patterns for file or directory " " names which should not be indexed.")); eskn->setFsEncoding(true); m_widgets.push_back(eskn); gl1->addWidget(eskn, gridy, 0); vector amimes = rclconf->getAllMimeTypes(); QStringList amimesq; for (vector::const_iterator it = amimes.begin(); it != amimes.end(); it++) { amimesq.push_back(QString::fromUtf8(it->c_str())); } ConfParamCSLW *eincm = new ConfParamCSLW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "indexedmimetypes", &m_sk)), tr("Only mime types"), tr("An exclusive list of indexed mime types.
Nothing " "else will be indexed. Normally empty and inactive"), amimesq); m_widgets.push_back(eincm); gl1->addWidget(eincm, gridy++, 1); ConfParamCSLW *eexcm = new ConfParamCSLW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "excludedmimetypes", &m_sk)), tr("Exclude mime types"), tr("Mime types not to be indexed"), amimesq); m_widgets.push_back(eexcm); gl1->addWidget(eexcm, gridy, 0); ConfParamSLW *encs = new ConfParamSLW( m_groupbox, ConfLink(new ConfLinkPlusMinus( rclconf, config, "noContentSuffixes", std::bind(&RclConfig::getStopSuffixes, rclconf), &m_sk)), QObject::tr("Ignored endings"), QObject::tr("These are file name endings for files which will be " "indexed by name only \n(no MIME type identification " "attempt, no decompression, no content indexing).")); encs->setFsEncoding(true); m_widgets.push_back(encs); gl1->addWidget(encs, gridy++, 1); vector args; args.push_back("-l"); ExecCmd ex; string icout; string cmd = "iconv"; int status = ex.doexec(cmd, args, 0, &icout); if (status) { LOGERR("Can't get list of charsets from 'iconv -l'" ); } icout = neutchars(icout, ","); list ccsets; stringToStrings(icout, ccsets); QStringList charsets; charsets.push_back(""); for (list::const_iterator it = ccsets.begin(); it != ccsets.end(); it++) { charsets.push_back(QString::fromUtf8(it->c_str())); } ConfParamCStrW *e21 = new ConfParamCStrW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "defaultcharset", &m_sk)), QObject::tr("Default
character set"), QObject::tr("Character set used for reading files " "which do not identify the character set " "internally, for example pure text files.
" "The default value is empty, " "and the value from the NLS environnement is used." ), charsets); m_widgets.push_back(e21); gl1->addWidget(e21, gridy++, 0); ConfParamBoolW *e3 = new ConfParamBoolW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "followLinks", &m_sk)), QObject::tr("Follow symbolic links"), QObject::tr("Follow symbolic links while " "indexing. The default is no, " "to avoid duplicate indexing")); m_widgets.push_back(e3); gl1->addWidget(e3, gridy, 0); ConfParamBoolW *eafln = new ConfParamBoolW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "indexallfilenames", &m_sk)), QObject::tr("Index all file names"), QObject::tr("Index the names of files for which the contents " "cannot be identified or processed (no or " "unsupported mime type). Default true")); m_widgets.push_back(eafln); gl1->addWidget(eafln, gridy++, 1); ConfParamIntW *ezfmaxkbs = new ConfParamIntW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "compressedfilemaxkbs", &m_sk)), tr("Max. compressed file size (KB)"), tr("This value sets a threshold beyond which compressed" "files will not be processed. Set to -1 for no " "limit, to 0 for no decompression ever."), -1, 1000000, -1); m_widgets.push_back(ezfmaxkbs); gl1->addWidget(ezfmaxkbs, gridy, 0); ConfParamIntW *etxtmaxmbs = new ConfParamIntW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "textfilemaxmbs", &m_sk)), tr("Max. text file size (MB)"), tr("This value sets a threshold beyond which text " "files will not be processed. Set to -1 for no " "limit. \nThis is for excluding monster " "log files from the index."), -1, 1000000); m_widgets.push_back(etxtmaxmbs); gl1->addWidget(etxtmaxmbs, gridy++, 1); ConfParamIntW *etxtpagekbs = new ConfParamIntW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "textfilepagekbs", &m_sk)), tr("Text file page size (KB)"), tr("If this value is set (not equal to -1), text " "files will be split in chunks of this size for " "indexing.\nThis will help searching very big text " " files (ie: log files)."), -1, 1000000); m_widgets.push_back(etxtpagekbs); gl1->addWidget(etxtpagekbs, gridy, 0); ConfParamIntW *efiltmaxsecs = new ConfParamIntW( m_groupbox, ConfLink(new ConfLinkRclRep(config, "filtermaxseconds", &m_sk)), tr("Max. filter exec. time (S)"), tr("External filters working longer than this will be " "aborted. This is for the rare case (ie: postscript) " "where a document could cause a filter to loop. " "Set to -1 for no limit.\n"), -1, 10000); m_widgets.push_back(efiltmaxsecs); gl1->addWidget(efiltmaxsecs, gridy++, 1); vboxLayout->addWidget(m_groupbox); subDirChanged(0, 0); } void ConfSubPanelW::reloadAll() { for (list::iterator it = m_widgets.begin(); it != m_widgets.end(); it++) { (*it)->loadValue(); } } void ConfSubPanelW::subDirChanged(QListWidgetItem *current, QListWidgetItem *) { LOGDEB("ConfSubPanelW::subDirChanged\n" ); if (current == 0 || current->text() == "") { m_sk = ""; m_groupbox->setTitle(tr("Global")); } else { m_sk = (const char *) current->text().toUtf8(); m_groupbox->setTitle(current->text()); } LOGDEB("ConfSubPanelW::subDirChanged: now [" << (m_sk) << "]\n" ); reloadAll(); } void ConfSubPanelW::subDirDeleted(QString sbd) { LOGDEB("ConfSubPanelW::subDirDeleted(" << ((const char *)sbd.toUtf8()) << ")\n" ); if (sbd == "") { // Can't do this, have to reinsert it QTimer::singleShot(0, this, SLOT(restoreEmpty())); return; } // Have to delete all entries for submap m_config->eraseKey((const char *)sbd.toUtf8()); } void ConfSubPanelW::restoreEmpty() { LOGDEB("ConfSubPanelW::restoreEmpty()\n" ); m_subdirs->getListBox()->insertItem(0, ""); } } // Namespace confgui recoll-1.23.7/qtgui/confgui/confgui.h0000644000175000017500000001667213125637102014407 00000000000000/* Copyright (C) 2007 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _confgui_h_included_ #define _confgui_h_included_ #include "autoconfig.h" /** * This file defines a number of simple classes (virtual base: ConfParamW) * which let the user input configuration parameters. * * Subclasses are defined for entering different kind of data, ie a string, * a file name, an integer, etc. * * Each configuration gui object is linked to the configuration data through * a "link" object which knows the details of interacting with the actual * configuration data, like the parameter name, the actual config object, * the method to call etc. * * The link object is set when the input widget is created and cannot be * changed. * * The widgets are typically linked to a temporary configuration object, which * is then copied to the actual configuration if the data is accepted, or * destroyed and recreated as a copy if Cancel is pressed (you have to * delete/recreate the widgets in this case as the links are no longer valid). */ #include #include #include #include #include #include class QHBoxLayout; class QLineEdit; class QListWidget; class QSpinBox; class QComboBox; class QCheckBox; class QPushButton; namespace confgui { // A class to isolate the gui widget from the config storage mechanism class ConfLinkRep { public: virtual ~ConfLinkRep() {} virtual bool set(const std::string& val) = 0; virtual bool get(std::string& val) = 0; }; typedef std::shared_ptr ConfLink; // Useful to store/manage data which has no direct representation in // the config, ie list of subkey directories class ConfLinkNullRep : public ConfLinkRep { public: virtual ~ConfLinkNullRep() {} virtual bool set(const std::string&) { return true; } virtual bool get(std::string& val) {val = ""; return true;} }; // A widget to let the user change one configuration // parameter. Subclassed for specific parameter types. Basically // has a label and some kind of entry widget class ConfParamW : public QWidget { Q_OBJECT public: ConfParamW(QWidget *parent, ConfLink cflink) : QWidget(parent), m_cflink(cflink), m_fsencoding(false) { } virtual void loadValue() = 0; virtual void setFsEncoding(bool onoff) {m_fsencoding = onoff;} protected: ConfLink m_cflink; QHBoxLayout *m_hl; // File names are encoded as local8bit in the config files. Other // are encoded as utf-8 bool m_fsencoding; virtual bool createCommon(const QString& lbltxt, const QString& tltptxt); public slots: virtual void setEnabled(bool) = 0; protected slots: void setValue(const QString& newvalue); void setValue(int newvalue); void setValue(bool newvalue); }; // Widgets for setting the different types of configuration parameters: // Int class ConfParamIntW : public ConfParamW { Q_OBJECT public: // The default value is only used if none exists in the sample // configuration file. Defaults are normally set in there. ConfParamIntW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, int minvalue = INT_MIN, int maxvalue = INT_MAX, int defaultvalue = 0); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_sb) ((QWidget*)m_sb)->setEnabled(i);} protected: QSpinBox *m_sb; int m_defaultvalue; }; // Arbitrary string class ConfParamStrW : public ConfParamW { Q_OBJECT public: ConfParamStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_le) ((QWidget*)m_le)->setEnabled(i);} protected: QLineEdit *m_le; }; // Constrained string: choose from list class ConfParamCStrW : public ConfParamW { Q_OBJECT public: ConfParamCStrW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList& sl); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_cmb) ((QWidget*)m_cmb)->setEnabled(i);} protected: QComboBox *m_cmb; }; // Boolean class ConfParamBoolW : public ConfParamW { Q_OBJECT public: ConfParamBoolW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); public slots: virtual void setEnabled(bool i) {if(m_cb) ((QWidget*)m_cb)->setEnabled(i);} public: QCheckBox *m_cb; }; // File name class ConfParamFNW : public ConfParamW { Q_OBJECT public: ConfParamFNW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, bool isdir = false); virtual void loadValue(); protected slots: void showBrowserDialog(); public slots: virtual void setEnabled(bool i) { if(m_le) ((QWidget*)m_le)->setEnabled(i); if(m_pb) ((QWidget*)m_pb)->setEnabled(i); } protected: QLineEdit *m_le; QPushButton *m_pb; bool m_isdir; }; // String list class ConfParamSLW : public ConfParamW { Q_OBJECT public: ConfParamSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt); virtual void loadValue(); QListWidget *getListBox() {return m_lb;} public slots: virtual void setEnabled(bool i) {if(m_lb) ((QWidget*)m_lb)->setEnabled(i);} protected slots: virtual void showInputDialog(); void deleteSelected(); signals: void entryDeleted(QString); protected: QListWidget *m_lb; void listToConf(); }; // Dir name list class ConfParamDNLW : public ConfParamSLW { Q_OBJECT public: ConfParamDNLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt) : ConfParamSLW(parent, cflink, lbltxt, tltptxt) { m_fsencoding = true; } protected slots: virtual void showInputDialog(); }; // Constrained string list (chose from predefined) class ConfParamCSLW : public ConfParamSLW { Q_OBJECT public: ConfParamCSLW(QWidget *parent, ConfLink cflink, const QString& lbltxt, const QString& tltptxt, const QStringList& sl) : ConfParamSLW(parent, cflink, lbltxt, tltptxt), m_sl(sl) { } protected slots: virtual void showInputDialog(); protected: const QStringList m_sl; }; extern void setSzPol(QWidget *w, QSizePolicy::Policy hpol, QSizePolicy::Policy vpol, int hstretch, int vstretch); } #endif /* _confgui_h_included_ */ recoll-1.23.7/qtgui/restable.h0000644000175000017500000001315513125637102013115 00000000000000/* Copyright (C) 2006 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RESTABLE_H_INCLUDED_ #define _RESTABLE_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include #include #include "ui_restable.h" #include "docseq.h" #include "plaintorich.h" class ResTable; typedef std::string (FieldGetter)(const std::string& fldname, const Rcl::Doc& doc); class RecollModel : public QAbstractTableModel { Q_OBJECT public: RecollModel(const QStringList fields, QObject *parent = 0); // Reimplemented methods virtual int rowCount (const QModelIndex& = QModelIndex()) const; virtual int columnCount(const QModelIndex& = QModelIndex()) const; virtual QVariant headerData (int col, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; virtual QVariant data(const QModelIndex& index, int role = Qt::DisplayRole ) const; virtual void saveAsCSV(FILE *fp); virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); // Specific methods virtual void readDocSource(); virtual void setDocSource(std::shared_ptr nsource); virtual std::shared_ptr getDocSource() {return m_source;} virtual void deleteColumn(int); virtual const std::vector& getFields() {return m_fields;} virtual const std::map& getAllFields() { return o_displayableFields; } virtual void addColumn(int, const std::string&); // Some column name are aliases/translator for base document field // (ie: date, datetime->mtime). Help deal with this: virtual std::string baseField(const std::string&); // Ignore sort() call because virtual void setIgnoreSort(bool onoff) {m_ignoreSort = onoff;} friend class ResTable; signals: void sortDataChanged(DocSeqSortSpec); private: mutable std::shared_ptr m_source; std::vector m_fields; std::vector m_getters; static std::map o_displayableFields; bool m_ignoreSort; FieldGetter* chooseGetter(const std::string&); HighlightData m_hdata; }; class ResTable; // Modified textBrowser for the detail area class ResTableDetailArea : public QTextBrowser { Q_OBJECT; public: ResTableDetailArea(ResTable* parent = 0); public slots: virtual void createPopupMenu(const QPoint& pos); private: ResTable *m_table; }; class ResTablePager; class QUrl; class RclMain; class ResTable : public QWidget, public Ui::ResTable { Q_OBJECT public: ResTable(QWidget* parent = 0) : QWidget(parent), m_model(0), m_pager(0), m_detail(0), m_detaildocnum(-1), m_rclmain(0), m_ismainres(true) { setupUi(this); init(); } virtual ~ResTable() {} virtual RecollModel *getModel() {return m_model;} virtual ResTableDetailArea* getDetailArea() {return m_detail;} virtual int getDetailDocNumOrTopRow(); void setRclMain(RclMain *m, bool ismain); public slots: virtual void onTableView_currentChanged(const QModelIndex&); virtual void on_tableView_entered(const QModelIndex& index); virtual void setDocSource(std::shared_ptr nsource); virtual void saveColState(); virtual void resetSource(); virtual void readDocSource(bool resetPos = true); virtual void onSortDataChanged(DocSeqSortSpec); virtual void createPopupMenu(const QPoint& pos); virtual void onDoubleClick(const QModelIndex&); virtual void menuPreview(); virtual void menuSaveToFile(); virtual void menuSaveSelection(); virtual void menuEdit(); virtual void menuEditAndQuit(); virtual void menuOpenWith(QAction *); virtual void menuCopyFN(); virtual void menuCopyURL(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); virtual void menuShowSnippets(); virtual void menuShowSubDocs(); virtual void createHeaderPopupMenu(const QPoint&); virtual void deleteColumn(); virtual void addColumn(); virtual void resetSort(); // Revert to natural (relevance) order virtual void saveAsCSV(); virtual void linkWasClicked(const QUrl&); virtual void makeRowVisible(int row); virtual void takeFocus(); signals: void docPreviewClicked(int, Rcl::Doc, int); void docSaveToFileClicked(Rcl::Doc); void previewRequested(Rcl::Doc); void editRequested(Rcl::Doc); void openWithRequested(Rcl::Doc, string cmd); void headerClicked(); void docExpand(Rcl::Doc); void showSubDocs(Rcl::Doc); void showSnippets(Rcl::Doc); friend class ResTablePager; friend class ResTableDetailArea; private: void init(); RecollModel *m_model; ResTablePager *m_pager; ResTableDetailArea *m_detail; int m_detaildocnum; Rcl::Doc m_detaildoc; int m_popcolumn; RclMain *m_rclmain; bool m_ismainres; }; #endif /* _RESTABLE_H_INCLUDED_ */ recoll-1.23.7/qtgui/rclmain_w.cpp0000644000175000017500000010634713125637102013630 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include "log.h" #include "mimehandler.h" #include "pathut.h" #include "smallut.h" #include "advsearch_w.h" #include "sortseq.h" #include "uiprefs_w.h" #include "guiutils.h" #include "reslist.h" #include "ssearch_w.h" #include "internfile.h" #include "docseqdb.h" #include "docseqhist.h" #include "docseqdocs.h" #include "restable.h" #include "firstidx.h" #include "indexer.h" #include "rclzg.h" #include "snippets_w.h" #include "fragbuts.h" #include "systray.h" #include "rclmain_w.h" #include "rclhelp.h" #include "moc_rclmain_w.cpp" using std::pair; QString g_stringAllStem, g_stringNoStem; static Qt::ToolBarArea int2area(int in) { switch (in) { case Qt::LeftToolBarArea: return Qt::LeftToolBarArea; case Qt::RightToolBarArea: return Qt::RightToolBarArea; case Qt::BottomToolBarArea: return Qt::BottomToolBarArea; case Qt::TopToolBarArea: default: return Qt::TopToolBarArea; } } static QString configToTitle() { string confdir = path_getsimple(theconfig->getConfDir()); // Lower-case version. This only works with the ascii part, but // that's ok even if there are non-ascii chars in there, because // we further operate only on ascii substrings. string lconfdir = stringtolower((const string&)confdir); if (!lconfdir.empty() && lconfdir[0] == '.') { lconfdir = lconfdir.substr(1); confdir = confdir.substr(1); } string::size_type pos = lconfdir.find("recoll"); if (pos != string::npos) { lconfdir = lconfdir.substr(0, pos) + lconfdir.substr(pos+6); confdir = confdir.substr(0, pos) + confdir.substr(pos+6); } if (!confdir.empty()) { switch (confdir[0]) { case '.': case '-': case '_': confdir = confdir.substr(1); break; default: break; } } if (confdir.empty()) { confdir = "Recoll"; } else { confdir = string("Recoll - ") + confdir; } return QString::fromUtf8(confdir.c_str()); } void RclMain::init() { // This is just to get the common catg strings into the message file static const char* catg_strings[] = { QT_TR_NOOP("All"), QT_TR_NOOP("media"), QT_TR_NOOP("message"), QT_TR_NOOP("other"), QT_TR_NOOP("presentation"), QT_TR_NOOP("spreadsheet"), QT_TR_NOOP("text"), QT_TR_NOOP("sorted"), QT_TR_NOOP("filtered") }; setWindowTitle(configToTitle()); DocSequence::set_translations((const char *)tr("sorted").toUtf8(), (const char *)tr("filtered").toUtf8()); periodictimer = new QTimer(this); // idxstatus file. Make sure it exists before trying to watch it // (case where we're started on an older index, or if the status // file was deleted since indexing) QString idxfn = QString::fromLocal8Bit(theconfig->getIdxStatusFile().c_str()); QFile qf(idxfn); qf.open(QIODevice::ReadWrite); qf.setPermissions(QFile::ReadOwner|QFile::WriteOwner); qf.close(); m_watcher.addPath(idxfn); // At least some versions of qt4 don't display the status bar if // it's not created here. (void)statusBar(); (void)new HelpClient(this); HelpClient::installMap((const char *)this->objectName().toUtf8(), "RCL.SEARCH.GUI.SIMPLE"); // Set the focus to the search terms entry: sSearch->queryText->setFocus(); enbSynAction->setDisabled(prefs.synFile.isEmpty()); enbSynAction->setChecked(prefs.synFileEnable); // Stemming language menu g_stringNoStem = tr("(no stemming)"); g_stringAllStem = tr("(all languages)"); m_idNoStem = preferencesMenu->addAction(g_stringNoStem); m_idNoStem->setCheckable(true); m_stemLangToId[g_stringNoStem] = m_idNoStem; m_idAllStem = preferencesMenu->addAction(g_stringAllStem); m_idAllStem->setCheckable(true); m_stemLangToId[g_stringAllStem] = m_idAllStem; // Can't get the stemming languages from the db at this stage as // db not open yet (the case where it does not even exist makes // things complicated). So get the languages from the config // instead vector langs; if (!getStemLangs(langs)) { QMessageBox::warning(0, "Recoll", tr("error retrieving stemming languages")); } QAction *curid = prefs.queryStemLang == "ALL" ? m_idAllStem : m_idNoStem; QAction *id; for (vector::const_iterator it = langs.begin(); it != langs.end(); it++) { QString qlang = QString::fromUtf8(it->c_str(), it->length()); id = preferencesMenu->addAction(qlang); id->setCheckable(true); m_stemLangToId[qlang] = id; if (prefs.queryStemLang == qlang) { curid = id; } } curid->setChecked(true); m_toolsTB = new QToolBar(this); m_toolsTB->setObjectName(QString::fromUtf8("m_toolsTB")); m_toolsTB->addAction(toolsAdvanced_SearchAction); m_toolsTB->addAction(toolsDoc_HistoryAction); m_toolsTB->addAction(toolsSpellAction); m_toolsTB->addAction(actionQuery_Fragments); this->addToolBar(int2area(prefs.toolArea), m_toolsTB); m_resTB = new QToolBar(this); m_resTB->setObjectName(QString::fromUtf8("m_resTB")); this->addToolBar(int2area(prefs.resArea), m_resTB); // Document filter buttons and combobox // Combobox version of the document filter control m_filtCMB = new QComboBox(m_resTB); m_filtCMB->setEditable(false); m_filtCMB->addItem(tr("All")); m_filtCMB->setToolTip(tr("Document filter")); // Buttons version of the document filter control m_filtFRM = new QFrame(this); m_filtFRM->setObjectName(QString::fromUtf8("m_filtFRM")); QSizePolicy sizePolicy2(QSizePolicy::Preferred, QSizePolicy::Maximum); sizePolicy2.setHorizontalStretch(0); sizePolicy2.setVerticalStretch(0); sizePolicy2.setHeightForWidth(m_filtFRM->sizePolicy().hasHeightForWidth()); m_filtFRM->setSizePolicy(sizePolicy2); QHBoxLayout *bgrphbox = new QHBoxLayout(m_filtFRM); m_filtBGRP = new QButtonGroup(m_filtFRM); QRadioButton *allRDB = new QRadioButton(m_filtFRM); verticalLayout->insertWidget(1, m_filtFRM); allRDB->setObjectName(QString::fromUtf8("allRDB")); allRDB->setGeometry(QRect(0, 0, 45, 20)); allRDB->setText(tr("All")); bgrphbox->addWidget(allRDB); int bgrpid = 0; m_filtBGRP->addButton(allRDB, bgrpid++); allRDB->setChecked(true); // Menu version of the document filter control m_filtMN = new QMenu(MenuBar); m_filtMN->setObjectName(QString::fromUtf8("m_filtMN")); MenuBar->insertMenu(helpMenu->menuAction(), m_filtMN); m_filtMN->setTitle("F&ilter"); QActionGroup *fltag = new QActionGroup(this); fltag->setExclusive(true); QAction *act = fltag->addAction(tr("All")); m_filtMN->addAction(act); act->setCheckable(true); act->setData((int)0); // Go through the filter list and setup buttons and combobox vector cats; theconfig->getGuiFilterNames(cats); m_catgbutvec.push_back(catg_strings[0]); for (vector::const_iterator it = cats.begin(); it != cats.end(); it++) { QRadioButton *but = new QRadioButton(m_filtFRM); QString catgnm = QString::fromUtf8(it->c_str(), it->length()); m_catgbutvec.push_back(*it); // We strip text before the first colon before setting the button name. // This is so that the user can decide the order of buttons by naming // the filter,ie, a:media b:messages etc. QString but_txt = catgnm; int colon = catgnm.indexOf(':'); if (colon != -1) { but_txt = catgnm.right(catgnm.size()-(colon+1)); } but->setText(tr(but_txt.toUtf8())); m_filtCMB->addItem(tr(but_txt.toUtf8())); bgrphbox->addWidget(but); m_filtBGRP->addButton(but, bgrpid++); QAction *act = fltag->addAction(tr(but_txt.toUtf8())); m_filtMN->addAction(act); act->setCheckable(true); act->setData((int)(m_catgbutvec.size()-1)); m_filtMN->connect(m_filtMN, SIGNAL(triggered(QAction *)), this, SLOT(catgFilter(QAction *))); } m_filtFRM->setLayout(bgrphbox); connect(m_filtBGRP, SIGNAL(buttonClicked(int)),this, SLOT(catgFilter(int))); connect(m_filtCMB, SIGNAL(activated(int)), this, SLOT(catgFilter(int))); restable = new ResTable(this); verticalLayout->insertWidget(2, restable); actionShowResultsAsTable->setChecked(prefs.showResultsAsTable); on_actionShowResultsAsTable_toggled(prefs.showResultsAsTable); // Must not do this when restable is a child of rclmain // sc = new QShortcut(quitKeySeq, restable); // connect(sc, SIGNAL (activated()), this, SLOT (fileExit())); // A shortcut to get the focus back to the search entry. QKeySequence seq("Ctrl+Shift+s"); QShortcut *sc = new QShortcut(seq, this); connect(sc, SIGNAL (activated()), sSearch, SLOT (takeFocus())); QKeySequence seql("Ctrl+l"); sc = new QShortcut(seql, this); connect(sc, SIGNAL (activated()), sSearch, SLOT (takeFocus())); connect(&m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(updateIdxStatus())); connect(sSearch, SIGNAL(startSearch(std::shared_ptr, bool)), this, SLOT(startSearch(std::shared_ptr, bool))); connect(sSearch, SIGNAL(clearSearch()), this, SLOT(resetSearch())); connect(preferencesMenu, SIGNAL(triggered(QAction*)), this, SLOT(setStemLang(QAction*))); connect(preferencesMenu, SIGNAL(aboutToShow()), this, SLOT(adjustPrefsMenu())); connect(fileExitAction, SIGNAL(triggered() ), this, SLOT(fileExit() ) ); connect(fileToggleIndexingAction, SIGNAL(triggered()), this, SLOT(toggleIndexing())); connect(fileRebuildIndexAction, SIGNAL(triggered()), this, SLOT(rebuildIndex())); connect(fileEraseDocHistoryAction, SIGNAL(triggered()), this, SLOT(eraseDocHistory())); connect(fileEraseSearchHistoryAction, SIGNAL(triggered()), this, SLOT(eraseSearchHistory())); connect(actionSave_last_query, SIGNAL(triggered()), this, SLOT(saveLastQuery())); connect(actionLoad_saved_query, SIGNAL(triggered()), this, SLOT(loadSavedQuery())); connect(actionShow_index_statistics, SIGNAL(triggered()), this, SLOT(showIndexStatistics())); connect(helpAbout_RecollAction, SIGNAL(triggered()), this, SLOT(showAboutDialog())); connect(showMissingHelpers_Action, SIGNAL(triggered()), this, SLOT(showMissingHelpers())); connect(showActiveTypes_Action, SIGNAL(triggered()), this, SLOT(showActiveTypes())); connect(userManualAction, SIGNAL(triggered()), this, SLOT(startManual())); connect(toolsDoc_HistoryAction, SIGNAL(triggered()), this, SLOT(showDocHistory())); connect(toolsAdvanced_SearchAction, SIGNAL(triggered()), this, SLOT(showAdvSearchDialog())); connect(toolsSpellAction, SIGNAL(triggered()), this, SLOT(showSpellDialog())); #ifdef _WIN32 actionWebcache_Editor->setEnabled(false); #else connect(actionWebcache_Editor, SIGNAL(triggered()), this, SLOT(showWebcacheDialog())); #endif connect(actionQuery_Fragments, SIGNAL(triggered()), this, SLOT(showFragButs())); connect(actionSpecial_Indexing, SIGNAL(triggered()), this, SLOT(showSpecIdx())); connect(indexConfigAction, SIGNAL(triggered()), this, SLOT(showIndexConfig())); connect(indexScheduleAction, SIGNAL(triggered()), this, SLOT(showIndexSched())); connect(queryPrefsAction, SIGNAL(triggered()), this, SLOT(showUIPrefs())); connect(extIdxAction, SIGNAL(triggered()), this, SLOT(showExtIdxDialog())); connect(enbSynAction, SIGNAL(toggled(bool)), this, SLOT(setSynEnabled(bool))); connect(toggleFullScreenAction, SIGNAL(triggered()), this, SLOT(toggleFullScreen())); connect(actionShowQueryDetails, SIGNAL(triggered()), reslist, SLOT(showQueryDetails())); connect(periodictimer, SIGNAL(timeout()), this, SLOT(periodic100())); restable->setRclMain(this, true); connect(actionSaveResultsAsCSV, SIGNAL(triggered()), restable, SLOT(saveAsCSV())); connect(this, SIGNAL(docSourceChanged(std::shared_ptr)), restable, SLOT(setDocSource(std::shared_ptr))); connect(this, SIGNAL(searchReset()), restable, SLOT(resetSource())); connect(this, SIGNAL(resultsReady()), restable, SLOT(readDocSource())); connect(this, SIGNAL(sortDataChanged(DocSeqSortSpec)), restable, SLOT(onSortDataChanged(DocSeqSortSpec))); connect(restable->getModel(), SIGNAL(sortDataChanged(DocSeqSortSpec)), this, SLOT(onSortDataChanged(DocSeqSortSpec))); connect(restable, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)), this, SLOT(startPreview(int, Rcl::Doc, int))); connect(restable, SIGNAL(docExpand(Rcl::Doc)), this, SLOT(docExpand(Rcl::Doc))); connect(restable, SIGNAL(showSubDocs(Rcl::Doc)), this, SLOT(showSubDocs(Rcl::Doc))); connect(restable, SIGNAL(previewRequested(Rcl::Doc)), this, SLOT(startPreview(Rcl::Doc))); connect(restable, SIGNAL(editRequested(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(restable, SIGNAL(openWithRequested(Rcl::Doc, string)), this, SLOT(openWith(Rcl::Doc, string))); connect(restable, SIGNAL(docSaveToFileClicked(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); connect(restable, SIGNAL(showSnippets(Rcl::Doc)), this, SLOT(showSnippets(Rcl::Doc))); reslist->setRclMain(this, true); connect(this, SIGNAL(docSourceChanged(std::shared_ptr)), reslist, SLOT(setDocSource(std::shared_ptr))); connect(firstPageAction, SIGNAL(triggered()), reslist, SLOT(resultPageFirst())); connect(prevPageAction, SIGNAL(triggered()), reslist, SLOT(resPageUpOrBack())); connect(nextPageAction, SIGNAL(triggered()), reslist, SLOT(resPageDownOrNext())); connect(this, SIGNAL(searchReset()), reslist, SLOT(resetList())); connect(this, SIGNAL(resultsReady()), reslist, SLOT(readDocSource())); connect(reslist, SIGNAL(hasResults(int)), this, SLOT(resultCount(int))); connect(reslist, SIGNAL(wordSelect(QString)), sSearch, SLOT(addTerm(QString))); connect(reslist, SIGNAL(wordReplace(const QString&, const QString&)), sSearch, SLOT(onWordReplace(const QString&, const QString&))); connect(reslist, SIGNAL(nextPageAvailable(bool)), this, SLOT(enableNextPage(bool))); connect(reslist, SIGNAL(prevPageAvailable(bool)), this, SLOT(enablePrevPage(bool))); connect(reslist, SIGNAL(docExpand(Rcl::Doc)), this, SLOT(docExpand(Rcl::Doc))); connect(reslist, SIGNAL(showSnippets(Rcl::Doc)), this, SLOT(showSnippets(Rcl::Doc))); connect(reslist, SIGNAL(showSubDocs(Rcl::Doc)), this, SLOT(showSubDocs(Rcl::Doc))); connect(reslist, SIGNAL(docSaveToFileClicked(Rcl::Doc)), this, SLOT(saveDocToFile(Rcl::Doc))); connect(reslist, SIGNAL(editRequested(Rcl::Doc)), this, SLOT(startNativeViewer(Rcl::Doc))); connect(reslist, SIGNAL(openWithRequested(Rcl::Doc, string)), this, SLOT(openWith(Rcl::Doc, string))); connect(reslist, SIGNAL(docPreviewClicked(int, Rcl::Doc, int)), this, SLOT(startPreview(int, Rcl::Doc, int))); connect(reslist, SIGNAL(previewRequested(Rcl::Doc)), this, SLOT(startPreview(Rcl::Doc))); setFilterCtlStyle(prefs.filterCtlStyle); if (prefs.keepSort && prefs.sortActive) { m_sortspec.field = (const char *)prefs.sortField.toUtf8(); m_sortspec.desc = prefs.sortDesc; onSortDataChanged(m_sortspec); emit sortDataChanged(m_sortspec); } if (prefs.showTrayIcon && QSystemTrayIcon::isSystemTrayAvailable()) { m_trayicon = new RclTrayIcon(this, QIcon(QString(":/images/recoll.png"))); m_trayicon->show(); } else { m_trayicon = 0; } fileRebuildIndexAction->setEnabled(false); fileToggleIndexingAction->setEnabled(false); fileRetryFailedAction->setEnabled(false); // Start timer on a slow period (used for checking ^C). Will be // speeded up during indexing periodictimer->start(1000); } void RclMain::setSynEnabled(bool on) { prefs.synFileEnable = on; if (uiprefs) uiprefs->synFileCB->setChecked(prefs.synFileEnable); } void RclMain::resultCount(int n) { actionSortByDateAsc->setEnabled(n>0); actionSortByDateDesc->setEnabled(n>0); } void RclMain::setFilterCtlStyle(int stl) { switch (stl) { case PrefsPack::FCS_MN: setupResTB(false); m_filtFRM->setVisible(false); m_filtMN->menuAction()->setVisible(true); break; case PrefsPack::FCS_CMB: setupResTB(true); m_filtFRM->setVisible(false); m_filtMN->menuAction()->setVisible(false); break; case PrefsPack::FCS_BT: default: setupResTB(false); m_filtFRM->setVisible(true); m_filtMN->menuAction()->setVisible(false); } } // Set up the "results" toolbox, adding the filter combobox or not depending // on config option void RclMain::setupResTB(bool combo) { m_resTB->clear(); m_resTB->addAction(firstPageAction); m_resTB->addAction(prevPageAction); m_resTB->addAction(nextPageAction); m_resTB->addSeparator(); m_resTB->addAction(actionSortByDateAsc); m_resTB->addAction(actionSortByDateDesc); if (combo) { m_resTB->addSeparator(); m_filtCMB->show(); m_resTB->addWidget(m_filtCMB); } else { m_filtCMB->hide(); } m_resTB->addSeparator(); m_resTB->addAction(actionShowResultsAsTable); } // This is called by a timer right after we come up. Try to open // the database and talk to the user if we can't void RclMain::initDbOpen() { bool nodb = false; string reason; bool maindberror; if (!maybeOpenDb(reason, true, &maindberror)) { nodb = true; if (maindberror) { FirstIdxDialog fidia(this); connect(fidia.idxconfCLB, SIGNAL(clicked()), this, SLOT(execIndexConfig())); connect(fidia.idxschedCLB, SIGNAL(clicked()), this, SLOT(execIndexSched())); connect(fidia.runidxPB, SIGNAL(clicked()), this, SLOT(toggleIndexing())); fidia.exec(); // Don't open adv search or run cmd line search in this case. return; } else { QMessageBox::warning(0, "Recoll", tr("Could not open external index. Db not open. Check external indexes list.")); } } if (prefs.startWithAdvSearchOpen) showAdvSearchDialog(); // If we have something in the search entry, it comes from a // command line argument if (!nodb && sSearch->hasSearchString()) QTimer::singleShot(0, sSearch, SLOT(startSimpleSearch())); if (!m_urltoview.isEmpty()) viewUrl(); } void RclMain::setStemLang(QAction *id) { LOGDEB("RclMain::setStemLang(" << id << ")\n"); // Check that the menu entry is for a stemming language change // (might also be "show prefs" etc. bool isLangId = false; for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { if (id == it->second) isLangId = true; } if (!isLangId) return; // Set the "checked" item state for lang entries for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { (it->second)->setChecked(false); } id->setChecked(true); // Retrieve language value (also handle special cases), set prefs, // notify that we changed QString lang; if (id == m_idNoStem) { lang = ""; } else if (id == m_idAllStem) { lang = "ALL"; } else { lang = id->text(); } prefs.queryStemLang = lang; LOGDEB("RclMain::setStemLang(" << id << "): lang [" << qs2utf8s(prefs.queryStemLang) << "]\n"); rwSettings(true); emit stemLangChanged(lang); } // Set the checked stemming language item before showing the prefs menu void RclMain::setStemLang(const QString& lang) { LOGDEB("RclMain::setStemLang(" << qs2utf8s(lang) << ")\n"); QAction *id; if (lang == "") { id = m_idNoStem; } else if (lang == "ALL") { id = m_idAllStem; } else { map::iterator it = m_stemLangToId.find(lang); if (it == m_stemLangToId.end()) return; id = it->second; } for (map::const_iterator it = m_stemLangToId.begin(); it != m_stemLangToId.end(); it++) { (it->second)->setChecked(false); } id->setChecked(true); } // Prefs menu about to show void RclMain::adjustPrefsMenu() { setStemLang(prefs.queryStemLang); } void RclMain::showTrayMessage(const QString& text) { if (m_trayicon) m_trayicon->showMessage("Recoll", text, QSystemTrayIcon::Information, 1000); } void RclMain::closeEvent(QCloseEvent *ev) { LOGDEB("RclMain::closeEvent\n"); if (prefs.closeToTray && m_trayicon && m_trayicon->isVisible()) { hide(); ev->ignore(); } else { fileExit(); } } void RclMain::fileExit() { LOGDEB("RclMain: fileExit\n"); // Don't save geometry if we're currently fullscreened if (!isFullScreen()) { prefs.mainwidth = width(); prefs.mainheight = height(); } prefs.toolArea = toolBarArea(m_toolsTB); prefs.resArea = toolBarArea(m_resTB); restable->saveColState(); if (prefs.ssearchTypSav) { prefs.ssearchTyp = sSearch->searchTypCMB->currentIndex(); } rwSettings(true); // We should do the right thing and let exit() call all the // cleanup handlers. But we have few persistent resources and qt // exit is a great source of crashes and pita. So do our own // cleanup: deleteAllTempFiles(); // and scram out _Exit(0); } // Start a db query and set the reslist docsource void RclMain::startSearch(std::shared_ptr sdata, bool issimple) { LOGDEB("RclMain::startSearch. Indexing " << (m_idxproc?"on":"off") << " Active " << m_queryActive << "\n"); if (m_queryActive) { LOGDEB("startSearch: already active\n"); return; } m_queryActive = true; restable->setEnabled(false); m_source = std::shared_ptr(); m_searchIsSimple = issimple; // The db may have been closed at the end of indexing string reason; // If indexing is being performed, we reopen the db at each query. if (!maybeOpenDb(reason, m_idxproc != 0)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); m_queryActive = false; restable->setEnabled(true); return; } if (prefs.synFileEnable && !prefs.synFile.isEmpty()) { string sf = (const char *)prefs.synFile.toLocal8Bit(); if (!rcldb->setSynGroupsFile(sf)) { QMessageBox::warning(0, "Recoll", tr("Can't set synonyms file (parse error?)")); return; } } else { rcldb->setSynGroupsFile(""); } Rcl::Query *query = new Rcl::Query(rcldb); query->setCollapseDuplicates(prefs.collapseDuplicates); curPreview = 0; DocSequenceDb *src = new DocSequenceDb(std::shared_ptr(query), string(tr("Query results").toUtf8()), sdata); src->setAbstractParams(prefs.queryBuildAbstract, prefs.queryReplaceAbstract); m_source = std::shared_ptr(src); m_source->setSortSpec(m_sortspec); m_source->setFiltSpec(m_filtspec); emit docSourceChanged(m_source); emit sortDataChanged(m_sortspec); initiateQuery(); } class QueryThread : public QThread { std::shared_ptr m_source; public: QueryThread(std::shared_ptr source) : m_source(source) { } ~QueryThread() { } virtual void run() { cnt = m_source->getResCnt(); } int cnt; }; void RclMain::initiateQuery() { if (!m_source) return; QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); QueryThread qthr(m_source); qthr.start(); QProgressDialog progress(this); progress.setLabelText(tr("Query in progress.
" "Due to limitations of the indexing library,
" "cancelling will exit the program")); progress.setWindowModality(Qt::WindowModal); progress.setRange(0,0); // For some reason setMinimumDuration() does not seem to work with // a busy dialog (range 0,0) Have to call progress.show() inside // the loop. // progress.setMinimumDuration(2000); // Also the multiple processEvents() seem to improve the responsiveness?? for (int i = 0;;i++) { qApp->processEvents(); if (qthr.wait(100)) { break; } if (i == 20) progress.show(); qApp->processEvents(); if (progress.wasCanceled()) { // Just get out of there asap. exit(1); } qApp->processEvents(); } int cnt = qthr.cnt; QString msg; if (cnt > 0) { QString str; msg = tr("Result count (est.)") + ": " + str.setNum(cnt); } else { msg = tr("No results found"); } statusBar()->showMessage(msg, 0); QApplication::restoreOverrideCursor(); m_queryActive = false; restable->setEnabled(true); emit(resultsReady()); } void RclMain::resetSearch() { emit searchReset(); } void RclMain::onSortCtlChanged() { if (m_sortspecnochange) return; LOGDEB("RclMain::onSortCtlChanged()\n"); m_sortspec.reset(); if (actionSortByDateAsc->isChecked()) { m_sortspec.field = "mtime"; m_sortspec.desc = false; prefs.sortActive = true; prefs.sortDesc = false; prefs.sortField = "mtime"; } else if (actionSortByDateDesc->isChecked()) { m_sortspec.field = "mtime"; m_sortspec.desc = true; prefs.sortActive = true; prefs.sortDesc = true; prefs.sortField = "mtime"; } else { prefs.sortActive = prefs.sortDesc = false; prefs.sortField = ""; } if (m_source) m_source->setSortSpec(m_sortspec); emit sortDataChanged(m_sortspec); initiateQuery(); } void RclMain::onSortDataChanged(DocSeqSortSpec spec) { LOGDEB("RclMain::onSortDataChanged\n"); m_sortspecnochange = true; if (spec.field.compare("mtime")) { actionSortByDateDesc->setChecked(false); actionSortByDateAsc->setChecked(false); } else { actionSortByDateDesc->setChecked(spec.desc); actionSortByDateAsc->setChecked(!spec.desc); } m_sortspecnochange = false; if (m_source) m_source->setSortSpec(spec); m_sortspec = spec; prefs.sortField = QString::fromUtf8(spec.field.c_str()); prefs.sortDesc = spec.desc; prefs.sortActive = !spec.field.empty(); initiateQuery(); } void RclMain::on_actionShowResultsAsTable_toggled(bool on) { LOGDEB("RclMain::on_actionShowResultsAsTable_toggled(" << on << ")\n"); prefs.showResultsAsTable = on; displayingTable = on; restable->setVisible(on); reslist->setVisible(!on); actionSaveResultsAsCSV->setEnabled(on); static QShortcut tablefocseq(QKeySequence("Ctrl+r"), this); if (!on) { int docnum = restable->getDetailDocNumOrTopRow(); if (docnum >= 0) { reslist->resultPageFor(docnum); } disconnect(&tablefocseq, SIGNAL(activated()), restable, SLOT(takeFocus())); sSearch->takeFocus(); } else { int docnum = reslist->pageFirstDocNum(); if (docnum >= 0) { restable->makeRowVisible(docnum); } nextPageAction->setEnabled(false); prevPageAction->setEnabled(false); firstPageAction->setEnabled(false); connect(&tablefocseq, SIGNAL(activated()), restable, SLOT(takeFocus())); } } void RclMain::on_actionSortByDateAsc_toggled(bool on) { LOGDEB("RclMain::on_actionSortByDateAsc_toggled(" << on << ")\n"); if (on) { if (actionSortByDateDesc->isChecked()) { actionSortByDateDesc->setChecked(false); // Let our buddy work. return; } } onSortCtlChanged(); } void RclMain::on_actionSortByDateDesc_toggled(bool on) { LOGDEB("RclMain::on_actionSortByDateDesc_toggled(" << on << ")\n"); if (on) { if (actionSortByDateAsc->isChecked()) { actionSortByDateAsc->setChecked(false); // Let our buddy work. return; } } onSortCtlChanged(); } void RclMain::saveDocToFile(Rcl::Doc doc) { QString s = QFileDialog::getSaveFileName(this, //parent tr("Save file"), QString::fromLocal8Bit(path_home().c_str()) ); string tofile((const char *)s.toLocal8Bit()); TempFile temp; // not used because tofile is set. if (!FileInterner::idocToFile(temp, tofile, theconfig, doc)) { QMessageBox::warning(0, "Recoll", tr("Cannot extract document or create " "temporary file")); return; } } void RclMain::showSubDocs(Rcl::Doc doc) { LOGDEB("RclMain::showSubDocs\n"); string reason; if (!maybeOpenDb(reason)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); return; } vector docs; if (!rcldb->getSubDocs(doc, docs)) { QMessageBox::warning(0, "Recoll", QString("Can't get subdocs")); return; } DocSequenceDocs *src = new DocSequenceDocs(rcldb, docs, qs2utf8s(tr("Sub-documents and attachments"))); src->setDescription(qs2utf8s(tr("Sub-documents and attachments"))); std::shared_ptr source(new DocSource(theconfig, std::shared_ptr(src))); ResTable *res = new ResTable(); res->setRclMain(this, false); res->setDocSource(source); res->readDocSource(); res->show(); } // Search for document 'like' the selected one. We ask rcldb/xapian to find // significant terms, and add them to the simple search entry. void RclMain::docExpand(Rcl::Doc doc) { LOGDEB("RclMain::docExpand()\n"); if (!rcldb) return; list terms; terms = m_source->expand(doc); if (terms.empty()) { LOGDEB("RclMain::docExpand: no terms\n"); return; } // Do we keep the original query. I think we'd better not. // rcldb->expand is set to keep the original query terms instead. QString text;// = sSearch->queryText->currentText(); for (list::iterator it = terms.begin(); it != terms.end(); it++) { text += QString::fromLatin1(" \"") + QString::fromUtf8((*it).c_str()) + QString::fromLatin1("\""); } // We need to insert item here, its not auto-done like when the user types // CR sSearch->queryText->setEditText(text); sSearch->setAnyTermMode(); sSearch->startSimpleSearch(); } void RclMain::showDocHistory() { LOGDEB("RclMain::showDocHistory\n"); emit searchReset(); m_source = std::shared_ptr(); curPreview = 0; string reason; if (!maybeOpenDb(reason)) { QMessageBox::critical(0, "Recoll", QString(reason.c_str())); return; } // Construct a bogus SearchData structure std::shared_ptrsearchdata = std::shared_ptr(new Rcl::SearchData(Rcl::SCLT_AND, cstr_null)); searchdata->setDescription((const char *)tr("History data").toUtf8()); // If you change the title, also change it in eraseDocHistory() DocSequenceHistory *src = new DocSequenceHistory(rcldb, g_dynconf, string(tr("Document history").toUtf8())); src->setDescription((const char *)tr("History data").toUtf8()); DocSource *source = new DocSource(theconfig, std::shared_ptr(src)); m_source = std::shared_ptr(source); m_source->setSortSpec(m_sortspec); m_source->setFiltSpec(m_filtspec); emit docSourceChanged(m_source); emit sortDataChanged(m_sortspec); initiateQuery(); } // Erase all memory of documents viewed void RclMain::eraseDocHistory() { // Clear file storage if (g_dynconf) g_dynconf->eraseAll(docHistSubKey); // Clear possibly displayed history if (reslist->displayingHistory()) { showDocHistory(); } } void RclMain::eraseSearchHistory() { prefs.ssearchHistory.clear(); if (sSearch) sSearch->queryText->clear(); if (g_advshistory) g_advshistory->clear(); } // Called when the uiprefs dialog is ok'd void RclMain::setUIPrefs() { if (!uiprefs) return; LOGDEB("Recollmain::setUIPrefs\n"); reslist->setFont(); sSearch->setPrefs(); enbSynAction->setDisabled(prefs.synFile.isEmpty()); enbSynAction->setChecked(prefs.synFileEnable); } void RclMain::enableNextPage(bool yesno) { if (!displayingTable) nextPageAction->setEnabled(yesno); } void RclMain::enablePrevPage(bool yesno) { if (!displayingTable) { prevPageAction->setEnabled(yesno); firstPageAction->setEnabled(yesno); } } QString RclMain::getQueryDescription() { if (!m_source) return ""; return QString::fromUtf8(m_source->getDescription().c_str()); } // Set filter, action style void RclMain::catgFilter(QAction *act) { int id = act->data().toInt(); catgFilter(id); } // User pressed a filter button: set filter params in reslist void RclMain::catgFilter(int id) { LOGDEB("RclMain::catgFilter: id " << id << "\n"); if (id < 0 || id >= int(m_catgbutvec.size())) return; switch (prefs.filterCtlStyle) { case PrefsPack::FCS_MN: m_filtCMB->setCurrentIndex(id); m_filtBGRP->buttons()[id]->setChecked(true); break; case PrefsPack::FCS_CMB: m_filtBGRP->buttons()[id]->setChecked(true); m_filtMN->actions()[id]->setChecked(true); break; case PrefsPack::FCS_BT: default: m_filtCMB->setCurrentIndex(id); m_filtMN->actions()[id]->setChecked(true); } m_catgbutvecidx = id; setFiltSpec(); } void RclMain::setFiltSpec() { m_filtspec.reset(); // "Category" buttons if (m_catgbutvecidx != 0) { string catg = m_catgbutvec[m_catgbutvecidx]; string frag; theconfig->getGuiFilter(catg, frag); m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, frag); } // Fragments from the fragbuts buttonbox tool if (fragbuts) { vector frags; fragbuts->getfrags(frags); for (vector::const_iterator it = frags.begin(); it != frags.end(); it++) { m_filtspec.orCrit(DocSeqFiltSpec::DSFS_QLANG, *it); } } if (m_source) m_source->setFiltSpec(m_filtspec); initiateQuery(); } void RclMain::onFragmentsChanged() { setFiltSpec(); } void RclMain::toggleFullScreen() { if (isFullScreen()) showNormal(); else showFullScreen(); } void RclMain::showEvent(QShowEvent *ev) { sSearch->queryText->setFocus(); QMainWindow::showEvent(ev); } void RclMain::applyStyleSheet() { ::applyStyleSheet(prefs.qssFile); } recoll-1.23.7/qtgui/mtpics/0000755000175000017500000000000013224670235012521 500000000000000recoll-1.23.7/qtgui/mtpics/pidgin.png0000644000175000017500000000675413125527323014434 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs × ×B(›xtEXtSoftwarewww.inkscape.org›î< iIDAThÕ™{tUU~Ç?{ïsν¹7$À%$ÈÃH!Œ5ƒ©::¨£v´vtúPW•βkÚªÕb«N×èR§øhír|€"`«ãˆÊP;*‚‚¼‘G !áæqs_çì½ûǹ‰JDÛþîúÝó¸';ßïþíßcÿްÖòÿYœÓ1ÈO¬¯q"êÇJrQÎ7uÖ¢úzÎZ‹µ¦p´Xc¿wÌ5XqÄö 0¯û>-¾£á³ÞcНj;ŸÞpaQD.ù£ÙÕ%#+‹EÔ;-sr”dr>;$íã¯nêìÊä®|jÁ¼7z~<šù©éOn¸è_ÞÒ•ÍûÖc¿N1ÆØL.oï^üN×õ÷¯¼¨C¿-pÏ‹›½l>Øý³ù㱨{º&û %•ÉqûÃo4v¦3£^øÛ«ò²ßuåo9ü AEcì7¦ñ¨ÇÜ©µƒ©nè7ˆ§æ7vPÄX0Ö~ƒ Sj"G΃SŒB³Ì5ˆ$ÔÔ6Ì=«±Î#vΘþÎA¿D(E = NÑ¿m|ë5u_™7à“ì[Šºñßò4ÉÆvŒáQ­-®«HçrCàKZ`Ö° ®ôTäî·t@UÉÈT‰Wú¶7ã,Üu;9¼1Éó?|…KïŸKå™§>¥ý­„/I࿾µä¦3nz]Ê’Û¥”÷ù:fûêÕt˜$™NÊÛ²cÁf^û{Ô5–Úñµ8îéϽÅhÍ—&°µcÏ¥®ë,QU9j¤SU=ÂMT%ˆÇc´4µr`_#뽞e‹_&çç¸ëç?e¹¿>Æ|9õ‰†aŽtþmdMÍŒï]wM±§"d:³dÓyZw%9”o¡¨$Bu¢š±uu•DÙöÉvø³{9ÿòn¸ë¸ÞéÏÆ„8i"›øö•Žã<9÷¢‹‹¦Î˜êÜq˜ÎÖRJ„!%BB !RPQ='*Yþò š“Müõã÷0¼vÄi_Yaî~Ék?ÿSqB Ô'ê¢Ñ¢§o¹õÖxĉ°cígXcQŽKQ b! „XkiÙw„XYW]s%ï¯ù€…·ÜÇ?-åœ>¿è¶@Ÿa´>Ñ é¼xùw®ˆ)ãðÙ¦XcJ •B9Ç•HG …rŽ'Q®ÄñÂël*Çm‡˜^?òâr^|ì9´µ§EŒ6'& …üɨÚÚº gއv6€K¤’(GÎŽ«Ž*:FÝpèäÁv.ûîeüúÙWùlÛžÓRNô¶Àq6­O4Œr]÷žùWÏ5noBkC[[’®tÖBIi C8ŽƒRᲑJ€è5Öb­ ³#ŧ[>¥+•âŒxjÁ£Üõ̽xE^ÿÖM/9aB\3ó¼zWE{s'ÍÍMŒ1š†këQŽâÃ77²fé{Œ¬Ié€â‚/Pø é®4»¶ïfúÅ“™yé4„üæ¹wxê'sãC·âF¾‰ZÀ‘ÎcÆÕ¹mͤ³*F⺻¿[pT˜û' ŒšXÃó÷¿Bñä1¸Ž*8³@ èŽjÍûsÉ.dæÓ{ƾöÎù´Üþ/|°ì]f\uþW"`Í |@3>1b(éö4¹®,gÏžˆ‚Ýî籞å“UÛ7}4õóÏ£eß‘p)¹áºw<:³#ÑYËÄúñl~k|ûQ6¼º€is¦ppã~´±ýVS89Ž€Åz^ÄC¬`ì´°Ú\vßTÖ æ¹¿ZÀôKÎ!ßé[H8¡ºŠ¨Š¢s¯.z›ª©•,_ø&g#ך%,ÃO]…cq”H÷MÀW9 k,Q'J¬$ @GsŠ—–/!Õ–AûšxyŒ¢H!ŽκrU– .ãã7¶“íÌò«%Ï’M劋Kú=ûB€h”¤½OÝ"„ д£€Ù7NcPófÊU$÷·‰Dp" ¡>ÿŽ«PJQ^SÊ®w÷1ãêÉŒ Îá[7Nàж¯<ù?‰Ä"жŽ.vô…Æ«„´xñë–~¨s«iøá f]7…HÜÃZËïþ}Å•1„(få\>G4Zh¢ebƒ¢4~ÔÄ ]ÁÙ—Œ§eO’µ/|LíNè7ò¸Ë³ÿñ~&™J/î“cUBHD:“)Vüý›Ì¼~ åUel}{›^ÛFº#Íà åX, ùxÃGŒs^b]r“ëÿ,”VÇQQÁ¦×¶²þ•ÍhÐÈ!&ÕÍ>%ÐR@ÄU *vÉåó<óÊ×òå> „6Ƹ¦*…#‡ÛX~ÿ›Xß"=IÑ å£Kð}ŸŠÚ2ªê†3uâ&ü“ o}—’ú›9¸çûÖ7-¢bŠxyŒ•ËWpÅŸ_¤êÒã@Z -YšÚó£‡Ä‰zŸ÷Ǻ2y>klæ¶žIut¦>^ú©¾-ÆSÀo±T\à p°V“j}‹Îö‚è(„€‰#Æ0¢ü0v×oHJ¿ãMJ¯FŒ:Ÿw—­%ÝÙF¬å &\þ36º…õKc_z¿§G¡¿3°4ÆÊ_ÜNS{žq—L6Cý/*<ƒ‰EÝy?x+“Î=²qÙÂMÝ`OdèNJÝÕ¶µHÇ¡¥Ýã/¯~û?äH‡G×ÛK1còìÞÛÊ@)RòÞ¢ïÓE C´Ku컼Zr~?›ßºúÉgû?§^ÿÀ0Ï•;­¥H¨,°è©•i0w¬{îÞÇN¶¼úô@Ø»4Æ"Mh iU5ÓYº*É—vùž?RQBp$’¸0ÄÛòF,™CþP³µÖ¼Óe‚úYg!ëk†•GéèJ³bõ†¥MOœ <ôF…KÕn „¦6Ú`Œ¡¨(FkvÏþg1…m)ñ˜×³O(îUæ¬mŸÎ¨sç±wïÞ´6ú·}(Џ?ýΓ‹\%‰y‚k<œIgÒ7¬}üqÿ”Ô'Øx¤(ŠöõçÝcCxn,F[ª«ªHúçóà¿Vp8ù¹£ÉÂê–Ý]5ø57F8p`¿6 `Ú5÷LÊåýI%ñ(kÖm .»uQê`SÛœ K¾þEàáø%4)Q•È뜎ä³>Ž+1Ú„…œ¡Ã­£µ’ÊŠÁ”–}›E¿ZÏø˜7+C¼mµ¨øUƒ+‘JÒÕÕ%!Ìž½Eëà6ÈÝü7O¬Þs°e©få¦eîÿ2àû"0clÝ8·³56\ÿ„•ŸÑ! P9 µÄs#L2“d[’_,ÙÃÐâ­Lröp cM·1|XoRIg u,€¼ðXÿüƒaûÙe>Š€£Ü9£FŠv´¤ÐÚ6ë!C¯%¶¶…ÀHKYIe“Î&&ðßû§á öH N„aRСÃDðñ ÷ÂÂþ`zù@}¢A Áê†Ñq8…5¦0ó ƒÑk :0è@£}S¸¯ ×a%ÕëZ9hL`|M&•câÄI¸¼ßH¿ˆpymÕ˜èáíä3ùÇ5:Œ@Ý€¬Ý÷´ÿ9™n üÂý@cKgkŠs&ŸS¤¤³ >Ñ0òk!àH÷ïΨ<+Þ¼µµ.ÔÐ aôÑFÝÇîþÜ"¦çØ‹\ élI1¤r_8¯ZIgÓ·†Ïùq}¢¡ß­ýÞ"¬µÔ'&ŽÒß]ræüxÛÁd‰Å-wzºÊ)ôTï~á6RˆB”½†µ=%‚5„W1tL%Mû›Yùꊮ¶TëŽÀß[Ó¸jëé pÝôÑõ‹‡E«‹:[RHGê ]Ù«¥‚TJB¡Ñ݉G/€žÃ Ï2‘M;7Îú¬—NJ çg_:tøà”DbD»‘ÖüÀH)…uQFYim€*Ф=ÏÅq…”Ž”RIB!º݃vgUa… ‚­Ac­¬õtà&ÈÆÏFçΧ† M”í<°³¶¿6~ºoSf_Ëîöò’AížÑ!Á€Š2áëˆ(¶Å2tIOºx®‡ë8Âu]ᛀX¬ˆ¢X (%m&› ‰kd l4Gûƶi³ñ’¨ösí<’2"ÀøAÞfó¹uïæŠt6uÊ/zÞÔ'À-hˆþÆùŠÏZ@é5«t¿Ÿx°þ¾©ÿ¿"§%þoÊÿAÜØ\ÜVIEND®B`‚recoll-1.23.7/qtgui/mtpics/text-x-python.png0000644000175000017500000000731413125527323015723 00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<IIDATxÚå[[lgþvv½öÞ¼Þõ5¾åžÚ8I«¦)¨)."úPŸjÕB[ µ}¨Th¼¤òVU<  q“)´PE ¨M i./ñý²ëëÚë½ywf8çh&ûï®ízT8ÒÉ?»3ÙùÏw¾sùÿûLÓÄÿ³øPF<$4>ýdŠi©a’T@5ÞO°F ŸL1HWIsdÒ*ƒ°UxIäͤuöuŸ &؆–HS¤IÒ%þ¼"¤mÅRél&k™nží|vR " še®Ù!ê~¿^¯÷4€,éÊv°C ÂÆ§WÒòÑÈšßÆrê¨+çʳ 0Ôk×3=bÙâÙ<¨÷òÒ¿2aÛØtz33IÔÕÅ0<<„®®nD£µ˜šœÂ®Ö]è»qmííX^^FGGFGGáóùàÕ4¬‹Ø½{7Å€Q¹Þ´F‹ÍžmTõÇE2™D&“A}}=/õõ÷azz š×‹‘‘D"°¬ ÀA×˵º®ó䣃+XYÔÒõ±°·i{øÈÒ£Ì3úN»uâQ¡~œŒnhh@;±b~~,M½_9o¸+¾2%pM×…€M‰yRÅ F2^=V½-ÿn ˆ-bOØV“äc†ÀG'º¡¡!Äãq°ÌÌÌHܳ$ ÔF£L‰÷ ƒèŸ¤ë‰Q:O3‚GÓìº%Ÿå÷U ¶:æóy ˆ‘Ùl–ã0X46*•Ãjkk1L@é†!¹ÃGybzj ]ÝÝò;)•+Θ¿ª U¤ô„Û²9ëŒWc¼§§G¡¾uÌY_@™˜˜ÄøŠ7çV‘Îy°RÔ‘-x£Š¡Á@µ×DÀ ý¢zÚ¢8º¯Q.0˜ÛÌj¹ÝI¨ãÊwöX(ˆê³øõ{S¸2ïAÑ RÓ$f^kÔH 96Ì«øË@± øÆ‰6œ8²‘pÂÕÂÛÍÕxµÁQA0 Cú€WÎO“ç½–&¤<:ís&à87Ÿ3ñ“¿Ž¢°ZÂ?݃P($¡rçC@1~s‰úWGgÉxM úÒ¡¾|Oú&ð³¿MðÒ̈cF8ϯ½3Ž{¶"H¡GNït°LMNò‰ÍëׯãøñãrLqGgwx{Ò2!Ö¾3´ FjtM§„ƒSaýV1?‡úÆ98¥5F,,ÜÄtê ‚Á»¹"¹šÕ0xA#ñøÓs}˜Ò£eãe›s‹áZæ_YYA&“Ú00:ù`Uå?áƒ<Ü“0 dV]]íÔ_vxÞ¹‘X3Þ07‹a圭XŸð0lI$ÔZÛn``Xu{$&Ìâúä~„˜ä0q-”—¡Ä÷Ñû*yx‡Þ7á”¥9˜3£¡+ ô´#—Ë1ì}f‚ëePzøôJS9ßö<\¹Ü)`m”öxáê!Ë`‡ñX¡)4‚ñ\†“½÷;ÁR©D ‡n²ÓøvÒ|%èjô4êó€Yrz~¼ÙåIäã²ñÊ ÑýNÐÐu Ï“W<\¶ÙÙX€©ïþ†Æb¡ôFã6¬, U×ÉÆsp³ä^Ø`6]P<¬&Ã5ÅÖBEÔ)Ñ kÆÑvàxç€MgT©¯-ð>#oÉ»Þ òD… 9§AƆ¾]õ¾—>ï«:ëªÑ©’%³ §ÁòÛ6]åü®ºâa?êü¢«å}ø½EÕóPÙà3f¸Ø¿çn0­ôi(³ˆQ=÷åñ•O…Ñ×áÕ‡Ñ\/dâÞ)Ê×p^áÌ-ßg2+¨¢Ô2À‚þ€²´WÙ`d¹à™ÕÝ* ñÅ”]‚¼Å¥¯ËêPãQ-‡Ï7¦ÐÓ<ŠãÝK¨X•Ì™òÔVË^Y6¤2!ì …¸st•"6=›jkÈȼâ}g2Ô`àë÷·àXç µ.U²|+ÔÞò¹P¼›K ²säVnéž‹JÌÃHgØ]oà@ËÊKec6÷¸zN«ÙÃs¼}}€—~¼…ðÀpôê"&bf03Ùí  UÌrÔÞ Eò|¸‰;@žƒË›¢Ž Í›{kM ,–/… !Ú[ª¤U¯«Ælƒ êhÿßéÂI„ƒA{>·e-À£ìúžØCÿ»s–÷ÕdXS-^0Kʳs6À@Éð¡>ƒFk9LIÐ~<·CT‘ŸÞ»÷àÂànÌ?2¦ë‰Npí>“Ùãˆt´³ÁÜl|˜cÚʲÓ]ai/cuuøöé.¼òƇ¸š,(Ép9æMzΖ±…ŒÄºïÔÔ¿„Á ØÏ]Þu¼|´·³ />Áûƒ“è›\Ä¿¯õóÓÙ( ge߆,^Ê#åÛ—cr¾­µ•$ÛlÁ`€Në”ѽ€Õ5&“ ÄcuÜ@ÉèÚXrèÀb¡»v5ð£3'¬\\Êê6ODvgOÝ[‹GKxäØûéô s¿ÌÉÊÔ†‰šÚCä­ä „=JÞüU~J¦€à Bgû6HXÖÕa²w™\òx‡J»8p@îm¿†c1Þt'¨%…'Ä*7 ‡Ã°DvqWan\¿+lРã³{þ¾¤5d†sà=Bkg¹%‘1‹Äáu9æ]ë‚õ¢d‰/ÝÙ¦¨Ê¹ùØØ{àmk^‰‰7V y^¿»‘èäy€_×íìÎ#ß{ø~ÊétÚ<{ö쯬%³¤ÆŽVƒ* ä&¸|ù2º»»e;ª¯¯Ã@‰Bñ~%6ÈhP$ýߨ máu4jo‚Ä6ÒŽmY@™¦c¶úCF6QÏŸ?ÿ»^xá×ÖK’º[IÐf¼úræÌØrðàÁ[À¤ÆÞ }[eoÞèE¤å”Ðx¥ê›0gÞ¢ûñpUae íc DÆy5Éû<'y/áâÅ‹o>÷Üs¯r‘ %Í`àæSWa€Qµ0ßÞVGç5Ä“¢z^Œg)x÷ÃCÞžŸ_ p—¹ IÈ566Hü“q ºèÕ«W/>ýôÓ?·ŒO²÷é|ɽ*PæÁ=ºâ7¿Ø3âÝlC"GKmbË]\{‰ñW¡ûïB8Ѐdf7¼Áýô»E1þᇆ%œäØh[ùyeßO<ñCËøi«/¹_Tá›czz§Nâ'$‘Ù‡™ªo!Žp©s>ìàPX·u|||âÉ'Ÿ|‰rÂ(€)ÒeÒ¢Iâªç7?•°ôöö2-¥&§R÷¡þ_ˆë¿GC`Taƒ*ìõ=HÀ½±p˜C‚™ÅÍŽm¼Óó üÑþ»Ĉeüéªm|eÜÛx'H¼-e½ÙKaq 7—úaæ†àÓÇá7§ôÍ¡¨û‘3(tÐÝÛ ÝתØn4†BÒè†ITÏ Ÿ/ ¹¹I1~nn.ýüóÏ¿DOúL.*Æ»·›œ€øÆœ}YÙ;œø¸3,×, EJXº~—/)]9«œù5 5¤ šF£µ¦·Jœ•ýó9.±NÚ‹ñ/¿üò÷¯]»vÅa|ÁÎøî@¼rå —;~-–©i·£ò|a£ìJgç¬ñ¶Ñ¢R ä³Á¡$û$¶çÙóäùï‘ñ'WËû à,Ìžâ¾{{¢Õk[â¬l´³Íµ–ØÿNïs÷9ñÔSO½è ý‚b¼«¸/bp…0åsvÌÀ0{ìR×ÿøã¿èHxl|Þ6~ǘ$é@ ºÉ»¹¼4å.Œ'Ê Š¦¬¼ËÓÕÕÅ!³·ªÅƒ‡æóÜ/ðßT•sÿ?¿K=öØ(DÆìl¯Äüíd€©‚Àõ—ß”?˜¸pá{‰½%´¥‰ ¶×y½`Ç=Ïc%–X•ÀÀ¥K—Þ¢&çÇV¼O;ê¼qÛ_•­ ¼âR'“}àÔ| VaˆÔôÍoÎÕÂ$`ÿðÌ3ÏüÂÙÞªMŽû0²«ün¿G}AÑ6Ò~Un+ QIž¦)No;—¹²ž?wîÜëÏ>ûì/-ÏÏ’fHKŠñ.`Xkè9šàWTÝÁ?¡5sÈ[å-aYeas›(Y fØ¢œw^L¦¹åñ+ÙéwäuyN,DÉ,n-Kàùï *‹%Ù¹€ ‚ð?.ÿ^@j-¿OçgIEND®B`‚recoll-1.23.7/qtgui/mtpics/image.png0000644000175000017500000001037113125527323014232 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé°IDATxœÕ›[l×yÇsÙ½p—Kri‰Y¦)Ó’cFòE¾¨Fd§ëÔH…ß yÎ[‘ú”‡4HQCòH#§°èÉ@ NÑ6 I娲JCWŠ,#Þv¹\^ö6»;3çôawƳÃ]r))‰õÄž9ç›oÎ÷ÿ®sv©Ð¤©©©b±Ø?©ª‘RJ€æ‡GBüóîµûÙz» ›klã>§eMˆ†”æºô­¹ó²Í}Á}K)uÓ4?þîw¿û¯Hwûüñ¿ôÑG5DZ[¹$ ø4ðTÚä¶Aë’ÜYÂî<­ væQ°l‡sçÎÿlø7åP.—µžž¨S'¦ý~ÎAQ$ŽHé~‚ˆæœ 9ŽØNÃNÓŽhðI)A‚ƒD6ïR"dƒWH‰hò6Öšcéã ¬K)qd«,!sÒ'£j =ãÿö¶mÇûš° !„‚M˜Y¶ëpxTe½(P¹p£Î¡!Û\˜©rô0a~w½JX‡§'" $5®-VùCÎâ¹#14Uaµ`ñó‹E,!¢–#%¶G4®›ÀØM…l!qé[ûœÏU¾YÅ´$ÏLLÏW9<æ¾”ÆÏ/•¸¹RGQ$c÷…(›*ŸÌšÔ,ÑL|8·„hŸüîÝî¯M8Ž{o Ô5K²ô–e!¤¤7i*à@o\AÊF8ôÆË– #%X¶äȨAÝd7lTŽŒ†É²™ù¿öåžF‘¢™¡c)ð2¹”­ÝÍä²¥"à]KupçU¡n &†ã¨ªÚ±n·x€Ð¿8ºM‡Úd›qóÓ_Ðe`NÁ+§Òw” Ð(ÑÙäW|=„EmÜßaGÛBàn’¿#Ûi¼_ðsg¾ <›h´³A[¶ljÓ²îy/;ñ !v•£î¸zt;VÝIÎnà´ãsçÏÀ^i'º¹§Ýšã8(»”_/lÛ¾k!ЭõwÛœÿ>—×?®Ÿ|ëlGÔ$è'ÿæEAUUJ¥õz½-_· çâñ8¡P˲ºÚW× ¦§§™››£T*J¥8xð G¥§§§EÁvc—,ËâÃ?dkk ]¿3½Ã²,>Ìøø8Š¢tíhee…ÕÕUlÛæüùóܼy³ÑTøHÁ#<ÂK/½„ªª»†‘¢(ܼy“ÁÁA^~ùeÏU÷jy°l§¥/ëÙÕçÏŸ'‹±oß¾÷² ÿûÛß²°°Àðð0Bž{î9¾ò•¯´"„`kkkÚíÐB0::ÊñãÇqÓ4©ÕjØ¶í­«ªJ(BJ‰mÛ^,»< °œ¯ é4MEU@¡V5I½½½ÞÞoËVWWYXXà•W^ià6-®ÅüŸíÆ~·$¹ _¹r…\.€a!…BÔëu/¡ÅãqÒé4†aP*•ØÚÚ"‹ÅX/IÆ k –-øÅ§9ìZ™—ކºN€( ,Ë"‹qôèQ.]º(H§í·ŽÕÈ+)‰-ÅRã«[:–A7\÷ Öv÷z§)ŠB>ŸGJÉÓO?íÍW*¦§§FÖßÜÜÄ4Í– P«ÕÈår 011€¦iLLLpùòe¢Ñ/¡iã67¹ú“îžs´¶¨ŽãÍfÙÜÜô»™ÜŸäÜæÃ0 ¯œ¹<¶mS,yñÅÑ4 h$ÁK—.‘L&Y\\$—Ë188Èý÷ߢ(”ËeÖÖÖX[[#•J±¾¾Î§Ÿ~Êää$B¢Ñ(û÷ïg~~ž‡z¨¥ºè†:z€ã8,,,°¸¸ØR Ú•A˲èëëckk ˲¼Í”J%ž}öY‰ÐH´ÓÓÓ 233C<çë_ÿ:óóó\¼x‘ÕÕUúûûyä‘Gñ/!—/_æÈ‘#X–Åàà ¹\Žb±H$ÙÖHݶ¸ä¿ÉM&Bˆ¦Ëµ~=æ˜[=\°‰“““ž¬¹¹9R©Ùl–ÑÑQFFFøþ÷¿ÏO~r–\nÍã;p௾ú*/¿ü2³³³Ôëu,Ë"“ÉÐßß”’T*E>Ÿgdd¤¥¿èæ  #{yéØí¯^¯366F,À4MLÓ$‹‡ç[ßúgÏž`düRýûÈ,Ýdaá2ÿü½ïaš&ßøÆ7˜››£¯¯L&C*•¶m‰ -M—»•ñ¶¸äZÜoí`Œù»-ÿœß‡††<™Åb‘p8L¥Ra||œóçÏ7•qò•ðÍo¾J2a9³Á›§_çÚ¯ÀÙ³g9vìÉd’jµJ(Â4M/)+ŠB­VCÓ4ï¹nóÕmÜ&‚i§¤œàº‚þþ~OV¡PðÞãñ8?ûÙψ<ø*‡O¼Æÿe.^/°Qð¥þeà$ù|ž?þ˜x<îP,½gišF½^ïhí=å7y¹ÔIÑ`¬uÇÝ  dµZ%‘H‰D0M“……[ô>øUf25rÅ:ª¦ …ÅZ=Nß§YÏÿŠ•••E\9BÂá0…BÁ³º”’b±HµZ½³*àf}¿;ïJ0\ü亥®ë¨ªŠ¦ièºîuƒ‰h‰p\Ci„B –-éÑU¢† ÐâÞ.¹¥¶X,råÊïÍ \.S.—9vìØ…@»r×Îâ~^??4¬åZÇmnTUÅ0 ŽŠpH…Ìyö§%cc ÆÇb:”b º†²~Þd“““Þû@(ÂqlÛ¦R©P¯×©ÕjÔj5êõ:ÕjÕ{£¼mªÕjÛ„×.\ÅÛ´¶Ö(mŽã‡)•JD"Êå2¯½öÏ¿ð5’ΛŸœÂ¨Í2˜,¡þ—üÿü ÷õÔù«—þšÇœÍÍMb±˜¤{FP.—[:V—öÒÊ· W`rñ[·]¾Òòò2“““ضM,#—Ë‘N§ÙÜÜdbb‚oûÛ¼ÿþû” ×YøÏSd"1jå}J•‡N>Ï /¼@­V#•JyVµm˲( K»m×wÌ®eƒ9¡] þ^HUU2™ ÄãqE!“Ëåèïïgyy™gžy†ááa>ûlšüZÛ¶ÑC!Á²,fggI§ÓضíõT*•–Ó`¿!öÜøÅƒIÏ?Þ-Ü9h„ÒÕ«W9~ü8¶mÓÛÛËòò2år™H$ÂÒÒ½½½œ<ù¼w4&„ ^¯³¶¶F6›eppEQ0 ]×=÷_YYÙæ…< +‚Ô®åíäöÊ ¢(\»vÑÑQúûûq‡t:M&“¡§§‡ÞÞ^J¥RËëpµZ¥\.#¥dhhÈ+iÑhÔ³~.—#ŸÏ·*¸ïnó@[?qûù`'èË_pÍ Z­ráÂ*•Š7ŸN§1M“[·ná8‘HÃ0ˆD"Äb1úúúˆF£Ôj5 à ã8Ðè(ççç·µ¾Áq7ñ;¼ t*u»5HA€Ü\páž|òITUÅq’É$µZB¡€mÛ¨ªê…¡mÛ^Îp¯¡qŽpóæM*•JÇ#ø`ïF»&ÁàC:yE;0Ü9UU™››Ã4M{ì1âñ¸÷Ík]˲<¥ÜZïoÅ …ssslmmµUÞõ¸v ÜþS]Øþ^ìüüÁ&Ê•±°°Àúú:?ü0CCCèºÞ¢¨ °_–išd³Y–––¼Ç ¿ò.¹²Ü$¸ mO…]¡þøžø‰D¼Þ?˜ \ÅÜ ^¿~l6Ëðð0ÑhÔ“/eãpÅUÂ4MÖ××)•J$“ÉmqíWÐUØ0 ¯¸>55uÆgù;R|$‰êG}´rãÆ¤üs÷¿>jžjŸ}öÙ­sçÎý¸ÙÛßåÏÿ£ì‰'žè- _-‹J)uÚü¹H×uecc#W©T.ѨówEy å_ê4 ôòúOÕ€úÄ)‰b@â„PÄ¿ÀÄ?ÄÈ'nÁD\@¶Ì/‘€-,¯µ?ñzwg^w‡îêW¯§gvfwÖ–Ef5zÓï½yóªúûª¾ª~ |öúÿ~ÑÇ€¹´¥§Ì6ÀBÚNí·°°ð…Ï8’œð4½ÀêÂÂÂúÆÆÆÚ('ŒsÀA/ŠÈ§O5ĉN¸ `P;ÞóÝ9ÏÀòò2ˆ¨¼øØqÚ¹'îˆ ï/öå13à3Ž=ŠdýQ×ïíðû=˜#‚S㈢Q"c¥c¢ŽÉû²!é3ÕŒJß5åk‹='}Ï¥ýb`,07¿ÛNFoGw„‘sÙX5ÎÒ¾|#D1Pˆ@œkQ Z¤8Gô¸HEêPP2TtlÑPAÍ® "@$å\Ö”¡†èq»OFQ¤Œt–É\¿C8"ˆ"BÇéþ¦¡]oÂ@’g™Y1µ™v.ÞÜ.s³˜kP应ö‹¡YGÌÒú»Ïp;­s çɘÀhg8ÇýŽå¾B¾@”ؘCƒáÌ( 7¬|´ÁϹ K!Êc2Fë>7†—–.:ËÙ(ãÔä ß;ЭTz“ËEãˆ<óz“†÷@Ôh…fÚ§û‡ï$3Ö3¥¸6Œ“©Ì.S¦Ý‰€Q:@¹o>ׯy_% Hg9ú«á–j•1L"‹¢Y"@g…l„N30ä˜ò»’3¢Û[-ç X`‰ð>cyo
‘¹ùªoTmCt0ððÁƒ(”ð㜰ûj°Òâª:ƒ[D hj¢|5ÁL3„>ù!¢t Œl4K+BÓÀ7 ÈU¦Òï÷ØD|VpB¨Òéu|Ô¹,ÈR8¤,Bªq‚¹¦ÌhX6^TGD  ß@àÁÌ8qâ]»ví×þ;NO.„F,FØ™gæ‘ç0sëÖ¡ÉALg² ˜ê4ó=6éTGtÄ`РßoÐðŽÿ2o^¹råVöŒkÄ(˶˜å>´&`†ƒ¤r˜m4þè£Û.]ú>€OlìTNËYž´ǦfHðÛ ó½ržCŠ,!¦6ï}+©S®ošƒímlnnâîÝ»ÿ¹péÒUOÜûÚÛ1&w§,@ !$Ã’4î̾€96Q ü`Ð-u“ñ¾i0è÷±¹¹)z„¥¥¥¥so¼ñ.Ý‘ÕIŸª°ž¡Æ´U‚¦6°Ïj? <$Ì¥|Þ¦³*|È(_YYYý.ÝJ°÷»¡qoÄï>‡ckÕIÒÙ l” ÄZ åÇYè¨ñ‘ ½ÏÆe¶ímô·¶°²¼ü驳gßð×i9?ÜMÜmGH© ˜g~Ê^‚–Ú>X¸ô&ŠÝ.r‘ÄmLŽxîØ `ý­-Ü»ÿ/§Îž}ÀŸìÉø½¯ Y*ä6XR©,ž;0¸¿¶aúCÀ'ÿ¸ç\Êõ@ôŒýˆˆÓ¾ƒõµuܾsççßzëGIä¬OÑýÞcWXëüqO_Xg˜‡*çççqëæMl<\Ï:>„€^bÐã¼÷! ñÁ§1{ôû|ó»ð‡ýíË— àŸ;8û³2dfxÇ'1‹Çâ^yõÕ¡%µüfŽN`Fð>9CÞ‹/½„ß]¿þÛ·/_þ)€ÛÎÊøIb«àÉ+C̦dlBó73§ äÏúöj|úL€¼|ò$~óᇿºxñâþ5kãwzÍxMžÐkqqñÎÕ«W?ð€ìÓ?nŽ£€?tèÐ*½àâ¿Ñ=Ž— þ߀¥TÏ÷§^÷ž²³5ÎA“ñó_g9 ›f¯in¯Øí¹{EÀg¯ÇõúÊ;V™kØ"IEND®B`‚recoll-1.23.7/qtgui/mtpics/aptosid-manual.png0000644000175000017500000001061013125527323016062 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î<IDAThÍšy]UÇ?ç.oë%~½/I:k‡LÈ’!h „GG- ¢3†œÂ?,Pq)ÄÁfÊ)± 42¤¢…ŒcH2 F¨"ÄhHšô–îô¾½¥ï{÷žeþxK¿nšt´Êª¹U§Ï¹÷žsî÷{~ë9ý0Æðÿ©üêŠËí?§¿0Æð׺^¹ãö £TÖªÆ(×JÕ¥j´Rq£T–ùZÍzïj©þþæ×^Ûw!ßp.̉{>_iŒ©Sc´‰cLѺÆ7Z×­ãF©Ü3¥ãZ«¸Ñ:dŒÆèB1m PçWc¨loGyS§NcŒ¹øó ^[³xkAB¸½¾ßt‘”Ø~SU…J§±ÊËA€SQÎdpÊËq*+ÑÙ,ñ+¯"34ÄøÑ£4ßz+Ñ–V¢MŒ¼ô"Ën¿ƒtw7ËnoåO=Äò;èÞ³‡to/M7ÝL÷O÷Pwõ5„«ã ,N}ÿû¥q+*©X¾ox±ñ‚äëè„R­Jkää$©áa´7ÛØ@Û;о[¹ˆìèÉŽšo½•ÎÇÃŽFYvÇN>ô-ÖÞ÷eº~òcZ?òº~ü8‰S§)_±‚¥û8°üSŸÆhMòíŒ1¤º»‰65┕儫5A*EÅÊ• 9‚0zƒâ©…ìÀÒJUi¥˜J$ÑÝݸ¾Ïâ yéEÆ%ÚÔÌòÏìdðŸ#u¦“‰7ßm¨h_K¤©” &°£1ŒVd††pÊÊH÷ž¥kÏÆŽ½Îº{îeñ† $:N®­¥ïWÿæÿ²cc¸åå9Ã7aÌ{òØ$`ip”Ö$S)üÞ³4†#X‘rh-é³½„ãq¼¾^*ÚÛq+áONih 32•̹B=r÷³Ýfi)€WDË%ZI–mƒ•óì2‘ ïÿt_ßó ©xZOù¾_ר¶ŒPCºã4ZIF_þ]®·Å—n$ÖÚB¸¦r²Ô´Ö˜ @J‰’”ÛÇÅv\°-Œ6ˆšj´6¨’WÈ}0:'<)KR ÍìTCÍ‰Ö c \̆\*/©Ô¸ÖšÌ؉@” (JsN^4“å@ Û¡õC·P{ùåD›šÐOòL''vï&32\XÍRªHܲÖÜVYiçU|~Æ#„P@6¡Ô¨ÒšD"ÉÄd‚E‘*›^ÚP±z—Ü÷eF^~™“|—DGFµ·óÞ]»8±{78ŽÑšÕÿðÔmÞ̹矧ãñÇÑR¢#@dkYÙjàÄBÐ@0!åÎÇ‚ÄT’šš8ÙDbøàï_¿õZÖüó]¼ùÀŒ¿ñû’4Z3ñ‡?ðÆpí“OòÆ7¾A$gý=÷PwÕU´Üx#¿ýÌgðÆÆr$Dz6 !þøn†\ `€`Ø÷¦§=¦FG ¯]Kr||Ö€ÒÕoºáFZnº‰t_>JåÚµ\üÅ/Ñù_OR¹j+–ƒpM Ñúz"õõDqb16=ü0Ú÷gÍ]³i×ïÛdz·Ü‚J¥ÐB yÏBݾNc¼LVD¢B˜?žÈ‰³°âyaT­»ˆK¾òº÷ícøÅyß#kiÁr]ÖÜùOïö½â•˜@A(*>›êè`üÄ .½ï>~÷Õ¯æ2[¸„óx¢Yð•JeµNú¾_¹tý:ÜÚt&ƒqÝäþ,ý»ÐýóŸqâá‡hÚ¾ò¶¶ó6J1~ü8ƒ‡3ð Œ?N¤¶–Mßþ6õ›7sú‰'8¶k2›…P§¼œL"eYë9'š%À›Vj*‚Êå¯'™É"|mY9uŸaÀ¢övŽì܉SQÉú{¿0kRopÑ×^C¦R¤z{ûýL?Žô¦‹ö`´&}î/|ò“ຨ ÀZLAÁîkh¨’@Ž€ÖRÊV9>NÂWh?@;îL7Ne%þä$Þà—íþ7BUU³&}óÁé?xp&­(I3Š59OcEÏc Ø.ò"Û~ÏBrÁl\kMzd„É©$n4B ä M rÅ &Nœ öÊ«hÞ¾}Ö„‰Ó§é;xÔlÀ”/¬t¾] £çikÀÊy¢Cóy" ÿâ±`êÜ¡EU©Ð²°ï•¸UUø“4lÝúŽ9ñï`YÜ#÷ÎÆ óÀKÁîué} x#BˆÂÞà¼Ѐ?%åp!¤FG _r zp‚úDjkYþ±Q{Å$Þ~{Öd]{÷Ò·ñЉ’/ª‹ïP!=§Ï\u²à] yîÎ_ŽÁ€çeH%“„››Ñ¯¿BPÑÖÆu?ûÊó¨\¹27(¦ç¿àØý÷ç“>ˆ57S¿e [¶PÑÖF¤¶–h]ÆÒýý¤úûIõõ‘èî¦ëÀ&»ºæU¡|J±úƪ*—yRŠRú³Ù~c ^&Ãâæ&ÜÚZ‡¹ü»ßeòäIŒRÄššŠ~ðƒ$ΜÁr–~øÃ´ïÜÉâuëæ[°ñ¶6*KÜîe_ü"ƒ¯¾Êɽ{y{ÿ~üééY’B›ÊË/Ž-D@Á¨4ÆZuÙ¥(cRß²…ò%KØ¿mÛöî-šøÓŸ˜êì¤í£å=÷ÜC¬±qÖüd’dw7‰|Q¾Oys3eÍÍT´¶R¹l ›6Ѱi›ï¿Ÿ—|O=5c'€cY„¿ŸkÈsU(¼ŒÖ“AÔ-Y½Šžž>Œ14¾ÿýt=ý4©ÁA„33lèÈ®þái½ñÆ™IR):žzŠ“O^yà¦zzrž'¼àaŠE&zzxõ‘Gxò†xfÇ}}´mÛÆí‡ÑzõÕhÀbÞ½5ç>G@ëq¥5©±q¦‰¶´®®føØ14)Ið Òè?|˜§·oçÄ~D6•šr>àó=ë>|˜oßÎk>ŠQŠhu5·=ú(M—^Š-ļ§EyÝ’@6¥Ô˜ÖšD2IjlŒhSÞèhñÃÞœ õÍï}ƒwÜ755n®¿@2¾çqø[ßâ—ŸûZJœH„?ö5+VÔÞÝÔT¿4à'¥ÑZ“J¥HOMin.æèM×^KUÞ}¼p÷Ý}øa”1ïw>à…çïÒïÔþý<½s'2›%RUŇ~ðÖoÙrMþ(´xÍwLJ9¹Xñ}ÜúzB®Ë‡$¾vm±ã‰Ç§ã™gf ´´.1Ö³Y­ä¤1øR(E %ʲÔÈsÏÉSÛ¶éÈâÅÁpg篞 v.œ+õý|,ÈÒº¶mÛããÔoÛVì8þÖ[üî›ß,ªHp) 9@Ják¯µ‘¶-ë*¢m—•§j¡ÅÕ¢¼¹Éªom‹š›ÅV8µC¡‡‰WÇ£Ÿ½ùæ}vbbìB¾ß˜ ÄÅW]Ar`€gwïfÛ“O²äºëðÆÆøåw2™JÀieÛR…BÊD"šX »¢QU%ÊEys³]W_o—×Äm× ¹®ë¸¡PǶqÛ¶ GÂDÂ"‘¡P˲B`Ùñê8[׬ ž>vL.¤¯T*£u2‚ʺú:ì?ŒUTʽ»w›ä®]B…#&´r•Uvõ5VmK‹«ª²¢‘H( ãº.®ë¢•ÊåôÆ`Y±h”p$BÈus'ùÃ0×u ‡Ã„ù±9aæÔÜu]ÇA€n¨ˆ„óB]X€7-åd•R•^W· íØánlltc±èÌGÈíÇÁ¶,lÛÆ¶m‚ @kƒm[EpB”ÖL§Óxù<*S^^N8Ʋ,´Öø¾Çq…Bù“;ÃdoÏHH›²y{~ ^Ú˜‰°ë.éGåš5kìºÚB¡Ú,aaÛ9ÐZkT~µ3™ –e‹Öšééi²Ù,A‡ÃaÇÁC6›Å¶mB¡PQzBˆâ¼¾ï“>ujÒ‘ª‚y"ñ,¥gDÓJ•…B¨—Ú•ÅtSJ‰çy³ÀÞ——RæT(#‰à8RJ‚ü9ªmÛ9•ËK`¸¼$&NŸÊ:J]°4à§” ´bK—ºŽã µ&”RH)ÑZcY¡Pˆh4Zày™L¥®ëRVVV\ÑD"Që8NQ B®ë¸`ÈJJn›tÚµƒ *´¶}­=O멬1Sc&=cƧa4iÌð˜Ìt§¼S£™Ìi`äÏ‘€ÿöôôɈ¨mk× Y¶mûž§†:;½±ÎÎÌxo¯ŸìïW™áa‚ÉIÛ¤R!!¥«¥Tc­§<¥&¦µOk=šrx\Ê¡nß÷ýI ;§Hr;/™/^¾ómêßñ[‰|®Q´ßÛÚú£†x|Iy]­IÏs•ï«@© «ÔTF뉴Öãi¥FRJ ÁP¿ïôûþØPA¾€•ÖsÛ…E,Ôæ|ÿà˜÷ÇB¨ÀÊ¿mhø¤Ž <ëyÃ2s€P¡.fóÌ5þÂ_¼¸@ (^Îln¾6à_ ìB¯ÿÀüäª~*JIEND®B`‚recoll-1.23.7/qtgui/mtpics/aptosid-manual-copyright.txt0000644000175000017500000003400213125527323020124 00000000000000This package was debianized by Kel Modderman on Mon, 9 Apr 2007 13:54:11 +1000. It was downloaded from http://developer.berlios.de/projects/fullstory/ Files: lib/* Copyright: © 2006-2010 Trevor Walkley (bluewater) License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: bg/* Copyright: © 2008-2009 manul License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: da/* Copyright: © 2006-2009 Rasmus Pørksen License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: de/* Copyright: © 2006-2010 Markus Huber © 2006-2009 Markus Müller © 2006-2009 Philipp Rudolph License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: el/* Copyright: © 2008-2008 Gregory Gretri (grigris) siduxgr@gmail.com © 2008-2010 Nikolas Poniros (edhunter)edhunter@TBA.com © 2007-2008 mixalis (miles) georgiou mechmg93@gmail.com © 2007-2008 Pavlos (lathspell) fubar.ath@gmail.com © 2007-2008 Lazaros (riddle3)lazarost@gmail.com © 2007-2008 spyros melcher (xouzouris) License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: en/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: es/* Copyright: © 2006-2009 Richard Holt © 2009-2010 Luis_P License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: fr/* Copyright: © 2006-2009 Philippe Masson License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: hr/* Copyright: © 2006-2009 Dinko Sabo License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: hu/* Copyright: © 2008-2009 mrowl Bagoj Ur © 2008-2009 ruess reuss@chello.hu © 2008-2009 Siposs Zoltan © 2008-2009 honorshark honorshark@gmail.com License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: it/* Copyright: © 2008-2009 Renato Zanotti zenren@tiscali.it © 2008-2009 speedygeo speedygeo@email.it © 2007-2009 Stefano Tombolini dedo.tombolini@gmail.com © 2008-2010 Alessio Giustini alessio@alessiogiustini.com License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ja/* Copyright: © 2006-2009 Mutsumu Nomura License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: nl/* Copyright: © 2006-2010 S R Eissens © 2007-2009 Ronald Stam © 2007-2009 HarzG License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: pl/* Copyright: © 2006-2008 Marcin SÅ‚otwiÅ„ski © 2008-2009 Michael R' Tokarczyk © 2009 dongle License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: pt-br/* Copyright: © 2006-2010 Jose Tadeu Barros License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ro/* Copyright: © 2006-2008 Gabriel Palade © 2009-2010 Dorin Vatavu License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: ru/* Copyright: © 2006-2010 Roland Engert © 2006-2007 Dmytro Kychenko © 2006-2007 Mikhail Burov © 2009 kostiagol License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: menu/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: debian/* Copyright: © 2007, Kel Modderman License: GPL-2+ The Debian packaging information is licensed under the GNU General Public License, version 2 or later. Files: menu/* Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License.. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: menu/icons/* Copyright: © 2010 Rick Battle © 2008-2010 Bernard Gray © 2008 David Creedy © 2007 David Vignoni © 2007 Johann Ollivier Lapeyre © 2007 Kenneth Wimer © 2007 Nuno Fernades Pinheiro © 2007 Riccardo Iaconelli © 2007 David Miller License: CC-ASA-3.0 | LGPL-2+ | GPL-2+ aptosid-manual.svg also includes elements from The Oxygen Icon Theme. Licensed under the Creative Common Attribution-ShareAlike 3.0 license, as found here: http://creativecommons.org/licenses/by-sa/3.0/ or the GNU Library General Public License (with following clarification). Clarification: The GNU Lesser General Public License or LGPL is written for software libraries in the first place. We expressly want the LGPL to be valid for this artwork library too. KDE Oxygen theme icons is a special kind of software library, it is an artwork library, it's elements can be used in a Graphical User Interface, or GUI. Source code, for this library means: - where they exist, SVG; - otherwise, if applicable, the multi-layered formats xcf or psd, or otherwise png. The LGPL in some sections obliges you to make the files carry notices. With images this is in some cases impossible or hardly useful. With this library a notice is placed at a prominent place in the directory containing the elements. You may follow this practice. The exception in section 6 of the GNU Lesser General Public License covers the use of elements of this art library in a GUI. Files: * Copyright: © 2006-2010 Trevor Walkley License: GFDL-1.2+ All content is © 2006-2010 and released under GNU Free Documentation License. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. Files: *Coloured sidux Book Icons (type2) Copyright (C) 2007  by spacepenguin, cako and cathbard (http://sidux.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA I suggest a copy be kept in your sources for safe keeping ________________________________________________________________________________ On Debian systems, the complete text of the GNU Free Documentation License, version 2, can be found in `/usr/share/common-licenses/GFDL-1.2'. On Debian systems, the complete text of the GNU General Public License, version 2, can be found in `/usr/share/common-licenses/GPL-2'. On Debian systems, the complete text of the GNU Lesser General Public License, version 2, can be found in `/usr/share/common-licenses/LGPL-2'. The Debian packaging is © 2007--2010, Kel Modderman and is licensed under the GPL, see `/usr/share/common-licenses/GPL'. recoll-1.23.7/qtgui/mtpics/html.png0000644000175000017500000001136013125527323014113 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé§IDATxœÕšiŒÇuÇUÕ=×Î3Üåµ$ÅKI[2)K¤ŽÈŠå°eXˆmÅ |$ð‡qI>(ˆ3€b˰É6 PŽa‹ )¢cZIuYeI¦ÄP\’+î5³³suwUåCuÏÌÞ»ÔʰШî®êêzÿwÔ«W%è xà¯S©ÔmBØÈ €µ€äµíoŒ{·³ ¾›ùÞ¶út`°ÉïÐÆ eû}«m«èCÜg«7cèè9ƒ_­V‡î½÷Þ™U…×ùÐÝÝý¾;ï¼ón¥$nætiçX,P „ B¾ÿƒôÿLvÖ{³?èîîáÄë–©ªÁ`1ÆýD‹±É…+µE[' m-ÖX"ëXrÏNê:i¿ÓÖõëž{¶`ŒuqÙjÛQO<“üÏý¿ÝÆýÏZK#4\¿5Ï—?¾‘ hæ~ Ô‰× ¬µÂÃð˜ad2bS¿ —¼z!bÏF`Y_P çF#²]‚Ñ)ÃÅRÄMW¦yætƒlZðâÙF 0m,Z»2ŠÔÉ{c1Ú m»±–H»¶‘NÚWÆÌ'ß'}µúNú3–ZÓPmj´YµVj¶Àgi€,J‚0УXß'¸TÖìÚìó¿'ëò’5Ý’7ÇB>ysžJÝðæhÈÍ×äŠØ2âåsM¤c]?R€2 ±TAw!ܳ-âwñwÆ€’I[¹ ¦I c ¥390³2Ò0Ð#Ùu _ Ʀ iß9™‘IÍTÍPè’toIQ®Œ ²‘RÊÿû;C³†8_ÁHÉpì¥&‘1x |R ”X`ºaFÊž ô(n½6Ç®ÍéU x›×R4G,´ìîü¸f¼ÓMËso„T– åª@Ës¯7h%ÍÈPªj„€^EêAÛÌPÓøÞù€ØŽ­YÂÌUùyM å õ†¡„XŠ9³€@°{‹Ç¶u2ö¬–Þ¡¶ì¿:í~¨aS¿"Š,Æ*Œ¬a°èK=°òwßÔã¼uçÌaãg{o Æ,ï\{Û1óXÓî#鯳ìœu’¾m¹jc æ˜÷¸v“dŽu¬ Ùyî“`¡-´«,ˆ$è±íf­j;£li}¹X¤2€Õ¦ÎAJC¸ƒiKݵ³3"ÇÙ ÎW·x; Òé9³_‹f`Œ™ÑñjPbB@¥®™œ6˜ø¹” —øžh7Œ:Yšk§õâöï°œyòµÇSãÅsMJµˆjÓ¶bõ´'èÎH6õyÜte†wf¸~kŠlZ…m––þìwuZk”ZXúð0ôJ>^æ™3 òÉîÍ)îÞŸgÛÚ=í_K!gFC^<Ûä?_¨‘Rðѽ]|l_–E3œŸ$´˜ô£5xÞâ,Î…WÀæ\zy¸ÉÁ‡Æ9u¾É‡®Ïóí/làš)ºÓÎ¡Úø>JŠLëû‰šæä›M~z¼ÂϾ3ÆÝ7äø“[òd}õÂcœOúË5çUÑká»GKüë/KÜy]Ž¿ÿd?›Š>aäæçñj2zfF'³ÌSJØ·#ÃWfxe¸É÷~1Åçïîêáš~a&ÿ\ZúË¡· @#4|ùÇc?Sç+Ÿ*rÓÎ,AoM…­6NâÂñk-ÈÅ¢s‡Ëº¢ÇWî)rä¹_>Tæ‹èâý»24¢™m’~ÀŠœàrQKhªnøÒ÷/q¶ÜäŸ?ÛϺ^KSzÑo_štPÓ5¾}w†þ^É}GJÔøÈ{247Î…Ìa%³Ùek@¨-ÿphœç«üã§úɦ$£•™Ì«Xå•$‚ТøšJ6x|úönþw™b—`ÿÎÍÌ!‘~{ú}‡¦ÁïwGž.ñiǼÀâ AœÑ!;V†ÆBC/šGšCÓ Ø¹Îg÷¯ü¼Ì÷þ¬È†>ÙrŒ ­Äöº,µÁw/ÑW´ìÙe´a”¤$$f*:–dR: ­e:ÐhãV“³äds¥V à¦Y{yœûÿ§Ê?}"€VPnÞ·Ö.)õNZñ4X©þõ—eÞœ®sˆ, ˆ øñ÷A,!R „pŒ ëÌ \×T›&Nº¢$Æ%A|)0ô<‚Ì*ÁàÉáSU>¸'Íûwû4W7[õÁ©ÿª›ÀÑSuŽŸ¦jŠY‰µiOˆé¤-H+@;ÿ/¥›ǦC´†žŒÄ÷ ÐN+<)PÂ%T¦ƒ¹Ü[\äXÌ*^¨×xðÙvz(Iœ\:ì}ÛL7 ÿªJ)éÏ{äR „ DJI¤X\šKh·’ÒR®i.•B¡c®Rw¹äÓëI&šÐØy¥ÐT£-Pó̹O¿‘áö«=jM}ÙAÜŠC/ ‡<÷f % ,iß# ‘¶x¾)1ÆÙµÎ# #㣥cfÚg•j†Žõë‚™—–ÓèÞªûMÈþírQ»_U8~¦É¹ñ&[7¦5”jšFdB"c‘±ÍK\Bãµá:ãS!²5¥$×Ï „p>æÂD„0P©Gœ<1RöYßëò——CË`ºi95ܤ\ Ég3l^›!lL5 Ým€•aV6–·J!µ†AʕۧÎ?€@Ix«12!­ Ù0œ/‡œ™È°© 4›iÀbêiJ3Ö|ÊMÆÆÏK4±Ðâ”¶5 0‰ßפÆ+aËAZëÂêH»MÓ\ZñÙ»Ö²i­Ït-â•3Gt`ؽ³‹ýiÖuydT;ñ:›.+HÂÊÎòŠ\ZBd)d$¡zUÓæÌ%¼6¯O³®?M&­ð<'y/^$ùñ–š@Г‘¼{{ާ_ªÐ-µ¦ÆhÚÛuÃûúص=‡6–ÿ»Dð÷ ’•*IµaéÎ*|å´ærh^šÍf+¡èyJ) ]’5½>KÞÈ”dd<ÎZËš‚Ï?½‘õkÓ¤R O@Æ“d<ð¤DŠv#…d°à3XðPJ0ÝÐ\*E”*XØzE–÷(",mÀZ¦fëº4c¡‹F×t ”­çß ¼ìHÐZK†„aˆ§$9åqõ`†£ÖRkhvoLsê8ͩа{G/ëúÓ¤|EΗäS‚”’­˜¿5ž„´/БÁ“’ÞŒ¤{]Šr^²n}Ž«¶çØyE–©JˆŠ,ÓÓ>>ÎéÁ ·ßÐNjà ö\ÕËæ«ºÀšÃç¥hÞý¯Dý“kmH²oG–LÎc¬²±àSèVÐ4z6f¸ã¦"}=>ÝYE!+ɥ܊ÏóˆKá.åÊ×÷’ñ%V»ýFY®ÝÒEoöìÌ“ñ%i_’I+Š}>¦qå†OÿªÄ³/”ØPH3ØçÅü×R´äb¨sggï¶»wvóì‰1êuÍ Ûsܽpë~éêSܺ·a×?ðž^þê³[Ø»»e-}Ý'^(Ñ …^ÝÐËødÄøx“ý×¹j›ÿßÎvƼ>`>õ±@NYîzož#×xþù1îùÀZ>zë^ X|2žcÚÙ½@ȹÎÉÅngèšíy¾ôù+Èå;·tá§adéÊ(Þ*‡¼ò›in¾¡È=w¬%áÞ;˾}îØ[`K·^2 ^µÅ¸èê¢åÏïäK''8ùF•Ï|Lq•Mq¾ªBàÅç‹ÕC„9û!ÉŸò9ɽ½îìIÎ <a`xï{úØ5˜¦WB5|⛈"Å®"ä}{ÙÓ_B+:`,d…æÃ{²|æ¶ò³_ŒòÜkÓ¬íVlëõèR€pê0/…;š%…[Þ*1ó^X0‘[=B¬9Âå6®Mó§ è;ÔÆš–lÚg}Îc{¯~[¶¿( yT!Á¦lÈîZÇÞwøöÏÑ4Г–lÈ ú|øpôÕ¯~õÁ§žzêAà`|6?+Ò!A099IE³ê _NÑcêŒ]œ?×à©_MsèçÆày‚MƒYvlÊ’NIJ•ˆTJ22ÖäöŠt¯I³çº~ú‹iL½N¿­—u–fÍPùd,óxý‡z(úÚ×¾öàSO=ux¸ÀR&ØÑbNP)E:niBbÖ‚Fà‹Át‰ÏýÏÇlæÕaó/×xítóo59yºN­¡ÑÆ’ÏyäsŠS¯M³g7ä£ …Æ$).@¸C˜´w~µÖ3˜î¼—ñtÌüOžxâ‰E™ŸÀr(¥( cˆ¢­u«ì”’1š>Uçæm‚[®Ì`ÈQi‚Èj‰1†”Ï’ÏZ†(¨a‘j1$¥$ŸÏS*•f0Ÿä¥”>|8:xðಘŸÀr)ÙŠJ¥RsÞ'å cPzó¶c6q·—(;Ž–Ï–p¹\frrr³ÕþÈ‘#áÁƒ:44”0q1æ`¹kéù¾ë,;iñÓzK÷Ù©]ý'’?räHtß}÷u2—ªY”Þñ£²«E óQµ´%)yä‘è¾ûîû˜ù,“yø=f€J˜ôÑG£¯ýë³m~Ù[¥óœ_~:é·M‰PJa­åÑGî¿ÿþCO>ù䃴m~EûÄ ú€ßEê {=~ãßxðøñã—Í<üžšÀ±cÇÂo~ó›‡f1Yéß’©îرcÑ·¾õ­Uaf „žç¹ÔÖ§¬›”Ä«Í<Ì ÑhØ“'O¢”ZñÃw’&&&xæ™g‚‡~ø'Ç?<Ë*0³x饗þëĉ¢Ùlf„‹ÇÄ¿EB¨‘‘‘á¡¡¡Ÿ³J’oõ=ë¹lò«Ñù*S8Œ°JÌÃ\îÐçåF®ï$i `™øHß3±çlIEND®B`‚recoll-1.23.7/qtgui/mtpics/folder.png0000644000175000017500000001363313125527323014427 00000000000000‰PNG  IHDR@@ªiqÞ pHYs  šœgAMA±Ž|ûQ“ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚbdb@2 < {20ì¿êñ_Àä~þüs†‡÷_2H ²2¬©Ðg`e¨ÙÈÀpì°bGRËËËÅðîÝ (0¯ÿgdþûŸóÿ_Æ@{Ø”â~Ý[xZ`mI`;ù±â¦ =ñ èÿß¿ŸþüøºíÅñ¥e67?ÇÖÓ­¼)àþÿÏããbåOtgHvb8,›—KößQÕ_½öžáæ­ç ÀŒÌP®Àn%Àз—aÝHÀ WèìœÎÈÀ#Íð÷÷#¦¿ÿ8þþåü l810²‹J¥8 þÄZQ`?í)¸zd7+#ƒ67ƒ½ 'Ãþ›_ù6^`Š`°Nôfã“»³4û ´Uv§nÕ•D Çë™åÄ2ÝE}e`X L¬_Ñœóòõ_†#§î3|þôƒ!ØL˜¡.T’a70e„̶s?C Š_Am>6†7~‹²ýþÿîÿߌÀB•ñ?ÛOFVAqB@Œø<î<ÿ½À¿?¿±Ç˜ÇÍÆÄL²úlàRè&†·ÀØ{þØ2Ûø’á!° úñöᔿ¿~îdá‘–ÂÙ ÎE›Ÿ¡:P’áPÓ `ùŒÅ?ÿ 1¢ß :pò)óŸÌ€u~M,Ã_`‚íÙ Éç?Cbþ×/T3€’7(€Ê`c‰ñÇ/†ÇÞ0p~ÿvùÛßß2<’øóëу戮€N½ u2 œà4÷M ##S?04å“MùÂuYÀµ+?-ý‹„ÿ=³öØW†]g^3|ýþè¸ÿ fŠ\ 9®’ JRL '_ ´Ÿ¨ÿL''/`¸tóƒ?+C°}o ÈÆ0˜†Î?†zèé_@ÿü…]è Œã+—ž1ð~ùñîßÏ?þþbøÿ›á…ЦWlߎ†z‚r´Ã„ˆ[¬ «…ŒLÌ~†Rl 5N\ ü@U@ûÞ3@hlÀß‚›ÁË”›á1°”¶W‚8ì!0Ì?G-à@àúƒ_ Ï=ÖQÿ€$ÁfÁÇpüCþZˆÇAcÍMú¸ô‡š$ó›¿ù€ÕáÇÿ Ëÿqý``gdâQù÷守 ”pšó Øÿ¿Ÿ—“•¿Æ‰ÁD"þ™˜nHŠƒû=$¦Ð=þXðí=û‚áÕÛo þ† ÙÎB ?10´ ¹÷ß žEó(r`àÿ2ƒÔ±S'0ô¿1üáø ª™E¬Õ€pWM@(ÀÈIJ^U”ª7Xõh’ÿKaJ›N~`¸ù胉CW "ƒ0?#ÊKÀÖ4ŸÃÊ·ÿÈžþ$þOŸèÀßþ3°231|ÿÏ̬u¾ÿÿl ýgýÃ̧a4~´Yü]+@± òükGFFùnxPý BýÿhûÒo¾~ýÉÐ É`¯ÆÊ°ØÆ_{Z­Áb™fÀô8>ÿ3|øn*óp±3|ÿò‡¨ç0%5›0C2pá €‚ÀߟߘY8ùÔ mo*5€NÝúÁðòý†•)2 ‚< s€‰XÓ¡æs´<þÿ?šÇñùä¥ï?Áj˜YÙô`ä1òüû÷÷#ö_Œœ"Ú@ÜÐf1 ŒžÒÇ¿Ôm^¸ÿ‰ÁOA–a=°Mö㚇ÿc&}ô¬€Ëÿ Á¿Àµ¨àû ì)òóýÉÈÂJÂÿ BFfnfQ[h`Ôz€/¯^ÑçŸRÏóÀê™áÃçß ŽêÀë tÈ4’/1 >\!j ëIä2ƒ‘˜ þ1²ügbæføÃnü°[)Nl#€‚ÀÙv¯·ÿþüºúüó_Â-$"hôÔ*3‘ebxò -¦ÑØ Xø øR0¶ÿý‘Æ>ƒÚ$ÿY8Ù™ÁÌÇðŸ X°ÿdä–ÓƒfVtc9 üÖý|03à°u(Åi@½úŠ%öÑcM%‹ ‡xô'ÔóHzÿA Vv`Æ$€þÍñ“‰MX¨ƒÚ;DÄ‚Ôø™ YC)ˆ×ÿQ!®=þÂ`*Ï f?ùˆˆetÏc-P^U ½ÿŸSÄóÿ‘ M›™™ù+Ã6ÿ8¿2rrˆ³ˆÚ*ÿy}ø>4qÃM &hãç°ñWã$À !È@•8zãÃów?üõùžÿÄ’ô°Ôèõ>›ó_ÃcžRþý‡§øÌù<<œ TÀÅðƒ\õ1‹9:@«C”Ä @Lß^=xÔÎè­ÎÉà ±ðl9ÍÜõžaËé×ÀÒŸŸAKŒáâ ìÞ,ù£ ÅŒß@ùþ¼Ä‡èû‘àÝd`6`ffdRQ`RãþÃÄ) *øÐ«C€b:Qeöþï/;ÝÿAqáwðú†¾Í¯^½ÿÉÐ"ÉPîÊǰç ÃÓÏØc=é#'ux €$_€¬_áÉœá?j[H}<`§˜!Æë/C_É/_K.Fq3&^5Øø¸Ñ÷íùí)Ï>ýa¸ñž}Åpö†ã·!Ùûß÷g¡Õ!@¡ûñ÷¯O¯§ï¿Å:éƒ3ƒ+–¤áUô¦*FŒ¡€ÿA9ÿýÃây̘Gæƒòz˜í7£ïÀÀû4W¬ÿ‡ÓŸ?c¸}ûÃ…6]6 ýýöçÕÞåßžx‹?€B/ðÿŸ®7™ûïïŸÏKO}Å( Ey˜@½E6\±Œ­„Íö@=m«Ç‘°Ž 0Öã>3ø›þ$*¹ƒèÑ£ .ßgXt”aÕ6†ïŸžŸÿy­£ú×í©kAÓ ‘Pb ¬£X_ÞÎÞt¹(ÚÜxþ ^†Ûo~3°¡õÿÿÇž×ar Ïÿù‡%•àÊçP Êëqß| ~cëÿñ†/_¾1ܹó„áìŸ «O³cýÏ·ßÏ6Ïû}á~Ðü ƒF<Þ€*4­„-þ}{q{ —pÑÆK?‚ô=HM 6†£·¿SÞ¡+äòøŸ¿hƒغ¾h -õ‡!ÓþƒÏ_,Éý?  Ç_2Ü{ø†aùñ¿ WŸ02üÿþ ëíÓÿ}úêñÐøü ‹+€Â:5vmZØ-ãÆKkŸ` Ò“§P¾—bfXýñ1°² ʇÿ ØGuA“&¿ÿaÝÿhÿÅ\Àr'Ê䃇öOpY뚉‰2úõï ÷î=a8yó;ò£¾ÿÅúVX¬ƒ<ýë?Ð;º„knðÏ÷—w&?cç Ùuóƒ›:¤å¨% ñÝÙ'ÿtÁ}ôž,éÿƒæ{l1+4%R¬0sý%*¹ƒbýéÓ× Wn¿fXxàÃíçÿ°Åús¤XÇ„sàçõé•Ï%lSÝ>ÿb”ñÖå°È<,QÿþùÏ`#ÏÊðî¤dÿ ­Öþ@§½@lÐpøo$q˜š¿ÿPù 6;Ð!†ÿ,ó=–t…IƒJxP^_{øÃÜ=?^~ø Êë3ž_ôÿÏgÐÀÇ=hàÚ |³Ã¿¿¿¾ß~Š™cÕÀúW‚\jhJ²3œ¹÷ؘæDiù!lÀæ U“@¬.ÆÀoöA“ØXÿõÙ;?3Üxú‡äXG„¯ßóÿÚŸÿÿüz:eÏ °¨è3‘ggµŸÃ••{g–ïÑÛíÈÀ Ìëa† ¥.ÿÎF 2ýõë†[·3,Ùõœ¡vé†O~|ûýtã”ïgsZ€žM€^‡Æü{b§6ˆÐú€_¿>¾ì:u‡yâ`þÒ‘dbÐ’TL ûoýdp3bgøü µ üûûxr쫈20D=/È )äÀóùXKwˆçA±þüù[†+·^1LÞüžáÚ£ŸÅ:2 b€¸ô«¯Ü6Wš/Íì1ôìùÂðìÍO`ÿ_Ü üÃÍñ}ù Éÿ0þ/èÔ6h~Tàxi20H Õ¹à2’´!u=Œ†°AyÔ¨Yuà-ʃ¾~ÿEt O  bVˆüøõñE×ÉÛ,.›ÐºRÌ &ŠÜ ]W>‚Wy€—^ µóqµô´€žÖÄ8êvç_¾|Œõ× ½k_1\º÷j±Ž ˆ˜±×§¸ÌþûûûI;žŒåÁ¾Ýwó'ƒ0;já‡üÊj™öUi?aU!´ºS``ˆzœŸ ¿çá™ÿþ2¼~ýáÂõ— µ‹ž0l=ù‘áûǧç\¬jùûúðiÐ\ ¿…N‹þg ±Ãÿî. ßþ÷ç—S¶B&Ý4¸n<ÿÐ`Aꃇ¤Áê£T#OdA „?~2<|ø’aÎÖG é“2\¸õæíÏ»‹:¿Êlþ÷º±Ž ˆ”°¢jg~r*¤³²°2„™ò0Ì9òAŠŸAY‚•áíwHÌK«4Yà½}û…áâW åó<3|{ue÷× Íþ¼>q( jÔ<¤f¬#€"%þºµû€^ˆÌõÿ C¬Ä>ÿüÏpøæg†03^†çÀV’%°©¬ÆC¼ lóüù{†y;ž0Ô-~Ìðàéû·ßo-™üíÊ„õÿº õ<¨ ûJ……*X@‘:ú™Sð<“°nÊã7¿ØýLE€ýí7 úB F"ÀÆ ³*Ÿ>ý`¸zç CÑì{ 뎾eøúòòîϧ&ü~yì<4©?‚®ìúEíXGDò$ð·G'¿òªºðžÍ=ÊFŒaßÏàjÎB‰“„$ÿ•aÁîg • 0Ü{òîí×ë‹&¹Ð»þÿ¯t‰ud@ä΄q+§< +!dâo'ðîÔ†CU*5}ÿþ‡áΓO µ‹0œºù‰áç«K»?í]ùçó£‡ÐÍKhÏû@‘»Xúû÷—Ë3›ï½÷è#çoŽÞýÅ`­Ì†7É/Ú÷’a°ùðþÃÛÏW—ÎùrcÙ  Ô3(†rÿèˆÜuÿ?ßÚöŒW͇ÿÎ+Fs!†Oßÿ2¸ëòbv)ÿg8wûC0¹¯:òŠáÓÓ‹»ßªšðãéºæu\ €(Y,…¯²‹hDüøõŸ÷Áû? À2“5ÉOÚòìùÇÏß½ýtaÞä÷':ÖÿûIÿ¼Ž E+a¾?=ý•CÚì>‡X+;++ƒ±"'¸z»tÿ3CÆŒ» Ûξcøñòâî×{Ë'||hPÄ:2 j¬…â”Y?ƒK\.NØ(:Ò¨Å0eûs†)Ûž1üùúöñ‡KË—~¼¸ð4¶,¯ãD`â×O’ãÓ=Æ-"( ÚOðñëo†¯Žmz¾-oh}Ôã¯è]ˆ‘Jæ°Ûµ:qK(Dýûý•ûó­g>^]wë ÎÃâ×[Ó#͘‰± ÔÜOÐ|þe 9B €©l+ÒÌúoä ˆÁ  g¨'k²¢aIEND®B`‚recoll-1.23.7/qtgui/mtpics/sownd.png0000644000175000017500000001122413125527323014300 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7ŠétEXtSoftwareAdobe ImageReadyqÉe<&IDATxÚbüÿÿ?ÃHÄÄ0Â@± sÉ2äüù‹ŠÀ”¤øë×/&PŠ%*Í€ÄG—CÐÿþAR">5 úÇ#"¼Î•þ)'×ã°”@ŒÈY€Ü¸téÊFfff?ˆGy¿AAHÿÇ‹ÓÒÂg­þ Äÿ( €b¡F2:Zˆ‘ñ?ƒ˜˜(Ü`õŸ¾È|t9tO#ó!lˆø«Wï€)àƒŒŒ\oOÏ,®’’´)@íŸÈ  ªÀß¿™˜˜ Bn¢xæitñ>3|ÿþ,§¡¡ÓÜÕ5ƒ±¬,c2%@T)aI“Ö–z”•eÀ´ŠŠfyjj PŠ”ƒÉ1 €˜¨ç0z$5HJŠ0ÈÊŠ3S·»{À‚¬¬r' 4'9@LT*À…}RÀ&EE)qq!p 88x,‚ 9@C.€¬ki)AvvîË22H€‚e(03033±¶¶ƒ„„0° gæ¶µu]–ž^FR 5c†^e#<€CGGX.€R ·ë²´´R¢ €¨T0À[rô¨@ûÈ §§Ä %ÉÖÖ®ËRRJˆ €b¡VÌœe=ÍðìÇ=†‹ÿ.]Ç€À ÿa`°g´gBVªe5P É2èë+ƒ#âñã×ÜVV®Ë€J£æÎíÙ”üŽ«Ù @äÀ1†@ fg0°å4Õe`нbÍ ¥™ -öŸ@ü  ØüùýøÈJØh¶ 8E>~üŠÛÒÒeÙ… 'ìΞ=r €H €M Š  @Oû=ÇÏÀedð ÌPӱπÖ@¼ðýÃ…÷&<œÀ û_Ž!V8–!V2žA™W‰P`Íj @@îx©€SÊ£G¯¸‹W13³:µÿÔu( €ˆë -zœèq†8pÌÂ08F¿+|Sa0ùiΩ-¡Î Ë«ÇÀÊÂÂÀÊÌItÿ!Ô£OŽ0¼eÇpùÓ%†£_0s$‡þ@¤t‰L†jÍZQn¬MáÓ§o0¼}û‰!<Ükêøû÷ß?ø°Éü‹áÐ¡Ë ïß²¿ÞY¾|ZÀñã»oÃæo€"‹Š€ž¯b~°§AJÞ2=e8ÇrŽáÓu†Œ×W¬XU&--­iccHd¡ùáÐýC ïldØðfÃÖì Þ?| ýÚ“Â5ÃÁîA€S§®ƒTõ!{Ñáú „ÿ`óA4¨ãtûö3°<(V¬˜pâÄp Àôþ,0—a!Ðaq`Oƒbé2ói†-ì‡N2\ ¼šóÔøBJ;€‰‰‰ÁAÙŒûpýù ¯M`8øã Ãg`¿&åd<Ã×wJ-ÊØØX1ʀ˗ï#õ‰ë~³±qªXY¹g hÔhæd Ü0ƒáÐãöà>Öm¦Û k962œc¸ Œ¦GÀ8|ýíÿdaaùMI;À_ߟÁOÏáÀ É{’2?dè¸ÖÌðèÄRëRVVH ()‰1°³3c[%䔀ÞB}øð-(%‰™B@ü„=&1L’öàXßͶŽa9Ç^ _ïsÙhè}†¦‰¿P ÿS£`§fÏpJú,Cɦ"†Å_1t^jfd“fˆ6‰//7°È1vÉûø;#¼e PÑÌ\tfô08É|`¥ñ•a׆ãL€©T<âwÐbë/­ú\ü ³Âæ0èÑc(;VÂP{²ŒÁ\Â’ASQ˜ŒÙñe”×ýú ¬ ˆî¯0"7Žˆ KMÓöâr®é@ÏŸe`ø †{@üˆ¿¡{žVMáë<†lµ\†Ï¿?1¬¹±’áÓ§¯XÕJ}bšý°²jt+'F;† ¬kN±^zˆCkö_¸ZS´ê vúö0ØŠÙ1x¼‡áë×oXkxuF`<W$jüc0dxËø‚aß:Hž'ûO°ÿxmúÓg3œ}q ß1<ôû÷?°Ça~Ǹz¬Ä‚F ¯™¦S90¯ÿyŠ\Zâ™ï3Üå¾ÍpìÃv`áóD“˜B~ûÿ äÔ0à ¾? /(Ïà£æ ,ýÙPÄÿþ ö8ÈOÿ‡³±y[35>K÷ý,À<ÿã9¡dϰ˜Zظü39cå€ %Hp±C1 KpR{¸ýêÃÖ»[6~ÜÈpàÛ†£¬G|Žx2$ˆ$34š61Hð‹aèáçà×õ?þzÙÓÄ®B €ÐÛ¡žGU:èù¿À–!+ƒ>8X.°gX±“áÆ¿ûÀöÐk“e¦JÀ$*ÃÉÉA09«Š©0ˆ0€àƒ·72,xL ßæ2œxvœaËfE Y´Âî/´ºcÀó„W!@LXûœ3àf±>à ¦‡ Ü 5lÓn|;Ì%§’ ”ïäÔ  óæ3œó9ǠϨÏpãÓ5† -> /_¾·ì~ýúìÐüÇ>Ìã°l¡kt>*â>L7á!±~`²gzþ:Ë!†b¾N†ó¿=,(ÿ]µ0ø##Ó_Jš:Rz ÇbO1DIÄ0Üøp¡åP3ûwŸPš·È'' ÝkL»o°Ük¯c¸Å²aÏ`“Ø"ü÷ÚøŽè Þ‚Å0(yÃRÏd ÿ·00̹1•!J9AWM#iƒìyÆ&.;`/üebøl-àYlc”ç^A;Bÿ±µ²~ýú쳿…Ç;;;ƒ   Jò8,Y# ql«s'Ãч‡<ÙÍ $-ÏÀÍÍI•@€MÈ¢€b!0¥Äpœm2Ç¿ÀæðïÇИ{¾¾¾^Ø vdff6|ñâ†.(´¦N½ÀvL˜á42›Ÿ_€‹‹X§ó1ˆˆˆÙ<Žà`(³®b¸úô0°~ƒ‡°{ˆ´@ÀÕ üðØ0ÚŽØõÿò|ZZ§°°p°kô”̃߾}·ËA±r LÔ……a†÷ïßcþÃçÏž>}ecàãã‡;6Ê0†aê÷ÉÐüŒËƒ¤öæ:@ဠ›€‰ú‹¹¹)‹••U 09çͲüógÐTõw0þ‡¥tÅ:8 €èW¯^Áù|||àÑïß¿cNN`ª†ÐÁL ¾š~ ÜœœðÂŒÒ@À•¬c¸”ÂÏÏ?ƒƒƒìñ÷ïß;&_ñjƒÅ>ÈÃÈ©„AóçÏ`÷ö°aóèqN`–àVw_ž?Àðñã;i`Þ—öËÊ{ ¼žžôÄ\#¿}ûv4!rÈ“0ÏÂ0z@À0¨ÕÊë0|ÿþ™áÁƒ[ bb²Àì!€µQCN à*g¤¦¦&ö<¨T‡HÄ{[Ìc d1PŠÆo†7o £¹ÂÂÔ lU5@am%$$( ìåÑ?åyä¤OlìcS* €Ùí-0küÄÚ²ÃÕðÁÕX•ˆGLÅÿ÷ï_¢=/--Í ¯¯Ï ®®¯ @Éä©7oÞ€„Ab°²WJëáäéý^ ‚«O|JÀžWrqqKzB@II‰XC€d¨`ƒÅ(E “±0¸ü  3Aå ¾ P@:•¿~ý„O‰S°Ét@Xƒ°Â 033—âOž<­{„A)Dƒ< JΠ¬¤¬¬ Vûå˼± „´/~3pp°ãííز@a €>芋‹ƒ+ÄÄÄÀÕáÝ»wÁ}ñâX=Èó?~ücPu7oÞdPSS«yúô)0YË2ÈÉÉá,`3Hÿþ±=ø/pÕ„5Þ½{÷èYnnnP`àœÞºví¼MðàÁ‚Ùd°M¦AÊ>Øb”z@ÙàÙ³gÀ€VBé푸ʀÂ/^<ª¥¥Jº –,_#PËë ‚r(ùƒ< 4PÒÆû €F0És€W†JJª0ÀZpy”@@„µR­7sA%2(Ð=’ƒ$Ñð¼ ƒÔƒ UPá÷úõkpì‚øè1R’Éý{÷@Kà|}Ãåå$»¡{’@ÀU¡ER Šü=0Éâh ÇŒ>|˜ùòåK˃rIJJ2HHH0€h%iPÁÚ @ ‚hXWúùóçàÔRQQc ‹z\XžðCÛ¸=Hn à bV‰RhDè'°ÿÄ í*¢À¼¼ (JÀÀÇ$¬'ˆ^¯Ã†Ä`XFFû²²ò ÑщÀ,Ä žö‚Å81$'`]bt@Ä.“û'ü Œ7À¤ÜLÚ3@µ(©ƒÊPì‚ò5¬ò0(¿ƒ² Èã Ô ,œ••PœX»ð"%MÂ-:ò{ R—Êþ‡§˗//z¸ Xà}y–ÿ‘c–*@b X?qâ0|`ð÷eÐÖÖ¨üãúÄtuaâĨA ©a J–Êþ<{öì4`Ci``ÂÒïßß)}ÿþ^¯#ƒªEAA!`énÉ`dd ,/ÄÀ­;\ÃW´H ¸R@Q ‘ÐÏÀ˜½¬¦fùš••])+ËÜéõÞ •ðìì¬àj••…ˆq>ꮆ@QºX_™þ€ yNGG›¨~áö;uWS €¨¶Z„?~‹R\ Û‡j7jï yÍ®õ¨[ñpëÇ·D €¨A†¯\yŒ¤M’¤nšD^G˜Æûúõýkô逢Jܹs¥üóç>~|+l±"bûFIÂ|ÊÕbK5çÏo8]ä © ªle€,‰Õi¼Ô TŸÐµO µÍàé,€¢–cCW‘~dÜà?Ò*00ôú=U,YIEND®B`‚recoll-1.23.7/qtgui/mtpics/sidux-book.png0000644000175000017500000000345313125527323015237 00000000000000‰PNG  IHDR00`Ü µsRGB®ÎéPLTE•þÿ$//$/$$/CN:::$:$$:.$DD99O99OC9OCCZZ$ZCCZNNZXCZXXd9.dNNdXNdXXdXcoocXoccommzC9zcXzcczmmzxx„„$„9.„C9„XX„cc„‚x$$$.$mcxx‚‚——šš$š$$š..š99šCCšN9šNNšx‚š‚‚šš—š——𢢤.¤9.¤‚x¤——¤¢¢¤¬¬¯¯$$¯.$¯9$¯C9¯NC¯NN¯XX¯cc¯mm¯¢¢¯¬¬¯··º$ºxxº‚‚ºº··ºÁÁÄÄ$ÄCCÄNCÄXNÄXXÄccÄxmÄxxÄ‚mÄ—¢ÄÁÁÏ.$Ï9.ÏC9ÏNCÏ‚‚Ï‚ÏÏ—Ï——Ï¢¬Ï¬¬Ï··ÏÌÌÚÚ.Ú9$ÚN.ÚX9ÚXXÚmcÚxxÚÚ——Ú¢¢Ú¬¬ÚÁ·ÚÁÁÚÌÁÚÌÌÚÖÖÚÖáÚááä$ä.$äxcäxmä··äÁ·äÁÁäÌÁäÖÌäááäëëäööï.$ïNCïX9ïXNïcCïÌÁïááïëáïëëïööúú$ú.ú9$úC.úC9úN9úcXúmcúxcú‚xú‚úú—ú¢—ú¬¢ú·¬úáÖúëáúöëúöö³´6 tRNS@æØfbKGDˆH pHYs  šœtIMEØKšV„{IDATHÇ…–[ÛDÀ[qFÝÀe 2ŒUùðóêT0@Q‘¢kˆ+¥W ŽQp)ZÚs(¨(KìuÍUÕ”1qÀÀ-¥ÿ —†¶I]ámŸ<}’ßïîrïÝ{µÙŽ n€ã¸·mdž !tw¸ÝÄþŽê„œ#YÁj>ŸÏæ±ûAi®ßŒ‘PÕ,ùk¾‚çD¦–CQ1VòUÔ¬Y€Ü¸™Ã¸ˆ¯z¨ª`IòMÊI‰"¶PÈoE°¤ÎÉ PŸ×!çî/ ‚ È„IêÍ!½9aräѸ(Š ý\Iô@ä^©¹ ¹QÀ’CäLy&Ê¢,”š+r…^q"‹@ETåbse®üb&ê‚L¥Ó§.Ų„« &4VÖGý=]€a€t´€q"ä"MÓ z‚M.ЀI@&+!`„¥iLlò ,<å<@·IÀÐišaY~bâó­íÞ Ä¥ƒ”»$xZÉÌ 2 4KÈ[$67oÿýÏî¾w!£i,÷ 8¸¤¬ì£(pý–Þ¼³½³³{wïÞ·/ò)MâÊBß uu5† 0s}skûîÞÞþþ¿$ögy˜¦ÏçR¦LÃ@kûÉg²º€iŠßÜÚ½}j²»­ÍÉØ©6ï…ÎvÙ<­ï¿–ìszÀ!ŠùõνˆÓ5äe!µ&}ôÅ _|ù{-¶ä¡¥^8mC¾½½w.› ¹”ŒåSgÞøàŸ´âj; ÁG„¥›¿ÄØèt7É2m·Ÿ¡^~3•²àiõ4@ñtö°&üÃR¸”:êÙ“§Þùø|¯eiô6¶76ÕBˆfF®^ ·ÑFžŸ×~~ŒzúÕ^ËZ ¾úçÞz\=œ%†‡Ã<<Ͼ¾ ­ð#ý¾!l]|†Ö'`1Dˆ†ÃÑ¥YoH[½ „£QÖ"<«Ê™~ðÑåå•õ¡P*3·¾<;‡?ù”•-BliNäu!É­¹ØÙ•¯ü¡ZljÒ˳dh—¦@Â"t¸›šë =$=ßi²ŸiÎhcÝ=þÑxˆ¦Y~2âŒcó;¹Þz‡ž‡¤çF&/ R.w ûS¢)ÀO®t]±Ðã€O©HõHZ&—Ó´kH‡I)\Ó×.{9Ö¯˜%GsƒCEb*£åþLIR|lØçr’=JÙÉ"_ƒŠ= ›šš²HÊüw9SH³]Ь7ö³"BKûD©¢ø=°`qG³,˜Z W¢Ø.ÔAQ²Àn€¤¶À’è¼¼úHV–$¢Zµ(8:½ú¦"3«¿¸ÆþWÈHÑ@Eî¼HÀéé™™ØÜüg« ÝÃX©X|º +†@éØÜÜüü|lz¨§Û €+Ž+j«ÅB]Ò…4`#>Wys=þ±E©Ž AÊ&\èJBI§±qŠ•¢\*mbY(, W 9Xl¨,H°™£ýÏ[Owù‚å«üÍ '-Rq•æª(²Š§þ»÷0õ$ZùIEND®B`‚recoll-1.23.7/qtgui/mtpics/pdf.png0000644000175000017500000000725113125527323013724 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé`IDATxœÍ›{Å}Ç?ÝóØÇííî$"ÖÃÂŒB[1rŒyN%˜ÈNa§•„¤R®TâJAÙ”‚)D1Ql‰ ˆ ƒ–! BÖ-oŽ CÒ=wïö5;Ýùcnöæöv÷vïAøVMÍìtOÏï÷ëoÿ~¿îéŒbÓ¦M‹£Ñè?K)ÃZk 0z*B)Eð¾*¹ G¯UàY(P®;îwð=Á¶TɳÁ6QŠQ!'ÊP"·ÖÚÌd2{o¾ùæ”Àô/æŸsÎ9מyæ™FA)ð…Â;”ò¤ôÊ\´ö1 ¯¬ J«µ\U¨©,XKÙtš-[¶Ì¶Áç‹1"n4™4øÕ¯à„À² ¿ ¹b1H¥ §Ç{èÄ=ź»!“ñ)À7¢ëŽ]—Þ/=J˜RNáºÊóyôÕW“]·Ž\.æƒA  ”ZOáƒáúë½,^ »vyX¶ÌSÒ²`çN¸â „dy>üÐS¢P;ÇSÎqÆß/=J†ÅLA-[†»nZk ¥åfðG‘â¶ ¡ìØçŸçž ¹<ó tvÂw¿ Ç{BïÞí1bd"OÃ;¤ôêFuø†*eÁt 5˜fÕ*²b‰aÀ•WBk+<÷œ'X6ë)›Éx ‡á¼ó ­Í3Üd”üb¼y|øxøaxÿ}¯w/¸N; ZZ¼²ãÇ=êoÜèù˜Ô ~1‘Z{=½ÿµ•‚_„¥K=_pï½ÞxÅ`xòù1'WJkŸÚ¥÷KÇÿ,±G8Nmp](À‚pá…žÒ«Vy‚)å)ÙÓã |ê©púéž_X»Ö+÷½»¸§ƒe£gíŸýz£ï)†BŸ£¿+†»Òò`=ÇA®^¨â`Ç3@)˜;.¿¼ªÕj…®pö¯u•²qç ’~Þ¡õØýÀ½Òz¦ÖÈB¡¢ŒÕ]ätìMÿ,„'xðÖ©ôÜ$gÁ˜¡ük­®”H˪(â¸(0Y¦V‚½ ãB¡®ž&<7™Š©ºR¸“ä•ÃàLBJÈçPþ„Âõ—£þâÔ¯‰k˜Ÿ“ ’aªÌ™ÄÂ, qÂvò¸·ü-ú›‹©³3ØOÿɧкh –!=ÊÖ TÅ÷”)s]1Ih.2 P(ÌȘІègC?ÒÑDÐ 1¬ºP]oÌdên{2ƒ¸®;n†X ³6‚ž[wì'‡jlÂYô„“Çìýˆ|> „¿z(^î·ϧÍ ˜ Lt|€«ÐýÇAˆÌn¬¤7'®SUùZÞUîw-ÎÏÇì:A­Áo ¢à`+¦Ì‰Rºæ1>•ÞŸŒgƒSDUao!HÌ#Ýãf|¥N·÷]×­Éùù˜õ0¨qÖJ°Ãci5€0p[NÀÏ÷*)Uï°¨%ô1#¨*¬ÖpÚY°p©—(…ŠFQ 1d€¦ÓÉ`t>£u‘úµ qap¦¡µö&?-ó_¼œ<B+Üx3nC#F!§Òû>õëÅ´0©°þϯ~ ›Š3B·e>nS+–œ~ï—s|u3`¦1 µGýÓ—ÃÊ/A>Z£›Ñá¦a”®ŽÞ÷©?LË5 «Ø!¸ò› -0Mìw˜=Ý`ÚSê}Žãååz¾–H0+³Á² @¼ „D&ÖGïÓ°û †³¹ºç~ÙTÇ}SfÀ”¦­¯7çÕ·LšžÞóÞ›d Õãv¹w¸®K¡P@”²êQ Sb@5å«öæÅå/mXX=]4>ù É‘”ª}P(ŠÉN­ O%Ìî\À? ©!8ü&Ú´=GhÙÄŸ}„Â[dQÒN¹ö}åg u`JÔ—ô…î·Àðš+É/^†Ð«·‡ø£í ¦R¸U²A_ùjoÚNp:¨J]CÂ[‡`h¤däü?$yÉ×A¹(;LÓîÇà@#ùòi¬RjÆÖ+JQ4@=±´®Þ÷Ÿyeä3¸sæâ´Î'÷嵨Ï~œ<23Bëw‘:ö…À'øRÊ×Óó³’•[¶*gqg!Ñ©$z ¡ÁY°ç„“°›[àºËFY6Ñßí#òøvRÙ<‚1/_.·Ÿõ!Piž]­nEß`pä0â혙¶sPv˜0 õ¥KÑý1ä²`˜´îØLöÕ}¤²ùY¡{9L0€Öšd2I6›­èm뢾!aßNHö¡ÃQÒg¬Ä4 lÓ!p¿óè‹ÐZcöÒÒ~;CG{PÓèõiB¡@:&™L’J¥ŠÆð¯9ö á}>{q7Â)àœ´ü’Ó°…@…LšÜ§N!ÿ—ß)Q–Eã½Äº—äHzì=B€£ÇÌ~€-k€ åÇ!N“J¥H¥R¤Ói²ÙlÑ9i­‹ëzã¿D9Œ8¸ß£ÿ²åd1E ™É¦q/½šÂe×x;: “¹Ý‡~î1†…‰ˆDZ#òYïP."AHcFP\«f‚ (¥&,5ûå¥/ÓZ£íFdzؽ=èP˜äÙ«@JB¡Š€À¹ñDÏaŒß>trÌÿÙRva Žö †‡¼ê¡î¹ଽkœ°«^Lø0R "Ȁі —ÁØý$¢à[t é¶„ض B"LÓs’ÉdÏaôÉ‹áå=h!°z?¢µýG£Kh á*´a ¥¹çi†³yrßøkšm«â°¨E‡²_†f"ÇÆ0kñj˜#+.@5µÒkDD¢A¼ñ*ÆožB¾°ãõˆ|ŽŒíJ …ІÅÀWÿ”|Û b/=Gã3#5œdxx„øœ8¦aUtÌÛªðÄ–-dǯÇQÍ­ ]pF(LÃP/æÓ?G>ó(ÆÁ}ˆd  “]t*™ÓŸáå_ÀJ3¯ýß‘C}­‰ï}ŠáÖym+àɇpc ¤ÏþR+„˜^2;K Icìú_ÐYv62Ÿcþ|Ÿèþ燻Ц ¿øT†/ZÅðy’_z²e.‘P˜p4гì ìõxï-¬cÒò“-að’ud–EÜ40FW”¦*ïììG/ïA&^AG¢„Þ›…ßÿ6ÆÐ…ÖV’k.#¹êb2g®DÎ[@$¢Éôroþ®ÐŸ_Cþ®˜íw":žÔn¬™¡5ké¿ü›DL‹æææš¿.W¸(à£nhí[ÓD›6â£÷‘Û7A6ëèä~†þ+þœÔª‹q—,Ãnh Õ²ˆX&r´ƒŠˆl½`…ºõAÙÞc¤í(…¹óiЋÕÔû“-¹ÏŒ0-oÍïH7æÿlE>ºÑsì#g®$¹ú oÌÎ_@ƒmÓ`[X]eß+Òuq²YúŒ¹–)äóÐßGNJúûúÊÎGJaY†aàºî„M’0] „"ÐwùÈ}?¿Ñý6:EHAöÓmùÞ˜ñfZ¢a¢¶]¾·'éÁT?G#?{—;Ê=kYÝÝÝtuuõÀĽTS÷v\ñËû1ÚïÀxõe óO$½f- ~¹,W} i`NØ&–É&‡‚‚ë²páBÚÚÚê3‘Hpÿý÷wlß¾ý!`˜#”Õ ®×‘wß‚ñøƒhÓfè®aàO¾CÓSÿ1ØÇð\ÌðÊÕÄ ICCCýóÿm£õý‰™¿Z*g¹v‰ëׯß{ß}÷ýØ/­S¤;„|b;òŽAv½Cfùyô}ýÒç™Æßî¦éñ(´Ì£ïê¦M<Þ8mOí3Ç_ /ÍVË]' n»í¶ŽQå÷oùš P–B‚ñã`ܳíèÿ³øÚ·'žÌ }Ghܼ‘apÝä—¶Ñ ‰DŠ‹Sÿœ¿éÁ_ Êümš&‰D‚[o½õ…öööÿª¦ü8Lº$fYÈÿy׿¢šZè½î&’kÖmn¦%ÙKèßþùÆïH~å*/½†ˆ!ijjš‘ì28ã,]žÃá0lذáÅZ”g€ &0À²á¥ç[~R2põ_1´öZâZß{ sÃMðrés¿Hß·n …h3gÒµ Ç}”ëùP(Ä¡C‡Ø°aþ-[¶T¥ý¤˜XË@ìÛ CèhŒøÓ¿ ôÁ»DriŒýÏÃ`/™ó/äØßü1w>óæ4c‡B3ú©Íu®ë ë! ÑÙÙÉí·ß^íÇ©Vîæ( Ë?sæA²«û-ìwhÀw©oÜÈÀU×aÆ›™ÛÜD8žÖ¸ÂW6ïƒ ¥–eqèÐ!î¼óÎŽöööŸ{jUje@>«.Bÿçã¨ÝO«“‚i“[rÙåŸG}j)ñpˆx,†iš³¶ Y:B¡‰D‚7vlݺÕïùw¨Qy¨' (Î8ã³çbäò¨BÛUD…Æ–˲¦ë«!(KpضMgg'wß}÷ [·nõ{¾.å¡Þ<`tFHB– MØÇ2¶?,Ë"‘H°iÓ¦½<ð€ïðêV¦˜ \kö¥PJ!¥$‘HpÏ=÷ìݶm[ÍÞ¾Ê`&Â×LÁZk¤”¼öÚklÞ¼y϶mÛ~ÆiDEðIoÃ0xóÍ7Ù¼yóÞ™R0 C(¥ÊΙÿ¿aš&d×®]¾ò{w™¦ò0@$IïÙ³§ë•W^‰×²Íüã‚RŠ‘‘óÀ;vìhgÌáåf¢ý"×W¬XÑ”N§W'“É%Úû›é'–e‰£G~˜Íf]Ìò0Þÿj›€xÉýO r@?ÉFÿIøGÅÞH6dIEND®B`‚recoll-1.23.7/qtgui/mtpics/archive.png0000644000175000017500000000743413125527323014577 00000000000000‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs7]7]€F]tIMEÚ 4úU9íœIDATxÚí›Û¯$ÕuÆkWuŸ 3\†lÌ`ð)ƒÁ9Ždbž,¤<ä%±E‰·Óy8Ì;ß^ã» p`ks'‚8ªXå9+€³Ê¥7®Š$©½-nDäÐõ°úÚõñÇʾ*8G;Ož$Ùðþ'Ù^Ç-@“pWžoYMÁq & Oš ñ$פsÅ‹2t€˜]íd‘bh¾‡«£iâwE²±]GÎÅ›J«a"—#Þ†äm2‚èh¯äCX68£B ƒˆ²tm«~‘ù¼’ µ¼_£Aãl·` Uß;ä¼%¤JYyÄÀ¢1å Éx‹×±èz­ktIrÌàÌâ1çJˆ¸ì˜t?²LHm§V Ɉl¼õ·ßÛ`åÆpV9pà$AÚÀˆÆ¸}•3J8ŠYÌÏÉØì¬£äëvq¤ÉÁ—¬S3EU«8NqOâ \‚¹àâ5Š«\ºtŠÛÔ5×Ô±Ÿ!_N-ªËs@Ât!c3ÃÔ03Ô4þE’“úm¨H„Ť0Hœ’×-géÓÑÓÙ ò9öIH¨¹iÑXÈfŠZ^qµòã¦a“>øDx‘ rüŠN\:æ±û2¤rI £ÀœC’¡yŸD‚…0L$:u™! ¦¨¦X/+h)$"äÍ d@D¤®ëmµú‡î/VÝ„q M1Lú†Ö œ„Š˜âRé›ÓWj[Æ °A-piã|ù­Á*Ö.ñÕ.l¿ÚÀ 1­¬u•ØЀbæJ YÚߘqeë›ï½Î›?ÿ1'¿ð0O|îiG£^*¨A®G®Y³ØÂÐ?¢ÐT±uõ"–HMÓ\*Ë@ÒÆ0Qœkñ³}üþeæûÛÌv·™\¾È•Kh’Ö'NÜÁjküÝ_ÿ(·Ÿ¸‹[︋㷞`íØí¬¬ÝÊhý8ã•ã4ãuÚÑ*ªóAxT„´G…Œå"µR~šcU‡é/ËZq#6ßø>“í ˆsxU,A ׎Рh¨*ϿͻïžçK_:Åþ• fÌ&ŒÚmëhš†¶mpÀʱ“Üûåo‚v7n1£t³ j/ÂÒ¸òEÌ šÂA'Øùè<ÍhÃ9Ô U%C5¯jŒÇ+œ»¸Iè<Þ|—Î[æ‡kÇL.o0ÝzãH¤wÃ: ¤º”Ë!õ†uLß'0‹Uä¹Wÿ™õ[Ö‹‘ƒ­…꘲¶6æìùM¼&ãó;4B„ „ ¬­­qîÕAœåÆÅ²€Vl˜szQH)—[R‰uÁè;oý'Ž´Ù¿{ãMF„µ•1³é †žÎ|ðÉð@ÐøVû++«\|õ¦=t^°œ,pP¢TÂ/³»ÔÙ!Õòzå=¶>x‡•Õ5B¨Œ5Å,–ÙmÓ2ÏøÅkgùÑÏþ‡ïÿë¿sÿý§¸ý¶ãxßѶ „°¦×JEDiÛ–/opëG¯²~×£KŽ®O˜Ùö&ÔziJ*‰k) }§Cpþóoµ-A5Ibc6ëxëw9ûÖ9ξý.ož=Ç[ï^À¹†Æµx5v÷:¶?žrç‰Û¸ëä >÷œºïn~à^~ð>9}+ãQJ±ն·w…Ÿù¤Y+È\]]ED~ø/`ÿ†pe2)M°AƒÓR›ÛúFE,Ï[>zíïyãÿÁÎö\¼Èûï_佋ÙØØF¥q¨ A.~®tAq"4”ÆŽWcÞööçÌæÆt÷Ü} Üw/œú_üâ½Üÿ…ÏóðCñÔï¿„…]Ðí¢0Éýý~Jcå„%‚¬ ”νÆÃ=ˆ“Ó¥i™§J!|ç /3¼*Ú)Ó.Æ{ß²¤,5•¹J#¹ ­¸¤›{.¼ñoœù½?¢iÚå÷¬n†¨£}Y)2nQ%²6áðnmÓaÊ((Ú*ã±#ÃLñРX"ÉL–s ¤Î€%2õA¯¬|·°Ö± XÞú1˜YÝ'Ê"ÉpnÌõšÓy ’ç ª†¥Ú ¨b§½Z}N5O K2Ã&J3jQ3l¹ƒ‘jL-Õ¸KóêçX¨ºC£1‡LKš2@5jÙx# åoÕ?Ÿ>c¥zŠ™$.DšS˜!Í ª¤ë-Ñ–W_ 1GìðK5ܰԈIÈP£iFƒáq-Ö´28߬jå„ûREZ\mÓÞ9Œ`éXúL;^‹¼’dõrk2ÊÖ^ ¥º¿”Àiš£âV_V<¯L§¥Æ ¬U•7íC"Ã?ÁÚRì›)´ÿ †k×Ñ$š–µv3ëN– ͈楄­%rq„öjQciU³€…BqFQ‘–?Kævm ?ïŠj\:ä4h©6°ÔÉÌ«ßwÅ iƤ'GU%ÍeSJÌkˆ«hA ‰•"É´p‚fx!`ñ»4nD磼÷;77×îŸ °¾í¶yŠ[Úßj mÔë©`*ä—2ˆVÌß™}vHPÁc¦Þ!×VÞ"0jÇxï鼯à¯å„#Ì,–£‰ tðpNƒ÷Õ¢4ctcºL­w@œ8“V:Å|vBZå Šy%˜O¥s,‚2É…Jˆ¸1³ÙŒ®›afBØö€pÓYÀ,ÏâÓ”7uysöÇú~AäÉX\åúkYŠ{2X4Î42¼úy!(Þ§ 0o«’:hÄàª9v'»\™ìrúôiyùå—¿|Ì5”\œrüR#šé)‚Ǻ]C5ðÌ¡ûZRa„zH¤W^-öB‚uð±GJB® ãË~Ç{.pêÔ}ìîîþ÷ /¼ðWÀöM#@¤Á9ôÝ쪱xU ‰0Z]eâêÕí´¾#œŒ.B¨Ú†@°@ðJðžé|ÎÎÖ&ûÓݼÃ'd©£•uV×oåλïåô#g8óä3¼þúë¯=öØc œ¦7M‚Î "íU]×Ü·+ãuöÔ'éZ¡¦„AÊë$GäT§5´°ùöæ&/ýå÷®y>(—¶6ùÙOúöן{î;À›ÀäZð?d0†Ê[çÜ'¦ÑÚ:ón^Ê  ÿ£"e‚(púünÉø÷Ìæ±óë½? #”®ë˜O§ìïïsþüù‹_î¹?^O±–+„¬rˆ1-5øù׎†ÓŤé³x!¯¾ÆÕ1Y?÷ç3_‘qo¼ï:æ³ûûû¶±±±õ;_ýê·Ÿ—1þ†p˜3¨UTÎðÞ3rÍ ÷Ò8“a$Âb?;ACîûE‡ÔÈÆÏf3ö÷öØÚÚÚ|êé§¿•;‹¿¸*ËdöêƒÊðRC@œ£ëky­Æ^¡TsóùœÝÝ]Ž?ÎåÞ~çW~÷k_{)‰œË×9Km‰èÒ 2?«'BÛ¶´m5ªÊ‚©BNÉéE×'ñS¿··G7ŸóÈ#ðãŸüä‡ßxþù?Î^¯Àùµ ÀT‡Ð_p"+ÕL „Æ®5E –©q`:ræñÇyå•WþñÏ?ÿçÀÛÀ_¤-®E çº?=’:0báçŒúÇÝ‹°IªðÞ㜳ß:s†úÁþæÙgŸý.ðÖ²¿ÞkxÔþ^ï¼øâ‹ßŽñkúÇÍk]´Y]]=9NïNÿîÓxñü.›IàÌ8ÚSðKq@æˆq2þÓü×YM¦»Ù4w³¸ÑÏÞ,~óú´^ÿ ³§©"zOþIEND®B`‚recoll-1.23.7/qtgui/mtpics/video.png0000644000175000017500000001143413125527323014257 00000000000000‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs7]7]€F]tIMEÚ 5 ûÙRœIDATxÚí›{Œ\Õ}Ç?çÜ{çµ;~íÚ˜]ƒy/ub0&@ì6B EP°hÓ´ 8RÜ(¡Ñ–$MHDÞH©‚‰–RR $!‘Ò$j  q£Æ@€Ö`Œ1Ø`ÖØØ`¯×»žû8þqνsgmã]¼¡Šš±V»ž¹3÷ü¾çûûïï1ð»Çÿï‡8Êëüoñ[f›  ýïi ›ÍæœñññÙÀ\ÂoÓÃû›ÍæñññÑ#ðzT€¬µ[«).ÄiÀ =Üëáë¼7æŒìÛ‡!ºñ²ÖbŒõls¯K)º¯â˜|Ǻúü¤çŠÿ[ B`Œa^_Þ†]Gúüð(÷¤H)‹ϲÖ¬uçÆ ÿ\þwnˆÿ[Î(!°eZ–^·åküóÒ?oK4¶å{w6+<ªSÙ )Ý{ „”þ[Z …á¶´û2_¯Í?ç0þhu cÇ¢üýÒgsÀs6†5o­5 ’Âpa­¿±Aƒ5‡Æ! éÖ#:;dŒAk±6çyÁ)A¸û”±­ ÆhlÎÌ @z—³~MÓq»© 4ÖB“h®”"MS´Öô¢0¤V“$Bv–¤­%ISÒ$A{à„§”’JÔƒN,ñ†i­IÓ„,ËÜz¢€j¥† ƒâ3º€˜)Œµc°Ö¹€îDÔÆ)E–em°%/Â)‚ DAá“Æƒ–¥iš¹÷˜ D$QH.îx´Ñh¶RÚ1Ń*¼#3%¦|¶‹@:C|°Ö¢ÒŒ,Ëœ X‹µÂS]!•j…0 Aà}[ú]ÌÈ”¢C·h)%•¨B5Šœ AÁ •’4Ciƒ±Æ»_Ç?d)Èæ ÌÂ0 Š"Â|AÆ’)EšehmÀR x’0 ©V«DaT소q;¯”rA+ß-@ IT‰¨ÖªaèvÔ«•£¾R k Âÿ£tÔæ§Ž¢ˆO3@†!|Àr(M3”Êý^¸µXçÃa"évJ¹cÁzê'iŠÖ!diÃ,2Dù}<}-`»WêÝ,?.…èøüdÍa§¡3¦@–f(‘•ÄA).û}ñË¢µ"N@¦©nYJ”VÞ]l±X!cQZab[þ0¬ulÓJÀƆãΟLeFÌIšb¤5‡Ò,GJi¿[¹ñÂi…’FdG åkU™¡œáبâ§@%K¦üüë¢ä 3@¾‹°Â‚Ù9kݽJ*Oˆâ¹œžŽòâ°*7°1þ¹Âb-]×YPrßÏï1“ ÈwQŠ/®tec;Æ‹’ªÞqE3 šãC‹)ÀÈwl†£˜€nR jµÊŸF¹á3 ·Ê£o‰ò"÷¿²yBTbÒO.}„w)cœárí)ƒp@ K­Vç¹-[ؼùYÖ?üknüô'Xt¢Άü&NîÔƒI”ï>ƒ¢P‡ (Ï(¥,n,¦`„A ÑZù㵂”W\ñ>FFF1Ú 2̓?ûW_ýA(ÅÔóÏ) ¡NŠ+» Ò‰£0 ÝßþGH'}‹k¼x’²ü#ÚóŠO–®¢Þžâ8á—ÿùKî¼óNŽgÁ‚ù4›Mjµ*÷Þ{ æOµÒü¾<½qK±.;“ pQݲ“’ÈBÈ+Üјßx2Õ…pú g´û¿õjÕ½7½^ç–[ná±Çcxøe¢("Mýü—|÷¾» ¤,ò[ÿáï¹åk·±eË6Œ MS·¥Ôú˜ „ Š¢($ #‚ÐaV,SP×ヘÁ˜(B‚@W Ãz£Î“O>E³Ù¤ÙlÒ×7F£Îµ×þ¯¼òI¬HC¥Ò Žï_óa^|a;­V‹-[¶ðÀÐ×ßàü•Ky÷»/A)U>–޹(Zβ֮AGSk!MÒ4+d²”ÆhŒvÇ“K–ÜΓё×÷Û¶mcݺuüú×òøãO‚eË–ñï|¥”K”²Œv;棹žýû†•JH£§ÂìÙ=ô÷÷³dɆ†† §§‡ 0ÆnP«ÕB¬6í7sd£(" ÝRÚ+3Z¡;•¢Àû¹¤Z­$IÌí·ÿ3išÇ XÁãmࢋþ»ï¾ƒÀ'NcccüÅÕWòýïÿˆ¾¾Ùô÷ÏcppÁÁAúúúéíí¥Ñh0kV“J¥R-Äô pGe€ÖfýË;wHIµZ¥Z­fq;ÆZ[@c4Z»T«U¾ôÅ/0gînºé¦C>x×®]\vé“ešJ¥JU©7ôÍ›ÃÅ—\ÀöíÛ±–,9“O>™ùóçS¯7Üi] R©vP® Μfw;­ *S…îD\QTžÓ4aýóyós¼ðâvîú—o‘e.uNÓ”Z­Æü„k®ùk¤„9sg±`A .dþüù,_¾œ Ž£ÙlÎÒ4%n·ÉTö†vú Ÿ.FDQdiê ¹-cËeËÞÊi§.GØ€Ë/ÿ¾ñÛØ¿”Í›7³uëVvïÞÍÊUç°ø¤“ ¿¯Ÿz£Þ%—Ûí6aR«U©T"Ò4¥µ¼9H)¨VkY¦HUV¨¶\Úæ:=_TH.¼ð"î¼ó‡DQ€”UÖ®½ŽU«V08¸ˆsÎy; .¤¿>=½=hÕÉã8F¥iÁ®0 i6›~-’8®Çm’¤Sæ¢ÈU€8Ž§ÅŽ) ¡( ;â§Èã-â«-„½µ£ gžy&ã­LÄœ8Èx+aãÓ/pþùç³ìÌe Ïm·ý#§žr CCCœqÆœrÊ©<òÈÃÔuêõ== î¹çŽ?~E‹N`hè –.]ʺuë˜7o.F¥wÝu7 OOO“Z­6³ È«ÂÆØB©•  l†6š…Ç-ä`ë`‘Ã+¥X±âL-ZDìÞ½‡ûîû!ƒƒ'÷ùýU+Y½zµ¯BÃØ1¾ùÍ»9á„“K®õ6Ö¬YƒÖ!qsë­·s≧2>>>ó.`-LLt¨@¶tüMî¸#QJ‰R™JI’”]u×ìâ8FÊŸ¹ñKÌŸ?PG)ŧnüdaDµV峟ý2}} ‹k’4ásŸÿLqME|ñ _eö¬þœ«ÓʧÈ[ ]$Gþ¬dGêæ™¢®*ÜÛÛK\õ?cõêËØþÒK€àÑGg×®=Ô«u_)6\±æ=ŒŽŽËzã3<÷ÜÖâ‹åò?º”8Nh·÷ð¶—xì± Ôëõ®Í¯×ž®0Ö®eç®®Òs9'Â%>¹ 䵑YÍYœtò),X°€$ɰָ" eX.œdiÖUò ‚€0 JÕ!È2wÙ'ÑÆÐn§‡ög"h­'E7L§¼‘3à`«Å'?y³šM¿˜¼$‹d%Ë•J¥è%äA4o8[ŸX%iB†>á¢+ár¿]mpdÿ( ™ÐZ¯~i¸èÌN.‡UÝ<ϵ޽³z9÷ÜU ºœ@J¤ cEpåûÞË·ïº×SµS3Ì[âÖ’8æO¯¼’ï÷;Nk×4F=IíY²cÇ^~ùEZ­ÆšÍæÌ$C‡EËw…¢,ŠN±µ†jµF¥!œzêÉ,_~Ï?¿Í›·8‰k•J…JµŠD€¯9¨Lû„*tFb]SFJOù€ÖDËÇ MH&Ú…82ZwÅ“™iÙÎŽw£aK1×µÇLg1Æ’¥)ïyÏ»i·Û|í–›9í´SÈ›Â6§{î©æª«®ä_t/sçÎÅú]¶þbãÕâm·}ûéùÙÏïg^ߺÖe]ÅO°1–K/}½Í^†‡_F ±Öx»Ý&Nb/>‘E‹N£Ùì¥Q¯d­Ô´8:„(:¼Aà|9B‚0D†!2tuA„.5d!Ö8 ¡!Žcn¾ùóüjý£<µñ¿«üÁZËŠgqîy+xðÁu<õÔ&¯7 Y–16>ÎÈÈ(­ÖKï žÜ°‘=¯¾Äš+ßÛå}J;ŠêÐQ„p*~†ágsŽXI‚¢,EwßóM~öàC|ë[÷0gÎ\´W”ùnõööò©Oÿ »víæ¿ŽÞf/‹ °ñ©§‰“©B‚?ñÄÿððÃòï\ŵ×~„ïÝ÷¢0Ä"È”v­4têõ@˜Ú|@ò6ÕaÆVJ½~W4„aÀ/~ñïXkéë›ÇÙ+–óñn$ªD ¿[ÆÆ¸è¢ËIÚ1·ßñun¿éfž}öùNÃÖ5N×¼ï½ ïàúë¯åŽ;kÀZÒ4%I¬µvbbb˜pb嘒!Õ5ÁSÖÿG"D^Û;0z€·¼åm„ÞM*Q…žÞÒ$qS]ÖºzâO~üS6mz£Ê7X•R@Ê€££,àcû[žÙ´ )ÝÜÒ­ÖAFFFX¼x±¸ÿþûŒñ%‹¢èððŽÂXQäÿtz5¶¤üuQqÿÿA¥Rët‚º(‚$Í£kÊg¿cO¦”FkÚ $YæZëÊ(ŒöÑ^k”1(¥hµZ|àÏWÓ?>Q=yúé§¿ØæYp ½A1y0­Ôõ_v^AK½^ãÓ÷fÏ™C ß Š‹”¾h*ƒ¢‰âT¢%I>~ã|åsŸ£R Q™bÿè~”RŨŒC†FOƒysç°xñ‰œµü,–Ÿ}6OoܸyåªU†øØ[cAXRÂvÒïCÆÁº X­U©D‘›ÊU`ÑAråt—ˆRßÑîE!ƒƒƒ„¡äÇ?yâ¨5‹½¯¾Ê#¿úÕ‹ïºä’¿ž-1œµZÕ—=Y¬=|¢§§§hŒXkœ¾×¶$¡~—V¸°Ó‚>÷pQ\kí4ÕE(7N1¨,#‰cZ­ÃÃï¼ë’KÖ !žµÖ޽^ð›Õjõu¶# ¤¸”·#Is”,hícGà|¾˜0u•õ“"ÚhŒQlÚô ûö¾Ö5GÐe|’0ÑjÙ={öì{ç|H±ÑZ;:ã§ @ÞÜèw~dºÆO/ÎÆt †|0:'€D§"Ô©,wf l1†cJCÔÅ\!ų,#õÆïÙqö9ç\%¥Üèi?mã§](fñÊs8‡Ž§—|9%MÓÎDD>?Ö ºFÅË ÐÆÐh¸¢gÇÄí6¯íÝ»õœsϽZñÌt}þØ(³¡äó¦\(µnVðöº¥ívLœÄ¤Led©Bk…òÇÖÚWwL1{ûû¬Ù³°ÖÒž˜`×+¯lzÇÊ•öGÝc1~z1àhí¦’ °%¦X_¡Q>CË”BeY1  üÿ³òÿýõY–Ñjµ˜7w.K—.å韸࠯ñ"çÀ4ªßÇÆ›ÁIõL:ÊÌÈSã|²$O§s‘Tì´ÖE1#ï${º³dhˆGyä¿.[½úz¯íÇfÂøi•Ĭ¯¼é;<‡€QþzŒ³Œ)¦:EéX@ „/œº¢‹ðAïmo}+6lxð²Õ«¯¶Î¤ñSÀtÆÞ(jnv’*³SùWiˆÁNbBþM!„]24ÄC=ô½‹/¾øà`|&?ª†ìÿÑcçÎÛ×®]{0ôòúâæëÅÕh4ö !Îúq_£{3÷¿Q)å^`H¦Ùóœ‘S ¨â3¿:k¼°ÉŽõ˜;VÞèµÇÊ€ß=Þ¬Çÿ³ ‘{•‹5IEND®B`‚recoll-1.23.7/qtgui/mtpics/document.png0000644000175000017500000001242213125527323014765 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7ŠéÉIDATxœÕ›Iodǵçw¾7G2“Ì$“d’E©ÊU*µ«d[j[²Ÿíá-ð¢Wý ºwý¼’ Æ!x¯nY^‚§'ÃèÅ{€ñ`Á-Yx²,ÁU,²¬8s`Î÷æ¢ɈJ&‡¢ªªÝîy3"ndœgøŸA1zã7þ»mÛßÐ4% €@ˆÙ&ÄÃw’Qãá8qjÛÑv¡æu@rø[q= Hdÿa[’öA’ˆ‰w9:G"H›÷p¼‚8~øò½ LøæóÓü·oMA˜ÆåtDB-I6k »ÓiùiDÀíÝz'fyÖ`¹d²Uøôn€e +ºÜht#%¨A âD%£O¹èøð{‹ÑØèpL¤úßI’Ñw!¿Ž‚(IÔï$‰ ‚$ô‚„”«ó_¿™%I0&7|B 0ô‘:­” Š:ÍnBeÚáß øÇ/z|z?ä•Ë.A˜°P4™Îè CÁÕªÍ{7"t]Cºz2ú‹“‘™Æbô'k#Çb ŒÃ1†ì×ßIôc0`&ë0FZc›'Æ)“ãlÖb>¾3ä?}Ùe~Ú ;üËŸú؆ÇbÑbqÆä_>îq{wHÖÓ0 md2ÿŸ~ôëÑ…k, þã%›ÁP°ÓLȸßþ«e‹­FÄN3âËÏ8ü—W²¼°êÆOƼö”ÿEÇœ ¢x¤~÷k1¶ ½¡àëCê˜ýdÀjÙäk>7·†üuoÈ—ŸqÐ5øpÃ'N ŠQœC#g¯ñü²Îjy¤ÊQ,0uk,4,†± ˆ39ƒº–Ex䉿q%Ú(FKÏ.íT€òîòYH¯-¾#’‡ã’C¯úd´˜|N’d¥Æ£@%\[Í'çô0RûË :ǬãoBâȳˆ£ño£8?Ž„j²O¨±r*M7è ‚Sñ˜Æ©ÑhP«ÕÈd2DQDEÄIÂÜ܃Á€F£a˜¦AئI±X$›ÍR«Õ hšFàû躎aLOèt:ôz=ƒŽã`Û6†a iÝn—l6C¹Ÿgoo ¸{÷.Žãàû>¦iÒl6I¥R\¾|Û¶¹}û6µZ Ã0ØÚÚbqq‘ápÈ•+WØÚÚ¢ÓéP(¨Õj´ÛmR©†a`Yš¦ñâ‹/YËit’pÆù9‹ùc˜¤ XXX@Ó44M#Š"VVVÐ4l6‹eY´Ûm‚ àÂ… „ìììP(˜››#Žc–——ˆ¢Çq¨T*DQÄÔÔW¯^Å0 µà$I0MÇqÎØýÓ3ÞDZšû±°»»ËÆÆº®333ÃÁÁN‡8އ¤ÓinÞ¼‰a‹EZ­•J…z½NE¬®®rpp@¿ß'Š"t]§Ùl"„ Ñh0;;˵k×H¥RÇ˜ÔÆ³˜=iœœCÓ´3癄ÂG:/^¼ÈêêªR#]×-ðÚµkhšF’$JÚ²ß0 Â0$I\×%Š"¢(Bišj‡â8>s‡w÷dzÒs `’ Ãx¤ =ŠÆ…bÛ6¶mÛi@ Y¡vm|÷Nk“ïL é<ÌÃ#Ðívét:d2jµét]×I§Ó*Äq Œ¦çy†!©T ]×éõzd³Yâ8&Žct]'I‚ À¶mÒé4ƒÁ@i®ëŠß÷Éd2!h·ÛLMMáû>š¦©ñr§mÛÆ4M„jãå `RjFƒN§C»ÝfŸ(ŠðŸ§ÑhP©TH¥Rt»]’$¡\.S«Õ(—Ëø¾ÏÜÜžç‘$ Õj•\.G¿ßgeeÓ4 ÃMÓÃ˲øÊW¾‚‚b± ´Æu]åg à I¢(¢Ùl’Ëåž, îîîróæMªÕ*ÍfMÓ˜™™¡^¯#„àù矧ÙlÒh4H¥RJwvv˜¥T*±¾¾N6›E×u677‰¢ˆ^¯GÇäóy4M£ÕjQ­VY[[S¦#Í@ ;•Já8N‡n·K±XäÎ;¤R)<ÏSXDA«ÕbnnŽëׯ?™‹E®\¹¢â¼ã8„aˆmÛ ½}á _:¯ ˜™™Q¸áâÅ‹d³Y:•J… ˜››#Š"2™Œzg8òÜsÏ)[ JC,ËR`Ìó<*• ¦i’Íf1 Û¶ñ}Ÿt:M§Ó¡X,²°°p. ufìt:Ï`0 P(`š&ÝnWÙ›eYÊ›çr9®]»F†<÷Üs8ŽC¿ßGA§Ó!ŸÏS©Tà .(Çåû>ÓÓÓär9šÍ&ù|ÇqÐ4jµŠ×u‰ã˜ÅÅE¢("—Ë133ÃÈårT«U¥-“›(#Ôc  ×ëQ¯×1 ]×¹wï¥R‰ƒƒ¥ª¾ïÓétX\\d{{˲˜ŸŸ§×ë){l·Û,--ÑëõØÙÙaaaA…Ñ Ôó`0 X,²»»«Ì CŠÅ"š¦Ñëõ”ð›Í&ƒÁ€R©„mÛÄq|DQtk' `~ !( ÀtH¼?77G¹\Æ4Mvvv0 ƒ^¯Ç³Ï>K¿ßW‘C:¿t:­p€ÌÊå2½^ÅÅE• Z–E·ÛU¹ÃÁÁ¾ïS­V‰¢ß÷ñ}Û¶yæ™gØÚÚâÃ?$•J!„ C\×¥Z­ž œ©29‘^¿R©Ç1< P( i{{{Êk;ŽÃp8dŸ~¿¯I»Ý&Š"Â0Tˆ¢ˆƒƒ<Ï£ÕjẮrtý~˲ˆã˜0 iµZø¾O·ÛUホ››är9–e1UÔ˜™™!—Ë}> ˜¤L&C†¸®«¼üÔÔAÐívI¥RضÍââ¢JxÇ9"ù|>O¯×Ãó<µ‹2wXYY!Š"òù<ét˲0MS%\A055Åp8$Žc.]ºÄöö6¦iréÒ%®^½ª2Õ$IŽ„OiÿŸK&£@$IB*•âÎ;”J%¥ò­V ÁåV«¥¢A»Ý&›Í(XlÃáPW$h‡ÀRýe¬—€f0E‘š»ßïÓét˜ŸŸ?†ùÏ‹ÿOÀ$ÍÍÍ©çJ¥ š¤ÅÅÅ#”»‰ÙWWW1 ãXò('6éƒÆÛ’$¡R©œ˜D=.)€É…G˜§(ŠTr¤ëºRÁ“=)½•B9«ržÁç¥3°··Çææ&žç©Ä' CJ¥ív›0 ™››ãþýû*„EQD*•buuõ‘¡è¬‚Æø˜qÁœµã'?¥!GJ¿“6äû>Bòùü‘ÌÎ4MU(Õ4Meˆ¶m“J¥”c’øAª·tŽº®«1òûxßxÿxÅ4Í#ãÆ5S&Br®óÒ™NPÆçáp¨0A­V£Ùl255E.—cggGemŽãàº.ív›>ø]×Éçóª&–ËåT±ô™gž¡ÑhE¶mÓï÷Z^^f{{›N§C.—c8bYõzjµŠeYÜ»wååeêõ:Ýn—ÙÙY|ßçêÕ«¸®ûHœXü—ö+SÙqè«ë:¦iâyA`š&š¦)0"óz×uÕdLv]—\.‡®ë8Ž£!µKîf«Õ"›Í2 ˜žžF×u†Ã¡Ò×u1 ƒB¡@*•²,ööö˜™™Áó<\×Uëz,Ȅ²,•eõz=ÖÖÖÈçóôû}666”ÚIâ8ŽÚÍR©ŒÌhkk ß÷‰¢ˆz½®*E;;;*ÅÝØØ Ùlbš&I’ÍfB¨¤ Fð¼×ëÑï÷U>°±±AµZ¥\.ÓjµhµZ|òÉ'GLä4:Ñ Ž ‰³ Ã`zzÇqðŸÇ², ÃPÅŽL&ƒmÛ”J%n$c²|&al&“!\×¥T*ÑlŽ®éÈ(!ÓcMӔ߰,K¥Ê2W€  Z­’Ífyðà®ë233ÃóÏ?eYJ‹ÎC§F$IXXX`iiéHßÊÊŠú.„`iiéÄ$ ‹‹‹jÜxª*³½ñyÇQãøX@¡¿ñvYôœ››S ×*é±ëã †L^d –¹¶ŒÇãy¸DyÿÃh'¥@λ°ÓFN*vŒCïÏ ‚à 0 ƒõõuþüç?S*•h4ªþ.ÕRÖ礭ˤã8ÌÎβ³³C:Æ4M^yå<Ï{êPöIéT(,„`ff†—_~YU~ä€ÌÜduu•L&£lYÖëe%#Êß# …‘…Ëvi"ððv¼ý$Ÿ «5r¾q“Ÿï¤”ö$U> ÷O¶IX}ª²,ó‰Ëóù<ÝnWÅr×u‡Ø¶}¤`Ád˜Ïç ‚@a ‘5M£ßï+¯](Ž8C!ý~x˜•jšF»ÝÆó<,ËRíRȶm+>daås À4M677ùË_þ¢Ny{½/^TGæ¦iò /°»»K&“assS…½v»ÍÞÞ•JÛ¶¹|ù2wïÞ¥V«©c,]×YZZ¢Ùlrûöm•l¥ÓiÊå2ý~Ÿƒƒjµšdò¨~ssS­3IƒJ–––TØ”‡5¾ïŸ¨gš@¹\Ʋ,2™ †a(m¸rå ÛÛÛêÜNö‹E2™Œº ! ¡²L&ãt»Ý¦Ûí’N§Éd2är99€|¾uëžçqéÒ%i®_¿®žO:T ÿóŸÿ¼ó»ßýî߀ðLŒÛŸaìììðÑG©8ìº.{{{|éK_bŸµµ5u‹äààMÓ¸|ù2õz7n(¨+OnLÓ¤P(ËåØÚÚ"eJš¦Ñl6ùÚ×¾F½^ç“O>Qá¶^¯óÒK/1??šÂžJo½õV÷Í7ß|óÆÿ h0qòTå'‰êäBggg±,‹K—.)¤ØétÞw]——_~™õõuR©”REy÷' Cƒ/¾ø¢:Á‘GÚý~Û¶ÉçóLOO«²úgŸ}¦v[Ö Æ›t¬ãmqóÖ[oõ^{íµ7×ÖÖþø3£‹ÒGèT ë:<`kk‹½½=¦§§ñ}_U‚ûý>ý~Ÿ¯ý묯¯Ón·q]—V«ÅK/½D¿ßçÓO?U™òÎÏW¿úUÞ{ï=uª4^\‰ã˜©©)ž}öYîÝ»G¯×Ãu]îß¿Ï /¼  ðx1e|Ý2‡‰ã˜Ÿýìgý1æÿìOîþ© ½o¡P I®_¿®’¹ë­VK¡ÃjµªœT:Æó<ªÕ*_üâUn¯ëºŠßùÎwÃPU‹¤'—;캮ºU¦ë:ª4>^ •¯@ ‡CÞ~ûíþ÷¾÷½ÿqÈüG§1LãÉÔ€?þ˜R©Äþþ>¥R‰0 YYYá£>âÊ•+Ôjµc瀯¾úê‘ûrÎÉç“4o<–Ëp–N§ñ}Ÿ$IŽ@ïñOÓ4‰¢ˆ·ß~»ÿýïÿÍ7n¼û(æOÕ@m///)2üÍÏÏ«{‚r“$Q±X ó$ï<ù™ÆGQf1%ŒÙ``¶c Ëë¿ÈÙ¡XQÿEnnüGNÀb¬Á&×""ö¾ÂÏgYâY€Ù`Çarc”LhšJ¯¿F÷õºíZŒ5ÔXfc”,¬[ùniúí}oWÇê,”$`p¬›YêYƒ ˆ\;CÛ…7÷püâ>:ú~OƒkEN9›\Ë5óïÀ?qI0æäYŒNN^z—¦Ù7—ìœÍT ÀkíOÐqq^÷µWtc@(:ÂDíÑO«ªúéP å­j”I##BQ¯.ºÒÃ;ïðô[OãùKw8³_(^—–Ÿ™•¼}ÅíÜwó}xœž²V£Ë}¨€€¯ïü:{ÞÝS®ú´p¸û0?yë'¼øÍ¹©ù&Ìfs&¯’ÑO$™‘Ÿ–<ðù¤ñ‹€5àr¹øŒý3å­¾ˆžHt@èýìy€}ÿ´úúzL&“n™RÓcªÑ‡2 xô•GÁ|îšw»–íÂep•S´b´ö·ò 0ðþ/z‰oÜú fÍš•År¼ =÷Ó˜–ô ÷ÀjXàXÀ—þAUF˳¨B|Éó%âl‰m÷¡£¯ƒ@ €ÓéD–eÝ2ù„(ŠRró“Š‚àÆú 0cƧñÕ9_eK÷ iL$!‹!Ëò”£¯iZÎÜO£*«ÀóF£„FC„FC9yv§»Ó^Iu%±Ú±šc£ë¼Â ÿugÍ(FƒMÓøÊß5âmpb0Lv?MH<¯¨Š)!J€` ÈuK¯ËÉ;Úu”„=QQã¥Ð’uuŸ×èû`M@S54Eåß~ù1ÿpW?úîØl¶ÌR™zz£])!F#„•0a5\§$¦Žº?¢3Ô™Œø)X%+^³—f{3Ͷæ á7¾å¡Œžtñ<¦Ãûyé¿}4-2òµõ«q8@é-o1èPŒ­1eŒ‘Äq%NDäEÝri áõÁ׎ëæ0ú $ÉHã»kàŸÿ>ùÜ„Mÿ³€N÷,/?ώݧXû¹zŒF#F£±ä¦*&@S´SÆÅ;ðjÿ« -« e"ó:q€~4 d`—öŒ‚¸¢ñ|/£¿?ŠT[‹ÙéÁºü,s‘$©ì]Åø~ ŠA× ý°wp/ÇÇŽWÒTÊ™D» %oÒ5ø&€´Å@'Ä4ˆ£¯oÃø¹oã¹ó{X­ÖœmtU=À¬˜u=@o œ ŸË1Þ;èÅ[ãͤŒ€ºâmΚÍ ©£B‰Ýo"½'!ôÇŸÓ+9™ë·¨©©AKŸ÷*" ¨‘2vÅ^@@P Jä.q5Îaÿá™·ÆËÚæµ™ôÃJ¶iºþ‡8¾òÃÒ»tŽý 5îvŽ€Ð‘Ý ¬\‡ÉdÂjµ–,Z1BB@UT&Ô‰‚¼þžþÉŠNk§sæ³.¦˜ªÀ ¾î¼‹è+¹WÁþÃÞ[™×xž3íCøO½Ûí®""Õ JBAR$]Xë\‹×ëàÙ£Ï2\3 Ƽz@ö 7 Þ7GÅgðAreÃåráõ.ÆçóZb*W?„½÷DƒÃD"‘êœaL#`J˜ H «a&Ô âZœ &ôkɽ† æk7å¨l9²jS -Z$ùQ¦ØhÕ5'mÐ’wåì +öQq(Ý VÄ £ ZrDôj—È% ?îUºl6ê˜-™Çt¼¼,P%gŸ Š"‚I@S44Q˽ÑHººQ@@@’¤‚:ÒõdGfI’ "µ$I j8ù ùÀß á¡Iåš…`ñ€cá¤ñ%WŒ) GEdYÎAeQÆ,šA«lÅd̽ °HdAF’úÑÂÜÁ¹¬´¬Ìè´‡Û1[Ì´^vÀ&ÚE‘þóøŽþ†À™C`;XÜó,¨½jÒ"œ»ÀŠc€¢(„Ãa"‘äÚ. 2ÉQ´ÓiY6ÑÂmËnËè u aÊ#À €P„êpÍYŒÅÅ 8÷+¼êRP&Ê> È‚Œ]´í´érÙ:&Ñ4%VÑŠ,&e.§ïøúÉLäýÂô< &Á”!À*X1‰¹S -KË­BrýÍÖ³ VÌ‚¹@–_—]´g@$wÙ,#ÉÃBE;›J<@œœ19Æ›'ÞÌÉÉ1ŽŽÑy¢3“rôbrŒ ± 9²º…uu9]N RªkåýzaL~´Ô˜f ÈÆ|×|úÛúYyK* yHEèIرçÈí$½%[OO6‹Yu¹pÑÛÖ €3Ú†ïß”}tÕR=ÈÇúÕëùÙ;?£ýÕv®¿ózd‹þådµÐ¶ŸŽ7;ð:aÓª.S üÂ)(7–5¾ç÷éêëâcop¡óîú™{"‰â¿èÇe1óÓµKp9NTVAjëïúÓš‹…÷í`×Û»xíøk(~%³ Œ‹Œ†¤úÜ—<žˆÇ"@ƒHÜŒÙZø‚BéþÙMx×,äGw¬+$@ªÂF¨ NIÂétò¿ýëW¯'döٯ㷧ÃÌY·)§Ìº³òåî-Ü𠂯o.Þæ\DRÑJ¿]ß(Éy] RPÕ)`4©««Ãf³F3ÛO£©½Øó:jS#‘’»Ü>|g¶”Ù­$Ì&*' µˆÇc„ÃaÆÇÇä\ïÇ’Šb¦(ŠX,,–ÉCGcè=ÄNœÂ½òªŒÜ˜^»S#ˆ¸Àºª"["€/ëþô?^ý›ò ®¢pvÿ~öïß_Rµ¢[a=ÜþWóybgçß>Dݼ:õ³Å”¦GPvá]º¶ìz‹a:o³oݺ§Ó¹![VáªYˆ:—•}°…ï=ù'>|æeê¼õhšÆÓ'`aòBÄ@Õ^ÇH»r©ò±uëV®¹æš‡î¾ûî—³åÓ&@’$¾|ÛRœV…¿>Á±ŽshЯļQ´É; É ‘Dß9ß4[K¾)ª(JÎò¦÷œ,ãŸÍÏ›ö€ä2ù…›¯¢¥©–‚Á ÒÅáÝßáoÏ_Cóò~àWÕ[ˆÇr^{ÓÛêæË¶mÛFKKËf=ã¡ Éàh³Ùe™ÚÚZ¢Ñ(‰åËúøçœmíǺl‹ªÑR¥< [öÄOÐÒÒ²ùž{îÙQ¬®ªn4ûEUU”uâoý6Ç·AÝu`š5©ŸfϾ÷×r„…kz¶¤¿óIxòÉ'Y¶lYIã¡JS@’$1{Í=ŒÇEBo>ÎÀ|©—¤)øÖ“‘µŸÏ•ZEó= ý~~ê©§X¶lÙæ 6”4ªèz0™L4ܸŽ~ïg  •ýæF>b±tu“è‘°}ûvšššÊ2f˜€tlhhhÀív‹Å.ûQ‘H„®Å‚à3ÏÑê&çÀˆ` öܳ7ÏcwyøPRÞÐŒ7gºWH7ªÐmÀÄl‹ïÿv‘WÏUYªYŒ@¹HÒÕbñ² aÆxÁT[ÊÉóuN]¬s÷ž<óh?Ì“ØNMa#+€Nb3íÃ6 @~~f™^çúRB.úò†ØúDªv–ú ¥¼¡\Ta±æ¨4‹UËBÕƒV!g0çßù·ïÏñW”ùë—1éâiõ»WjÿFÀ/£mAk•ç9ÏN/¡ê}:N|2sï¾<¿½Èá=yFûCŠcºÊ$êhÄÊ|Å29ó›‹ N_j°XSŠ9/Øïžª²Tsüýãý|`#íwcÐŽ‰Uþã—süäô2Qº$ޏï@žÏ>ÜÏ D‘iW™²tµ«ZF.v‡ì yä¶Wfc~ð»*¯¾ÓÀ(ð?o7ê3<õG%œ] ŠÙõVÁü–ðýß,ñ³7ªr3O=ÖÏg?6@.LsøDQŒ#íì#NR”wŠ XÏÆ"þåÉAŽE¼øë*…~|¦Î»"î?Ñ›ÝvÖ zC¾¿JÙÃ[¡7/×yéô2…È ªs†xbˆG÷Aºr Ò:ÌBÕ11—Pmx õåáàXÄ@Ñ£|£å\Z ò™ú |çd c¼eýøLƒ»v‡Æ ·›n&”ß´T›ŽïžZÂ:òNáïäÑÃ}íš]ø%òO_¯pær“…ª#NÍ7 „ñÁ€O?ØÇÑý9¾ñó%¦—ñ–‘’ðO”ùôýE¦/ŸkPÈ.M[þw"æáC­”ßnàëÕ¾ˆl¨Ø›À¯ÎÕ¸< ÍÄñÄ}%»§„¦¾™÷üç«K\_´F#äÓ$@©EˉW*\º3Ï{3 ­Ä§Éq¢Œ–#J/ØÏqWžÁ’áú¢å§oÔ¹4öÔjÂÑ *¸gOÈ©wcZK™©8Êy¹åþ¦ò€·'šˆxsÝÑòà¡BûžµÊK¿«²XsäC¼þÅCE>u´˜V‰•±~Ãî¡€c?«0³d=XâKrýaç`ÐU‚±~Ã`ÑPkz›[v5jøF¢Á–]`¹î˜˜IȇU8¼'ÇØ@Gûçß97“ œƒû÷çøóûЍú: Sïç#eÃÇ"@Ä ÂPŸa¨$ØåB1‚b(ñ®Toé:»Q[£-¯ç–-•¦# à¸c¼Fê”Sš8Å›µ 9åñ#IO†j²s ŒI™vú â³ÉŒL`0Æ€ˆÙ^Ü(M/Y@(äv ù!ŒÀÔ‚cbÖ’ ’2|p‡Ïð·:{SU¢Ðeº¢ÃîáÕÌ5Z¤‚õkˆ\ˆ¬*ªôÒ¶ƒàRÝ[ŠA(ç C%Ó.bN/Z±ú]"ü.ÑÁ±ˆ\ä“X‰5Ô[ŠC i»AÏÆ«c¾âhÄ¥컑­ÓÍi˰Ö3ˆPˆò‘Á©bD˜Z´Rþ‘@Ø3¬ÊØ -š˜¯x_Ä3V*cýÒ~Æ/k•Ë³Š¨C-”Í-`3Ú²A`07Ýζ·²XS#©ŒÂp_g†½‘¦eazÙ[LxÀì/ EI×ÿŠ TðÞ,äBƒU‚¢¬³Õ¾5Úr#i“.l²CxëÈî÷Ù`8£ªñ;P×— yŸO€Ñ~! |´ŸQ¾5©TBî7ä"1Û†YhµZþFbÌêÙGÆ&Õ©ßtN—µ1m¦EÁëpµ€À…)Gœx¿ö‚ñAÒ' àê¼yrézcGûõÂvÐ*°Ö’$ qA[YZ9Ø'ä_±‰a¹¡ŒE¾0\6Æu´navÙ±s°“ê©úâ|ÕqvÒ‘1^€&„±~¯íéEøÅY%q¾lf¹@<(ª†Â}û”OU‹ÞâŒé|¶CëbÀzäŒ{°š«ùÞ›öÂ1õ@uP*ù«Â|Õ£w6¤/…9îÝëCàÉ B3ö (ˆRv *·ïRv¦ Pkyw…œRˆØ0Øö­1rÙ«œ¼à£SøÝ¥€RÞ2Ú¯$nÛ¡ìRëPi‰Jye ¨” þ™}#0ø€c¡*4b!)}9¥”÷‚Ò’\[N] |ÕïZ¶#½¥”xË~òÆ`jA¹<…>"üê‚ðÈ¡„ñaÅ©ÏÇúaÇ@VêTT¥}bCþ" öe,øû Êä¼ðÛwCj±`Ä'@‡w[FÊlš`ûFàÁƒŽZÓ°P3äBhÆÂ¯/æ¸}—åö¶­Eç²ÔfõdTÁjwíÇkWÄ›ü»×C.^ °iDHœ°wÄqô@ºë¼‰ú7SèM À©7ÓGî°¼ö®°T7>UU¸029°wıkÀ1Xr„)py®WÎ;›ŸSò UajÁ01°XKˆ›Kˆ˜t¨ޑЪCãl?Š"šÍ&ι5¥°JƘƧ0ÔŸ8œðÖ•©…c|‹­ðîuÃåi¥/¯ öùïBN D¡_¶¿jÄBµ),Õ…ZShÙ42HB­2EК'¼}Æ‘X×ÞÝhO# Cœs,//¯ÉÔ-ï :…¾|ì¶„‰9åÒt@µáÁ14B=†ÚBZ1N³Ä@¼“;'ií¯“h_ù1®ÊŸ<4ξý‰›î0wV¡ëÍ=ªÕ*Ï<óÌÌ÷¾÷½-zœfÃLðFIÉòËøcj!`jÁ£ÍÊ`"æ½àRÿ•®óêê€@ ¿·%̺„0W¤ØW¦°…­¯f³ÉñãÇgž~úé¯OLLü˜éí³­'Dœú¼àÐNËþ1ËrM˜¯–êB¥ahÆ)ƒ*«ð0%  Tp a¸d.ê¨\ó‡Tµ½6•){o[£Ñàé§Ÿžýüç?ÿõ©©©—€3ÀÒºØ.Ê@0XR†Ë6=TéÃWœ-KÛúùȇ<“¦Ï¾Ì ´âìø{zbÜÚU w[D†ÔëuŽ;–1ÿ#à zþ'°®n$Ø eY`2Vˆð)ßÊ·¦‘¡SEW®L3æ»O~ô~GQDµZ娱c³_øÂ6ez@ðƒ:)ÖMž¹-bL*€õ,<ó•J…gŸ}vö‹_übÆüëlÀ<|À'E·‹2åô c> C*• ßüæ7»5¿)óðp[¡^è=ü$"„aHµZåøñã[Ò|Fz è.ÊôZ@¦ùçŸ~¦‹ù }¾—>ôè¦nt3ÿå/ùi¨ÛóðqŒ¬µXkÛhâĉé/}éKÏLMMý›`>‚ "T«U¾ýíoÏ|å+_¹%æá#$€ìôWµZåÅ_œþêW¿úÌäää–}¾—>2ÃZ­Æ /¼p½‹ù3ÜóÐ%€ X²ï ‰Q±¼¼ÌK/½4ýµ¯}íÙÉÉÉ,·Ÿ»ÕñÛœ6 9{ö,aþA2Â%k-ÓÓÓ¼üòË×Nœ8ñÜÄÄÄÙ&æ¡KçÎûák¯½Æq\Г1§OŸ>uùòåŸp‹>¿jì®ëQàn »ßfZ.³lÏÙþã žG‹R² IEND®B`‚recoll-1.23.7/qtgui/mtpics/mozilla_doc.png0000644000175000017500000001053213125527323015443 00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆtEXtTitleMade with SodipodiŸô/'tEXtAuthorUnknownŒ! òzTXtDescriptionxœKT(ÈL.)-J_~êô ,©IDATxœÝ›ytTE¾Ç?÷v§ÓéN:;{ Y!‚Ž$ £ €Fðˆâï=% 8ú@×1Â;8€ÀÌÃËc^–1‚HD"`6BÈF¶NÒ[ºïòþiºÓMÎ|ϹçÞúÕ¯~UõûýêWU·îðÀž={¶wmN+ŠâÎSUÕ“Õ+}+ðµÌkÏl6WÌ;wFsZë) 44´wbbâ½ü #%%åGÏ´—šµÖøÊh”ÊT@UAU@Q›žP½Óªr™Oo~UEšâQ¶9¿¹¬ªúÍ÷”§ú©ß«]ÊYÍiã€AŒÝû­B´>€ªt/,E>Ÿƒs×ÿ´l?öµ‹Pm /.G©©À¾ûK䊋˜æ}€h@•\T¾<É«A>¼†´¿w&­1…ùíªBÌ@4¦H4Î"†wA0†´p ïÎD.¿@Øg™TÍLí’éD¬Ø‡mÿ–VÝîV†—|‚J}5ÎB:•€ 7 AuI¨.'bX4ÁO¾†ëì l{7Þ¼V_T¿T±­"Êé 4wŒF):€ëØ> sÞFÿoÏ¡Zê¸c£'Ñxl?ÃG_ÿ6ß´:¤Ýë2÷¢XPÊ‹PªË±ý°í¨I¡]0/š€vÐH¶ ‹¿¥Ñ#;ãf¶ýºÀ¯Ä)I`­G;~ª š®±ˆ€V½ìH*f½zy–h" º@Lsßqç_&{Eîf~/Úå4xFò&fÏòÍ´f¿²Úݾš§AqÊB4Í5êÖWnË{Gi׃ßårùm›ß B;]ê8Z®äÚË»Qü²,ûåi3^Oø³N˼Åßrvó„—ÚÒæÕà·ìtG¬7Ñàæº¼'í7QÀ­b}EQP¥Õ¸vÓc€?ÚT’$Im¶ë†Ä€Î6´­¼káWUÕmý›æ¿µË{ÒÚ³>´±¾VtÖšéé餥¥QXXHQQ’$a2™ q_‘‘‘<ýôÓtëÖ­SÖ‡Ö×6mî;‹¶uæÌV¯^M]]‘‘‘ 2„!C†FRRGŽéPü1 .dÁ‚Æk²>Ü h…ç͛dž Ú1:­†7ÇÇD¬^%D¸$k)q|u²„]' °Z­$''óÅ_ðÖ[o1{ölDQô"Š¢ ªª—Õ;äׂÖ,±lÙ2Ö¯_ÏŒ»²tx(fAGž]äïç*Ø’yÎÍûê¸áü9®‘À» × 0˜Œ&bí¨ 5<:¶˜“™Gyvg'‹/QQQARR_}õkÖ¬áöÛow×ÙQëC+›¡kÙ x*"//÷߀þ½ºc7½«‘»¬ÕŒYÃçô&§ÆÁþ2Rd 3¦ Dõò¨FFè5øØ¡d þžÌœ\îÿìNI&++‹ñãdzeË‘eÙoûo¨´fýôôt÷.lãñ_Ùóë*²sÎòŸ³¦1þî;Ð7‚Þý$^Á…ÞRÖZ2¶^Q€ñ®‡¹7v('MÁ ^¶€††¦M›Æüùó™7oááánûu[NUYYYîÂb±jÐÓ…_JK>|8ë>ýŒw—.%ó…Ö<ù µ•—˜:¬¢¨AÐ!Cš:ØêJ/`uJ<<¬_þÙ+O–e,X€ÍfãùçŸoSÎ5Å€–.ÿý÷ß3{ölJKKøË£ <\Ï÷á·ó]ŽîÝ»³yóf²³³qÔ !B'2¦o!ïì-íw DXüÝY2ÎW¶Ú¶Å‹c2™xâ‰'n\¬¯¯çÀìܹ“M›6¡( !ú@RŸÉÀ`( êMq©ÛÙB,Ezv>Ep §ÍÊ!:5MÁ¯“Eå÷÷”–Õ*ªª$%%a2™xä‘Güò\õ8zô(ï½÷©©©îywxïn¼>j £ÔJºt5`0êr8™låž{â(Wtì/¨dóCý0ÉV´²„ê’Ái:?õ%çÃo³[å‘$‰çž{Ž””&Nœè“ßiÈÍÍåõ×_gÇŽô 71+~uÓs›PGH”ŒN4¡ì`³ 0*`µ0Dv2ebOô& ¢£ž‹U.]=ô2‚æêœñÅ!¡|è{äÇØ±cINN¦¸¸˜üü|ÒÒÒ¸ï¾û|ø:U«ÅbaâĉäççÁЇo-&´§H ZG`€ Òå1ì¼RN Ö]N¨PSë Z’9'vã!]‚ÃÑ™fx!Zõï9©©©|òÉ'¬\¹’±cÇ"Š"F£ï£S›¡×^{üü|f޼ä®v¢õ•MAƶë’J ‡]áì/Ywg-®:3šŽ/][BÐjDz…‡p¾ªÎ+oÓ¦M³aÃ"""ü–ï°ØívÖ¯_4Ö˜ÀJ´ÖŽï«T#Å…7ÎÙ—sš½³ï'¨æ'RÔ8 ¸ÚÕ·¬ á‡ç(³É<ºñ¨O~zz:=ôÛ·ogذa>ù~ƒ ¢(>#‡ÂqÙU7ÿ”ÊØÞt±_h¿ªÈyÙÈ?\!¼žV€¢V wÖÓè”9eW˜"¢u6t°ËÞµî²üŠâçÅçŒ38tèyyyLž<™ãÇû–÷'Ôf³aµZq:n¥œ>}Ú‹çWãmÈ m^ÕÀ?Ì+4ñÇïò›Ž·.cnj§Á|}ª¼]9m]šújÔÚKõÕh5Þ݉‰‰!++‹—^z‰²²2-ZäÓ×V‡€,ËȲŒÃá@«ÕRW×4¾âbza«7a¯§µ¡å„rB âù£f̶ž¼ª:&103¾?ªóL«²ÚGSA—>­hG’¯Z¾|9‘‘‘$''3gÎ22|o;´–eÙ­€ÙCûòdP5‘Ö"<êBU,#6UƒÅéb³Ô…49 5àÀ”¯¶Øx¾¯Êœ´þæ¾c8«‰Æá*p§ÇGqq1K–,Áb±°dÉFŽIJJŠW¹A›Í@¤ ÐÓü ’*` ÔH"6YâG1Š´ZH˯ ÖšË¸q}°X,n¸³?ÏîÆc[Û%’X{É5Xÿ2/J¼Ý_UU233Ù´i|ðµµµ¬Y³Æ§h‡0pà@ö”šFƒ$Q.ê) „¥ü|É‚Ý^âu {ðàA÷óGïåiC •U9è´zG˜HßÍÅc\kÿíÆp>û®À‹–ššÊÚµk™?>?þ8Û¶msïQ<ÑêépËkîܹDGGómv‹ÊCH8beJzŸUêiéÊ /¼à#'4HϬƒ9øD"sôUåR܃“S†p81œO (ªO`3„Rnìѱ@ˆÈ6[’7zóÍ7Ù²e z½ž9sæÐ³gOž/„´Z-&Là›o¾áÛ³Ånznn.F£‘ìì+ëñ;{uåã{û1ÀUI€bASU„ÖeCîª=ƒ¨^ñž5ªŠ&þÞâà† Æn¼º¿Ð‹¶téR ï¼ó/¾ø"QQQŒ?Þoù{€ <õÔS>¼’$ÑP_Ïß&æø”‘œylÿ¸+”Û+F0—RZ]ÃqgÙbò…jÅ`\ªèeEIpŠäƬ_Dþ•Û·¾ÀhqJÞ!tÆ LŸ>ÌÌLxûí·[U`§ö‰‰‰Ì›77ºƒ"ÀbyX)ÁPQˆ$èhÐQæTÉ èšÜ:ò*«Ý¼½ÂCxfp‰¢YQ¨EG Ã,°öt9 Œ%®®Eêȼ ²ÿ¬ïbìÌ™3L:•Ý»w³{÷nRSS±Ùl ^¯ùnçÎG'Ož|¯Ýno÷L®¬¬ŒmÛ¶ñá‡b³ÙX4j¿ê¨$cv-)çÊ8x±±±Ô××sþüyrssÛìο'ÞÉŸº7"Ÿk“Ïo¸âØåûõë‡ÙlfÚ´i¬X±¢©£‚@PP)))?N:uT3ïUíAA G¼üòËL›6;vpâÄ `0èv[7}¾˜Aƒy•;þ<[·neåÊ•Ô××{åm{|4£,…¨E%~¿è“Tpø‰ /DIlhA #55•uëÖyMÃ’$!˲—Ñýz€Ãá¸î_‹x¢¶¶–ùóç{-J& ŒaUd šF«ß2*Þ‹+þ¦3YBÑhÙ©Ñý@HH’$‘€N§ó’¡Ñh(..¾8wîܘfÚ ;m ááálܸ‘Å‹³zõjR ËyIèÁ_¢uè-¾¯ÈƒG1îõdŸ<ß÷<þqàÀÉf³½êI»¡ßµAHNN&!!€­“F|g„FAlú@ºÅ%_^{7[»3íÍÈÈPm6ÛÂ… nó¤ßÔo„ZB£ÑðÌ3Ïp²Ú†ñÌq&^ÌÄÅ?õ]‘UÁkÚSÔ&ȲŒ¢(î [{ ÉÈÈP«««çO™2å¯-ó:µ¸ט1cE‘ÿ+¬DµÔèBøÆJxŸ8Yõñ€æÓ_ÏŽ·¥Ã‡«Iþ:›9šÑ·o_fΜIö…2¾ÖÇñZ•‘Kèèqé| 냢4µÏ_‡ýÑÒÒÒ¸téRÒôéÓ×¶Vÿo:š1yòd>:ö+Ñ&#oD:±Õ[p‡·ÚSBZZ«V­Jo«óÐÖ×ñsÙö0tèP÷ó”»xŽšnÌï¡G67ͲzEžGàž÷æçŒŒ Ö®]›±k׮߷W·—\ë'2W‹¸¸8wã:Å”SuôîXp®ÅLpE­¹þ‘Œ V¯^¾k×®û •¿$<ð›¬ZBEt:˜mvâcº3ÕU‰Ãî„à`ÄÆFd§Ëk€·ÕAàøGùåËU™{öì¿¿Ãu߀þ\šî ŸŽè…½°»)‚ƒQƒ@Ð\þqÊ;zzÀ±Ž´aiî+Û÷ÿ®3õúõ€›9þÎ;ç^³ÿñþ4\¸@©;«•ƒ‚iÌs {üÑÒNdÃôÕ²’1)? èlÝ·Ä8pà€ûùOå±K«åtÙ%ÞwÚG‘”¦—%Í#Ú3fÿtœÐ/—•ŽÙùc/²ÛÃ-¡€¢¢"÷s^e ¿Ë#ÕEØ­¸¢¢PôAîˆÖì'³Nüù²ò1{ŽÅ´”ÙQüæ+AA()ñ=7ˆ ±–U`‰Œæ¯DØè@õð€ìŸŽcütiù{Žõ¸ú÷ª·„¨ªJŸ>}¼hé™n·ÝÍÑz;ÞÇÁ|šìõó‰„|ñßåî;~M‡[D[¶´ÿשÝn'##ƒ½{÷JõVëËS÷os…×Qx) ººúÂöíÛu:]„ ·Ì ˲`6› o-X°`Óõ’ûÿ»£^SdT_IEND®B`‚recoll-1.23.7/qtgui/mtpics/txt.png0000644000175000017500000000554013125527323013771 00000000000000‰PNG  IHDR@@ªiqÞbKGDÿÿÿ ½§“ pHYs  šœtIMEÔ 9'[ íIDATxÚÝ›il\ÕÇ÷m3ÛqâØ!ñ’@B'PZZª¤¨…R–(í‡TÔB@eQ¨ªŠtQ¿@U‰H@K)REÕÒŠVªTª"Ô*…ª"Ž“8Î`;±;^ÇËxfÞÌ[n?¼ÇÛx¶çôJWó–ûî;çö33‚ùC¤çÿÓé¹ ³8p °uëÖ·B¡ëºîôu)ç?7óZæ8Ÿks÷Zì~!û.vttT{á…vµµµE{.Zæ ‘H¨kÖ¬¹bÛ¶mŽã\XñH¹$ÏišÆÁƒû#‘Èe€IJFÀà˜Í[Ç\WΚîÌs)qÜùk\;oº3öȵvö3î¬÷/>]WòîÓWẮšL&—ŸR6ôª+×oЩ ú#“qÉXÌaõr•³#6›ë5V¯ÐèØüí½(±¤¼8_J!¥Ô²ù5%›JE¦$ÿmK1—lMq¤+Å  *‚‚ú,^{/F"éò—CQLK^²ÞQÉמ „7/Ñ!Jàæ­šO¥ˆ%%[ôK#öåá\µ¹j–” o·&Qø°3Å”éÒÞg¡¨Þš?¿EUÄtâÑwZSdvm’Þ§;#ñ˜5Å쩤÷U(2ý9kŠYçÞZ%2h­¬|sgÀW dû\Ê5ŽãPQ¢«-OPjLÎÅü…^ãºnaNð¼ ˆ%µG)%25†Õ{ÔPxÉÉ7™Óü–|N"æk70Ù;B<¶‚hDÅØp«v~ƒªOíð¢¸ÞXJ‰ìþ=ÚúMÔÝþ„^†9ÔËè±Cœ~ñ»T4ÝÌ{ŸA+¯*Iúùªÿ¼0è‡,J¤t±Â¿¦lÓ1„v€àªFêo½‡Ï<ó:Á2–Ç·3qâE^®w9Ž“·)+Rúôÿm]0öˆ¿1*#ÀÆoÿµ_¹ðÏïÁIL pFú®ë~2ä’šÓö=ã¡kÀq@Jz»&©Û½¯(égl?3}-†J’þT'Rv ´ïâÄ6°FÒ”Ù1O‚Á†#‚e›?]p(Fú¾‹HÙþÆfã|%02BTP·C2 Àà°FÝî'|‘~¾ZP² ä$29Œ9ˆhõ.ƶAò Ô ôyÌK£’3cåw,}˲Š ²T`zt½„ÞT{þU£OúŠÆz>1QÍê;›®óÿµ/Fú%›@N"vÏŸP+;¼–\òjˆwƒ¢y i TPt|ÐNí-÷.YÊ›w?ÀO-g_Aß¼ĘÀX=(ã ]06ÃØ8¨Q¥‘껚‘wÊëºnAŸï“Héât¼„ZÓÀ^S]žä…“Õ ê è|/Ìe·ï-(Á*Æã/i˜'ý×QÖ5)LlôÔ]èXC# h˜ÆZ‚[nE¯X‘°3Õ~!»/ÚB>*ꄟE«3AÀ­hoÚùi`6zÒW5:Äš]åWIú`óKRÏ$ò.¢ºDijýèV'=æÕø8ª†­­Æ©ª!°jmÞ…Žß ÅOÏ?=:žE»¢ÊS}ÊarÈ {Bw“g ŠÆ™¶©Û½oQ¦3R÷Ëæ-†| …S¸Œ i˜Ú²3­þA8UÃÕª‰ŒFYsåu‹ªü´OY¢V]AN0Ÿ&…8ýú¦&OõE¦bç=¿ÚR‚ªq®{œº¯>‘uŸLnïg«®$È+/OãŽAÇ<õO\ ödšùD,Pt¤QEoëiVÜpÛ<¦ ñòùÌ¢¢Àb¹õbÒWz^BÝòYOú`Jœ÷üZX6¨£ƒ«ïzl–ªg$¾T¶^ $ ¢Ñ(‰DÛ¶%j;Ž<÷:J¥éIߪ‡Ôp:í5 ª§Ÿ§þsˆÚ_ŸÅx¦%Ÿïôž“%狆A˲°, !š¦¡iв°Õ(ÿ±ñ DË<Ï/]ÐÀL‚¢19¡°bÇ}8¯ Rà°,›X,i¦¼¦jÐ`ùòJÿ¢@6ôlÛžî·eîO¯•.F÷˨7}pÁ Aj(]ó»¬u€Î7ÿÉúŸ¾YW—Rbš)âqËšMC2i15§²²¼tŠ }Úð(—ïH”±eéHm%L˜ j$âÁ-_D -Ëë=®ë›Äã&®›¾XÌÄ0tßL°Ð˜kœ}eûÝ@ \ ’#éÐç€S Ê$H—޽Iã#ȹFÍ“I+ï<  ü  /:þ>Ôlñ¾³&ñeÀDÚùUA4 ª†eéȪ 5õY÷2ͱXbZÍ Žã’JY†^<Åd]Æ™_¢^sˆ¸̱óÎ:Pc zþýu»2oï…ԼجÏ4S›Aéåðè ¬ö¤o.÷Ô^è T@ÂEÃ!ÆG”_~õ,5Ÿ˜˜bxxœ©©Ä¢6žïH¥,œ`!°LÍn=Éþóž_Ôƒ’ýï¥þkßCi&‰ÅÌ¢ˆÍ5cí¤+œJiŽÖµ oôúüJ,T ©„èûð(ú•714al,ê+óBB¡ 55Ë©ªªX4x-‰ØVÆæT¯Ïgl{´$ÒNpò·ÏúÂD£ñ¢ìÛ¶mFFç¤ËpQEY+YUU¨Hç/bI¢€•2æ+•V‹cÅ8úÌp.ÛÊÊíw½2i²vm ?{âÄ 988ØFMÏ.— +ì¸ó½®55NËϾƒÚô%jîÚWr·i¡þ®‡innîxòÉ'÷{ ÖBf - QSsޤÆG8òÔ”}þ[,Ûy_IÌ«ªByyp^x& ч9|øpûý÷ßÿF3/ ƒÈ‘S\wÍzœ‰!šŸÞò;¿Oùõw͸aè”—— D",ËšÕ#X°I···Ïd~&sj@Q ¸– Òv¼›“-m¬;úVÝûeMŸ+Ê›ƒååeèº6¯ºsÛÛÛinnžËü¸×›ÏвO×&e0R“Ô·þŽ5{ÑxUÁj  …‚ –Ús¿ ɦþ477·ïÙ³'oæK.†¤t!r޵¯ÒøøËèµ—¤æ¡P²²ÜLFòSBN:EKKKÁÌ—Ü–ŽC9«÷½‚ZU[´šç 2Ìõ]]]´´´´ïÝ»·`æKv‚J ĵÞ†ô’î‹éó@@ÏÚQÊ3 Ì »»›cÇŽÍ|É& T C½ ¿µÄqœY¿éééáøñãí>ø`ÑÌû’ ^¨1óÛ¡³gÏÒÚÚÚþÐC•Äü%@Æööörâĉö‡~¸dæ}k‰-åÈÐâº.===„ÃaߘŸW_Ì£§§‡“'OúÊü%còÌ™3m>úè>?™Ÿ€išnGGGïÀÀÀH0¬–R^vÇe___ÿþýû”.j†üb~n“@ÊZ " ÎÅâ \¼}FÒ…/ÌÏ@¤™ú÷>©‘ùç·.im¿˜ÏÆØÅ꥟ŒgÆÿ”úæüAç*IEND®B`‚recoll-1.23.7/qtgui/mtpics/soffice.png0000644000175000017500000001240013125527323014561 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé·IDATxœÕšitՕǵuõÞ­}k-^åM–±1Æ66;„%9L Àd’ œ,3“d2““œ9'³BB Æ ˜LJÍ!d!@Œ°Á ±-KÞdÉRkm©Õ‹º[½TÕ|hµÜ–e©Û6LæN~ýêÕ«wÿ÷Þwß»õưiÓ¦%IZkF*SgF¦ˆ®ë“Öeê§z&»~bû©ž9S6ÆÚécõÓ¿' B2™Œ>üØc›xSÎìvû5×^{í]²,u2¡# »A˜ô…SbúöéÝ.CÀdm'«Ï£ÈöíÛµM›6½œÎÒÀ8†aN§“}ûzðû£‚€¤’ºn`èºa ëšn`ŒiBÓ ãÌ}CO·?SÖÇÿëzú22ýhcmŒ³û×õÉ”`d‰=¤û³YxàJ¬V‹144T˜èy Ðuöv?£ñ$W^Yƒj’hjêÁj3‰$h?ågåª¼Þ 3ê øýëGY{õ öîó28J× ´1¡µLY;·œ¾¯‘0VÖÏ3¨SB× œN•{îY‚®ë Ll'Ÿy m‚ÕåvŽÂéR),°P$zT™ºÚ¢Ñ4A}}#ÔÔp¤e€@`tüźh êºn fÊbº,麔M€E€pI 0™$„sD>H’H—7Dq± O•“TJÃ4M'™ÔÑ´4QmmC\¶´³*“J]ø@ÿ¯‘í@Úwjª]¨&‰¾¾0µ5nÚÚüÌ™S„ªÊãsAOOˆDBçškfNËò_2αM38qb‹EFUeÞ}÷½}#hºÝfâOï´12’Äb‘ñzƒ FŽ‘Lhg&°Iæ-•1û3õºžöÿì9 •y>ÎúθÀtA'‹€´i7,*#Œ‘HèÄãqªª\Ty\$“:@Œêj7éÖÔ¸IÄS¬¼²0Ð1K2 ºf`p&Æ™è¡Ý×Çëô¬(ÀÙL&¹§ë³ŒËm‹(ÓY\44”MMÙ%…1áwòrÆ=Ó?“×uO7Æ×,ªªæFÀÇìÅÌ™Ÿ¿n²{¹¶›¬NÓ4dYrŒb®ÂL†X ÁˆotR»<Ÿ0ë¦[NÕnº:MÓ¦™¡/؆:‚Ù~€‚r­ÕÔ,ªÄVbËéÙé>)¹¡iÚ¤ûމ8' æ o‹Ÿ²ÚvöµÊìÛí£¾ú·ÞÓHÝÒªóîB÷ ¢ý\„‡,Èõt…8ÑʉA¿y9Ž¥ÐDªÀÄÓ?ÙÅÞW[0Rú9¦—¯ÿæJÖùúÐ4-§çóvÀéûßi§n¥ÄëÿÓµÀÃ羸ˆ"‹ÀÁY¼øÌ~‚CÖÞµ“]ÍK빺Æt}꺎aˆâôS\ÞT»ðž¤-bOk)koªÃÞÖÍàÖC,¸e á›f±å©Ñ)®ûâåÈ]; Wóž Si_„ñk*äbÁQfÕ°fy M×(±ŠŒî>†Ozã ‹ ‰j¼´~?»_> º1>ˆ‹™Ü¦ …Ù˜,I3Æ È•õ~Bñ(ÇûŠˆŒ ô Ç1/ò ZUÌKk9ð~’IÄÓPÆ[/âÀ«­g™¢,KSö1 –‰ÚÏy[€¿7BõŒ8NýÛ·¶ÓQ[Mñ7¯§£º†žÞQîøÚå4T›˜µ°ˆ÷^?JoË¢”~Õ®÷14D…œÝ Wíkš–7ù`Àp§Ÿ¶a3;Ô’Ò4Fc)Ö?´—7wô±ÿNnþR#'›hÛÛÆìT˜2·Ê¶¢ÅS¢ÀÇF&ÕÐÅh?cúÙ¾Ÿ‹œsÉ×…G™SzŠž~Ö¬¬áч®cÕŠ*þðÒ?UKËÞFzŽñå *î5#ØK´7÷ðÑ(P7ÃCuuÙx˜ºÚÏ'ìMD~Q@0ôm½n|å®8ÕªÁwï›ÇÊynt—…Ài/÷ÞÛG‘`PºÌNÕlep|g 7ÏÁí²áídÎì ’É3ƒÎLÅi2Ù¢g¢Æó²€\á(wQnêÀe#Ú¬¼ßâ§i¿—§ÁÀ¶¬%.f¯˜O<¤·ÅËc߉ÑqBgñšNNî<ŲåõŸ9 ï…Pí’26þ° ïp§áþ .-Ûã /•¤øp?{ÃæÒ‰$l¬Xã«ÿ² ÒÛÜBWs?ó—ÔðáÎVŽ”œB4ËÄb R©­G»x૟Áé°b` Éõ¤%:ç÷“ë ì¨tpùå3ؾñ}N‡,˜_Ì`\#Œc‘ó[p¸œôv0Ø;HGóaöïô1ÜÄn†ˆ&ˆŽa³(˜$§K¥¶¡˜ÙË«¨[V³Ì–þ¦Èß".( ªwþÓUÈO~Àæ­|ýË)6Ö=Œ"ЏuŠÌéÑFÔŽ­´·YYr5,»QåÑ»Â\¿ª€Pï‡G’l:…¯ãJ²—B×(•¥&V]n¡Ðû\T]VIŸXNëû^Ž¿ÛAÕÜ"ìvǰ÷¥Ì’È’Ûæ°â¾Å”ÖbŒ¹äfãëÒÛo¿ý®ÆÆÆ’4õRÒîbv˜©[XBûÎb‰å6T·Ã$“f–Z#02RA¡å#q€`GŒï±¼Vã•ý^Jª;­Hñ.V6ôÓ*eÃFV%ʾAp‹ôvˆ&'†" *_þáJ–,r²pU‹ïk$<cdžØ#¨6+®J×ø8A@UUŽ?nìÚµkkwwwÜ7®çšpÌssè…VºuS4ßJÃÂ2 f8ùéðaB‹jË©YZɲ’:†ŽXèo=ÆÍóE^»ÖÎ Rtö/Á·½_oŠò ‘þ0'ôrtw³—RXi§k¿ anù–‡w_ñ,6°Xs˜Ã&% c±Xú†,#ËòYÉ Aö‡éêíÜÁWþ ^1N°µýúÙ‰7Ù+0‡ ¹.ê¦ÎsˆÝ§ ¶¿égMÙ,‚ÝaÂæÊ—ˆ¼êóc.ⳋëèhõSÔ°·ýjôx’’‚‚†T£á¶I¨”³‘=;ºØý®—#ÁóW×°d•ÁÂëJÀd¦ ÊŠ»À‘>×Ç®òœ9@R©©T Q‘$ I’ÆËöB+3+8)50÷Šc”|”¤{@§©©…[oYÃ÷ên‡$¤"M3ùð•J*e'RR¤?bÙ5Èå0pRÃçs²(Æì*•êÞPíˆVz<‰œJ Ç8},ˆKàqˆÜµÂÎÐiG»TîüŽѾˆ¦7ÔßP†³Ò1¾rÎ(í¢&Á “2 ½K3»LØÊKØõú;´µÒ?(P63ŒTêB–²õF§½źžzÂ÷—ãëòN:‘E¤¦ñVëAVÙ*ô“pX°[üÁ8 f:`0’àƒ†9ÚaH—¸áoÊéöÚPµ(‹œzÜXTsNIЉ8뉌éœoca:ŠE¢»=½YùÂWâ,ÿt=§zÛÙò‡×ˆZDôä{ˆ©#‘ŒQbP$f•¹õÛõ¬Y0ÄŒö"Š"HÉh Ûh‚Ƕ¿‚dI>Mß‘¡ÑN¡®!±‚)ºmNf/·pݽ.ä¤Ù"㹬‡ÍŠÙlBÅ3¤ëµKËYg•Ù¹ã¤ÐkìÝû>þaèÚÃoßy—/}E¡¾°èà % —áë’øÜÝ)îXyÑgÂ(£R IÄéóž`µ½Šßô¿NW¡›’²(¾cý [-T ¼Á$M©ùþýA‘¶cÕ¼ûËQ*Ô®öà°[9s°+œ¦cÎÐ ¬±ÁíCežÄ´.bƒ®ËZ™;ï ŒˆÊ¾X×ßz]‹7ñe÷1ôˆ@,x²­k€×¶íâs+n@ìÁ‚ȱÝ}H×Íïيl4„qh$\UÎ$ß0H: ?]‹»Î…M5c±¨Æäþþ±X€ é}zJ £-Æê/ÝOqy~§›{›¸ÿz‘ê·Žž6Xû·w#8$|2´†-̱ ˆÂb(Xá.àŠåK°ú»AÙ€¿måƒx§>BMò©•Kh,³‘úùª÷4µæ:¾®áÝú!7™p¨ÞÁ¾C}ÜX¢RZëf°§½?ůÿøû‚Ýܰð^FT·‚*Z¨¹¢ŠÑ‘úXš[”EDL²‚Å¢"Šâ›ý¤d0 ˜Ì _=Áæ÷sëçgqÓÌYØL&~ÿæŸyìô;ÜS¶œ[篣qY ýÏí=Ì*ÜØ‹zøÏÿlgë‚ÇXÛ¸ˆÎž>vúˆ†ËÖ0°§³;€;RDóö_VA¡ÓÁ¨”$shSD$I;œyf]2.¹ ˆ’@¤7Â?ù>7ÞÓÀƒw]A(CQî«ø©Í:kW5P¿¬ÍÐé‹3b7,þo½b^b}§ZÙÔ¹›+/¿Ñk%Qåãû߯ä¹_KÌ»¹‡UÆUãBKêˆbú¨ ¤ƒU¾¹¿\¾Håe&“Ÿ^ÛÇßa¾{ÝDG¸œvEÆí´óÿx¡‘(ªªbRJÝ&VT–ðòq?ž†oãëõÓÕaÆnécaY€ËœA(¸³³’×6R1»›¡áªubhéuG   ’L¦­!se›*].V«•p8,™L¦I ùí GC,ºÜ‚æbµšQUSÚ“Å„[–PUDÄpœ?‡¢8ÝȷȬþ»Eh»ÞøWj*ëˆ[ën½†öäg(Ÿ«0ÜÜÏÌ;çb’e 2g†;;;q»ÝH’4þõ'“ ž*+,Ë2½½½|ôÑGÝ===CLuR4Äã >ýà:V–Œ Ÿ&DADU¥tn 9Dþí¿Æ×égÇ®Ãü*µƒïÜt+¥¯ =x%³jªp—×Sª8Ü uw̦ÐãÆ¤(c>žVŒ¢(,]ºYÎ/hE"6lØàݼyó3ƒƒƒ-LH†œE@æCÄ´“ É„Ùl›&o7^/ TÕcs«ÌYPÉÀÓ¿ãág¶±.ÑÀšuu˜ì Ue&ìå6ÌN¢ `³ZÆûÈ\º®/Ç'®óÏ·î‡Ã<þøãÞGyä™@ °ôIñÄy Ⱥ®c·§™‹Û†ÓaÃl2±zÙŸˆÄãqÌ&ÓYk‡|0ñüOFó›6mò>úè£ÙšçÓï'F€(Š˜ÍùÌFöD(Ë2ÃÃÃlÞ¼Ùû³Ÿýìé±8„<…‡OÈ&ö!m3 ( @€çŸ¾ëñÇ&KøœÍ>Ÿ˜\,ÆÓòÁ /¼ðB×Ïþó_øýþ·¹ááÿ’$ Ù²eK×úõë/‰ð0€Œù_Hzùã@f,²,‡Ù²e‹÷‰'žxvLøœCÝTÈ&@I$ãaç/™U`$á—¿üe÷“O>ùìÐÐÐ%²8uêÔ¾ÿøÇžT*%]Š\Û¥€ $“IÁçóÅßzë­7}>_Î+¼œß‘õ[,œ—ªóK èÚ€à¥ì8;&É€…Oh' >v]Rü/¦,Ÿ ?^¶IEND®B`‚recoll-1.23.7/qtgui/mtpics/emblem-symbolic-link.png0000644000175000017500000000354313125527323017166 00000000000000‰PNG  IHDR@@ªiqÞsBIT|dˆ pHYsììu85tEXtSoftwarewww.inkscape.org›î<àIDATxÚí[]LTG>3’"B‰)¢6% í«Ä}PŠMãSµ6 >ibÔ&þôÁwÃñ¯¼©ø¤bŒ•ôŸ*Ò˜ŸJ+ð@H1H‹(Ý;ÓsæÇñþ°ëºë••=ËÇ̽³»3ßwΙ;ww–I)a)G(P`éZQªF†fDZfÀ ?L"<!Ñäˆm©È€(G¬D”ÁXO"fÓˆç-Ó ò#ªŸ!V!ŠmÚ,B!,A˜GL"þF #þ¥sépÞ§pÿÈWVVÖuttl¨««û¤ òÀæÑúúúþinnþ}||ÐæSRJé¥N'yÿSÄæîîîo6nÜX‘L&§ójr+**¿{÷îD}}ý/xØ‹E®Ï_÷*ÀMί"Ïçy238.<“Ë 3éQLyjfìâÂ2Y”@OŸ>-ê¼ÖYÕÛ{§êÉô“œ3àœ‡ÁtlgÜwÞt#AÐ¥¤º¦]R=Œòò•Ï6oÚ4²óÛ]#eeeÉ'³ŒÖ©^ÐÙy¥êf×ÍZM&Å{³h0 ó:‚2z0©Ú$¢ £;züxjEŽIbûÞ–½Ã™pâ©# ü¢_{nWI;) ׿ªRji¼)Áó<æX j· ¤ïGU{îÜ®JÇ#ÚÔ£Gö\wÌüï+_}Hö’48RŠ,pLh[³Ä…! †ÿýC&¥[ÖKáôô¨“ÌÔ­”·¸"&È:Ä%•0|?ñR¡]›VbA‘Þ¶š(s^vÐaÌ×mÜXR®![AĹ›‚ H0D„pä…p"—>!ò:â€B“”’ûÉs]¬3¢Ît)™ñºPÑ äYGØ‹àæx ðäÜ(o›ãCà9°u&´—éφzÍ bI—玴TQ`y'ÎùóçaõêJØ^¿ýÍRÀ³D“_ tY ˆÀB°²eËVضu[àRÀ®â@ý9¢Îóaï·k7>üƒ¹ý…FÀ»ÀÊó’Ià’k¢Á¼×ù¡:t×­yž½Zn±„eLÆëÌ„}¤÷'är ñ@×cnG{_§Çš5k`ß¾ýà,ëpw‚ £¢ ¾šlÀûàaOÃ())\™Ðs@€<ÄÂó Ñh€cÆ/-·š4¼ó¶PeiYÔÔÔÀëØÃ‡ãp`UÄ´4·,Яç'àHÇ`ò¾—LªãTFߨœ8qzëõ}³5ùß$9r$ò2HD££âœ¼°÷Á A•™™HeSSS°ûûÝ066jkoÿI­ðŽ=}/¯’w"Ä–žˆ\ì€BM”ŒÁÚµë ÊŽ?£££ÀÀ™gçÎSïqüøþ9 ð¡ ä ø›\( <‚G ÂÓçlýÆŸ!ʆ††àÖ­[úùcgÏž…ÖÖVŸðÂö'Á\ê& xñâ-‘—æFÉžž8xð ÔÖÖ.²’1ÚÕ«W¡ººzio•.ìÎk***žÁ"5[. Û±cÇ,Rsc óÈhLõ‚¨Nºººª&&&V,Ïy;¶ôœÒo•-ÁâsD=~¸±·ÞŽåéFÉu¥¥¥×°Ú¸\gC)fËù<ä©™±ˆ‹Ìdf¿ý$íº¦ÇgFc¦±ÃEd’˰øñÅ{°]¾þBL¥Þ.¡ø}úÁòœ/üdf ?š*,… (°Tí=P@Ž8sIEND®B`‚recoll-1.23.7/qtgui/mtpics/License_sidux.txt0000644000175000017500000000176313125527323016006 00000000000000For sidux-book.png: _________________________________________________________________ Coloured Sidux Book Icons (type2) Copyright (C) 2007 by spacepenguin, cako and cathbard (http://sidux.com) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA I suggest a copy be kept in your sources for safe keeping __________________________________________________________________________ recoll-1.23.7/qtgui/mtpics/README0000644000175000017500000000025213125527323013317 00000000000000Most icons thanks to KDE crystalsvg Oxygen (www.oxygen-icons.org) (GPL): archive.png book.png bookchap.png text-x-python.png The Pidgin project (GPL): pidgin.png recoll-1.23.7/qtgui/mtpics/aptosid-book.png0000644000175000017500000001061013125527323015537 00000000000000‰PNG  IHDR00Wù‡sBIT|dˆ pHYs11·í(RtEXtSoftwarewww.inkscape.org›î<IDAThÍšy]UÇ?ç.oë%~½/I:k‡LÈ’!h „GG- ¢3†œÂ?,Pq)ÄÁfÊ)± 42¤¢…ŒcH2 F¨"ÄhHšô–îô¾½¥ï{÷žeþxK¿nšt´Êª¹U§Ï¹÷žsî÷{~ë9ý0Æðÿ©üêŠËí?§¿0Æð׺^¹ãö £TÖªÆ(×JÕ¥j´Rq£T–ùZÍzïj©þþæ×^Ûw!ßp.̉{>_iŒ©Sc´‰cLѺÆ7Z×­ãF©Ü3¥ãZ«¸Ñ:dŒÆèB1m PçWc¨loGyS§NcŒ¹øó ^[³xkAB¸½¾ßt‘”Ø~SU…J§±ÊËA€SQÎdpÊËq*+ÑÙ,ñ+¯"34ÄøÑ£4ßz+Ñ–V¢MŒ¼ô"Ën¿ƒtw7ËnoåO=Äò;èÞ³‡to/M7ÝL÷O÷Pwõ5„«ã ,N}ÿû¥q+*©X¾ox±ñ‚äëè„R­Jkää$©áa´7ÛØ@Û;о[¹ˆìèÉŽšo½•ÎÇÃŽFYvÇN>ô-ÖÞ÷eº~òcZ?òº~ü8‰S§)_±‚¥û8°üSŸÆhMòíŒ1¤º»‰65┕儫5A*EÅÊ• 9‚0zƒâ©…ìÀÒJUi¥˜J$ÑÝݸ¾Ïâ yéEÆ%ÚÔÌòÏìdðŸ#u¦“‰7ßm¨h_K¤©” &°£1ŒVd††pÊÊH÷ž¥kÏÆŽ½Îº{îeñ† $:N®­¥ïWÿæÿ²cc¸åå9Ã7aÌ{òØ$`ip”Ö$S)üÞ³4†#X‘rh-é³½„ãq¼¾^*ÚÛq+áONih 32•̹B=r÷³Ýfi)€WDË%ZI–mƒ•óì2‘ ïÿt_ßó ©xZOù¾_ר¶ŒPCºã4ZIF_þ]®·Å—n$ÖÚB¸¦r²Ô´Ö˜ @J‰’”ÛÇÅv\°-Œ6ˆšj´6¨’WÈ}0:'<)KR ÍìTCÍ‰Ö c \̆\*/©Ô¸ÖšÌ؉@” (JsN^4“å@ Û¡õC·P{ùåD›šÐOòL''vï&32\XÍRªHܲÖÜVYiçU|~Æ#„P@6¡Ô¨ÒšD"ÉÄd‚E‘*›^ÚP±z—Ü÷eF^~™“|—DGFµ·óÞ]»8±{78ŽÑšÕÿðÔmÞ̹矧ãñÇÑR¢#@dkYÙjàÄBÐ@0!åÎÇ‚ÄT’šš8ÙDbøàï_¿õZÖüó]¼ùÀŒ¿ñû’4Z3ñ‡?ðÆpí“OòÆ7¾A$gý=÷PwÕU´Üx#¿ýÌgðÆÆr$Dz6 !þøn†\ `€`Ø÷¦§=¦FG ¯]Kr||Ö€ÒÕoºáFZnº‰t_>JåÚµ\üÅ/Ñù_OR¹j+–ƒpM Ñúz"õõDqb16=ü0Ú÷gÍ]³i×ïÛdz·Ü‚J¥ÐB yÏBݾNc¼LVD¢B˜?žÈ‰³°âyaT­»ˆK¾òº÷ícøÅyß#kiÁr]ÖÜùOïö½â•˜@A(*>›êè`üÄ .½ï>~÷Õ¯æ2[¸„óx¢Yð•JeµNú¾_¹tý:ÜÚt&ƒqÝäþ,ý»ÐýóŸqâá‡hÚ¾ò¶¶ó6J1~ü8ƒ‡3ð Œ?N¤¶–Mßþ6õ›7sú‰'8¶k2›…P§¼œL"eYë9'š%À›Vj*‚Êå¯'™É"|mY9uŸaÀ¢övŽì܉SQÉú{¿0kRopÑ×^C¦R¤z{ûýL?Žô¦‹ö`´&}î/|ò“ຨ ÀZLAÁîkh¨’@Ž€ÖRÊV9>NÂWh?@;îL7Ne%þä$Þà—íþ7BUU³&}óÁé?xp&­(I3Š59OcEÏc Ø.ò"Û~ÏBrÁl\kMzd„É©$n4B ä M rÅ &Nœ öÊ«hÞ¾}Ö„‰Ó§é;xÔlÀ”/¬t¾] £çikÀÊy¢Cóy" ÿâ±`êÜ¡EU©Ð²°ï•¸UUø“4lÝúŽ9ñï`YÜ#÷ÎÆ óÀKÁîué} x#BˆÂÞà¼Ѐ?%åp!¤FG _r zp‚úDjkYþ±Q{Å$Þ~{Öd]{÷Ò·ñЉ’/ª‹ïP!=§Ï\u²à] yîÎ_ŽÁ€çeH%“„››Ñ¯¿BPÑÖÆu?ûÊó¨\¹27(¦ç¿àØý÷ç“>ˆ57S¿e [¶PÑÖF¤¶–h]ÆÒýý¤úûIõõ‘èî¦ëÀ&»ºæU¡|J±úƪ*—yRŠRú³Ù~c ^&Ãâæ&ÜÚZ‡¹ü»ßeòäIŒRÄššŠ~ðƒ$ΜÁr–~øÃ´ïÜÉâuëæ[°ñ¶6*KÜîe_ü"ƒ¯¾Êɽ{y{ÿ~üééY’B›ÊË/Ž-D@Á¨4ÆZuÙ¥(cRß²…ò%KØ¿mÛöî-šøÓŸ˜êì¤í£å=÷ÜC¬±qÖüd’dw7‰|Q¾Oys3eÍÍT´¶R¹l ›6Ѱi›ï¿Ÿ—|O=5c'€cY„¿ŸkÈsU(¼ŒÖ“AÔ-Y½Šžž>Œ14¾ÿýt=ý4©ÁA„33lèÈ®þái½ñÆ™IR):žzŠ“O^yà¦zzrž'¼àaŠE&zzxõ‘Gxò†xfÇ}}´mÛÆí‡ÑzõÕhÀbÞ½5ç>G@ëq¥5©±q¦‰¶´®®føØ14)Ið Òè?|˜§·oçÄ~D6•šr>àó=ë>|˜oßÎk>ŠQŠhu5·=ú(M—^Š-ļ§EyÝ’@6¥Ô˜ÖšD2IjlŒhSÞèhñÃÞœ õÍï}ƒwÜ755n®¿@2¾çqø[ßâ—ŸûZJœH„?ö5+VÔÞÝÔT¿4à'¥ÑZ“J¥HOMin.æèM×^KUÞ}¼p÷Ý}øa”1ïw>à…çïÒïÔþý<½s'2›%RUŇ~ðÖoÙrMþ(´xÍwLJ9¹Xñ}ÜúzB®Ë‡$¾vm±ã‰Ç§ã™gf ´´.1Ö³Y­ä¤1øR(E %ʲÔÈsÏÉSÛ¶éÈâÅÁpg篞 v.œ+õý|,ÈÒº¶mÛããÔoÛVì8þÖ[üî›ß,ªHp) 9@Ják¯µ‘¶-ë*¢m—•§j¡ÅÕ¢¼¹Éªom‹š›ÅV8µC¡‡‰WÇ£Ÿ½ùæ}vbbìB¾ß˜ ÄÅW]Ar`€gwïfÛ“O²äºëðÆÆøåw2™JÀieÛR…BÊD"šX »¢QU%ÊEys³]W_o—×Äm× ¹®ë¸¡PǶqÛ¶ GÂDÂ"‘¡P˲B`Ùñê8[׬ ž>vL.¤¯T*£u2‚ʺú:ì?ŒUTʽ»w›ä®]B…#&´r•Uvõ5VmK‹«ª²¢‘H( ãº.®ë¢•ÊåôÆ`Y±h”p$BÈus'ùÃ0×u ‡Ã„ù±9aæÔÜu]ÇA€n¨ˆ„óB]X€7-åd•R•^W· íØánlltc±èÌGÈíÇÁ¶,lÛÆ¶m‚ @kƒm[EpB”ÖL§Óxù<*S^^N8Ʋ,´Öø¾Çq…Bù“;ÃdoÏHH›²y{~ ^Ú˜‰°ë.éGåš5kìºÚB¡Ú,aaÛ9ÐZkT~µ3™ –e‹Öšééi²Ù,A‡ÃaÇÁC6›Å¶mB¡PQzBˆâ¼¾ï“>ujÒ‘ª‚y"ñ,¥gDÓJ•…B¨—Ú•ÅtSJ‰çy³ÀÞ——RæT(#‰à8RJ‚ü9ªmÛ9•ËK`¸¼$&NŸÊ:J]°4à§” ´bK—ºŽã µ&”RH)ÑZcY¡Pˆh4Zày™L¥®ëRVVV\ÑD"Që8NQ B®ë¸`ÈJJn›tÚµƒ *´¶}­=O멬1Sc&=cƧa4iÌð˜Ìt§¼S£™Ìi`äÏ‘€ÿöôôɈ¨mk× Y¶mûž§†:;½±ÎÎÌxo¯ŸìïW™áa‚ÉIÛ¤R!!¥«¥Tc­§<¥&¦µOk=šrx\Ê¡nß÷ýI ;§Hr;/™/^¾ómêßñ[‰|®Q´ßÛÚú£†x|Iy]­IÏs•ï«@© «ÔTF뉴Öãi¥FRJ ÁP¿ïôûþØPA¾€•ÖsÛ…E,Ôæ|ÿà˜÷ÇB¨ÀÊ¿mhø¤Ž <ëyÃ2s€P¡.fóÌ5þÂ_¼¸@ (^Îln¾6à_ ìB¯ÿÀüäª~*JIEND®B`‚recoll-1.23.7/qtgui/mtpics/drawing.png0000644000175000017500000001211313125527323014577 00000000000000‰PNG  IHDR@@ªiqÞgAMA± üa pHYs  ÒÝ~ütIMEÔ =³ÀÚIDATxœå›{p\Õ}Ç?÷îÝ»íC»ZiWK²°d[¶ñ#Øæá$¤!„6M€@CHi†I§-MIÿȤ¤m2™@Ê)¤i „¤Í4ÅLhóN$„GÁ@ ~ã·^–VÒ>¥ÝÕî½{_§¬$d[’%Y&íô;³³÷Þs~çœß÷÷»¿sÎoÏJÌÁ—¾ô%Áÿ|á _f®•s ?ÿùÏ¿½£y›qÏ=÷œuãù •ª†@ Äœœ}/ÄÙuæ–Ÿ+;ç™3çðÖ=ÓxA?\¾£FC¶t®?ïù¼Tª†eâU=Lieà d 9ZâX¶M¥ª‘/MRçñá÷úð{ü¦ÁÉä!€H0̱3§™UÎqÄÙ÷™%¡ö¬Vv©°PËòB.Y&è«£+ÑÎX>…KvQÖ5úƆˆ…"(.ê¡oì ²,qôÌ)Lˤ5GUÜxUÏ%Reu± u^?¦m¡**Ñ`˜í—m"Wœœ·¾GUq+nÊz…Ö†øêö`Qò¥IS#´56#IùR#ƒ'ˆCÈ’t^ý–hœÉ©"ºaÐn¸dƒ^MÌ´ªNÕ40-“¡Ô¶ã Uu ËäTr!e]àtr€L!Ç”^Á¶Š•’$ƒ°ßEVŠy HD±ìoÅ$1{-0÷¦Ë¦ï¦+Î\‹³ägêœÝÖ[í¬<^HÒ«zæñÚy ð{|+Èÿ5ÌK€mÛ¸\®Ué`ƪç~/Vv!™Á“¯â ¶O´.YF×u‰Äyã[4^J,6àÅdïÿ9#Ÿçø¡-YÆqœË/)+Ur!™ñ±¶Æ`8ãÂè]r?¶½p ž—€ù‚Åjb¥Ä$ß|ÿ†V^:t9½›·.¹Ÿe°Xmë¿yðÞ¹ëUœtOh;ápxQ™Ù}†ãüfXK ZóÉxÊÿ‰žú±Æ¦­×\Pf¦i"IÒ‚^}IX‰’‹É¾öÜ?sù»ªL ç™Pn>/š¯Ôúp ¸XW?G¿ÀÎŽGÁÛ«ÏZìyχp¹\KêDz¬Yë¿­«g}+ý¾Þ+0’ýLÙ—ñæ›Ç¿`?Bˆ ZÙ ¬«a}Çq¨T*äó“ ¼ù_¼gwœ(¥Q/7Ü~?oßÿþ÷‰Çã‹ö7óîÏ`!XUf°œN§I&“LNNhhh ÒÜ ÑÚý Ԧ˱ÿOüOðxë€I¦i¢(ʼíÛ¶½èâg.V€ ¹ºa¤R)&''Ñ4 Ã0ˆF£Äb1®¼òÊóê—ÁÓ²*y¦FsÔïú­ZûÀúõëéïï§§§gÞq̼ûsñ¶zÀÌ@r¹}}}”ËeÚÚÚˆÅb´µµáv»I¢œ=ŒžûÁÎß§òú©Ä?Ë!-Á냂OõHlÞ¼™Çœžžžóˆ7MsYã\ªÕ*“““ŒŒŒ ë:BB¡¡Pˆ«®ºj©·<Åq@–I þ+á¶MP9ÌÏ“yÄþr¯‚¯i€51p«*¶m#ËoÅñ™ 7ŸµWÕt]'—Ë144„eYD£Qâñ&¶oÛŠìZ¨I X€cÃþ$ÏC_êê [‚O¶¤ðÖ ÔøµïâÙÓߪxhE ðü›‚;Þ-±¦­L&3 çÎù–e!ËòYä,„yG{.[•J…}ûöáñxP…ÆÆFb Q®¾úê³ê9Frph@п^é‡tP!“‚Še†s-@O¼o„,‰Þh_#¸æ È?ÍÏŽí`P{/é¹Ë /…\ÝÝ—±oß+³ضM¹\f||MÓèìì$ .¨Ó¢œ‹‰‰ vîÜ9»þžUØbNŽ Þ<¿¬PÒÀ—Z@Tf² 1/|x7üö•Лnoª ýuÜ¡«Éüêi~8þcɃkúýV‰\Æ'¡=!“ÉÌΩTŠd2‰iš´µµáó--©³$|>'Nœ`×®] O ž8ãÈ—![„btÜ.P| ûÁœž…¤úÚjKÆt{–]Ð|5ÅU³´†eí ämxùY øL‹D¶’Æ[9¯©…gNxÄÿ Z “P.‹‘ÊS:zŒƒ§ùAý®é½¿ßÏ /¼À¶mÛhhh ­­@ °Œ,‘—ËUcP8tDeÄZ(Úຈ´`;ÐT/ñXžzâ»üÝ5^Hþ ?½“¸å¢ªõ£¢Ÿ¦ K~¢Š©™üÛþ›÷xhm £( ­­­Äãñ¥ñ–< ´´´ÉdhhŠóެ€Wˆé€$Qû–æd”™C˜#Õä&lpú‡ØSª§?·Žá#/Qêo&RzB¡Lª 1ž×°ñù,„9Aa|Š}‡Fùäïw±aÃTU]qsÉ$ ÆSi›âÜX’Œß f¥ŠjxŠYÜ•"’$áøCÁ(EEöz‘¨L·nÀ- `CãT o:<Ææž5<ÿêiž¼Ôd‰jÙ P´¨”ZÅÆ(¦0´"¶eÔDßL¢y ;wª=z”ÆÆÆEÇÑë€H$B__»ƒÃgð8Û#~Úõn|jË2Ieó”õ<–?ĉ¬‰œh¥Þ£¢UòdõqÆ+$ÇNr` ]ƒO´ÝÀ™¾O‰çÔ7°, §*ãq5 ‘C!Ü] U±C³9¦½‚p>B¼©‰'Ÿ|’­[/œ"»(‚Á Åb€Fapyêë[tvua#á8[8èÕ*òDÂØ(zé4Í.³ršc­iú´$#fšéÓœÙ÷ä >´öVÚ‚1~øÊÓœr ÷gðØ~ÖïèB ©”<ãLYCL ˆ‚‰S`V9–éçè™?cSç::::Èçó44,üsܲòóí£%I¢R©0zfîhˆŽuÝ–mYǦjW©Ú:¦cP6+àÇÏþ‚—^y™‰Ñ NX£ kYn5F7n¸ŽŠ®ñôÀËô½|ˆX%Î-·ÜȦ±Âétžl>ÍÔT=WÅ®Â)ýµ1ö>ùÛ·mg```©¶< óz@¹\F–eTUEUÕYöâñ8X–E0ım K`Ú6¥R‰ÉÂ$™ÉO;’¨‚>ŠcI86È.¨Áš|IÚR÷QtýzT—íÛvP.z#/ºª™ UÆbJhq7Õˆ ªåDéx•—šŠš ¤;üé?dÀHMn²‡|Ñ Oð³Ñ§B¬Þvxxx˜›o¾™h´É’Ž3ú÷ÔO~‘úh¼ J¯# À #9Îtƒ2¢RÃDñAƒÚ™c2} £u÷K¬eçömì;Ìñ(´(h 2fÊ•–ñéwÒÂx³Š}²Š¯`ó¼#ø¹)pˆ%>p¥—k6¨l]ëæŠun^$»èîîfllŒÖÖÖ•{À\ȲŒÇãel<‹šþ"Qí!d„Img3sÐ(ÔÎûÔBC­e„wºÜõÚ¢MÊþ@7VHÅÓáÅ5e ½XÅ.ØE˜S6AÝ!Ô Ó¾ÁEg£LcH"Q/“ˆ($" ›™“‚‰‰ *• étúâ˜ë.‰D‚!Öv6ãÿ²Âxgˆ@ ¬(Ït²×W ÔQP’`kÛe¿ÑOkÜb$gS¬úáˆ;­0ün…!˜¨(tÅe:eB> Ÿ*ƒâÜØ¦A&—cdd”l6K>Ÿ'“ÉpÙe—ÑÞÞN¹\>ÏóýXrAØ´i¯¾ú+zÖµàÞð"ó%0u~¼¼jÊR¥f i;!pÆÀø ¸’à¿‚‹­) %“ø+Íôu:¶Ö4HÔû%EÂë–ñz$YYÁ±“¥_ÿú´èÁƒ9xðàë-JÀ\ˆF£†I!×G£ú$RóæïKWäà ÂÀf F-: ¤ºÀs?(×BåQŒ¼Œâþ(w¼ÛM¬Ü.H.d—‚#…B‘“§ÇI§Óär9ŠÅ"¥R ¸¸Óì÷Üsápø¶ 0µ âЈ5þ-Üöýý Po@€šå5jÖ€M-8Ì<åQ°þÊÃhůà’±†i’/”I¥R 200€ã8477ÓÒÒÂÖ­[‰F£È²Ì7¾ñ €YW^ìgïù”¿üòËÿ즛nz|YÄãM g¦hÐö@å1ˆüHß®±è?µh©éÏ~ü²SpØCÚ›àÅý¿äÀkÏ#„Àï÷Ï.²f¦Û™ Ø 4M›½¶m{Vñ¹$,DÈåÿñܲ%-…;::xñWo°uãUðúc5·äÁ7 R˜ÉÁ[Ô,/¦¯-ÀÛC^¤CSàêàTAPçwóþë¯' â÷û/˜Ó›ÓÜcoç*?ß³{ï½—ÞÞÞ»çS~AÎE,c"=LqÏoíº yàED?ÄJÐ4ÑÍÞ J;H*ˆ*TÁÔëPxR' c‚'ޏìcœùe™ßyÿ{iiiYJ÷ça1˜ûì¾û·÷î[o½õ¡…ÚZ’$±kçœ8SäÊËîEFÊŸFäŽBùÈ¿¡‡Á§N·h×~ýЀ*Hþµ°~#ÐÆXà#¸¤gˆÇW~œ~®,DÂW¾òÖ¯_¿¨ò°ŒÝà–-[xøáo¿ñf|b­¨‰AåW`¿îøªµÙOvÕf± ÜïDhåñ3XÍŸáŸùïßµx<ËûCÅÜ1ëç’ðÀ°~ýú»o»í¶E•_€…ðÁþ.?þÑÙuÕõ¤Ò?C;N¤e#áØ|Á)dwdAÃð0U”F'ºŒ¡~š§}’µ-ólXf˜„¯}íktww/IyX&mmmÜyçÇytï^‚¡.Zš¯àð“8v’º †Ûã‚X–D¥¬cY!Ö¬¹Ž‰I‡Ã‡~ 7\϶mÛ> ±D,|ðAº»»ï¾ýöÛ—¤<,ã˜Ïçãÿè8pàýýýJ‚j5ÎXº Uõ"„®WåÚªNÓ†immáî»?I$Yñ1Üù^¹Ê?üðÃtuu-Ky¸ˆ";vì`ÇŽèºN*•"—Ë͙͞;·‡Ãáe¿ï‹a¾ið›ßü&]]]wßqÇËR!`©–òù|tvvÒÙٹܾ—……‚à·¿ým:;;W¤<\ÂCR—3ðï|‡ÎÎλ?þñ¯Hyø?J€mÛìÝ»—ööö‹RVS˜;¦½{÷^´ågðûËÌJñå/yU,?ƒó<àÜWÿoC}}ýwÞyçc«ÕÞÿB-Má$fIEND®B`‚recoll-1.23.7/qtgui/mtpics/book.png0000644000175000017500000001126013125527323014100 00000000000000‰PNG  IHDR@@ªiqÞsRGB®ÎébKGDÿÿÿ ½§“ pHYs7]7]€F]tIMEÚ ò9O 0IDATxÚí›ÛŽ¥Ù‘×±Öúöάª®6m»{ÌÕd!â‚ îx$¯ÀÅcÌÍÜ ÁWÄÈŒOmÕÝÕU•¹¿µâÀEÄ·³láv¶œ–Æ[JåÎܧoÅŠˆÿ!Ö†ßß~û;}“Ç=ç#n?9Ÿîþ3É—0€pæÿOëRÀ?ýÃþ×?yûÛà{r{þÅç›Ç·þè“pw Xj„t¶ó½»çßü«OøÏÿáûhkçsGÕ1sDÒ]ÆØ„Þ:jŽ4¤áôV—$ Ògë©8ctÌ‚µŒmë¸;Û訴ޭa|þêõù×ÿé/þ½ˆxDüÚÕß´üO?½=ýèoøÖ¿øÊ?þþŸqÙpÔŒ>6ätƒÝ½áŸþË?ç£þo1wÂiBÁ=pwZš4B‚ppwzoDPχÖZ z´Öâ—îÐz~Æè£>Û‘Öxñ³ÿñïà/þcDø×­ï7`ÎÉRã‹W¯xýå‡èRÔsgÛ6è§[曯xõÙÿâî'É\FAMé½#Ò÷Üáq,P*( 3Ã#2Û6hM˜KéMc` QAq" €Ö:}tˆ@5×9zc™á_þ„÷êô×ÞÚ£…d¤E$ÿZ"ê1j§×RÌÖ" ª¨¬¥ˆäîKÌó`ŒNoÞ20¦^¦ážÙd™I ´Ö‰öûì=æN“ìH½Ö´G5‹ñ˜'DD.\!"µ€D8k-zÏW˜.‚‡Ó{‡pzSÅÄ‚Ó͆_‚µ/Æ–)ßZC«dTkÁYVûE9¶iBïùž]È’©²áë3ÿ›@€Þsç x¸ „@¸á¹}tœl_† ¨;c ÁœÊÚ¡‰ ŽR5UADòïp&ŒÑÁ¹¯¼  JÃ3KD]QñDÈ˦c–(€l®‚jÐ¥±õÆýšÙÁݯ%r¤4MpWL«{›A䂹§Ñ‘÷—­w<‚mt2À8‚à}4\kçÉÒŠ€¾uÞÜÍ',ZH´ŠlX–Fö0sæœà¦ ‘¬óÖ²w¸9‚›1MFï¹û@$|êíz­•¿É)"7I$±ÈÍDUãë ï›—€dܳì覎líú·Hý)0w¤ MÀÃÑŒ­#DÈ‘:˜;º´êßaÍ…™³‘h£Æíí‰U]^5ƒ!M-ö™ðJ"ˆ®EuÚG =6®pÕ[6¦L½D€pç²O¶ÑÐ¥˜Y56øêÍ;L¹/„@—æ.ºcªy!áõNki¢Æœ 7EW>/"cª4Éþ”µ¿òµ¸=añ^jE.Ú¬ê[ÓE'krÍÅš‹¹OÞÞ½ãö<0SF—ªY‡„\ û¾×"3Cª$L•Ñ_üìÜß}u},*û>û«ÿÊÛÏ?#ÂQÕ„W³'€<ÐÔ(:ܤ`ˆÀ–ã‘õnYçk!Ï^>Öћ$ šey¨ž;v¹¿dôÈÈÏÒzóÕW|ðBhíœÌQ`ÍÉÚ/Üž&7/>¢IË 1eÈ£@xBŽVj¹Aë‚Í\°†°}ðœËÛw¼øÎ‡¬×oHÐÖˆ¥Ü/å¶Ÿ¸›æT^>Á´7ÌK§ÍwD ºÜ æœ¶!¿ ß~Ê»/ÎôެÏùà»ÿýÕçÅ'ÿŒ/þö‡ì—Åwþþ§„/æzò Ô‚¤ñžŠÊ’й/žcc].ܽyßþÞǼ}·3:¼{wÏŸý“OÙÍù“ïÿ){ >ùã9ŸO|uwÇüÑÇô-øÎw?æíܷۤçsÞóüÃùêõ/øèãgœ†ñ­ï|—×_ü‚—ßþ¾|õ/ŸÏ^|ÈÝÛ׌m«¦ú” Yr‚ Ë 0\ ½\pnGðÁŸü!?ýÁ¹ Kùè¿ÇÏÿçùðÃçüø¯~ʳ›Á«Ï¾¤Kã£oÀÏ~ôšÛÛ>uÏßûÖK¶Ñ™ûâ|3xõJyùò%ûjçåÏxû^~0x}§<{1x7'Ò;·ÏžW¶ÅÓÀ£ÈPµ‹äóråÊݽc“|L¾øë¿I Kª»¯~üSZKìoæ\Ö¼²Ìû/ÞÒGçÝÝ…mtZoì÷šèbBG¸Ü)·ÛÆÝ[ãæ4p FÌ…ÓvKo0Cè²§ @«•º§ˆÊqK›åã’½ ¦Ù4USÇý ŠÜh=nÅ XS±$ÀÛ!}s*£'ÙZxàu}½w\'0˜‹Ë˜™Q}ð K†YÂQo`Kq·dDqýÀÜ0·Òž •D€ËýNk ‘Ò7<™_„';ŒÒýB²>?„VÅÜØçzºHuý42j÷  Ñ MT½Ao°æ¢µÌž$5QBÍè"„åÅ·FÞ7C—Ñ» K‘d]ÅJXÊ^3½’žÖ¨,4" ‰`MÕšÐêýñ¸¢Àœ‹m4ÖRš9V)/åX5QE0TŸX ´/â0Eƒ.qUƒR¦¥hùÿI¡5Øw…­Ó.—Eo’ü ,1³\ˆ”É'eq¯iéÿUªG2‡K½¦q:õê!ï9XO6¨:w’tx^-±(Ÿ>MŒý^é[«Þ˜ÆÕkM’-:@ƒÛg]Fë­j8ÐW-ânTLsf é;®™ýÄÌŠÄÓËa!çwaÕá«þ#’ôhy‚º a­à|n¬åX$¶«}ºh–ø¿ó¢é4¬ŠHÍ{oéZpûlÃÍQ±T“~ô …ÑÚïF ­_"üeu´!@ ©ºx‰¤ðäMÊ[P£I¨yYD$îGdµâ­|A‰ I »æk‹|]îÒGL˜ƒÛG:b߬HÕÿ¡ \‚9 úÕHqô±e}F•Åa¯96S}¨1²ù¹ägÔRW"ÏØrzˆ¯C4ÝÜöB@úh‰,O*†Ü—"DÅòBsN°uè-®Ö·©aS9’ RÉÔXKM®ÃÒóMÒßÞ¸Zㇻ;ÆQnE¦Æ&Wnà½a~Êãþã¡êK×´?vZ"®¦ÈœÊ¶ s&d©Yš5ÍÑeŒqˆg^’­ËÊ:®nÆiËh*Ĥ¦ «©!àrŸä+ˆä]=ߤD$ @y€Çd4g€…ÓnRÉJûp¶‘z!›UM,Mr¸¹m$Tkâ<“Eº’̓ބý~!ˆd)¬]i£1†°Ïß~’(-ЬèmpM7ˆâêQ\?Šß.è4Ö2ZËâ5puæÕpÎ[ˬþ÷‹ô”Èöâ%™5ãxî“‹¡:#pÔ””“G½Ü 2ü–ÚUĘ£WPzKñÓG^´—v{î×Ú^ªi˜^­=ˆ­cä&ÑšÊèÇ(=ßç±LðÑT8ÞŽ¸×ŽZȢΩW×OXåÎ6yP†áŽÄƒ9"q Vƒý’.°”J5ÍS¥x„3zfÚtÜ9m ]öÀ<×C}Ú(Ñâ×úòÐòh‹–‘´8Ó|ß-Ñã q™;„;ww+Ýe!P¢Æåù¾k*ªÊykY:óaœv> ûý*ë-³ÏK\¹=q*Ø¥ÿ¨°GV l'¹î(žoÍÌ<]ãµòBݾ95B¹g¯i¬iW?aŒì+Ë4Çov,й¿(m'Îò½ëØÙU[<.˜IQþà•æG­‹²ÖCm†£ç¹>pÆF9CÆÍI®ç ¥ê»"ËiK¹\Ò'#=ÅUµîl›Õcöû4I¥²êì À7€AA=X•˜Evqó:!u6çàžÓc!èM¸¿[l[KZ°48míz®0})Ë]8ŸóäI–sÁ]M™ïîcäïçÏG:ÊVÖ}cŒàÝ‹L=qxùÔ‡=á˜'ý¬é‰8óRç 9.6 DQöŒàí;ÃVÎO§PQ°vÚ· ÖèåB«_ÅÏÚm‹"CÎvÀñSRa‘cØÐêT5)ŽÃ"r|>†°ïÁ8¥[twïœÎiqäÉÃç³°ïÎù”œ³7X+®H£–³À1„1²LÆ&Œ€ËrÌ`«yeéeÆÓ¡ƒêFÁØ;ޝDyV‡†.¬Êä0OÇ+÷Ÿšû¿ Á öõ…'¸ìžC–RŸ­ ˪×X°m™\Kƒ×ﲸÀ\Á®i®ÌjÄ<ð›3àíÛ7çã<€ª]JÔ…Gžæz}ïüðÿû äK¡oðæ]ðü,ÜÏ`0'ŒS~IbŸÁiäû¦Ÿ§ÌW0:Hƒ}:ç-I˜jZå£S'N`;û}°¥LZÇ ¶wïØo€ûß.ïî7îÞj<Ûïæñ•¡d¼õ­àƒWð£4ºÀ»œ;«ò ÔS0]n,ÿå&ÝÛƒód·,K÷ç8‰v3ÀB8 ®0ì§-I™9ÕýáÕ ëøâ7þ ·g"òçÀ?ÎU6ïÿt’ëôz¿ëÿîÇq_Þ{¼ç¶]Ïaýòo±÷þþºû•¿'Äÿþðæ· äWCo~¥gÈ×¼×7yìÿ%>õ~üJ°~ÈÇ{Äuû£ÍÁßßþŽÞþ/ìî‰ã ìºÏIEND®B`‚recoll-1.23.7/qtgui/mtpics/source.png0000644000175000017500000001003613125527323014446 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7ŠéÕIDATxœÍ›[l\Uw€¿s›‹=ãvìñc7;‰ˆ@U%TýE¨/HH\_òÒ‡ªO}hyD„48Š‚ DH ôƒÔ4ŠJøiû#„4 ¹ÈvâëÄÎ$öØžË9gï>ŒÏÉÌ™9ã™Äü풎Ι½×Ù{­µ×m¯}FÁ~øá߆ñ˜¢HK €”§MÊ»ïˆ\ãžôm+n·ót¦C:x*‘GƒpЋqÝ‘…¸û|—†Àêêêù×^{íŸóÛu¯¢Ñè§žzêwªªàÌ‘£_¢(0 rM ŠâÕ;ºÓìPî (.²¼‹TòÍB¦ Û¥ªªªñå—_öï F‘¢Ñ(ßNZLÞ±Bd,IÚ’(R¢¶„´)±…DJ…Ú€B2-1íœìm!B"$Ø"·ŠR€µÖ&ì\¿-À–kmbm<‘ßÃ¥¿\JBÓ²¡µ^çŸ~÷ª¢„€Và–¿¤DÁõ„Éÿijx0ÈCM:¶€¯~]a{,@GTGHɯq“¿œâo‡#t6è,§‡ÿk‘¹Åœà,!±m‰mƒmK,)±ì5¦í³ÖÚÝÅqž…¬‚Y°lɃ-ÿðWÍ lPÉ“c‘œU°ÛÛ f–l’A}H¥=ª3‘°XLÛ<ÚB× «Aç_þ¸È¾ClŠh,,Û(27†wi4%§öڽ෠ºÈÝmQÍj—€ªÔŸÑJ˜ÀšûPrjøci¶·h‹Ì,Z˜B2Ü .¨ñ‡ +4ÖªÌ,Yܸcqû B‚¦(¯³ø ª·!ÏI(<ÜäòM“US²¹Å ¨+üÛ¥?M§énÔ¹~Ëd 9Àaþñ/›îb‰ê™W~ë”t‚³ßÛ«‚ÿžÌ°½Õ`~ÙæÔÕ½:c “ŸfÒ<Ù_Ã¥›&Š²Êž® ºžæOiL["Öžkß–Ä^ó–×8mBäð-¯P nÕ€eKRY‰ôyÙW;ÛÄ"*¶ ñ¤%awG!${º‚)ÉÚ’Ç ‘µ$7n[(Àß쨤 çÙå]¯/¥Ä^óörí.äÝh!<}Ü ›woÞ6÷Y)Ì;l[ò@D'T°K˜e±\Cn3ÃO>÷^Š=÷5&²8)NB”'!טÎõËxR@@¡”eújÀFBÁ^âÊô•z.×ç×&„À–¦í7€Áåð¼ ëzÎ|l»$žÓ¦ë9vlÛÆ¶m·Ïy.9vyòïÂÒÒW¯^%ÓÛÛKMMMIEQP…‰‰ „´¶¶ BáI)Ýy;;;illDá+4_”Bžššâرc´··ÓØØH<gïÞ½EB°m›ãdz°°@__ñxœ¡¡!º»» 6A•Ì©( ™L†'NL&ikk£±±‘Ý»w‰DŠ6X'Nœ`ii‰ÞÞ^زe mmmضR´I)#¯t…œ}šL&Cgg'ÃÃÃD"‘’fSiôpÞõ ³* ¨Önó!™LrôèQêëëyì±Ç¨©©áêÕ«騪ª¬¬¬ðÑG¡ë:û÷ï§¡¡±±±Û­vß`Ûö=Ñ^Q*¼8ªñâEºººxúé§èêêbvv–l6K0tUÿ×_¥®®ŽgŸ}!]]]ÄãqLÓ$ ùž)x{mßo¥«J…ï4McÓ¦M®-655%B†a‹ÅRb𦋗6½PnCu?Z[]–Rò ëïïàÖ­[n_ (X˲èîî&0;;ë®\ (¯\áüηûr—Ü·BÐÐÐÀ®]»H&“¤R)TU-Û£Ñ(»wï&N$9Õ¬äý®¼÷e¥˜kjj¢¡¡¡ˆ@¯·®¯¯'ú:ÖË+Éó+ ‰ë…"?&üúýÂ#ÔûÉU¼pÏP.&; we« mùãn˜,·q’0oÅÈJ†A¿8{ãÆ „tvvºaÍ‹«iñxœùùyÚÛÛ©¯¯¯h…Kõ9„OMM±¼¼L,£¶¶¶äûš¦1??ÏíÛ·iii)9o)¨H’É$ü1ªªÒÞÞÎØØ{÷®®(½=yò$çΣ¯¯ññqééé)(Rz™õ+‰™¦É_|A<§¿¿ŸÉÉIimm-xGUUN:Å¥K—`bb‚-[¶ÐÕÕ…âÞò'—8uêuuu<÷Üs(ŠÂôô4óóóD£Q_Ó4ÆÇÇùé§Ÿx饗hii!™L299I:v÷òå˜ÏoSU•óçϳ°°ÀË/¿LMM wîÜaaaÛ¶]Ú4Mãúõë\¼x‘^xÆÆF–——™››sKqåÀ·7N9é¦R)üqW’±XŒd2éJ×!|nnŽ­[·ÒÒÒ‚eY„Ãa:;;Ë&8ùÌçGUUY\\ddd„H$B&“!‰ Š,ªª2??ÏŽ;hllt³ÉŽŽŽ²µ@÷}¿Ç™8åè………‚½v$)R­X,†®ëniÊ© 8IN>³ÎÝ™#?´9ã¶µµaš&–e¹mÑhÔÝ=:‚Åb!0MÓN$Á0 WH À¥” aš&ÓÓÓd2¤”X–E6›uÓ4éèè ££ƒññq2™ŒK´³Qq,ò/?§+„ ¯¯ºº:fffÜR—7¿B‹ÅèììdzzÓ4 ƒî¼U—ÄbòW¢®®Ž­[·bYªª’Íf]"ò÷ߊ¢000@*•rµ¥Üþ|=âÛ¶m#N”ÄJmw7oÞì–âáV’(UòKS•p„Ãá{*N”OUU·Â[n<Çܪ×W~›ˆJÓÏHS7jÞ I„ Ã(pT~)©¦i®ºjšæ:¸¢‰ó25M[÷ ï·‚ŠL@×u.\¸ÀÙ³g©­­epp¾¾¾¢ð¦i‰D‚3gÎJ¥x衇ؾ}{Q‘Ã0 ®]»Æ÷ßalݺ•ªÏ6ʆAEQ0 ƒ .ðÕW_±mÛ6†‡‡¹uësssnî­(Š›/|òÉ'¨ªÊ¾}ûŒ¹¶¬( º®3>>ÎgŸ}Foo/{öì!™L233S0ž÷RUµâ«¾¬«B~ùåž|òIyäLÓ$‹±¸¸X°ªº®såÊšššxæ™gRºGjNI r1ùìÙ³ìÛ·ýû÷cYííí$‰²i«÷Dªœ];&Z ”€3Pmm-ÍÍÍn2 ƒæææ’DlÚ´É •<ð€»~0dÓ¦Mn¸Ò4æææ²+µ´´ÄíÛ·Ýšßáˆ3wSFY^^.J ×M„t]góæÍÌÎκŸº®ewNâb†{ª( Á`°¨6088Èüü¼{¬iš«!¥ÀYˆ™™4MÃ0 t]/Pù|!8Ú¹4MãÒ¥KüðÃSPøÅdE&000ÀÜÜœ»Õt¼¼/²k×.–—— ‡ÃD"‘"ïnÛ6===„B!îܹCss3†aTtœ‡Ù±cǺx^˜žžæèÑ£ç;vHB¹OeKd‚Š¢ÐÞÞîö•+L444¸%±rxmmm—O‹mÛ¾¾ÀÏ7ŒóÆoœ;tèÐà?x~Å¡JcôFãyßñÚº÷î<«ªÊØØ¯¿þú¹Ã‡¾®©ü1+€¢(n}#êrN¨r[ÏkçïNý´Ôy6 ƒ«W¯òæ›oþ|øðáÎc>í·ä7BÞ›Ÿœœrž>ÿ¼¯ZPU!“““ضMKK µµµ¾ãåo}!ø™A àòå˼õÖ[óßWK1_R¥&_^^æÓO?ukõõõŒŒŒ¸eíj@Qr_?~Ü­óE£QFFF\ßá÷ž³úù;½üdÉ0 ®\¹ÂÛo¿½îʯ+g]×ùæ›oƒ<ÿüóhšÆää$‰D¢ $V)†Á™3gH§Ó¼òÊ+„ÃafffH$Ô××û¾—o¥´4píÚ5ÞyçŸGGG•/ËÍûíÁæ€ 6€y(ýO<ëŸ,þùÁ²@å¯ÿ Ù× a 4…ÄIEND®B`‚recoll-1.23.7/qtgui/mtpics/wordprocessing.png0000644000175000017500000001304013125527323016214 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé×IDATxœÕ›Ùo\×™àçnµ/,²Š»$RRl-–Ù=Ž’1”Ž:hc`Þfþ‹y`ò>pYâÄîÀy`^ò0ý2ã¼(·²eKŠIE)Š[«X¬í®çöCÕ=ª*ÉF7úŠw9Ë=ßw¾ý;|ðÁiÓ4ÿ›¦iñ0 C€ÞE”’þ÷Ñstµ„½6ôþÎ@›”ÝYzía_[ô>1nxÝa¶mÿÿŸÿüçÿ`ììì”Þzë­ÿ|ùòe#üQýž-C׃}Ü 6…#G=GŸA¢ÞGà’?þxø@uxQ@³ÙÔS©DàŠ¤ñO„ñ‚„H@!R†¸2D"?ø2D† DH‚ AÊIHØk dHvçaØë# Â)é¾ëõí¶÷õjð7®®î»°oÇ“\œKò_ÿÃ<¾ï¥€R €”R„RŠF–7< -djLˆ šÉ_·<„€—fu O<6j>ŬÆÅ9‹rÝçËU×ï.$è-H½ûÞOÊ? »D äàûB¾ ‚þ1ÏúEˆ?{Q¿àÙ÷Û¶dçR–ÿò÷3„Ô}Ÿý,#è|ï;keŸKóa’Mjœ6جúüÝëIþ×ÿkòw“b»æsºg·é³¶ë¡…M€‚ Ég?)»ï5 R Aô^v¹G—hôµiÇ@—]N ´g,]æøÃ 0,OŽòé#+>Léd“‚»¾XqùO›æì”‰!ÿûnA"D]$þ-vXƒe.ÍÌë”’݆äåY“ë/Ç0uÁú®þÝùÿñßg)å †ü¿ 0ú¼ {]ÞôËhüeÃãëuC‡ï.Z3:ÿøy›Õ²Ï?Þmqu!Æãm—õ]/è* ~ÙîÞË;wYÔ“r´ƒ:ãÀo„A4vH8Ç—tmÕ1ð}†äRpmÑ@ÓÀ BªS×xã¥8ìjÖŽ#™78]4qýr]"CøÁ…‚®v§+Èž¤TV"%2èùá3í.Ãîø®&ú÷4¾Òú‘Eé³Ê<³ ®/9?“ÄÐG1¦â)!‡¿Y °mÓ40M Ûîàû>–##4 ÏupÃ0š†&t„$Ou©t:„èºÞuP„ÀÐu4]§Õju¿H‚À •ÎõúïyÊß0 C× û|A×ô†ôæî½{‚Ð@œ€ú¡RÙå‹{÷è´Û$S)\×%•J±¿¿O±Xd~~ŽO?ý'æææxüø1ù|Ïsi6[ÄãqÞzë-LÓäáÇ´ZMõ½:Ù\Û¶I&SÌÌL£i:;;;¸®K&“a¿Žëz´Z-òùBh¤R)jµétš+W®066¦8*‚è>ì!=Øæ“H˜'#@4pzf¡i¬®®’Édp‡b±ÈÎΦibY1æç癟ŸÇ²,4MC×uÚí6š¦©ßøø8‰D‚T*ÍÄD‘X,F6›í!˜GJ‰ã8X–ÅÔÔµZV«…çyhšF††®ë\ºt‰T*u¤= RÊ#Û ‚VWW)•JlllL&ÙØØ`rr’B¡ÀÚÚçϟǶm<ÏÃ÷}‰a²²²@,#ÆÇÇÙÛÛC×uêõ:¶m¦i’L&‘RR«Õ˜››#‘H „ˆ3„=™ŒEFâиâyÐl6ÙØØ ÖÖÖ¸|ù2ëëë4›M<ÏãË/¿¤Ýn+++hšF"‘P;êÔ)¾þúk,Ë"›í²ýöö6AP*•h4<}ú”B¡@T«U’É$†a°¸¸ˆïû: éQ†!¾ïcš&â$:Àó<5áüü<ÓÓÓX–Åk¯½†a¼ôÒK!BpêÔ)µ3¯¿þºÚHÑ !øÎw¾3ðÎó<‚ P;îû>®ëbš¦º…èIw¿ŸcŽƒ`š&¦ÙUº®\Ÿ¢EEóEDÑuX,¦v·¿}™£æ=¬m!ƒø6 ℈ý¢geûúI)ÕîG„ŽúÇùÑûˆc¢ñýlzwûÃ+°»»Ë£G¸xñ"÷îÝ#ŸÏcÝnÙl€•• à Cb±®J¥ˆÅbloocY®ëÇñ<Çq( 4›MÂ0IJ,<ÏCJ©´þÜÜFƒ èú!ŽãL&Ñ4 )%®ëây©TŠ|>ÏãÇ#—ËQ.—Ñu p]—ÙÙYb±Ø‰6ëD ßÛÛ#|ß§Ùlbš&Íf“ÙÙYµŽãH$Øßß§ÙlR(ð}Ÿd2É“'Ozf³k*+• [[[,,,P¯×iµZ ÁJ¥ÂÄÄ»»»ø¾O§Óu¾ööö”rW¯×I$Ôëu +6kkkÌÎÎR¯×‰ÇãÏÏ‹Er¹B …N)%ù|×uÑuï}ï{J»çóyµK¹\ŽN§ÃÞÞׯ_G×u<¯ëáAÀÂÂûûûÌÌÌÐétgD6?N¨Ýô}]ו8D?!?øÁp]MÓ(‹!(‹ìíí)ýòB°²²Â½{÷°,‹¹¹9¶··q‡ÉÉIÇÁu]ÆÇÇ™˜˜à³Ï>Ã÷}N:E¥Rá7Þ`ii‰íímJ¥SSS¬¯¯+Ù‚€v»M©T¢Z­ö\n“ññqÆÇÇyüø1™L†l6Ë_ÿúWfffØÚÚRÜ‘N§ÙÛÛàêիܽ{—W^yEqW:¦Z­‹Å(•J'çß÷ÅÆÇǹxñ"óóóÄãqΟ?”Riêˆý-Ëâí·ßƶm ÃÀ÷}âñ8™LF)4!–e1999à™õï¨B±y±XTаT*Ñn·9{ö,щ„Ò±XŒþð‡˜¦ÉØØ§OŸ&Óét”~z!(  …l*•RÞØ(ˆØºò˜L&œ—Ó§O+mÉe„x|úé§d³Y&''ÙÝÝUŠ0rªîß¿Ïøø8›››œ?žr¹L©TâÑ£GX–¥D¥Óé°¸¸H£Ñ ‘H¼"(—ËìïïcYÖ¡ƒ#3äºî€Ö=Ìyñ<ÙÙYLÓTDš˜˜ ›ÍbY–e‘J¥°¬n.â"èrf2™T^g,S\ ÇÕ˜h¾ÇQfæ0¯JmÛìîî2333*'?ð¼±±çyЍžç‘ËåØÛÛ£Ùl’H$H&“”Ëeòù<±XŒ©©) à ™LÒjµH¥R4 ²Ù,†aÐl6I&“ Úí6Íf“©©)|ß1+МišÊs; LÓÄ0Œ1Œ|äÀDþD4£Ñ`ii‰z½N2™¤^¯3>>N£Ñ \.sîÜ9?~Œ¦i´Ûm ÃPâ“Ëåh6›Ø¶­d¿^¯311q,Ò'"@†ØvË4‘‡°S—ºæ¬Ó騘|ÐÍ8 \×U ŠÈl^¾|Y)U)%ûûûd2„8ŽÃµkׂ­V‹N§ÃÌÌ ðLyGœqöìY\×U:äq€ãz'MaGpTlò¼p€Q¾¾Ýn+"¶hÁD OÛ¶i6›í£è8Žj‹Öu]9-ý©´h¼¦iÊþwëRŠQ¢¤_'ôëoäéºN.—#N†¡ZdºF‹³m!ÓÓÓä;º>S˜žB z·±±¡ò±XŒF£¡ò„†a°¿¿ã8¤R)fggY^^¦ÙlªÌ’®ë8Ž£Rk‹‹‹GÆ/# Ðo7£6#Ñ„ýWMÓ”¹r]WÕô¢Í–çþoDãÇÁ¶möööH&“Ôj5LÓ¤Ñh099ÉÒÒ…Bjµª²Éëëë,--Q­V™ššRÈÛ¶ÍÌÌ ccc'ÒeŠ£ C:íö‘ò&8¶3 ‡Ad2ûAJÉää$“““ÊŸ˜˜À0 ªÕ*ñxœk×®‘ÍfI$*ťѢ˜Á÷}*• Ùl–T*E§Óyñ¤hÄæ¶ãñ—å'Xñ8‡3È Às;<Ý©ý¥=J¥Éùâ‹/¨T*LMMQ©Tèt:´ÛmfffØÙÙºŠùÒ¥KLMMñùçŸséÒ%îܹÃÔÔår™x<ÎÜÜ>¤Z­277ÇO~ò“Õ4MOåˆãWËÀGÓ‰TþØnëÀq…W^yÏóT¾¯R©P(0 CA®ë"„ ‘Hðꫯ255ÅÛo¿­iäGâ¥ÝORÐ9¦0öýëª÷8‡ú†ÁÎÎ<À0 •…®ÕjT«UUˆ¼½½Ío¼Á½{÷XZZêžUè[\×åå—_æÏþ³ÊŸÔ)]¹»Ó& ¶ÑRx®ƒh·Žý˜îŠ‘aLOO‹ÅÈd2lmm‘ÍfI§Ó¤Ói4MS¡r6›åêÕ«*U¥Ç6771M“Ó§O#„8±ü`ؾ[¦ÎÙS$SiÂp´IÑ„F«Õ¢Z• Ù# %„ Õj ð€”’3gΰ¸¸¨¾{îܹ‘ŽWd㣚E¿É=s挪>#Ýëc 0 ¦iP,I§SÈCÎ¾éºÆÞ^]×XXX8–ú 0ýŠKJIµZÅuÝÂéI½À(yêyÞ¡§áŽîÿÀ({ ûǦi4›MVVVH§Óʉꯚ¦I½^guuõÀáT8< AP«Õ”û: „4›Íž8†{Úí6¹\îØ~Ã똞žæ»ßýîJðQ „`kk‹[·n-ÿþ÷¿ÿŸ@‹D8 úóðÑ©£À²,ŠÅâ±ýòùü@ñò¤0êÜÀq ­­-~ñ‹_,½ûî»ø¾ØÕo¤ÃnE¨¿êómÁó&,ú§(0ƒA ßommñË_þrùÝwßý­ïûŸÚ£æ?@€þrtÿÄQ€ÒŸ¤èÏÊDï?¸Ðà!ºÏß¿«A¨º^¤õûçE€þgÃ0ØÜÜäæÍ›Ë¿úÕ¯>è!ÿà0äúƒ¡­­-Êå2­VKyTQ¥xii‰|¾ëñéºÎää$«««LOO£ë:kkkd2b±±XŒ­­-ÇQ~ûÌÌ ¾ï³±±¡œ˜ÙÙY•þž˜˜àîÝ»d³Yvww™Ug"D‘èðÎÇb1ž>}ÊÍ›7—nÞ¼ù¡mÛÿxxò#9 Ýn³¹¹©”_£Ñ —ËQ­VY__'•Jáy™LË²ØØØ NS«ÕØÙÙáéÓ§ªHºÞK%“IUñÉd2Ü»w©©)vwwyøð¡:8õãÿ˜û÷ï3==M¹\æÁƒt:®]»¦0¬«"Çgccƒ÷Þ{oùæÍ›ôÿ ]Åw$ ÀôôôÀ.ú¾¯ÎÞ¸qƒv»ïûêBtdebb‚+W® i;;;X–Å~ô#677Éd2Ýè²Ó!›Í²°°€eYÔj5ÅaQ)ý§?ý©b{Ó4Y^^ƶmeîúÃÜhÌÆÆ·oß^~ï½÷>´mû“òG‡§‡`mm;wîP*•#ŽãpõêU>|¨*·Íf“X,F:ƶm®_¿ÎÿøG‚ ŸÏ³½½Í… p‡ÕÕUæææp]—7npÿþ}Òé4KKKLNNϽ½=Î;G"‘ Ýn+.é/yY–Åææ&·oß^¾}ûö‡ívûÿÐeû!?’³³³\¿~ Tn°X,âº.ív›ééiI&“t:RuµZ¥V«qãÆ ¶··ÑuÅÅE …Fƒ3gÎ`Y•J…z½Î‰D‚\.‡išªÐUˆÇ¡Ñhà˲ØÞÞæ7¿ùÍò­[·>è“ù##þa¢\.«:AµZUah«Õ= ½´´D,Ã0 .^¼H½^ÇqvvvT¹üÔ©Sj™L†ÝÝ]‚ PÙŸ .Ðl6ùꫯ”Õ_ ØÚÚÂ0 ,ËRiùÈ F–akk‹_ÿú×nݺ)¼Ï‹üH°,«—ë¯ÏçY]]e||ß÷iµZø¾O­Vcss“D"aŠ…÷÷÷©T*êÀS*•â믿fss“K—.© o­VcbbÇqT³Õj!¥d||œJ¥B©Tbee…l6«N˜J)1 ƒíím>üðÃåÛ·oЇüñáèIRxóÍ7Õ®Eé¨D"ÁÓ§OI&“\¹r×u)•J¤R)u¢üûßÿ>º®cš&çÏŸWióè„8tË[–eqîܹCëarõêUîÝ»§ˆ#„`{{›>úhùÖ­[¿u]÷ÄÚþÄØÝÝåÎ;ŒÆ…qÉcÉÔÿ€‘ö73ä?PbÀH¾Ä‚”‰ 4(‰sr20°¥._f`ðð``xõŠAD„áâEp¨2°³CÍÄ„P²ñAd>Œ+p`©€Z”B€Y &ìÁö’äutŽc`8’ tu!CJRÄ €˜°–œ >,2€eÆÆ ƒÄ@±ÏÄÄ0\@±`ý>}‚$KP`œ8)DE¦MƒÈ –Ÿ‘Ëbò;6q¥(F]К  ”:Ä%û/ ž|°ÒT¼~ÍÀ ¬ÌÀ ªŠG® p”ðÿÑÄÿãR’C o5£ažDÖ,¯mmþgÄY¶j!ÂŽŽÔ+ƒÈ¥Ñ=‡ä)d1\âÈ4æÄS° ­òVÏÀŒDÿG£ÑåbC-Tf6º qp³OM@4 X®c„µ$Al`á‰-¦ažÀÒÔþóçfÃ9™c XdýÿT«Dõx,?N Mv`mñOÁ†ÍãÈŽÿ ,¼ÔÕÕTTTÀ€+‰cË&0€x8@±àê@ žFŽ19OŸ>ePSS#±íƒð(ÙØØðª ª§P¬ LBBBD9H Š-¸¹¹¾ÿŽRØ‘û sþѪ lÝIŠZVHùŸÇAö¡{9@âL$6¸í…%F¡”@Lèõ1¥r4rÞ…•öä¼I„»H)ø@±P3öÑkJ<žÅ>rÁGJ­@T/˜™™ám lu<:Ʀ ³`) _«äyrÛ1ÄB؇ÑïÞ½cøúõ+¼j†Â< ó:źÈ3 ¾Ä/`þåË—ÀÎ+hØk6%Tê*ˆ*YähP'èæÍ› ÝÝÝ ÞÞÞ âââ(UrÌbã#cž?~0œ}ÂY‡ `bb &&ÖóàÁ===”˜'¦¹‹«-Dq Åþû÷ïÁùUBB‚!..ŽèÃ<cƒò5ˆ¥P§èÙ³g ººº`û@rĶõ ÉÙ!Á <úæÍ†£G‚“)1žF/üÐY ÆÙJQgΜa““— rÔF6@d¥€W¯^1ܸqƒáÛ·o \\\ ÆÆÆ 222Œ……Œam}ô®.®®/kjj‚SÁíÛ·Á­°°0ƒ‚‚¼p$7ÉpäȆ>0èjë2HJI2°±³Q¥—H àçç(îÞ½ËpìØ1ð€‰’’Ù…!@‘Ôá•ô¯_¿fðññaø-ð›áÀ£ Çîcøùû'F,Ò ÃK@¢‡‡¸æeEX•Š ãDR ¸zõ*ƒªª*ÿ?ÿ¦ßšÎpÿ:Ã÷çßz™zŒŒ¨Ö£$¶ö<²ÂÇÁ59© €˜ˆ­A¥ñçÏŸÁyÚêlê 7ïÜdû!Æ ' Çðÿïœõ:­0ÈÍ ,ðüùs¬î'&ËF-ò(H#¨‡l¨à‰qrr‚“|¢V"C„J; ;3ï?¿è>¯r3¨Õ j‡€ÊPŒ­o‚Få'P= ª×AU7 j’òññåÀms defeøûXmýûÃ0V³€Ü ª&A51#ÑÈ €X°5l`íqPjaP»T߃êzP6ɃVð3LE Ï¢·&ayäq»È©iˆ… a-/Pª¬Û (°•º¤ôçq5_alXž‡5Ž`|XJ‰“SÍ 1›ÈýzX¿›£‘{w09  ˜"³‘=¶Eȃ¢°9¯c Xs}ݺu?€1¿ógqyˆâ°ÝƒÆçpm‰AÆøf…G{@4¨Ð–àXSrìÃæ$AžïììDöü <›Zˆ¢K ª ÔìóÃø ¬+qeçA´~ýúÝÝÝ Ï¯EJöxc €¨27ŠÕ´Èlä®1rÀb~ãÆ?zzz–Ÿ;wn¾<ˆâ@ë‘ ä±ä,σķlÙò£··wÅùóç×Êóè €h¶V˜–]_ØHˆ¿uëÖ}}} ϯ%%æa €ˆ(€ž×‘WŽ€èíÛ·ÿœ4iÒr çבó0@C.À²Ðó?@ž'5Ï£€"jLp°¤XY°cÇŽS¦LYvñâÅõäÆ< РOÈõ=ÌóÓ¦M[ õü9J<Ä‚ÞuáÁ–`ÍÛ]»v}ÆüòË—/Ãbþ%ž€‚°¾e†-H"uv…–r ¨ÏìØ±6lXôü:b9Ä€b„Õß©©©À$ælK³¶‚ˆ™®_¿~ØÂuiÏSóÈm€bü?Lv€’  A;cæîE…@IEND®B`‚recoll-1.23.7/qtgui/mtpics/spreadsheet.png0000644000175000017500000000646613125527323015471 00000000000000‰PNG  IHDR@@ªiqÞgAMA¯È7Šé íIDATxœÕ›Ml\U–Ç÷½ª²«âJblDZ11‚H D‰ÝCƒhZ,PoØu/zÁ¦5ÒŒÔÛ™ÙÍžæC DH–f‡ÄŽ0³IQP6nÙq &ŠÝ„†;.Wù£Êõý>î…}Ÿ_U½÷ªÊqèæH¥çwï¹çÜsÿçÜsŸMôÑGýÙ4Íß*¥]¦”ò꥔ºµ[¸[Èz…Ü)‰B7RR²Û"b@Jw‡a·­WçÓØÎß×λp]Wær¹¿œ;wî®.5+ ¯¯ïõ×_ý÷1Ó@(…RPW` p˜(bbw@ß»Â_ÀÛR¶;њݞ‚Yšëüó˜fŒonßæìÙ³—€Ev–¥EH<È- «`¿;‹Ux¦–êð}L=FÔ/ŒG¶Ö© zܧò÷¯û Ѹz„â/¿N÷±¶¶vè* J éJ.o˜<°à߆¶ðRþ}þº±3 žlÐÓ/LPY³ 2 ¾]ÿ‚˜©ø_ RJ"¥ŒùÕÕ¢€móT$ ø—ð‡'@øÓøhnUvZ5¯²hz*ß{P™Õšy‚þÖO£{ô`ˆàj#¤ ‚«ø® 7Jð‡Aøó´ ×/˜Z ¤D5 ÿ“ݶ€‰Hy¾.Ò¸ß~áÔºvÈUðmþû>üq®àæ\˼Ÿ£ÞÝž½`@3ȶ#uC Cø[Apçù¯GàïÕí•¿Y%àWiøõÁ¦ øZ'¨@íðh·º+¸v]ªÕ4x¥ƒ‹ÆqÐnO¸Få ‘Š'ô² „@ À ªÙ+©à§ò=US™ïoòÔñ„?vPJí¼+¯ )%ÉTŒl' ˆDö@:èi~-¨Ðñ6·(¥lË%.B´‚W ØO YûÁ„ ¾=Oã»ÀvœÐ… Áý  ÉùWA©€¨¾‚x]×m8CÀ¶ù;ŽCµ‚ ŒvòÅb‘™™b±hÝY–E<4;M¶mc¦i¶­Û¹®‹ëº$‰ÐU–RÇ™œœ$7È •6®1 V«aYãã㡼J)#£”"‹áº®×Æ0 ¾ÿþ{Òé4CCC¸®‹a!R¢”Â0 Ö××) <õÔS¸®‹Ã0PJy‚J)¹{÷.®ëÇæaÛv¤<{Ú½½½8p ÔZ”Rôöö’L&I$¸®ËÜÜ'OžlVó¤R)”R|ùå—lllðÊ+¯Ð××@¥R¡^¯“J¥RR*•øê«¯8|ø0(¥p]7Ð"¥”žÒ:¶€NHïÛ( Ð?!¹\Ž;wî`CCC õú'¥¤P(ÍfÉçóôõõµð!X]]Å4M>Œã8ž5ÍÁ‰?MÝ !¨V«¼öÚk¤ÓilÛ]ÁÁAÆÇÇ=‹h&)%£££!( ˜¦ÙPï_ ~Q«{AÍ„¸þ‰¸®K½^G)ÅÈȈ·R–eÛà8®ëbÛ6RJN:åµ·,+Ç4M^|ñE`h… Ø¢ÛÛ¶íYMu½40}ûí·¡|èñ(¥( ,,,„ („ ›ÍR*•BAPA>Ÿ§P(„‚ ìz0Euuj¼$“I<ðÓú'§CQ©(!ŽãD¬4Æ“(øÛ„D]{)%‡â™gžA)Åææ&RJ¼€ëºœ:u*ÒÄ-Ëb``€±±±PíNœ89§Ñ«DÁwƒm¬@¯0Àýû÷™™™iX%½¢xN¾ž½†Ý¡P*•BÐÓÓãtšIçú,˶íУïÏEû‚úˆ[¯×±, Ó4‰Çã^fÖðGepp°%2 £!AD¦i¶õ±X¬­§h—}Žì?ªR£ª4˲¨×묯¯³°°ìj}qqÑk§”bmm7nD†Â+++d³YVVV"CáR©äWͤ²Z­vtpj«€°|€îXÇùýýý^BÄ0 /û ÛP.— Ýú0tèÐ!FFFBCñxÃ0 = 9ŽC&“éJpM¡´Ÿô{2™dhh)%¶m³¶¶ÆÈÈHÃ( ŒŽŽFšx&“a``€áááP½ GŽ åñƒ»uƒ-^@›bT\­ÓØBæçç¹qãFhª;Š:É>é4W;žvs£=ðúœH$H¥R^†ö—F¡‘`Ôð?'''qÇ» œ`íWFÈÏóØÏ†aËå©93¬”"ŸÏ3;;yÈd2¬¬¬ðÓO?…ïÖÖVdÒDƒ`¥Rië.ƒ¨kTJÑßßÏñãÇŽÁŸ¶n‡¦§OŸ¼Õ…mEÞ¹s‡þþ~ïâ3ˆçáǬ¯¯sæÌ™H78==Ýs‚¬cO9Áxûì3çÒ¥KççççïâûÔ3Ðüh4Û¶)‹ÞÅçèè(Õjµaå-Ë"ŸÏGb@­V£T*Q,CCáR©DµZessÓËAø¯Ë›•D/^tÞzë­ósssŸj¡ h{Ÿ¾s9êÿò"È ‹EïÊ,ˆ„Øþn ™L²²²ºz¥R‰Z­Æêê*årÙKƒ7»\Í߬Œ .Øo¿ýö§sssŸ_+´³€æÎšn¹õ+AJÉ?üÀ«¯¾ióóó<ñÄŒ‡zååeÖÖÖ8qâ³³³^†(L°{StáÂçÝwßýßÙÙY-üC¿ð èä<¯Çãܼy“J¥ÂË/¿ÜÕt‚þI‡åXÜÏÓ$¼ýÎ;ïD ¨€æƒÊü´´´D­Vöm‰D¤°JÚûøñÂ?G¿ðï½÷^[áaq€ÂCýçž{ŽR©D"‘hXmíz¢¨ ÑiqÝ—ßýùI÷sñâEçý÷ßÿ¿™™™ó´öx. ,//£”"N“N§Y]]õø¤”lnnòã?Fb@.—ó>™ ss¹›››ôöö²µµåñ6o5!Ÿþ¹óÁ|º#ü—;ÂG&&»²¥àøñã Bùà§Ÿ~:ô»MúN!›ÍFŽÙßßO&“¡VÛö^þï4>\¾|Ù9{öì§333~³ÎÊÒe$H$˜˜˜h×ï¾’v‡…BÁ@„÷Å_8çÎëZxØ#D]x<Ò¿›ÕtõêUçÃ?Ü“ðð˜?–ÞojÎFíÞäD^…* ì Ì5²”’ééigjjꓹ¹¹ŽÐ>Œ"½À?iELOOÛSSSç¯]»ö p“= Aÿ9*„¡¯ºÛ]lü\¤£NÃ0¸råŠ=55õÉõë×µð ±}·Ô¢€\.·þñÇ—…Î?Ó°,K¬¬¬ÈË—/_º~ýúyöAxøÀ‰‰‰É—-Ë:ø(ï7í`’“Édî·y³÷SÐFOƒ@Ï£vþH[À&]¸º(ú´@@£%,=PIEND®B`‚recoll-1.23.7/qtgui/reslist.h0000644000175000017500000001163013125637102012775 00000000000000/* Copyright (C) 2005 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RESLIST_H_INCLUDED_ #define _RESLIST_H_INCLUDED_ #include "autoconfig.h" #include #include #ifdef RESLIST_TEXTBROWSER #include #define RESLIST_PARENTCLASS QTextBrowser #else #include #define RESLIST_PARENTCLASS QWebView #endif #include "docseq.h" #include "sortseq.h" #include "filtseq.h" #include #include "rcldoc.h" #include "reslistpager.h" class RclMain; class QtGuiResListPager; /** * Display a list of document records. The data can be out of the history * manager or from an index query, both abstracted as a DocSequence. */ class ResList : public RESLIST_PARENTCLASS { Q_OBJECT; friend class QtGuiResListPager; public: ResList(QWidget* parent = 0, const char* name = 0); virtual ~ResList(); // Return document for given docnum. We mostly act as an // intermediary to the docseq here, but this has also the // side-effect of making the entry current (visible and // highlighted), and only works if the num is inside the current // page or its immediate neighbours. bool getDoc(int docnum, Rcl::Doc &); bool displayingHistory(); int listId() const {return m_listId;} int pageFirstDocNum(); void setFont(); void setRclMain(RclMain *m, bool ismain); public slots: virtual void setDocSource(std::shared_ptr nsource); virtual void resetList(); // Erase current list virtual void resPageUpOrBack(); // Page up pressed virtual void resPageDownOrNext(); // Page down pressed virtual void resultPageBack(); // Previous page of results virtual void resultPageFirst(); // First page of results virtual void resultPageNext(); // Next (or first) page of results virtual void resultPageFor(int docnum); // Page containing docnum virtual void menuPreview(); virtual void menuSaveToFile(); virtual void menuEdit(); virtual void menuOpenWith(QAction *); virtual void menuCopyFN(); virtual void menuCopyURL(); virtual void menuExpand(); virtual void menuPreviewParent(); virtual void menuOpenParent(); virtual void menuShowSnippets(); virtual void menuShowSubDocs(); virtual void previewExposed(int); virtual void append(const QString &text); virtual void readDocSource(); virtual void highlighted(const QString& link); virtual void createPopupMenu(const QPoint& pos); virtual void showQueryDetails(); signals: void nextPageAvailable(bool); void prevPageAvailable(bool); void docPreviewClicked(int, Rcl::Doc, int); void docSaveToFileClicked(Rcl::Doc); void previewRequested(Rcl::Doc); void showSnippets(Rcl::Doc); void showSubDocs(Rcl::Doc); void editRequested(Rcl::Doc); void openWithRequested(Rcl::Doc, string cmd); void docExpand(Rcl::Doc); void wordSelect(QString); void wordReplace(const QString&, const QString&); void hasResults(int); protected: void keyPressEvent(QKeyEvent *e); void mouseReleaseEvent(QMouseEvent *e); void mouseDoubleClickEvent(QMouseEvent*); protected slots: virtual void languageChange(); virtual void linkWasClicked(const QUrl &); private: QtGuiResListPager *m_pager; std::shared_ptr m_source; int m_popDoc; // Docnum for the popup menu. int m_curPvDoc;// Docnum for current preview int m_lstClckMod; // Last click modifier. int m_listId; // query Id for matching with preview windows #ifdef RESLIST_TEXTBROWSER // Translate from textedit paragraph number to relative // docnum. Built while we insert text into the qtextedit std::map m_pageParaToReldocnums; virtual int docnumfromparnum(int); virtual std::pair parnumfromdocnum(int); #else // Webview makes it more difficult to append text incrementally, // so we store the page and display it when done. QString m_text; #endif RclMain *m_rclmain; bool m_ismainres; virtual void displayPage(); // Display current page static int newListId(); void resetView(); bool scrollIsAtTop(); bool scrollIsAtBottom(); void setupArrows(); }; #endif /* _RESLIST_H_INCLUDED_ */ recoll-1.23.7/qtgui/restable.cpp0000644000175000017500000007256513224431020013451 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "recoll.h" #include #include "docseq.h" #include "log.h" #include "restable.h" #include "guiutils.h" #include "reslistpager.h" #include "reslist.h" #include "rclconfig.h" #include "plaintorich.h" #include "indexer.h" #include "respopup.h" #include "rclmain_w.h" #include "multisave.h" #include "appformime.h" #include "transcode.h" static const QKeySequence quitKeySeq("Ctrl+q"); static const QKeySequence closeKeySeq("Ctrl+w"); // Compensate for the default and somewhat bizarre vertical placement // of text in cells static const int ROWHEIGHTPAD = 2; static const int TEXTINCELLVTRANS = -4; ////////////////////////////////////////////////////////////////////////////// // Restable hiliter: to highlight search term in the table. This is actually // the same as reslist's, could be shared. class PlainToRichQtReslist : public PlainToRich { public: virtual ~PlainToRichQtReslist() {} virtual string startMatch(unsigned int) { return string(""); } virtual string endMatch() {return string("");} }; static PlainToRichQtReslist g_hiliter; ////////////////////////////////////////////////////////////////////////// // Restable "pager". We use it to print details for a document in the // detail area /// class ResTablePager : public ResListPager { public: ResTablePager(ResTable *p) : ResListPager(1), m_parent(p) {} virtual bool append(const string& data, int idx, const Rcl::Doc& doc); virtual string trans(const string& in); virtual const string &parFormat(); virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string iconUrl(RclConfig *, Rcl::Doc& doc); private: ResTable *m_parent; }; bool ResTablePager::append(const string& data, int, const Rcl::Doc&) { m_parent->m_detail->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor); m_parent->m_detail->textCursor().insertBlock(); m_parent->m_detail->insertHtml(QString::fromUtf8(data.c_str())); return true; } string ResTablePager::trans(const string& in) { return string((const char*)ResList::tr(in.c_str()).toUtf8()); } const string& ResTablePager::parFormat() { return prefs.creslistformat; } string ResTablePager::iconUrl(RclConfig *config, Rcl::Doc& doc) { if (doc.ipath.empty()) { vector docs; docs.push_back(doc); vector paths; Rcl::docsToPaths(docs, paths); if (!paths.empty()) { string path; if (thumbPathForUrl(cstr_fileu + paths[0], 128, path)) { return cstr_fileu + path; } } } return ResListPager::iconUrl(config, doc); } ///////////////////////////////////////////////////////////////////////////// /// Detail text area methods ResTableDetailArea::ResTableDetailArea(ResTable* parent) : QTextBrowser(parent), m_table(parent) { setContextMenuPolicy(Qt::CustomContextMenu); connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); } void ResTableDetailArea::createPopupMenu(const QPoint& pos) { if (m_table && m_table->m_model && m_table->m_detaildocnum >= 0) { int opts = m_table->m_ismainres ? ResultPopup::showExpand : 0; opts |= ResultPopup::showSaveOne; QMenu *popup = ResultPopup::create(m_table, opts, m_table->m_model->getDocSource(), m_table->m_detaildoc); popup->popup(mapToGlobal(pos)); } } ////////////////////////////////////////////////////////////////////////////// //// Data model methods //// // Routines used to extract named data from an Rcl::Doc. The basic one // just uses the meta map. Others (ie: the date ones) need to do a // little processing static string gengetter(const string& fld, const Rcl::Doc& doc) { map::const_iterator it = doc.meta.find(fld); if (it == doc.meta.end()) { return string(); } return it->second; } static string sizegetter(const string& fld, const Rcl::Doc& doc) { map::const_iterator it = doc.meta.find(fld); if (it == doc.meta.end()) { return string(); } int64_t size = atoll(it->second.c_str()); return displayableBytes(size) + " (" + it->second + ")"; } static string dategetter(const string&, const Rcl::Doc& doc) { string sdate; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { char datebuf[100]; datebuf[0] = 0; time_t mtime = doc.dmtime.empty() ? atoll(doc.fmtime.c_str()) : atoll(doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); strftime(datebuf, 99, "%Y-%m-%d", tm); transcode(datebuf, sdate, RclConfig::getLocaleCharset(), "UTF-8"); } return sdate; } static string datetimegetter(const string&, const Rcl::Doc& doc) { char datebuf[100]; datebuf[0] = 0; if (!doc.dmtime.empty() || !doc.fmtime.empty()) { time_t mtime = doc.dmtime.empty() ? atoll(doc.fmtime.c_str()) : atoll(doc.dmtime.c_str()); struct tm *tm = localtime(&mtime); strftime(datebuf, 99, prefs.creslistdateformat.c_str(), tm); } return datebuf; } // Static map to translate from internal column names to displayable ones map RecollModel::o_displayableFields; FieldGetter *RecollModel::chooseGetter(const string& field) { if (!stringlowercmp("date", field)) return dategetter; else if (!stringlowercmp("datetime", field)) return datetimegetter; else if (!stringlowercmp("bytes", field.substr(1))) return sizegetter; else return gengetter; } string RecollModel::baseField(const string& field) { if (!stringlowercmp("date", field) || !stringlowercmp("datetime", field)) return "mtime"; else return field; } RecollModel::RecollModel(const QStringList fields, QObject *parent) : QAbstractTableModel(parent), m_ignoreSort(false) { // Initialize the translated map for column headers o_displayableFields["abstract"] = tr("Abstract"); o_displayableFields["author"] = tr("Author"); o_displayableFields["dbytes"] = tr("Document size"); o_displayableFields["dmtime"] = tr("Document date"); o_displayableFields["fbytes"] = tr("File size"); o_displayableFields["filename"] = tr("File name"); o_displayableFields["fmtime"] = tr("File date"); o_displayableFields["ipath"] = tr("Ipath"); o_displayableFields["keywords"] = tr("Keywords"); o_displayableFields["mtype"] = tr("MIME type"); o_displayableFields["origcharset"] = tr("Original character set"); o_displayableFields["relevancyrating"] = tr("Relevancy rating"); o_displayableFields["title"] = tr("Title"); o_displayableFields["url"] = tr("URL"); o_displayableFields["mtime"] = tr("Mtime"); o_displayableFields["date"] = tr("Date"); o_displayableFields["datetime"] = tr("Date and time"); // Add dynamic "stored" fields to the full column list. This // could be protected to be done only once, but it's no real // problem if (theconfig) { const set& stored = theconfig->getStoredFields(); for (set::const_iterator it = stored.begin(); it != stored.end(); it++) { if (o_displayableFields.find(*it) == o_displayableFields.end()) { o_displayableFields[*it] = QString::fromUtf8(it->c_str()); } } } // Construct the actual list of column names for (QStringList::const_iterator it = fields.begin(); it != fields.end(); it++) { m_fields.push_back((const char *)(it->toUtf8())); m_getters.push_back(chooseGetter(m_fields.back())); } g_hiliter.set_inputhtml(false); } int RecollModel::rowCount(const QModelIndex&) const { LOGDEB2("RecollModel::rowCount\n"); if (!m_source) return 0; return m_source->getResCnt(); } int RecollModel::columnCount(const QModelIndex&) const { LOGDEB2("RecollModel::columnCount\n"); return m_fields.size(); } void RecollModel::readDocSource() { LOGDEB("RecollModel::readDocSource()\n"); beginResetModel(); endResetModel(); } void RecollModel::setDocSource(std::shared_ptr nsource) { LOGDEB("RecollModel::setDocSource\n"); if (!nsource) { m_source = std::shared_ptr(); } else { m_source = std::shared_ptr(new DocSource(theconfig, nsource)); m_hdata.clear(); m_source->getTerms(m_hdata); } } void RecollModel::deleteColumn(int col) { if (col > 0 && col < int(m_fields.size())) { vector::iterator it = m_fields.begin(); it += col; m_fields.erase(it); vector::iterator it1 = m_getters.begin(); it1 += col; m_getters.erase(it1); readDocSource(); } } void RecollModel::addColumn(int col, const string& field) { LOGDEB("AddColumn: col " << col << " fld [" << field << "]\n"); if (col >= 0 && col < int(m_fields.size())) { col++; vector::iterator it = m_fields.begin(); vector::iterator it1 = m_getters.begin(); if (col) { it += col; it1 += col; } m_fields.insert(it, field); m_getters.insert(it1, chooseGetter(field)); readDocSource(); } } QVariant RecollModel::headerData(int idx, Qt::Orientation orientation, int role) const { LOGDEB2("RecollModel::headerData: idx " << idx << " orientation " << (orientation == Qt::Vertical ? "vertical":"horizontal") << " role " << role << "\n"); if (orientation == Qt::Vertical && role == Qt::DisplayRole) { return idx; } if (orientation == Qt::Horizontal && role == Qt::DisplayRole && idx < int(m_fields.size())) { map::const_iterator it = o_displayableFields.find(m_fields[idx]); if (it == o_displayableFields.end()) return QString::fromUtf8(m_fields[idx].c_str()); else return it->second; } return QVariant(); } QVariant RecollModel::data(const QModelIndex& index, int role) const { LOGDEB2("RecollModel::data: row " << index.row() << " col " << index.column() << " role " << role << "\n"); if (!m_source || role != Qt::DisplayRole || !index.isValid() || index.column() >= int(m_fields.size())) { return QVariant(); } Rcl::Doc doc; if (!m_source->getDoc(index.row(), doc)) { return QVariant(); } string colname = m_fields[index.column()]; list lr; g_hiliter.plaintorich(m_getters[index.column()](colname, doc), lr, m_hdata); return QString::fromUtf8(lr.front().c_str()); } void RecollModel::saveAsCSV(FILE *fp) { if (!m_source) return; int cols = columnCount(); int rows = rowCount(); vector tokens; for (int col = 0; col < cols; col++) { QString qs = headerData(col, Qt::Horizontal,Qt::DisplayRole).toString(); tokens.push_back((const char *)qs.toUtf8()); } string csv; stringsToCSV(tokens, csv); fprintf(fp, "%s\n", csv.c_str()); tokens.clear(); for (int row = 0; row < rows; row++) { Rcl::Doc doc; if (!m_source->getDoc(row, doc)) { continue; } for (int col = 0; col < cols; col++) { tokens.push_back(m_getters[col](m_fields[col], doc)); } stringsToCSV(tokens, csv); fprintf(fp, "%s\n", csv.c_str()); tokens.clear(); } } // This gets called when the column headers are clicked void RecollModel::sort(int column, Qt::SortOrder order) { if (m_ignoreSort) { return; } LOGDEB("RecollModel::sort(" << column << ", " << order << ")\n"); DocSeqSortSpec spec; if (column >= 0 && column < int(m_fields.size())) { spec.field = m_fields[column]; if (!stringlowercmp("date", spec.field) || !stringlowercmp("datetime", spec.field)) spec.field = "mtime"; spec.desc = order == Qt::AscendingOrder ? false : true; } emit sortDataChanged(spec); } /////////////////////////// // ResTable panel methods // We use a custom delegate to display the cells because the base // tableview's can't handle rich text to highlight the match terms class ResTableDelegate: public QStyledItemDelegate { public: ResTableDelegate(QObject *parent) : QStyledItemDelegate(parent) {} // We might want to optimize by passing the data to the base // method if the text does not contain any term matches. Would // need a modif to plaintorich to return the match count (easy), // and a way to pass an indicator from data(), a bit more // difficult. Anyway, the display seems fast enough as is. void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { QStyleOptionViewItemV4 opt = option; initStyleOption(&opt, index); QVariant value = index.data(Qt::DisplayRole); if (value.isValid() && !value.isNull()) { QString text = value.toString(); if (!text.isEmpty()) { QTextDocument document; painter->save(); if (opt.state & QStyle::State_Selected) { painter->fillRect(opt.rect, opt.palette.highlight()); // Set the foreground color. The pen approach does // not seem to work, probably it's reset by the // textdocument. Couldn't use // setdefaultstylesheet() either. the div thing is // an ugly hack. Works for now #if 0 QPen pen = painter->pen(); pen.setBrush(opt.palette.brush(QPalette::HighlightedText)); painter->setPen(pen); #else text = QString::fromUtf8("

") + text + QString::fromUtf8("
"); #endif } painter->setClipRect(option.rect); QPoint where = option.rect.topLeft(); where.ry() += TEXTINCELLVTRANS; painter->translate(where); document.setHtml(text); document.drawContents(painter); painter->restore(); return; } } QStyledItemDelegate::paint(painter, option, index); } }; void ResTable::init() { if (!(m_model = new RecollModel(prefs.restableFields))) return; tableView->setModel(m_model); tableView->setMouseTracking(true); tableView->setSelectionBehavior(QAbstractItemView::SelectRows); tableView->setItemDelegate(new ResTableDelegate(this)); tableView->setContextMenuPolicy(Qt::CustomContextMenu); new QShortcut(QKeySequence("Ctrl+o"), this, SLOT(menuEdit())); new QShortcut(QKeySequence("Ctrl+Shift+o"), this, SLOT(menuEditAndQuit())); new QShortcut(QKeySequence("Ctrl+d"), this, SLOT(menuPreview())); connect(tableView, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createPopupMenu(const QPoint&))); QHeaderView *header = tableView->horizontalHeader(); if (header) { if (int(prefs.restableColWidths.size()) == header->count()) { for (int i = 0; i < header->count(); i++) { header->resizeSection(i, prefs.restableColWidths[i]); } } header->setSortIndicatorShown(true); header->setSortIndicator(-1, Qt::AscendingOrder); header->setContextMenuPolicy(Qt::CustomContextMenu); header->setStretchLastSection(1); connect(header, SIGNAL(sectionResized(int,int,int)), this, SLOT(saveColState())); connect(header, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(createHeaderPopupMenu(const QPoint&))); } #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) header->setSectionsMovable(true); #else header->setMovable(true); #endif header = tableView->verticalHeader(); if (header) { header->setDefaultSectionSize(QApplication::fontMetrics().height() + ROWHEIGHTPAD); } QKeySequence seq("Esc"); QShortcut *sc = new QShortcut(seq, this); connect(sc, SIGNAL(activated()), tableView->selectionModel(), SLOT(clear())); connect(tableView->selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex &)), this, SLOT(onTableView_currentChanged(const QModelIndex&))); connect(tableView, SIGNAL(doubleClicked(const QModelIndex&)), this, SLOT(onDoubleClick(const QModelIndex&))); m_pager = new ResTablePager(this); QSettings settings; QVariant saved = settings.value("resTableSplitterSizes"); if (saved != QVariant()) { splitter->restoreState(saved.toByteArray()); } else { QList sizes; sizes << 355 << 125; splitter->setSizes(sizes); } delete textBrowser; m_detail = new ResTableDetailArea(this); m_detail->setReadOnly(true); m_detail->setUndoRedoEnabled(false); m_detail->setOpenLinks(false); // signals and slots connections connect(m_detail, SIGNAL(anchorClicked(const QUrl &)), this, SLOT(linkWasClicked(const QUrl &))); splitter->addWidget(m_detail); splitter->setOrientation(Qt::Vertical); } void ResTable::setRclMain(RclMain *m, bool ismain) { m_rclmain = m; m_ismainres = ismain; // We allow single selection only in the main table because this // may have a mix of file-level docs and subdocs and multisave // only works for subdocs if (m_ismainres) tableView->setSelectionMode(QAbstractItemView::SingleSelection); else tableView->setSelectionMode(QAbstractItemView::ExtendedSelection); if (!m_ismainres) { connect(new QShortcut(closeKeySeq, this), SIGNAL (activated()), this, SLOT (close())); connect(new QShortcut(quitKeySeq, this), SIGNAL (activated()), m_rclmain, SLOT (fileExit())); connect(this, SIGNAL(previewRequested(Rcl::Doc)), m_rclmain, SLOT(startPreview(Rcl::Doc))); connect(this, SIGNAL(docSaveToFileClicked(Rcl::Doc)), m_rclmain, SLOT(saveDocToFile(Rcl::Doc))); connect(this, SIGNAL(editRequested(Rcl::Doc)), m_rclmain, SLOT(startNativeViewer(Rcl::Doc))); } } int ResTable::getDetailDocNumOrTopRow() { if (m_detaildocnum >= 0) return m_detaildocnum; QModelIndex modelIndex = tableView->indexAt(QPoint(0, 0)); return modelIndex.row(); } void ResTable::makeRowVisible(int row) { LOGDEB("ResTable::showRow(" << row << ")\n"); QModelIndex modelIndex = m_model->index(row, 0); tableView->scrollTo(modelIndex, QAbstractItemView::PositionAtTop); tableView->selectionModel()->clear(); m_detail->clear(); m_detaildocnum = -1; } // This is called by rclmain_w prior to exiting void ResTable::saveColState() { if (!m_ismainres) return; QSettings settings; settings.setValue("resTableSplitterSizes", splitter->saveState()); QHeaderView *header = tableView->horizontalHeader(); const vector& vf = m_model->getFields(); if (!header) { LOGERR("ResTable::saveColState: no table header ??\n"); return; } // Remember the current column order. Walk in visual order and // create new list QStringList newfields; vector newwidths; for (int vi = 0; vi < header->count(); vi++) { int li = header->logicalIndex(vi); if (li < 0 || li >= int(vf.size())) { LOGERR("saveColState: logical index beyond list size!\n"); continue; } newfields.push_back(QString::fromUtf8(vf[li].c_str())); newwidths.push_back(header->sectionSize(li)); } prefs.restableFields = newfields; prefs.restableColWidths = newwidths; } void ResTable::onTableView_currentChanged(const QModelIndex& index) { LOGDEB2("ResTable::onTableView_currentChanged(" << index.row() << ", " << index.column() << ")\n"); if (!m_model || !m_model->getDocSource()) return; Rcl::Doc doc; if (m_model->getDocSource()->getDoc(index.row(), doc)) { m_detail->clear(); m_detaildocnum = index.row(); m_detaildoc = doc; m_pager->displayDoc(theconfig, index.row(), m_detaildoc, m_model->m_hdata); } else { m_detaildocnum = -1; } } void ResTable::on_tableView_entered(const QModelIndex& index) { LOGDEB2("ResTable::on_tableView_entered(" << index.row() << ", " << index.column() << ")\n"); if (!tableView->selectionModel()->hasSelection()) onTableView_currentChanged(index); } void ResTable::takeFocus() { // LOGDEB("resTable: take focus\n"); tableView->setFocus(Qt::ShortcutFocusReason); } void ResTable::setDocSource(std::shared_ptr nsource) { LOGDEB("ResTable::setDocSource\n"); if (m_model) m_model->setDocSource(nsource); if (m_pager) m_pager->setDocSource(nsource, 0); if (m_detail) m_detail->clear(); m_detaildocnum = -1; } void ResTable::resetSource() { LOGDEB("ResTable::resetSource\n"); setDocSource(std::shared_ptr()); } void ResTable::saveAsCSV() { LOGDEB("ResTable::saveAsCSV\n"); if (!m_model) return; QString s = QFileDialog::getSaveFileName(this, //parent tr("Save table to CSV file"), QString::fromLocal8Bit(path_home().c_str()) ); if (s.isEmpty()) return; const char *tofile = s.toLocal8Bit(); FILE *fp = fopen(tofile, "w"); if (fp == 0) { QMessageBox::warning(0, "Recoll", tr("Can't open/create file: ") + s); return; } m_model->saveAsCSV(fp); fclose(fp); } // This is called when the sort order is changed from another widget void ResTable::onSortDataChanged(DocSeqSortSpec spec) { LOGDEB("ResTable::onSortDataChanged: [" << spec.field << "] desc " << spec.desc << "\n"); QHeaderView *header = tableView->horizontalHeader(); if (!header || !m_model) return; // Check if the specified field actually matches one of columns // and set indicator m_model->setIgnoreSort(true); bool matched = false; const vector fields = m_model->getFields(); for (unsigned int i = 0; i < fields.size(); i++) { if (!spec.field.compare(m_model->baseField(fields[i]))) { header->setSortIndicator(i, spec.desc ? Qt::DescendingOrder : Qt::AscendingOrder); matched = true; } } if (!matched) header->setSortIndicator(-1, Qt::AscendingOrder); m_model->setIgnoreSort(false); } void ResTable::resetSort() { LOGDEB("ResTable::resetSort()\n"); QHeaderView *header = tableView->horizontalHeader(); if (header) header->setSortIndicator(-1, Qt::AscendingOrder); // the model's sort slot is not called by qt in this case (qt 4.7) if (m_model) m_model->sort(-1, Qt::AscendingOrder); } void ResTable::readDocSource(bool resetPos) { LOGDEB("ResTable::readDocSource(" << resetPos << ")\n"); if (resetPos) tableView->verticalScrollBar()->setSliderPosition(0); m_model->readDocSource(); m_detail->clear(); m_detaildocnum = -1; } void ResTable::linkWasClicked(const QUrl &url) { if (m_detaildocnum < 0) { return; } QString s = url.toString(); const char *ascurl = s.toUtf8(); LOGDEB("ResTable::linkWasClicked: [" << ascurl << "]\n"); int i = atoi(ascurl+1) -1; int what = ascurl[0]; switch (what) { // Open abstract/snippets window case 'A': if (m_detaildocnum >= 0) emit(showSnippets(m_detaildoc)); break; case 'D': { vector dups; if (m_detaildocnum >= 0 && m_rclmain && m_model->getDocSource()->docDups(m_detaildoc, dups)) { m_rclmain->newDupsW(m_detaildoc, dups); } } break; // Open parent folder case 'F': { emit editRequested(ResultPopup::getParent(std::shared_ptr(), m_detaildoc)); } break; case 'P': case 'E': { if (what == 'P') { if (m_ismainres) { emit docPreviewClicked(i, m_detaildoc, 0); } else { emit previewRequested(m_detaildoc); } } else { emit editRequested(m_detaildoc); } } break; // Run script. Link format Rnn|Script Name case 'R': { int bar = s.indexOf("|"); if (bar == -1 || bar >= s.size()-1) break; string cmdname = qs2utf8s(s.right(s.size() - (bar + 1))); DesktopDb ddb(path_cat(theconfig->getConfDir(), "scripts")); DesktopDb::AppDef app; if (ddb.appByName(cmdname, app)) { QAction act(QString::fromUtf8(app.name.c_str()), this); QVariant v(QString::fromUtf8(app.command.c_str())); act.setData(v); menuOpenWith(&act); } } break; default: LOGERR("ResTable::linkWasClicked: bad link [" << ascurl << "]\n"); break;// ?? } } void ResTable::onDoubleClick(const QModelIndex& index) { if (!m_model || !m_model->getDocSource()) return; Rcl::Doc doc; if (m_model->getDocSource()->getDoc(index.row(), doc)) { m_detail->clear(); m_detaildocnum = index.row(); m_detaildoc = doc; if (m_detaildocnum >= 0) emit editRequested(m_detaildoc); } else { m_detaildocnum = -1; } } void ResTable::createPopupMenu(const QPoint& pos) { LOGDEB("ResTable::createPopupMenu: m_detaildocnum " << m_detaildocnum << "\n"); if (m_detaildocnum >= 0 && m_model) { int opts = m_ismainres? ResultPopup::isMain : 0; int selsz = tableView->selectionModel()->selectedRows().size(); if (selsz == 1) { opts |= ResultPopup::showSaveOne; } else if (selsz > 1 && !m_ismainres) { // We don't show save multiple for the main list because not all // docs are necessary subdocs and multisave only works with those. opts |= ResultPopup::showSaveSel; } QMenu *popup = ResultPopup::create(this, opts, m_model->getDocSource(), m_detaildoc); popup->popup(mapToGlobal(pos)); } } void ResTable::menuPreview() { if (m_detaildocnum >= 0) { if (m_ismainres) { emit docPreviewClicked(m_detaildocnum, m_detaildoc, 0); } else { emit previewRequested(m_detaildoc); } } } void ResTable::menuSaveToFile() { if (m_detaildocnum >= 0) emit docSaveToFileClicked(m_detaildoc); } void ResTable::menuSaveSelection() { if (m_model == 0 || !m_model->getDocSource()) return; QModelIndexList indexl = tableView->selectionModel()->selectedRows(); vector v; for (int i = 0; i < indexl.size(); i++) { Rcl::Doc doc; if (m_model->getDocSource()->getDoc(indexl[i].row(), doc)) v.push_back(doc); } if (v.size() == 0) { return; } else if (v.size() == 1) { emit docSaveToFileClicked(v[0]); } else { multiSave(this, v); } } void ResTable::menuPreviewParent() { if (m_detaildocnum >= 0 && m_model && m_model->getDocSource()) { Rcl::Doc pdoc = ResultPopup::getParent(m_model->getDocSource(), m_detaildoc); if (pdoc.mimetype == "inode/directory") { emit editRequested(pdoc); } else { emit previewRequested(pdoc); } } } void ResTable::menuOpenParent() { if (m_detaildocnum >= 0 && m_model && m_model->getDocSource()) emit editRequested( ResultPopup::getParent(m_model->getDocSource(), m_detaildoc)); } void ResTable::menuEdit() { if (m_detaildocnum >= 0) emit editRequested(m_detaildoc); } void ResTable::menuEditAndQuit() { if (m_detaildocnum >= 0) { emit editRequested(m_detaildoc); m_rclmain->fileExit(); } } void ResTable::menuOpenWith(QAction *act) { if (act == 0) return; string cmd = qs2utf8s(act->data().toString()); if (m_detaildocnum >= 0) emit openWithRequested(m_detaildoc, cmd); } void ResTable::menuCopyFN() { if (m_detaildocnum >= 0) ResultPopup::copyFN(m_detaildoc); } void ResTable::menuCopyURL() { if (m_detaildocnum >= 0) ResultPopup::copyURL(m_detaildoc); } void ResTable::menuExpand() { if (m_detaildocnum >= 0) emit docExpand(m_detaildoc); } void ResTable::menuShowSnippets() { if (m_detaildocnum >= 0) emit showSnippets(m_detaildoc); } void ResTable::menuShowSubDocs() { if (m_detaildocnum >= 0) emit showSubDocs(m_detaildoc); } void ResTable::createHeaderPopupMenu(const QPoint& pos) { LOGDEB("ResTable::createHeaderPopupMenu(" << pos.x() << ", " << pos.y() << ")\n"); QHeaderView *header = tableView->horizontalHeader(); if (!header || !m_model) return; m_popcolumn = header->logicalIndexAt(pos); if (m_popcolumn < 0) return; const map& allfields = m_model->getAllFields(); const vector& fields = m_model->getFields(); QMenu *popup = new QMenu(this); popup->addAction(tr("&Reset sort"), this, SLOT(resetSort())); popup->addSeparator(); popup->addAction(tr("&Save as CSV"), this, SLOT(saveAsCSV())); popup->addSeparator(); popup->addAction(tr("&Delete column"), this, SLOT(deleteColumn())); popup->addSeparator(); QAction *act; for (map::const_iterator it = allfields.begin(); it != allfields.end(); it++) { if (std::find(fields.begin(), fields.end(), it->first) != fields.end()) continue; act = new QAction(tr("Add \"%1\" column").arg(it->second), popup); act->setData(QString::fromUtf8(it->first.c_str())); connect(act, SIGNAL(triggered(bool)), this , SLOT(addColumn())); popup->addAction(act); } popup->popup(mapToGlobal(pos)); } void ResTable::deleteColumn() { if (m_model) m_model->deleteColumn(m_popcolumn); } void ResTable::addColumn() { if (!m_model) return; QAction *action = (QAction *)sender(); LOGDEB("addColumn: text " << qs2utf8s(action->text()) << ", data " << qs2utf8s(action->data().toString()) << "\n"); m_model->addColumn(m_popcolumn, qs2utf8s(action->data().toString())); } recoll-1.23.7/qtgui/rtitool.h0000644000175000017500000000235513125527323013013 00000000000000/* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _RTITOOL_W_H_INCLUDED_ #define _RTITOOL_W_H_INCLUDED_ #include "ui_rtitool.h" class QPushButton; class RTIToolW : public QDialog, public Ui::RTIToolW { Q_OBJECT public: RTIToolW(QWidget * parent = 0) : QDialog(parent) { setupUi(this); init(); } public slots: #ifdef _WIN32 void sesclicked(bool) {} void accept() {} private: void init() {} #else void sesclicked(bool); void accept(); private: void init(); #endif }; #endif /* _RTITOOL_W_H_INCLUDED_ */ recoll-1.23.7/qtgui/preview_plaintorich.h0000644000175000017500000000447013125637102015371 00000000000000/* Copyright (C) 2015 J.F.Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _PREVIEW_PLAINTORICH_H_INCLUDED_ #define _PREVIEW_PLAINTORICH_H_INCLUDED_ #include "autoconfig.h" #include #include #include #include #include #include #include "plaintorich.h" /** Preview text highlighter */ class PlainToRichQtPreview : public PlainToRich { public: PlainToRichQtPreview(); void clear(); bool haveAnchors(); virtual string header(); virtual string startMatch(unsigned int grpidx); virtual string endMatch(); virtual string termAnchorName(int i) const; virtual string startChunk(); int nextAnchorNum(int grpidx); int prevAnchorNum(int grpidx); QString curAnchorName() const; private: int m_curanchor; int m_lastanchor; // Lists of anchor numbers (match locations) for the term (groups) // in the query (the map key is and index into HighlightData.groups). std::map > m_groupanchors; std::map m_groupcuranchors; }; /* A thread to convert to rich text (mark search terms) */ class ToRichThread : public QThread { Q_OBJECT; public: ToRichThread(const string &i, const HighlightData& hd, std::shared_ptr ptr, QStringList& qrichlst, // Output QObject *parent = 0); virtual void run(); private: const string &m_input; const HighlightData &m_hdata; std::shared_ptr m_ptr; QStringList &m_output; }; #endif /* _PREVIEW_PLAINTORICH_H_INCLUDED_ */ recoll-1.23.7/qtgui/guiutils.cpp0000644000175000017500000004017013125637102013511 00000000000000/* Copyright (C) 2005 Jean-Francois Dockes * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the * Free Software Foundation, Inc., * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "autoconfig.h" #include #include #include "recoll.h" #include "log.h" #include "smallut.h" #include "guiutils.h" #include "pathut.h" #include "base64.h" #include "advshist.h" #include #include RclDynConf *g_dynconf; AdvSearchHist *g_advshistory; RclConfig *theconfig; // The table should not be necessary, but I found no css way to get // qt 4.6 qtextedit to clear the margins after the float img without // introducing blank space. const char *PrefsPack::dfltResListFormat = "\n" "\n" "\n" "\n" "
%L  %S   %T
\n" "%M %D    %U %i
\n" "%A %K
\n" ; // The global preferences structure PrefsPack prefs; // Using the same macro to read/write a setting. insurance against typing // mistakes #define PARS(X) (X) #define SETTING_RW(var, nm, tp, def) \ if (writing) { \ settings.setValue(nm , var); \ } else { \ var = settings.value(nm, def).to##tp \ (); \ } /** * Saving and restoring user preferences. These are stored in a global * structure during program execution and saved to disk using the QT * settings mechanism */ /* Remember if settings were actually read (to avoid writing them if * we stopped before reading them (else some kinds of errors would reset * the qt/recoll settings to defaults) */ static bool havereadsettings; void rwSettings(bool writing) { LOGDEB1("rwSettings: write " << (int(writing)) << "\n" ); if (writing && !havereadsettings) return; QSettings settings("Recoll.org", "recoll"); SETTING_RW(prefs.mainwidth, "/Recoll/geometry/width", Int, 0); SETTING_RW(prefs.mainheight, "/Recoll/geometry/height", Int, 0); SETTING_RW(prefs.pvwidth, "/Recoll/geometry/pvwidth", Int, 0); SETTING_RW(prefs.pvheight, "/Recoll/geometry/pvheight", Int, 0); SETTING_RW(prefs.toolArea, "/Recoll/geometry/toolArea", Int, 0); SETTING_RW(prefs.resArea, "/Recoll/geometry/resArea", Int, 0); SETTING_RW(prefs.ssearchTypSav, "/Recoll/prefs/ssearchTypSav", Bool, 0); SETTING_RW(prefs.ssearchTyp, "/Recoll/prefs/simpleSearchTyp", Int, 3); SETTING_RW(prefs.startWithAdvSearchOpen, "/Recoll/prefs/startWithAdvSearchOpen", Bool, false); SETTING_RW(prefs.previewHtml, "/Recoll/prefs/previewHtml", Bool, true); QString advSearchClauses; const int maxclauselistsize = 20; if (writing) { // Limit clause list size to non-absurd size if (prefs.advSearchClauses.size() > maxclauselistsize) { prefs.advSearchClauses.resize(maxclauselistsize); } for (auto clause : prefs.advSearchClauses) { char buf[20]; sprintf(buf, "%d ", clause); advSearchClauses += QString::fromUtf8(buf); } } QString ascdflt; SETTING_RW(advSearchClauses, "/Recoll/prefs/adv/clauseList", String, ascdflt); if (!writing) { vector clauses; stringToStrings(qs2utf8s(advSearchClauses), clauses); // There was a long-lurking bug where the clause list was // growing to absurd sizes. The prefs.advSearchClauses clear() // call was missing (ok with the now false initial assumption // that the prefs were read once per session), which was // causing a doubling of the size each time the prefs were // read. Should be fixed, but in any case, limit the clause // list to a non-absurd size. if (clauses.size() > maxclauselistsize) { clauses.resize(maxclauselistsize); } prefs.advSearchClauses.clear(); prefs.advSearchClauses.reserve(clauses.size()); for (auto clause : clauses) { prefs.advSearchClauses.push_back(atoi(clause.c_str())); } } SETTING_RW(prefs.ssearchOnWS, "/Recoll/prefs/reslist/autoSearchOnWS", Bool, false); SETTING_RW(prefs.ssearchNoComplete, "/Recoll/prefs/ssearch/noComplete", Bool, false); SETTING_RW(prefs.ssearchAsYouType, "/Recoll/prefs/ssearch/asYouType", Bool, false); SETTING_RW(prefs.filterCtlStyle, "/Recoll/prefs/filterCtlStyle", Int, 0); SETTING_RW(prefs.ssearchAutoPhrase, "/Recoll/prefs/ssearchAutoPhrase", Bool, true); SETTING_RW(prefs.ssearchAutoPhraseThreshPC, "/Recoll/prefs/ssearchAutoPhraseThreshPC", Double, 2.0); SETTING_RW(prefs.respagesize, "/Recoll/prefs/reslist/pagelen", Int, 8); SETTING_RW(prefs.collapseDuplicates, "/Recoll/prefs/reslist/collapseDuplicates", Bool, false); SETTING_RW(prefs.showResultsAsTable, "/Recoll/prefs/showResultsAsTable", Bool, false); SETTING_RW(prefs.maxhltextmbs, "/Recoll/prefs/preview/maxhltextmbs", Int, 3); SETTING_RW(prefs.previewPlainPre, "/Recoll/prefs/preview/plainPre", Int, PrefsPack::PP_PREWRAP); // History: used to be able to only set a bare color name. Can now // set any CSS style. Hack on ':' presence to keep compat with old // values SETTING_RW(prefs.qtermstyle, "/Recoll/prefs/qtermcolor", String, "color: blue"); if (!writing && prefs.qtermstyle == "") prefs.qtermstyle = "color: blue"; { // histo compatibility hack int colon = prefs.qtermstyle.indexOf(":"); int semi = prefs.qtermstyle.indexOf(";"); // The 2nd part of the test is to keep compat with the // injection hack of the 1st user who suggested this (had // #ff5000;font-size:110%;... in 'qtermcolor') if (colon == -1 || (colon != -1 && semi != -1 && semi < colon)) { prefs.qtermstyle = QString::fromUtf8("color: ") + prefs.qtermstyle; } } // Abstract snippet separator SETTING_RW(prefs.abssep, "/Recoll/prefs/reslist/abssep", String,"…"); if (!writing && prefs.abssep == "") prefs.abssep = "…"; SETTING_RW(prefs.reslistdateformat, "/Recoll/prefs/reslist/dateformat", String," %Y-%m-%d %H:%M:%S %z"); if (!writing && prefs.reslistdateformat == "") prefs.reslistdateformat = " %Y-%m-%d %H:%M:%S %z"; prefs.creslistdateformat = (const char*)prefs.reslistdateformat.toUtf8(); SETTING_RW(prefs.reslistfontfamily, "/Recoll/prefs/reslist/fontFamily", String, ""); SETTING_RW(prefs.reslistfontsize, "/Recoll/prefs/reslist/fontSize", Int, 10); QString rlfDflt = QString::fromUtf8(prefs.dfltResListFormat); if (writing) { if (prefs.reslistformat.compare(rlfDflt)) { settings.setValue("/Recoll/prefs/reslist/format", prefs.reslistformat); } else { settings.remove("/Recoll/prefs/reslist/format"); } } else { prefs.reslistformat = settings.value("/Recoll/prefs/reslist/format", rlfDflt).toString(); prefs.creslistformat = qs2utf8s(prefs.reslistformat); } SETTING_RW(prefs.reslistheadertext, "/Recoll/prefs/reslist/headertext", String, ""); SETTING_RW(prefs.qssFile, "/Recoll/prefs/stylesheet", String, ""); SETTING_RW(prefs.snipCssFile, "/Recoll/prefs/snippets/cssfile", String, ""); SETTING_RW(prefs.queryStemLang, "/Recoll/prefs/query/stemLang", String, "english"); SETTING_RW(prefs.useDesktopOpen, "/Recoll/prefs/useDesktopOpen", Bool, true); SETTING_RW(prefs.keepSort, "/Recoll/prefs/keepSort", Bool, false); SETTING_RW(prefs.sortField, "/Recoll/prefs/sortField", String, ""); SETTING_RW(prefs.sortActive, "/Recoll/prefs/sortActive", Bool, false); SETTING_RW(prefs.sortDesc, "/Recoll/prefs/query/sortDesc", Bool, 0); if (!writing) { // Handle transition from older prefs which did not store sortColumn // (Active always meant sort by date). if (prefs.sortActive && prefs.sortField.isNull()) prefs.sortField = "mtime"; } SETTING_RW(prefs.queryBuildAbstract, "/Recoll/prefs/query/buildAbstract", Bool, true); SETTING_RW(prefs.queryReplaceAbstract, "/Recoll/prefs/query/replaceAbstract", Bool, false); SETTING_RW(prefs.syntAbsLen, "/Recoll/prefs/query/syntAbsLen", Int, 250); SETTING_RW(prefs.syntAbsCtx, "/Recoll/prefs/query/syntAbsCtx", Int, 4); SETTING_RW(prefs.autoSuffs, "/Recoll/prefs/query/autoSuffs", String, ""); SETTING_RW(prefs.autoSuffsEnable, "/Recoll/prefs/query/autoSuffsEnable", Bool, false); SETTING_RW(prefs.synFileEnable, "/Recoll/prefs/query/synFileEnable", Bool, false); SETTING_RW(prefs.synFile, "/Recoll/prefs/query/synfile", String, ""); SETTING_RW(prefs.termMatchType, "/Recoll/prefs/query/termMatchType", Int, 0); // This is not really the current program version, just a value to // be used in case we have incompatible changes one day SETTING_RW(prefs.rclVersion, "/Recoll/prefs/rclVersion", Int, 1009); // Ssearch combobox history list if (writing) { settings.setValue("/Recoll/prefs/query/ssearchHistory", prefs.ssearchHistory); } else { prefs.ssearchHistory = settings.value("/Recoll/prefs/query/ssearchHistory").toStringList(); } // Ignored file types (advanced search) if (writing) { settings.setValue("/Recoll/prefs/query/asearchIgnFilTyps", prefs.asearchIgnFilTyps); } else { prefs.asearchIgnFilTyps = settings.value("/Recoll/prefs/query/asearchIgnFilTyps").toStringList(); } // Field list for the restable if (writing) { settings.setValue("/Recoll/prefs/query/restableFields", prefs.restableFields); } else { prefs.restableFields = settings.value("/Recoll/prefs/query/restableFields").toStringList(); if (prefs.restableFields.empty()) { prefs.restableFields.push_back("date"); prefs.restableFields.push_back("title"); prefs.restableFields.push_back("filename"); prefs.restableFields.push_back("author"); prefs.restableFields.push_back("url"); } } // restable col widths QString rtcw; if (writing) { for (vector::iterator it = prefs.restableColWidths.begin(); it != prefs.restableColWidths.end(); it++) { char buf[20]; sprintf(buf, "%d ", *it); rtcw += QString::fromUtf8(buf); } } SETTING_RW(rtcw, "/Recoll/prefs/query/restableWidths", String, "83 253 132 172 130 "); if (!writing) { vector widths; stringToStrings((const char *)rtcw.toUtf8(), widths); for (vector::iterator it = widths.begin(); it != widths.end(); it++) { prefs.restableColWidths.push_back(atoi(it->c_str())); } } SETTING_RW(prefs.fileTypesByCats, "/Recoll/prefs/query/asearchFilTypByCat", Bool, false); SETTING_RW(prefs.showTrayIcon, "/Recoll/prefs/showTrayIcon", Bool, false); SETTING_RW(prefs.closeToTray, "/Recoll/prefs/closeToTray", Bool, false); SETTING_RW(prefs.showTempFileWarning, "Recoll/prefs/showTempFileWarning", Int, -1); if (g_dynconf == 0) { // Happens return; } // The extra databases settings. These are stored as a list of // xapian directory names, encoded in base64 to avoid any // binary/charset conversion issues. There are 2 lists for all // known dbs and active (searched) ones. // When starting up, we also add from the RECOLL_EXTRA_DBS environment // variable. // This are stored inside the dynamic configuration file (aka: history), // as they are likely to depend on RECOLL_CONFDIR. if (writing) { g_dynconf->eraseAll(allEdbsSk); for (list::const_iterator it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { g_dynconf->enterString(allEdbsSk, *it); } g_dynconf->eraseAll(actEdbsSk); for (list::const_iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { g_dynconf->enterString(actEdbsSk, *it); } } else { prefs.allExtraDbs = g_dynconf->getStringList(allEdbsSk); const char *cp; if ((cp = getenv("RECOLL_EXTRA_DBS")) != 0) { vector dbl; stringToTokens(cp, dbl, ":"); for (vector::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.allExtraDbs.begin(), prefs.allExtraDbs.end(), dbdir) != prefs.allExtraDbs.end()) continue; bool stripped; if (!Rcl::Db::testDbDir(dbdir, &stripped)) { LOGERR("Not a xapian index: [" << (dbdir) << "]\n" ); continue; } if (stripped != o_index_stripchars) { LOGERR("Incompatible character stripping: [" << (dbdir) << "]\n" ); continue; } prefs.allExtraDbs.push_back(dbdir); } } // Get the remembered "active external indexes": prefs.activeExtraDbs = g_dynconf->getStringList(actEdbsSk); // Clean up the list: remove directories which are not // actually there: useful for removable volumes. for (list::iterator it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end();) { bool stripped; if (!Rcl::Db::testDbDir(*it, &stripped) || stripped != o_index_stripchars) { LOGINFO("Not a Xapian index or char stripping differs: [" << *it << "]\n" ); it = prefs.activeExtraDbs.erase(it); } else { it++; } } // Get active db directives from the environment. This can only add to // the remembered and cleaned up list const char *cp4Act; if ((cp4Act = getenv("RECOLL_ACTIVE_EXTRA_DBS")) != 0) { vector dbl; stringToTokens(cp4Act, dbl, ":"); for (vector::iterator dit = dbl.begin(); dit != dbl.end(); dit++) { string dbdir = path_canon(*dit); path_catslash(dbdir); if (std::find(prefs.activeExtraDbs.begin(), prefs.activeExtraDbs.end(), dbdir) != prefs.activeExtraDbs.end()) continue; bool strpd; if (!Rcl::Db::testDbDir(dbdir, &strpd) || strpd != o_index_stripchars) { LOGERR("Not a Xapian dir or diff. char stripping: [" << (dbdir) << "]\n" ); continue; } prefs.activeExtraDbs.push_back(dbdir); } //for } //if } #if 0 { list::const_iterator it; fprintf(stderr, "All extra Dbs:\n"); for (it = prefs.allExtraDbs.begin(); it != prefs.allExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } fprintf(stderr, "Active extra Dbs:\n"); for (it = prefs.activeExtraDbs.begin(); it != prefs.activeExtraDbs.end(); it++) { fprintf(stderr, " [%s]\n", it->c_str()); } } #endif const string asbdSk = "asearchSbd"; if (writing) { while (prefs.asearchSubdirHist.size() > 20) prefs.asearchSubdirHist.pop_back(); g_dynconf->eraseAll(asbdSk); for (QStringList::iterator it = prefs.asearchSubdirHist.begin(); it != prefs.asearchSubdirHist.end(); it++) { g_dynconf->enterString(asbdSk, (const char *)((*it).toUtf8())); } } else { list tl = g_dynconf->getStringList(asbdSk); for (list::iterator it = tl.begin(); it != tl.end(); it++) prefs.asearchSubdirHist.push_front(QString::fromUtf8(it->c_str())); } if (!writing) havereadsettings = true; } string PrefsPack::stemlang() { string stemLang(qs2utf8s(prefs.queryStemLang)); if (stemLang == "ALL") { if (theconfig) theconfig->getConfParam("indexstemminglanguages", stemLang); else stemLang = ""; } return stemLang; }