/// <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)); } }
/// <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; } }
/// <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; } }
/// <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; } }
/// <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; } }