7#include "searchlinecommand.h"
8#include <KLocalizedString>
16 {SearchLineCommand::searchLineTypeToString(Subject), SearchLineCommand::SearchLineType::Subject},
17 {SearchLineCommand::searchLineTypeToString(Body), SearchLineCommand::SearchLineType::Body},
18 {SearchLineCommand::searchLineTypeToString(To), SearchLineCommand::SearchLineType::To},
19 {SearchLineCommand::searchLineTypeToString(Cc), SearchLineCommand::SearchLineType::Cc},
20 {SearchLineCommand::searchLineTypeToString(Bcc), SearchLineCommand::SearchLineType::Bcc},
21 {SearchLineCommand::searchLineTypeToString(From), SearchLineCommand::SearchLineType::From},
22 {SearchLineCommand::searchLineTypeToString(HasAttachment), SearchLineCommand::SearchLineType::HasAttachment},
23 {SearchLineCommand::searchLineTypeToString(HasInvitation), SearchLineCommand::SearchLineType::HasInvitation},
24 {SearchLineCommand::searchLineTypeToString(IsUnRead), SearchLineCommand::SearchLineType::IsUnRead},
25 {SearchLineCommand::searchLineTypeToString(IsRead), SearchLineCommand::SearchLineType::IsRead},
26 {SearchLineCommand::searchLineTypeToString(IsImportant), SearchLineCommand::SearchLineType::IsImportant},
27 {SearchLineCommand::searchLineTypeToString(IsIgnored), SearchLineCommand::SearchLineType::IsIgnored},
28 {SearchLineCommand::searchLineTypeToString(IsHam), SearchLineCommand::SearchLineType::IsHam},
29 {SearchLineCommand::searchLineTypeToString(IsSpam), SearchLineCommand::SearchLineType::IsSpam},
30 {SearchLineCommand::searchLineTypeToString(IsWatched), SearchLineCommand::SearchLineType::IsWatched},
31 {SearchLineCommand::searchLineTypeToString(IsReplied), SearchLineCommand::SearchLineType::IsReplied},
32 {SearchLineCommand::searchLineTypeToString(IsForwarded), SearchLineCommand::SearchLineType::IsForwarded},
33 {SearchLineCommand::searchLineTypeToString(IsEncrypted), SearchLineCommand::SearchLineType::IsEncrypted},
34 {SearchLineCommand::searchLineTypeToString(IsQueued), SearchLineCommand::SearchLineType::IsQueued},
35 {SearchLineCommand::searchLineTypeToString(IsSent), SearchLineCommand::SearchLineType::IsSent},
36 {SearchLineCommand::searchLineTypeToString(IsDeleted), SearchLineCommand::SearchLineType::IsDeleted},
37 {SearchLineCommand::searchLineTypeToString(IsAction), SearchLineCommand::SearchLineType::IsAction},
38 {SearchLineCommand::searchLineTypeToString(Size), SearchLineCommand::SearchLineType::Size},
39 {SearchLineCommand::searchLineTypeToString(Smaller), SearchLineCommand::SearchLineType::Larger},
40 {SearchLineCommand::searchLineTypeToString(Larger), SearchLineCommand::SearchLineType::Smaller},
41 {SearchLineCommand::searchLineTypeToString(OlderThan), SearchLineCommand::SearchLineType::OlderThan},
42 {SearchLineCommand::searchLineTypeToString(NewerThan), SearchLineCommand::SearchLineType::NewerThan},
43 {SearchLineCommand::searchLineTypeToString(Category), SearchLineCommand::SearchLineType::Category},
49SearchLineCommand::SearchLineCommand() =
default;
51SearchLineCommand::~SearchLineCommand() =
default;
53bool SearchLineCommand::hasSubType(
const QString &v)
55 return v == QLatin1StringView(
"is") || v == QLatin1StringView(
"has");
58bool SearchLineCommand::hasSubType(SearchLineCommand::SearchLineType type)
60 return type == Date || type == Size || type == To || type == Bcc || type == Cc || type == From || type == Subject || type == Smaller || type == Larger
61 || type == OlderThan || type == NewerThan || type == Body || type == Category;
64bool SearchLineCommand::isEmpty()
const
66 return mSearchLineInfo.isEmpty();
69QString SearchLineCommand::searchLineTypeToString(SearchLineType type)
73 case HasStateOrAttachment:
78 return QStringLiteral(
"older_than");
80 return QStringLiteral(
"newer_than");
82 return QStringLiteral(
"smaller");
84 return QStringLiteral(
"larger");
86 return QStringLiteral(
"size");
88 return QStringLiteral(
"to");
90 return QStringLiteral(
"bcc");
92 return QStringLiteral(
"cc");
94 return QStringLiteral(
"from");
96 return QStringLiteral(
"subject");
98 return QStringLiteral(
"body");
100 return QStringLiteral(
"category");
102 return QStringLiteral(
"has:attachment");
104 return QStringLiteral(
"has:invitation");
106 return QStringLiteral(
"is:important");
108 return QStringLiteral(
"is:read");
110 return QStringLiteral(
"is:unread");
112 return QStringLiteral(
"is:ignored");
114 return QStringLiteral(
"is:ham");
116 return QStringLiteral(
"is:spam");
118 return QStringLiteral(
"is:watched");
120 return QStringLiteral(
"is:replied");
122 return QStringLiteral(
"is:forwarded");
124 return QStringLiteral(
"is:encrypted");
126 return QStringLiteral(
"is:queued");
128 return QStringLiteral(
"is:sent");
130 return QStringLiteral(
"is:action");
132 return QStringLiteral(
"is:deleted");
137QString SearchLineCommand::convertSearchLinetypeToTranslatedString(SearchLineCommand::SearchLineType type)
const
141 case HasStateOrAttachment:
149 return i18n(
"Literal string");
151 return i18n(
"Size is smaller than");
153 return i18n(
"Size is larger than");
155 return i18n(
"Size is");
157 return i18n(
"To contains");
159 return i18n(
"BCC contains");
161 return i18n(
"CC contains");
163 return i18n(
"From contains");
165 return i18n(
"Subject contains");
167 return i18n(
"Body contains");
169 return i18n(
"Mail has tag");
171 return i18n(
"Mail has attachment");
173 return i18n(
"Mail has invitation");
175 return i18n(
"Mail is important");
177 return i18n(
"Mail is read");
179 return i18n(
"Mail is Unread");
181 return i18n(
"Mail is Ignored");
183 return i18n(
"Mail is Ham");
185 return i18n(
"Mail is Spam");
187 return i18n(
"Mail is watched");
189 return i18n(
"Mail is replied");
191 return i18n(
"Mail is forwarded");
193 return i18n(
"Mail is encrypted");
195 return i18n(
"Mail is queued");
197 return i18n(
"Mail is sent");
199 return i18n(
"Mail is deleted");
201 return i18n(
"Mail is action");
206QString SearchLineCommand::generateCommadLineStr()
const
209 for (
const auto &info : mSearchLineInfo) {
211 result += QLatin1Char(
' ') +
i18n(
"AND") + QLatin1Char(
' ');
213 const QString translatedType = convertSearchLinetypeToTranslatedString(info.type);
214 if (!translatedType.
isEmpty()) {
215 result += translatedType;
217 if (!info.argument.isEmpty()) {
218 if (!translatedType.
isEmpty()) {
219 result += QLatin1Char(
' ');
221 result += info.argument;
227SearchLineCommand::SearchLineInfo SearchLineCommand::isAnotherInfo(QString tmp, SearchLineInfo searchLineInfo)
229 if (!tmp.
contains(QLatin1Char(
' '))) {
232 if (tmp.
endsWith(QLatin1StringView(
"is")) || tmp.
endsWith(QLatin1StringView(
"has"))) {
233#ifdef DEBUG_COMMAND_PARSER
234 qDebug() <<
" found has subtype " << tmp;
238 const QStringList keys = mKeyList.keys();
239 for (
const QString &key : keys) {
241#ifdef DEBUG_COMMAND_PARSER
242 qDebug() <<
" found element !!!!!! " << tmp;
246 searchLineInfo.argument = tmp;
247 if (!searchLineInfo.argument.isEmpty() && searchLineInfo.type == Unknown) {
248 searchLineInfo.type = Literal;
250 if (searchLineInfo.isValid()) {
251 appendSearchLineInfo(searchLineInfo);
253#ifdef DEBUG_COMMAND_PARSER
254 qDebug() <<
" Add searchLineInfo" << searchLineInfo << mSearchLineInfo;
258 info.type = mKeyList.value(key);
265bool SearchLineCommand::hasOnlyOneLiteralCommand()
const
267 return mSearchLineInfo.
count() == 1 && (mSearchLineInfo.at(0).type == SearchLineType::Literal);
270void SearchLineCommand::parseSearchLineCommand(
const QString &str)
272 mSearchLineInfo.clear();
276 SearchLineInfo searchLineInfo;
279 for (
int i = 0, total = str.
length(); i < total; ++i) {
280 const QChar ch = str.
at(i);
281 if (ch == QLatin1Char(
':')) {
282#ifdef DEBUG_COMMAND_PARSER
283 qDebug() <<
" tmp ! " << tmp;
285 const SearchLineCommand::SearchLineInfo newInfo = isAnotherInfo(tmp, searchLineInfo);
286 if (newInfo.type != Unknown) {
288 searchLineInfo = newInfo;
289 }
else if (mKeyList.contains(tmp.
trimmed())) {
290#ifdef DEBUG_COMMAND_PARSER
291 qDebug() <<
" contains " << tmp;
293 searchLineInfo.type = mKeyList.value(tmp.
trimmed());
295 }
else if (hasSubType(tmp)) {
296 searchLineInfo.type = HasStateOrAttachment;
303 const SearchLineCommand::SearchLineInfo newInfo = isAnotherInfo(tmp, searchLineInfo);
304 if (newInfo.type != Unknown) {
306 searchLineInfo = newInfo;
307 }
else if (mKeyList.contains(tmp)) {
308 searchLineInfo.type = mKeyList.value(tmp);
311#ifdef DEBUG_COMMAND_PARSER
312 qDebug() <<
" is space " <<
"pare" << parentheses <<
" tmp " << tmp <<
"searchLineInfo.type " << searchLineInfo.type
313 <<
" searchLineInfo.argument.isEmpty() " << searchLineInfo.argument.
isEmpty();
315 if (tmp.
isEmpty() && hasSubType(searchLineInfo.type) && parentheses == 0) {
316#ifdef DEBUG_COMMAND_PARSER
317 qDebug() <<
"clear invalid type" << searchLineInfo;
319 searchLineInfo.type = Unknown;
321 }
else if (hasSubType(searchLineInfo.type)) {
323 }
else if (searchLineInfo.type != Unknown && parentheses == 0) {
324 searchLineInfo.argument = tmp;
326#ifdef DEBUG_COMMAND_PARSER
327 qDebug() <<
"clear tmp argument " << searchLineInfo;
332 if (searchLineInfo.isValid() && parentheses == 0) {
333 appendSearchLineInfo(searchLineInfo);
334 searchLineInfo.clear();
337 }
else if (ch == QLatin1Char(
'(')) {
339 if (parentheses > 1) {
342#ifdef DEBUG_COMMAND_PARSER
343 qDebug() <<
" parenthese ( equal " << parentheses;
345 }
else if (ch == QLatin1Char(
')')) {
347 if (parentheses > 0) {
350#ifdef DEBUG_COMMAND_PARSER
351 qDebug() <<
" parenthese ) equal " << parentheses;
353 if (parentheses == 0) {
354 searchLineInfo.argument = tmp;
356#ifdef DEBUG_COMMAND_PARSER
357 qDebug() <<
" new values " << searchLineInfo;
359 appendSearchLineInfo(searchLineInfo);
360 searchLineInfo.clear();
364#ifdef DEBUG_COMMAND_PARSER
365 qDebug() <<
" tmp " << tmp <<
" ch " << ch <<
"end";
369 if (searchLineInfo.type != Unknown) {
370 if (searchLineInfo.type == HasStateOrAttachment) {
371#ifdef DEBUG_COMMAND_PARSER
372 qDebug() <<
" type is HasStateOrAttachment";
374 if (mKeyList.contains(tmp)) {
375 searchLineInfo.type = mKeyList.value(tmp);
376 appendSearchLineInfo(searchLineInfo);
380#ifdef DEBUG_COMMAND_PARSER
381 qDebug() <<
" add as original searchLineInfo" << searchLineInfo;
383 const SearchLineCommand::SearchLineInfo newInfo = isAnotherInfo(tmp, searchLineInfo);
384 if (newInfo.type != Unknown) {
385 searchLineInfo = newInfo;
387 searchLineInfo.argument = tmp;
389 appendSearchLineInfo(searchLineInfo);
394 searchLineInfo.type = Literal;
395 searchLineInfo.argument = tmp;
396 appendSearchLineInfo(searchLineInfo);
399#ifdef DEBUG_COMMAND_PARSER
400 qDebug() <<
" END " << mSearchLineInfo;
407void SearchLineCommand::appendSearchLineInfo(SearchLineInfo searchLineInfo)
409 if (searchLineInfo.mustBeUnique()) {
410 if (mSearchLineInfo.contains(searchLineInfo)) {
411#ifdef DEBUG_COMMAND_PARSER
412 qDebug() <<
" Already exist " << searchLineInfo;
417 mSearchLineInfo.
append(std::move(searchLineInfo));
420QList<SearchLineCommand::SearchLineInfo> SearchLineCommand::searchLineInfo()
const
422 return mSearchLineInfo;
425void SearchLineCommand::setSearchLineInfo(
const QList<SearchLineInfo> &newSearchLineInfo)
427 mSearchLineInfo = newSearchLineInfo;
430void SearchLineCommand::SearchLineInfo::clear()
432 type = SearchLineCommand::SearchLineType::Unknown;
436bool SearchLineCommand::SearchLineInfo::isValid()
const
438 if (type == SearchLineType::Unknown || type == SearchLineCommand::HasStateOrAttachment) {
441 if (type == SearchLineType::Literal && !argument.isEmpty()) {
444 if (hasSubType(type) && !argument.isEmpty()) {
447 if (!hasSubType(type) && argument.isEmpty()) {
453bool SearchLineCommand::SearchLineInfo::operator==(
const SearchLineInfo &other)
const
455 return type == other.type && argument == other.argument;
458bool SearchLineCommand::SearchLineInfo::isValidDate()
const
460 if (argument.isEmpty()) {
466bool SearchLineCommand::SearchLineInfo::mustBeUnique()
const
468 return type == HasAttachment || type == IsImportant || type == IsRead || type == IsUnRead || type == IsIgnored || type == IsHam || type == IsSpam
469 || type == IsWatched || type == IsReplied || type == IsForwarded || type == IsEncrypted || type == IsQueued || type == IsSent || type == IsDeleted
473qint64 SearchLineCommand::SearchLineInfo::convertArgumentAsSize()
const
479QDebug
operator<<(QDebug d,
const MessageList::Core::SearchLineCommand::SearchLineInfo &info)
481 d <<
" type " << info.type;
482 d <<
" argument " << info.argument;
486#include "moc_searchlinecommand.cpp"
QString i18n(const char *text, const TYPE &arg...)
QDebug operator<<(QDebug dbg, const DcrawInfoContainer &c)
The implementation independent part of the MessageList library.
bool isSpace(char32_t ucs4)
QDateTime fromString(QStringView string, QStringView format, QCalendar cal)
bool isValid() const const
qsizetype count() const const
QString & append(QChar ch)
const QChar at(qsizetype position) const const
bool contains(QChar ch, Qt::CaseSensitivity cs) const const
bool endsWith(QChar c, Qt::CaseSensitivity cs) const const
bool isEmpty() const const
qsizetype length() const const
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QString trimmed() const const