def __parse
name = attrs = nil
while true
event = @parser.pull
case event[0]
when :end_document
return
when :start_element
@tag_level += 1
name = event[1]
attrs = event[2]
if match_pattern = self.cgikit_element?(name, attrs)
if tn = buffer2textnode
@cur << tn
end
new_node = CGIKit::HTMLParser::CGIKitNode.new(name)
ck_attrs = {}
attrs.each do |k,v|
ck_attrs[k.intern] = self.value_for_string(v)
end
case match_pattern
when :id
ck_attrs[@ckid.intern] = attrs['id'].sub(@id_reg, '')
when :ns_id
ck_attrs[@ckid.intern] = attrs['ck:id']
ck_attrs.delete('ck:id''ck:id')
end
new_node.attributes = ck_attrs
add_declaration(new_node.name, new_node.attributes)
new_node.ckid = new_node.attributes[@ckid.intern].intern
@node2tag_level[@cur] = @tag_level - 1
@cur << new_node
@cur = new_node
@node2tag_level[new_node] = 1
@tag_level = 1
else
@buf << "<#{name}#{CGIKit::HTMLParser.attribute_string(attrs)}>"
end
when :end_element
@tag_level -= 1
name = event[1]
if @tag_level == 0
if node = buffer2textnode
@cur << node
end
unless RootNode === @cur
@cur = @cur.parent
end
@tag_level = @node2tag_level[@cur]
else
if (@buf.size != 0) and (@buf.last.index("<#{name}") == 0)
s = @buf.pop
ss = s.sub(/>\z/um, '/>')
@buf << ss
else
@buf << "</#{name}>"
end
end
when :text
unless @in_doctype
@buf << event[1]
end
when :end_doctype
@in_doctype = false
end_doctype
when :start_doctype
@in_doctype = true
start_doctype( *event[1..-1] )
when :processing_instruction
instruction( event[1], event[2] )
when :externalentity
externalentity( event[1] )
when :elementdecl
elementdecl(event[1])
when :entitydecl
entitydecl(event)
when :comment, :attlistdecl, :cdata, :xmldecl, :notationdecl, :entitydecl
__send__( event[0], *event[1..-1] )
else
raise CGIKit::HTMLParser::HTMLParser::ParseError, "#{@filename}: CGIKit doesn't recognize the event(#{event.inspect})"
end
end
end