File: Extensions\StringExtensions.cs
Web Access
Project: src\src\Aspire.Dashboard\Aspire.Dashboard.csproj (Aspire.Dashboard)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Diagnostics.CodeAnalysis;
using System.Text;
 
namespace Aspire.Dashboard.Extensions;
 
internal static class StringExtensions
{
    public static string SanitizeHtmlId(this string input)
    {
        var sanitizedBuilder = new StringBuilder(capacity: input.Length);
 
        foreach (var c in input)
        {
            if (IsValidHtmlIdCharacter(c))
            {
                sanitizedBuilder.Append(c);
            }
            else
            {
                sanitizedBuilder.Append('_');
            }
        }
 
        return sanitizedBuilder.ToString();
 
        static bool IsValidHtmlIdCharacter(char c)
        {
            // Check if the character is a letter, digit, underscore, or hyphen
            return char.IsLetterOrDigit(c) || c == '_' || c == '-';
        }
    }
 
    /// <summary>
    /// Returns the two initial letters of the first and last words in the specified <paramref name="name"/>.
    /// If only one word is present, a single initial is returned. If <paramref name="name"/> is null, empty or
    /// white space only, <paramref name="defaultValue"/> is returned.
    /// </summary>
    [return: NotNullIfNotNull(nameof(defaultValue))]
    public static string? GetInitials(this string name, string? defaultValue = default)
    {
        var s = name.AsSpan().Trim();
 
        if (s.Length == 0)
        {
            return defaultValue;
        }
 
        var lastSpaceIndex = s.LastIndexOf(' ');
 
        if (lastSpaceIndex == -1)
        {
            return s[0].ToString().ToUpperInvariant();
        }
 
        // The name contained two or more words. Return the initials from the first and last.
        return $"{char.ToUpperInvariant(s[0])}{char.ToUpperInvariant(s[lastSpaceIndex + 1])}";
    }
}