presentation/TaskConsoleInput.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "TaskConsoleInput.h" | ||
| 2 | #include "EventQuickInput.h" | ||
| 3 | #include <QSet> | ||
| 4 | #include <QTimeZone> | ||
| 5 | |||
| 6 | namespace TaskConsoleInput { | ||
| 7 | 50 | Parts split(const QString &input) { | |
| 8 | 50 | Parts parts; | |
| 9 | // Text in double quotes is taken literally into the title (S94.5.5: a | ||
| 10 | // prefilled mail subject may contain "/", "!", "#", "@" or dates). | ||
| 11 | 50 | QStringList tokens; | |
| 12 | 50 | QSet<int> literal; | |
| 13 |
1/1✓ Branch 6 → 7 taken 50 times.
|
50 | const auto quoted = input.split(QLatin1Char('"')); |
| 14 |
2/2✓ Branch 32 → 8 taken 54 times.
✓ Branch 32 → 33 taken 50 times.
|
104 | for (int segment = 0; segment < quoted.size(); ++segment) { |
| 15 |
2/2✓ Branch 8 → 9 taken 2 times.
✓ Branch 8 → 22 taken 52 times.
|
54 | if (segment % 2 == 1) { |
| 16 |
5/6✓ Branch 10 → 11 taken 2 times.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 21 not taken.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 17 → 18 taken 2 times.
✓ Branch 18 → 19 taken 2 times.
|
2 | if (!quoted[segment].trimmed().isEmpty()) { literal.insert(tokens.size()); tokens << quoted[segment].trimmed(); } |
| 17 | 2 | continue; | |
| 18 | } | ||
| 19 |
2/2✓ Branch 26 → 27 taken 52 times.
✓ Branch 27 → 28 taken 52 times.
|
52 | tokens << quoted[segment].split(QLatin1Char(' '), Qt::SkipEmptyParts); |
| 20 | } | ||
| 21 | 50 | QStringList title; | |
| 22 |
2/2✓ Branch 118 → 34 taken 150 times.
✓ Branch 118 → 119 taken 50 times.
|
200 | for (int i = 0; i < tokens.size(); ++i) { |
| 23 |
1/1✓ Branch 34 → 35 taken 150 times.
|
150 | const auto &token = tokens[i]; |
| 24 |
3/3✓ Branch 36 → 37 taken 2 times.
✓ Branch 36 → 38 taken 148 times.
✓ Branch 37 → 116 taken 2 times.
|
150 | if (literal.contains(i)) title << token; |
| 25 |
7/8✓ Branch 39 → 40 taken 148 times.
✓ Branch 40 → 41 taken 30 times.
✓ Branch 40 → 44 taken 118 times.
✓ Branch 42 → 43 taken 30 times.
✗ Branch 42 → 44 not taken.
✓ Branch 45 → 46 taken 30 times.
✓ Branch 45 → 50 taken 118 times.
✓ Branch 46 → 47 taken 30 times.
|
148 | else if (token.startsWith('/') && parts.calendarHint.isEmpty()) parts.calendarHint = token.mid(1); |
| 26 |
7/8✓ Branch 51 → 52 taken 118 times.
✓ Branch 52 → 53 taken 14 times.
✓ Branch 52 → 56 taken 104 times.
✓ Branch 54 → 55 taken 14 times.
✗ Branch 54 → 56 not taken.
✓ Branch 57 → 58 taken 14 times.
✓ Branch 57 → 62 taken 104 times.
✓ Branch 58 → 59 taken 14 times.
|
118 | else if (token.startsWith('!') && parts.priorityHint.isEmpty()) parts.priorityHint = token.mid(1); |
| 27 |
8/9✓ Branch 63 → 64 taken 104 times.
✓ Branch 64 → 65 taken 1 time.
✓ Branch 64 → 68 taken 103 times.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 68 not taken.
✓ Branch 69 → 70 taken 1 time.
✓ Branch 69 → 74 taken 103 times.
✓ Branch 70 → 71 taken 1 time.
✓ Branch 71 → 72 taken 1 time.
|
104 | else if (token.startsWith('#') && token.size() > 1) parts.tags << token.mid(1); |
| 28 |
11/12✓ Branch 75 → 76 taken 103 times.
✗ Branch 75 → 84 not taken.
✓ Branch 77 → 78 taken 103 times.
✓ Branch 78 → 79 taken 84 times.
✓ Branch 78 → 83 taken 19 times.
✓ Branch 79 → 80 taken 84 times.
✓ Branch 80 → 81 taken 84 times.
✓ Branch 81 → 82 taken 84 times.
✓ Branch 82 → 83 taken 3 times.
✓ Branch 82 → 84 taken 81 times.
✓ Branch 85 → 86 taken 22 times.
✓ Branch 85 → 115 taken 81 times.
|
103 | else if (parts.dueHint.isEmpty() && (token.startsWith('@') || EventQuickParse::parseDate(token, QDate::currentDate()).isValid())) { |
| 29 |
4/4✓ Branch 87 → 88 taken 22 times.
✓ Branch 88 → 89 taken 19 times.
✓ Branch 88 → 90 taken 3 times.
✓ Branch 89 → 91 taken 19 times.
|
22 | parts.dueHint = token.startsWith('@') ? token.mid(1) : token; |
| 30 |
13/16✓ Branch 94 → 95 taken 9 times.
✓ Branch 94 → 104 taken 13 times.
✓ Branch 95 → 96 taken 9 times.
✓ Branch 97 → 98 taken 9 times.
✓ Branch 98 → 99 taken 4 times.
✓ Branch 98 → 104 taken 5 times.
✓ Branch 99 → 100 taken 4 times.
✓ Branch 100 → 101 taken 4 times.
✓ Branch 102 → 103 taken 4 times.
✗ Branch 102 → 104 not taken.
✓ Branch 105 → 106 taken 4 times.
✓ Branch 105 → 107 taken 18 times.
✓ Branch 107 → 108 taken 4 times.
✓ Branch 107 → 116 taken 18 times.
✗ Branch 157 → 158 not taken.
✗ Branch 157 → 159 not taken.
|
22 | if (i + 1 < tokens.size() && tokens[i + 1].contains(':') && !EventQuickParse::parseTime(tokens[i + 1]).isEmpty()) |
| 31 |
3/3✓ Branch 108 → 109 taken 4 times.
✓ Branch 111 → 112 taken 4 times.
✓ Branch 112 → 113 taken 4 times.
|
4 | parts.dueHint += QLatin1Char(' ') + tokens[++i]; |
| 32 |
1/1✓ Branch 115 → 116 taken 81 times.
|
81 | } else title << token; |
| 33 | } | ||
| 34 |
1/1✓ Branch 120 → 121 taken 50 times.
|
50 | parts.summary = title.join(' '); |
| 35 | 50 | return parts; | |
| 36 | 50 | } | |
| 37 | |||
| 38 | 37 | QDateTime parseDue(const QString &hint, const QDate &today) { | |
| 39 |
1/2✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 37 times.
|
37 | if (hint.isEmpty()) return {}; |
| 40 |
2/4✓ Branch 6 → 7 taken 37 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 37 times.
✗ Branch 8 → 9 not taken.
|
37 | if (hint.contains('T')) return QDateTime::fromString(hint, Qt::ISODate); |
| 41 |
1/1✓ Branch 12 → 13 taken 37 times.
|
37 | const auto words = hint.split(' ', Qt::SkipEmptyParts); |
| 42 |
3/6✓ Branch 14 → 15 taken 37 times.
✗ Branch 14 → 17 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 37 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 37 times.
|
37 | if (words.isEmpty() || words.size() > 2) return {}; |
| 43 |
1/1✓ Branch 22 → 23 taken 37 times.
|
37 | const auto date = EventQuickParse::parseDate(words.first(), today); |
| 44 |
3/3✓ Branch 23 → 24 taken 37 times.
✓ Branch 24 → 25 taken 21 times.
✓ Branch 24 → 26 taken 16 times.
|
37 | if (!date.isValid()) return {}; |
| 45 |
5/5✓ Branch 27 → 28 taken 10 times.
✓ Branch 27 → 33 taken 6 times.
✓ Branch 28 → 29 taken 10 times.
✓ Branch 29 → 30 taken 10 times.
✓ Branch 30 → 31 taken 10 times.
|
16 | if (words.size() == 1) return QDateTime(date, QTime(0, 0), QTimeZone::utc()); |
| 46 |
1/1✓ Branch 34 → 35 taken 6 times.
|
6 | const QString time = EventQuickParse::parseTime(words.last()); |
| 47 |
5/9✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 6 times.
✓ Branch 38 → 39 taken 6 times.
✓ Branch 39 → 40 taken 6 times.
✓ Branch 40 → 41 taken 6 times.
✓ Branch 42 → 43 taken 6 times.
✗ Branch 42 → 44 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
|
6 | return time.isEmpty() ? QDateTime{} : QDateTime(date, QTime::fromString(time, "HH:mm")); |
| 48 | 37 | } | |
| 49 | |||
| 50 | 29 | const QList<PriorityWord> &priorityWords() { | |
| 51 | static const QList<PriorityWord> words = { | ||
| 52 | {"high", 1, true}, {"hoch", 1, true}, {"h", 1, false}, {"normal", 5, true}, {"n", 5, false}, | ||
| 53 |
4/7✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 8 taken 25 times.
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 4 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
|
29 | {"low", 9, true}, {"niedrig", 9, true}, {"l", 9, false}, {"none", 0, true}}; |
| 54 | 29 | return words; | |
| 55 | } | ||
| 56 | |||
| 57 | 57 | int parsePriority(const QString &hint) { | |
| 58 |
1/1✓ Branch 2 → 3 taken 57 times.
|
57 | const auto value = hint.toLower(); |
| 59 |
2/2✓ Branch 4 → 5 taken 35 times.
✓ Branch 4 → 6 taken 22 times.
|
57 | if (value.isEmpty()) return 0; |
| 60 |
3/3✓ Branch 6 → 7 taken 22 times.
✓ Branch 16 → 9 taken 107 times.
✓ Branch 16 → 17 taken 6 times.
|
113 | for (const auto &word : priorityWords()) |
| 61 |
2/2✓ Branch 12 → 13 taken 16 times.
✓ Branch 12 → 14 taken 91 times.
|
107 | if (value == QLatin1String(word.word)) return word.level; |
| 62 |
1/1✓ Branch 17 → 19 taken 6 times.
|
6 | bool ok = false; const int number = value.toInt(&ok); |
| 63 |
4/6✓ Branch 19 → 20 taken 3 times.
✓ Branch 19 → 23 taken 3 times.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 23 not taken.
✓ Branch 21 → 22 taken 3 times.
✗ Branch 21 → 23 not taken.
|
6 | return ok && number >= 0 && number <= 9 ? number : -1; |
| 64 | 57 | } | |
| 65 | } | ||
| 66 |