public static bool TryParseUnicodeRange(IEnumerator <CssToken> tokenEnum, ref CssUnicodeRange result)
        {
            var token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;

            if (!token.HasValue('u'))
            {
                return(false);
            }

            token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
            if (!token.StartsWith('+'))
            {
                return(false);
            }

            var text = new StringBuilder(14);

            token.ToString(text);

            if (token.IsDelimiter('+'))
            {
                token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
                if (token.IsIdentifier)
                {
                    token.ToString(text);
                    token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
                }
                else if (!token.IsDelimiter('?'))
                {
                    return(false);
                }
            }
            else if (token.IsDimension)
            {
                token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
            }
            else if (token.IsNumber)
            {
                token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
                if (token.IsDimension || token.IsNumber)
                {
                    token.ToString(text);
                    return(TryParseUnicodeRange(text, ref result));
                }
            }

            while (token.IsDelimiter('?'))
            {
                text.Append('?');
                token = tokenEnum.MoveNext() ? tokenEnum.Current : EofToken;
            }

            return(TryParseUnicodeRange(text, ref result));
        }
        private static bool TryParseUnicodeRange(StringBuilder text, ref CssUnicodeRange result)
        {
            if (text.Length < 2 || text.Length > 14 || text[0] != '+')
            {
                return(false);
            }

            var pos = 1;
            var len = 0;
            var ch  = Peek(text, pos);

            while (IsHexDigit(ch))
            {
                len++;
                ch = Peek(text, pos + len);
            }
            if (len > 6)
            {
                return(false);
            }

            int rangeStart, rangeEnd;

            if (ch == '?')
            {
                do
                {
                    len++;
                    ch = Peek(text, len);
                } while (ch == '?');
                if (len > 6 || len < text.Length)
                {
                    return(false);
                }

                var hexNumber = text.ToString(pos, len);
                rangeStart = int.Parse(hexNumber.Replace('?', '0'), NumberStyles.AllowHexSpecifier);
                rangeEnd   = int.Parse(hexNumber.Replace('?', 'F'), NumberStyles.AllowHexSpecifier);
            }
            else
            {
                rangeStart = rangeEnd = int.Parse(text.ToString(pos, len), NumberStyles.AllowHexSpecifier);

                pos = len + 1;
                len = 0;
                if (ch == '-' && IsHexDigit(Peek(text, pos)))
                {
                    do
                    {
                        len++;
                        ch = Peek(text, pos + len);
                    } while (IsHexDigit(ch));
                    if (len > 6 || len < text.Length)
                    {
                        return(false);
                    }

                    var hexNumber = text.ToString(pos, len);
                    rangeEnd = int.Parse(hexNumber, NumberStyles.AllowHexSpecifier);
                }
            }

            result = new CssUnicodeRange(rangeStart, rangeEnd);
            return(true);
        }