예제 #1
0
        /// <summary>
        /// 4.4.17. URL state
        /// </summary>
        CssToken UrlStart(Char current)
        {
            while (current.IsSpaceCharacter())
            {
                current = src.Next;
            }

            switch (current)
            {
            case Specification.EOF:
                RaiseErrorOccurred(ErrorCode.EOF);
                return(CssStringToken.Url(String.Empty, true));

            case Specification.DQ:
                return(UrlDQ(src.Next));

            case Specification.SQ:
                return(UrlSQ(src.Next));

            case ')':
                return(CssStringToken.Url(String.Empty, false));

            default:
                return(UrlUQ(current));
            }
        }
예제 #2
0
        /// <summary>
        /// 4.4.20. URL-end state
        /// </summary>
        CssToken UrlEnd(Char current)
        {
            while (true)
            {
                if (current == ')')
                {
                    return(CssStringToken.Url(FlushBuffer()));
                }
                else if (!current.IsSpaceCharacter())
                {
                    RaiseErrorOccurred(ErrorCode.InvalidCharacter);
                    return(UrlBad(current));
                }

                current = src.Next;
            }
        }
예제 #3
0
        /// <summary>
        /// 4.4.19. URL-single-quoted state
        /// </summary>
        CssToken UrlSQ(Char current)
        {
            while (true)
            {
                if (current.IsLineBreak())
                {
                    RaiseErrorOccurred(ErrorCode.LineBreakUnexpected);
                    return(UrlBad(src.Next));
                }
                else if (Specification.EOF == current)
                {
                    return(CssStringToken.Url(FlushBuffer()));
                }
                else if (current == Specification.SQ)
                {
                    return(UrlEnd(src.Next));
                }
                else if (current == Specification.RSOLIDUS)
                {
                    current = src.Next;

                    if (current == Specification.EOF)
                    {
                        src.Back(2);
                        RaiseErrorOccurred(ErrorCode.EOF);
                        return(CssStringToken.Url(FlushBuffer(), true));
                    }
                    else if (current.IsLineBreak())
                    {
                        stringBuffer.AppendLine();
                    }
                    else
                    {
                        stringBuffer.Append(ConsumeEscape(current));
                    }
                }
                else
                {
                    stringBuffer.Append(current);
                }

                current = src.Next;
            }
        }
예제 #4
0
        /// <summary>
        /// 4.4.22. Bad URL state
        /// </summary>
        CssToken UrlBad(Char current)
        {
            while (true)
            {
                if (current == Specification.EOF)
                {
                    RaiseErrorOccurred(ErrorCode.EOF);
                    return(CssStringToken.Url(FlushBuffer(), true));
                }
                else if (current == ')')
                {
                    return(CssStringToken.Url(FlushBuffer(), true));
                }
                else if (IsValidEscape(current))
                {
                    current = src.Next;
                    stringBuffer.Append(ConsumeEscape(current));
                }

                current = src.Next;
            }
        }
예제 #5
0
        /// <summary>
        /// 4.4.21. URL-unquoted state
        /// </summary>
        CssToken UrlUQ(Char current)
        {
            while (true)
            {
                if (current.IsSpaceCharacter())
                {
                    return(UrlEnd(src.Next));
                }
                else if (current == ')' || current == Specification.EOF)
                {
                    return(CssStringToken.Url(FlushBuffer()));
                }
                else if (current == Specification.DQ || current == Specification.SQ || current == '(' || current.IsNonPrintable())
                {
                    RaiseErrorOccurred(ErrorCode.InvalidCharacter);
                    return(UrlBad(src.Next));
                }
                else if (current == Specification.RSOLIDUS)
                {
                    if (IsValidEscape(current))
                    {
                        current = src.Next;
                        stringBuffer.Append(ConsumeEscape(current));
                    }
                    else
                    {
                        RaiseErrorOccurred(ErrorCode.InvalidCharacter);
                        return(UrlBad(src.Next));
                    }
                }
                else
                {
                    stringBuffer.Append(current);
                }

                current = src.Next;
            }
        }