Class: Horseman::Dom::Document

Inherits:
Object
  • Object
show all
Defined in:
lib/horseman/dom/document.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(body) ⇒ Document

Returns a new instance of Document.



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/horseman/dom/document.rb', line 13

def initialize(body)
  @forms = {}
  @scripts = []
  @frames = {}

  @field_types = {
      'text' => :text,
      'checkbox' => :checkbox,
      'hidden' => :hidden,
      'submit' => :submit
    }
    
    @encoding_types = {
      'application/x-www-form-urlencoded' => :url,
      'multipart/form-data' => :multipart
    }
    
  parse! body
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *arguments, &block) ⇒ Object



89
90
91
92
93
94
95
96
97
98
# File 'lib/horseman/dom/document.rb', line 89

def method_missing(method, *arguments, &block)
  case method
  when :[]
    indexer = arguments[0]
    form = @forms.select {|id, form| id.to_s == indexer}.map {|k,v| v}.first
    return form unless form.nil?
  end

  puts "Not implemented in Document: #{method} #{arguments.join(',')}"
end

Instance Attribute Details

#domObject (readonly)

Returns the value of attribute dom.



11
12
13
# File 'lib/horseman/dom/document.rb', line 11

def dom
  @dom
end

#formsObject (readonly)

Returns the value of attribute forms.



11
12
13
# File 'lib/horseman/dom/document.rb', line 11

def forms
  @forms
end

#framesObject (readonly)

Returns the value of attribute frames.



11
12
13
# File 'lib/horseman/dom/document.rb', line 11

def frames
  @frames
end

#scriptsObject (readonly)

Returns the value of attribute scripts.



11
12
13
# File 'lib/horseman/dom/document.rb', line 11

def scripts
  @scripts
end

Instance Method Details

#parse!(body) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/horseman/dom/document.rb', line 33

def parse!(body)
  doc = Nokogiri::HTML(body)
    
    doc.css('form').select{|f| f.attr('id')}.each do |f|
      form = Form.new(f.attr('id'), f.attr('name'))
      form.action = f.attr('action') || '/'
      form.encoding = @encoding_types[f.attr('enctype')] || :url
      form.fields = {}
      
      f.css('input').select{|i| i.attr('name')}.each do |i|
        field = FormField.new(i.attr('id'), i.attr('name'))
        field.type = @field_types[i.attr('type')] || :text
        field.value = i.attr('value')

        form.fields[field.name.to_sym] = field 
        form.submit = field if (field.type == :submit)  
      end
      
      @forms[form.id.to_sym] = form
    end

    valid_script_types = ['javascript', 'text/javascript']
    doc.css('script').select{|s| (s.attr('type').nil?) || (valid_script_types.include? s.attr('type')) }.each do |s|
      script = Script.new
      if s.attr('src')
        # TODO -- account for HTTP failures
        js_src = s.attr('src')
        begin
          script.body = open(s.attr('src'))  {|f| f.read.strip}
        rescue
          puts "Could not load javascript at #{js_src}"  
        end
      else
        script.body = s.inner_html.strip
      end

      @scripts << script
    end

    doc.css('frame').select{|f| f.attr('src') && f.attr('name')}.each do |f|
      frame_src = f.attr('src')
      begin
        frame_body = open(frame_src) {|f| f.read.strip}
        @frames[f.attr('name').to_sym] = Document.new(frame_body)
      rescue
        puts "Could not load frame at #{frame_src}"
      end
    end

    @dom = doc
end

#respond_to?(method_sym, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


85
86
87
# File 'lib/horseman/dom/document.rb', line 85

def respond_to?(method_sym, include_private = false)
  true
end