/// <summary> /// 4.4.19. URL-single-quoted state /// </summary> CssToken UrlSQ(Char current) { while (true) { if (Specification.IsLineBreak(current)) { 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 (Specification.IsLineBreak(current)) { stringBuffer.AppendLine(); } else { stringBuffer.Append(ConsumeEscape(current)); } } else { stringBuffer.Append(current); } current = src.Next; } }
/// <summary> /// 4.4.3. Single quoted string state /// </summary> CssToken StringSQ(Char current) { while (true) { switch (current) { case Specification.SQ: case Specification.EOF: return(CssStringToken.Plain(FlushBuffer())); case Specification.FF: case Specification.LF: RaiseErrorOccurred(ErrorCode.LineBreakUnexpected); src.Back(); return(CssStringToken.Plain(FlushBuffer(), true)); case Specification.RSOLIDUS: current = src.Next; if (Specification.IsLineBreak(current)) { stringBuffer.AppendLine(); } else if (current != Specification.EOF) { stringBuffer.Append(ConsumeEscape(current)); } else { RaiseErrorOccurred(ErrorCode.EOF); src.Back(); return(CssStringToken.Plain(FlushBuffer(), true)); } break; default: stringBuffer.Append(current); break; } 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; } }