private Method

Element._validate(ignore_unknown_element, tags, uri, models=self.class.models)

There's no documentation for this item.

Source Code

# File rss/rss.rb, line 846
def _validate(ignore_unknown_element, tags, uri, models=self.class.models)
  count = 1
  do_redo = false
  not_shift = false
  tag = nil
  models = models.find_all {|model| model[1] == uri}
  element_names = models.collect {|model| model[0]}
  if tags
    tags_size = tags.size
    tags = tags.sort_by {|x| element_names.index(x) || tags_size}
  end

  models.each_with_index do |model, i|
    name, model_uri, occurs, getter = model

    if DEBUG
      p "before" 
      p tags
      p model
    end

    if not_shift
      not_shift = false
    elsif tags
      tag = tags.shift
    end

    if DEBUG
      p "mid"
      p count
    end

    case occurs
    when '?'
      if count > 2
        raise TooMuchTagError.new(name, tag_name)
      else
        if name == tag
          do_redo = true
        else
          not_shift = true
        end
      end
    when '*'
      if name == tag
        do_redo = true
      else
        not_shift = true
      end
    when '+'
      if name == tag
        do_redo = true
      else
        if count > 1
          not_shift = true
        else
          raise MissingTagError.new(name, tag_name)
        end
      end
    else
      if name == tag
        if models[i+1] and models[i+1][0] != name and
            tags and tags.first == name
          raise TooMuchTagError.new(name, tag_name)
        end
      else
        raise MissingTagError.new(name, tag_name)
      end
    end

    if DEBUG
      p "after"
      p not_shift
      p do_redo
      p tag
    end

    if do_redo
      do_redo = false
      count += 1
      redo
    else
      count = 1
    end

  end

  if !ignore_unknown_element and !tags.nil? and !tags.empty?
    raise NotExpectedTagError.new(tags.first, uri, tag_name)
  end

end
Comments

Have your say
Please use Textile formatting (click here for a cheat sheet). Use <code/> and <pre/> for code samples.
Click here to login with OpenID to to post comments.