/// <summary> /// See 8.2.4.40 Attribute value (unquoted) state /// </summary> /// <param name="c">The next input character.</param> /// <param name="tag">The current tag token.</param> /// <returns>The emitted token.</returns> HtmlToken AttributeUnquotedValue(Char c, HtmlTagToken tag) { while (true) { if (c.IsSpaceCharacter()) { tag.SetAttributeValue(_stringBuffer.ToString()); return AttributeBeforeName(_src.Next, tag); } else if (c == Specification.AMPERSAND) { var value = CharacterReference(_src.Next, Specification.GT); if (value == null) _stringBuffer.Append(Specification.AMPERSAND); else _stringBuffer.Append(value); } else if (c == Specification.GT) { tag.SetAttributeValue(_stringBuffer.ToString()); return EmitTag(tag); } else if (c == Specification.NULL) { RaiseErrorOccurred(ErrorCode.NULL); _stringBuffer.Append(Specification.REPLACEMENT); } else if (c == Specification.DQ || c == Specification.SQ || c == Specification.LT || c == Specification.EQ || c == Specification.CQ) { RaiseErrorOccurred(ErrorCode.AttributeValueInvalid); _stringBuffer.Append(c); } else if (c == Specification.EOF) return HtmlToken.EOF; else _stringBuffer.Append(c); c = _src.Next; } }
/// <summary> /// See 8.2.4.39 Attribute value (single-quoted) state /// </summary> /// <param name="c">The next input character.</param> /// <param name="tag">The current tag token.</param> /// <returns>The emitted token.</returns> HtmlToken AttributeSingleQuotedValue(Char c, HtmlTagToken tag) { while (true) { if (c == Specification.SQ) { tag.SetAttributeValue(_stringBuffer.ToString()); return AttributeAfterValue(_src.Next, tag); } else if (c == Specification.AMPERSAND) { var value = CharacterReference(_src.Next, Specification.SQ); if (value == null) _stringBuffer.Append(Specification.AMPERSAND); else _stringBuffer.Append(value); } else if (c == Specification.NULL) { RaiseErrorOccurred(ErrorCode.NULL); _stringBuffer.Append(Specification.REPLACEMENT); } else if (c == Specification.EOF) return HtmlToken.EOF; else _stringBuffer.Append(c); c = _src.Next; } }