Skip to content

Commit 3e70141

Browse files
wjyrichBLumia
authored andcommitted
feat: add Support for acronym matching and others.
add Support for acronym matching, add Intermediate matching is not supported for lowercase letters. Log:
1 parent 3fbd2e9 commit 3e70141

1 file changed

Lines changed: 87 additions & 1 deletion

File tree

src/models/searchfilterproxymodel.cpp

Lines changed: 87 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,5 +34,91 @@ bool SearchFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &
3434

3535
QString searchPatternDelBlank = searchPattern.pattern().toLower().remove(" ");
3636

37-
return displayName.contains(searchPatternDelBlank) || nameCopy.contains(searchPatternDelBlank) || transliterated.contains(searchPatternDelBlank) || jianpin.contains(searchPatternDelBlank);
37+
// Get first letters of each word in displayName
38+
QStringList words = displayName.split(" ", Qt::SkipEmptyParts);
39+
QString nameFirstLetters;
40+
for (const QString &word : words) {
41+
if (!word.isEmpty()) {
42+
QChar firstChar = word[0];
43+
if (firstChar.isLetter()) {
44+
nameFirstLetters += firstChar.toLower();
45+
}
46+
}
47+
}
48+
49+
// Check for number or English prefix matches only
50+
QRegularExpression searchNumberCheck("\\d+$");
51+
QRegularExpression searchEnglishCheck("^[a-zA-Z\\s]+$");
52+
bool isNumberSearch = searchNumberCheck.match(searchPatternDelBlank).hasMatch();
53+
bool isEnglishSearch = searchEnglishCheck.match(searchPattern.pattern()).hasMatch();
54+
55+
if (isNumberSearch || isEnglishSearch) {
56+
bool hasMatch = false;
57+
58+
// Handle number prefix matching
59+
if (isNumberSearch) {
60+
QRegularExpression numberRegex("\\d+");
61+
QRegularExpressionMatchIterator matches = numberRegex.globalMatch(displayName);
62+
63+
while (matches.hasNext()) {
64+
QRegularExpressionMatch match = matches.next();
65+
QString numberInDisplayName = match.captured(0);
66+
hasMatch = true;
67+
if (numberInDisplayName.startsWith(searchPatternDelBlank)) {
68+
return true;
69+
}
70+
}
71+
}
72+
73+
// Handle English prefix matching
74+
if (isEnglishSearch) {
75+
// Remove spaces and convert to lowercase for comparison
76+
QString displayNameLower = displayName.toLower().remove(" ");
77+
78+
// Check prefix matching for various name formats
79+
if (displayNameLower.startsWith(searchPatternDelBlank) ||
80+
nameCopy.startsWith(searchPatternDelBlank) ||
81+
transliterated.startsWith(searchPatternDelBlank) ||
82+
jianpin.startsWith(searchPatternDelBlank) ||
83+
nameFirstLetters.startsWith(searchPatternDelBlank)) {
84+
return true;
85+
}
86+
87+
// Also check if search pattern matches the prefix of any word in displayName
88+
for (const QString &word : words) {
89+
if (word.toLower().startsWith(searchPatternDelBlank)) {
90+
return true;
91+
}
92+
}
93+
94+
// Also check if search pattern matches the prefix of any word in name
95+
QStringList nameWords = name.split(" ", Qt::SkipEmptyParts);
96+
for (const QString &word : nameWords) {
97+
if (word.toLower().startsWith(searchPatternDelBlank)) {
98+
return true;
99+
}
100+
}
101+
102+
// Also check if search pattern matches the prefix of any word in transliterated
103+
QStringList transliteratedWords = transliterated.split(" ", Qt::SkipEmptyParts);
104+
for (const QString &word : transliteratedWords) {
105+
if (word.toLower().startsWith(searchPatternDelBlank)) {
106+
return true;
107+
}
108+
}
109+
110+
hasMatch = true; // English content was found
111+
}
112+
113+
// If we had matches but none were prefix matches, return false
114+
if (hasMatch) {
115+
return false;
116+
}
117+
}
118+
119+
return displayName.contains(searchPatternDelBlank) ||
120+
nameCopy.contains(searchPatternDelBlank) ||
121+
transliterated.contains(searchPatternDelBlank) ||
122+
jianpin.contains(searchPatternDelBlank) ||
123+
nameFirstLetters.contains(searchPatternDelBlank);
38124
}

0 commit comments

Comments
 (0)