/
link.rb
73 lines (58 loc) · 1.57 KB
/
link.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
##
# This class encapsulates links. It contains the text and the URI for
# 'a' tags parsed out of an HTML page. If the link contains an image,
# the alt text will be used for that image.
#
# For example, the text for the following links with both be 'Hello World':
#
# <a href="http://example">Hello World</a>
# <a href="http://example"><img src="test.jpg" alt="Hello World"></a>
class Mechanize::Page::Link
attr_reader :node
attr_reader :href
attr_reader :attributes
attr_reader :page
alias :referer :page
def initialize(node, mech, page)
@node = node
@href = node['href']
@text = nil
@page = page
@mech = mech
@attributes = node
end
# Click on this link
def click
@mech.click self
end
# This method is a shorthand to get link's DOM id.
# Common usage: page.link_with(:dom_id => "links_exact_id")
def dom_id
node['id']
end
# A list of words in the rel attribute, all lower-cased.
def rel
@rel ||= (val = attributes['rel']) ? val.downcase.split(' ') : []
end
# Test if the rel attribute includes +kind+.
def rel?(kind)
rel.include?(kind)
end
# The text content of this link
def text
return @text if @text
@text = node.inner_text
# If there is no text, try to find an image and use it's alt text
if (@text.nil? or @text.empty?) and not node.search('img').empty? then
@text = ''
@node.search('img').each do |e|
@text << ( e['alt'] || '')
end
end
@text
end
alias :to_s :text
def uri
@href && URI.parse(WEBrick::HTTPUtils.escape(@href))
end
end