def eat_this(line)
@rest = line + @rest
things_read = 0
until @rest.empty?
case self.state
when :inside_comment
if @m = CommentEnd.match(@rest)
@already += @m.pre_match + @m.to_s
@rest = @m.post_match
self.state = :inside_element
else
@already += @rest
@rest = ""
self.state = :inside_comment
end
when :inside_element
if @m = CommentStart.match(@rest)
things_read += 1
@already += @m.pre_match + @m.to_s
@rest = @m.post_match
self.state = :inside_comment
elsif @m = Tag.match(@rest) then
my_debug "#{@state}: Tag: #{@m.to_s.inspect}"
things_read += 1
handle_tag
self.state = :inside_element
elsif @m = PartialTag.match(@rest) then
my_debug "#{@state}: PartialTag: #{@m.to_s.inspect}"
@already += @m.pre_match
@rest = @m.post_match
@partial_tag = @m.to_s
self.state = :inside_tag
elsif @m = EverythingElse.match(@rest)
my_debug "#{@state}: Everything: #{@m.to_s.inspect}"
@already += @m.pre_match + @m.to_s
@rest = @m.post_match
self.state = :inside_element
else
error "Malformed HTML: not complete: #{@rest.inspect}"
end
when :inside_tag
if @m = /^[^>]*>/.match(@rest) then
my_debug "#{@state}: inside_tag: matched #{@m.to_s.inspect}"
@partial_tag += @m.to_s
my_debug "#{@state}: inside_tag: matched TOTAL: #{@partial_tag.to_s.inspect}"
@rest = @partial_tag + @m.post_match
@partial_tag = nil
self.state = :inside_element
else
@partial_tag += @rest
@rest = ""
self.state = :inside_tag
end
else
raise "Bug bug: state = #{self.state.inspect}"
end
break if is_finished? and things_read>0
end
end