# File lib/cgikit/parser.rb, line 411
    def __parse
      name = attrs = nil
      # entity string
      while true
        event = @parser.pull
        case event[0]
        when :end_document
          # end of XML
          return
        when :start_element
          # not normalize
          @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
            # not normalize
            @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].to_s, *event[1..-1] )
          __send__( event[0], *event[1..-1] )
        else
          raise CGIKit::HTMLParser::HTMLParser::ParseError, "#{@filename}: CGIKit doesn't recognize the event(#{event.inspect})"
        end
      end
    end