[PS-1352] Fix ignore diacritics in search (#2044)

* Fix ignore diacritics in search

This change updates the search function to ignore diacritical marks in search results. Marks are stripped from both the search input and results.

* Removed logs, added null or whitespace validation and improved formatting

Co-authored-by: aj-rosado <109146700+aj-rosado@users.noreply.github.com>
Co-authored-by: Andre Rosado <arosado@bitwarden.com>
This commit is contained in:
noncenz 2023-01-05 11:34:06 -05:00 committed by GitHub
parent acc587ce45
commit 0e856d2add
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 3 deletions

View file

@ -5,6 +5,7 @@ using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Bit.Core.Abstractions; using Bit.Core.Abstractions;
using Bit.Core.Models.View; using Bit.Core.Models.View;
using Bit.Core.Utilities;
namespace Bit.Core.Services namespace Bit.Core.Services
{ {
@ -76,12 +77,12 @@ namespace Bit.Core.Services
ct.ThrowIfCancellationRequested(); ct.ThrowIfCancellationRequested();
var matchedCiphers = new List<CipherView>(); var matchedCiphers = new List<CipherView>();
var lowPriorityMatchedCiphers = new List<CipherView>(); var lowPriorityMatchedCiphers = new List<CipherView>();
query = query.Trim().ToLower(); query = query.Trim().ToLower().RemoveDiacritics();
foreach (var c in ciphers) foreach (var c in ciphers)
{ {
ct.ThrowIfCancellationRequested(); ct.ThrowIfCancellationRequested();
if (c.Name?.ToLower().Contains(query) ?? false) if (c.Name?.ToLower().RemoveDiacritics().Contains(query) ?? false)
{ {
matchedCiphers.Add(c); matchedCiphers.Add(c);
} }
@ -89,7 +90,7 @@ namespace Bit.Core.Services
{ {
lowPriorityMatchedCiphers.Add(c); lowPriorityMatchedCiphers.Add(c);
} }
else if (c.SubTitle?.ToLower().Contains(query) ?? false) else if (c.SubTitle?.ToLower().RemoveDiacritics().Contains(query) ?? false)
{ {
lowPriorityMatchedCiphers.Add(c); lowPriorityMatchedCiphers.Add(c);
} }

View file

@ -0,0 +1,34 @@
using System;
using System.Globalization;
using System.Text;
namespace Bit.Core.Utilities
{
public static class StringExtensions
{
public static string RemoveDiacritics(this string text)
{
if (string.IsNullOrWhiteSpace(text))
{
return text;
}
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder(capacity: normalizedString.Length);
for (int i = 0; i < normalizedString.Length; i++)
{
char c = normalizedString[i];
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder
.ToString()
.Normalize(NormalizationForm.FormC);
}
}
}