File: System\Xaml\Parser\XamlName.cs
Web Access
Project: src\src\Microsoft.DotNet.Wpf\src\System.Xaml\System.Xaml.csproj (System.Xaml)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Globalization;
 
namespace MS.Internal.Xaml.Parser
{
    internal abstract class XamlName
    {
        public const char PlusSign = '+';
        public const char UnderScore = '_';
        public const char Dot = '.';
 
        public string Name { get; protected set; }
 
        protected XamlName() : this(string.Empty) { }
 
        public XamlName(string name)
        {
            Name = name;
        }
 
        public XamlName(string prefix, string name)
        {
            Name = name;
            _prefix = prefix ?? string.Empty;
        }
 
        public abstract string ScopedName { get; }
 
        protected string _prefix;
        protected string _namespace;
 
        public string Prefix { get { return _prefix; } }
        public string Namespace { get { return _namespace; } }
 
        public static bool ContainsDot(string name)
        {
            return name.Contains(Dot);
        }
 
        public static bool IsValidXamlName(string name)
        {
            if (name.Length == 0)
            {
                return false;
            }
 
            if (!IsValidNameStartChar(name[0]))
            {
                return false;
            }
 
            for (int i = 1; i < name.Length; i++)
            {
                if (!IsValidNameChar(name[i]))
                {
                    return false;
                }
            }
 
            return true;
        }
 
        public static bool IsValidNameStartChar(char ch)
        {
            return char.IsLetter(ch) || ch == UnderScore;
        }
 
        public static bool IsValidNameChar(char ch)
        {
            if (IsValidNameStartChar(ch) || char.IsDigit(ch))
            {
                return true;
            }
 
            var unicodeCategory = char.GetUnicodeCategory(ch);
            if (unicodeCategory == UnicodeCategory.NonSpacingMark || unicodeCategory == UnicodeCategory.SpacingCombiningMark)
            {
                return true;
            }
            return false;
        }
 
        public static bool IsValidQualifiedNameChar(char ch)
        {
            return ch == Dot || IsValidNameChar(ch);
        }
 
        public static bool IsValidQualifiedNameCharPlus(char ch)
        {
            return IsValidQualifiedNameChar(ch) || ch == PlusSign;
        }
    }
}