Akonadi Search

xapiantermgenerator.cpp
1 /*
2  * SPDX-FileCopyrightText: 2014 Vishesh Handa <[email protected]>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 
8 #include "xapiantermgenerator.h"
9 
10 #include "akonadi_search_xapian_debug.h"
11 #include <QTextBoundaryFinder>
12 
13 using namespace Akonadi::Search;
14 
15 XapianTermGenerator::XapianTermGenerator(Xapian::Document *doc)
16  : m_doc(doc)
17 {
18  if (doc) {
19  m_termGen.set_document(*doc);
20  }
21 }
22 
23 void XapianTermGenerator::indexText(const QString &text)
24 {
25  indexText(text, QString());
26 }
27 
28 void XapianTermGenerator::setDocument(Xapian::Document *doc)
29 {
30  m_doc = doc;
31 }
32 
33 QStringList XapianTermGenerator::termList(const QString &text)
34 {
35  int start = 0;
36  int end = 0;
37 
40  for (; bf.position() != -1; bf.toNextBoundary()) {
41  if (bf.boundaryReasons() & QTextBoundaryFinder::StartOfItem) {
42  start = bf.position();
43  continue;
44  } else if (bf.boundaryReasons() & QTextBoundaryFinder::EndOfItem) {
45  end = bf.position();
46 
47  QString str = text.mid(start, end - start);
48 
49  // Get the string ready for saving
50  str = str.toLower();
51 
52  // Remove all accents
53  const QString denormalized = str.normalized(QString::NormalizationForm_KD);
54 
55  QString cleanString;
56  cleanString.reserve(denormalized.size());
57  for (const QChar &ch : denormalized) {
58  const auto cat = ch.category();
60  cleanString.append(ch);
61  }
62  }
63 
64  str = cleanString.normalized(QString::NormalizationForm_KC);
66  }
67  }
68 
69  return list;
70 }
71 
72 void XapianTermGenerator::indexText(const QString &text, const QString &prefix, int wdfInc)
73 {
74  const QByteArray par = prefix.toUtf8();
75  const QByteArray ta = text.toUtf8();
76  m_termGen.index_text(ta.constData(), wdfInc, par.constData());
77 
78  const QStringList terms = termList(text);
79  for (const QString &term : terms) {
80  const QByteArray arr = term.toUtf8();
81 
82  const QByteArray finalArr = par + arr;
83  const std::string stdString(finalArr.constData(), finalArr.size());
84  m_doc->add_posting(stdString, m_position, wdfInc);
85 
86  m_position++;
87  }
88 }
89 
90 int XapianTermGenerator::position() const
91 {
92  return m_position;
93 }
94 
95 void XapianTermGenerator::setPosition(int position)
96 {
97  m_position = position;
98 }
NormalizationForm_KD
int size() const const
QStringList split(const QString &sep, QString::SplitBehavior behavior, Qt::CaseSensitivity cs) const const
Mark_NonSpacing
Q_SCRIPTABLE Q_NOREPLY void start()
void reserve(int size)
KIOFILEWIDGETS_EXPORT QStringList list(const QString &fileClass)
QString normalized(QString::NormalizationForm mode, QChar::UnicodeVersion version) const const
Akonadi search infrastructure.
Definition: core/query.h:20
SkipEmptyParts
QByteArray toUtf8() const const
QString toLower() const const
const char * constData() const const
int size() const const
QString mid(int position, int n) const const
const QList< QKeySequence > & end()
QString & append(QChar ch)
This file is part of the KDE documentation.
Documentation copyright © 1996-2023 The KDE developers.
Generated on Fri Dec 1 2023 04:09:05 by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.