Class: HTMLProofer::Attribute::Url

Inherits:
HTMLProofer::Attribute show all
Defined in:
lib/html_proofer/attribute/url.rb

Constant Summary collapse

REMOTE_SCHEMES =
["http", "https"].freeze

Instance Attribute Summary collapse

Attributes inherited from HTMLProofer::Attribute

#raw_attribute

Instance Method Summary collapse

Methods included from Utils

#blank?, #create_nokogiri, #pluralize

Constructor Details

#initialize(runner, link_attribute, base_url: nil, source: nil, filename: nil, extract_size: false) ⇒ Url

Returns a new instance of Url.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/html_proofer/attribute/url.rb', line 10

def initialize(runner, link_attribute, base_url: nil, source: nil, filename: nil, extract_size: false)
  super

  @source = source
  @filename = filename

  if @raw_attribute.nil?
    @url = nil
  else
    @url = @raw_attribute.delete("\u200b").strip
    @url, @size = @url.split(/\s+/) if extract_size
    @url = Addressable::URI.join(base_url, @url).to_s unless blank?(base_url)
    @url = "" if @url.nil?

    swap_urls!
    clean_url!
  end
end

Instance Attribute Details

#filenameObject (readonly)

Returns the value of attribute filename.



6
7
8
# File 'lib/html_proofer/attribute/url.rb', line 6

def filename
  @filename
end

#sizeObject (readonly)

Returns the value of attribute size.



6
7
8
# File 'lib/html_proofer/attribute/url.rb', line 6

def size
  @size
end

#sourceObject (readonly)

Returns the value of attribute source.



6
7
8
# File 'lib/html_proofer/attribute/url.rb', line 6

def source
  @source
end

#urlObject (readonly)

Returns the value of attribute url.



6
7
8
# File 'lib/html_proofer/attribute/url.rb', line 6

def url
  @url
end

Instance Method Details

#absolute_pathObject



151
152
153
154
155
# File 'lib/html_proofer/attribute/url.rb', line 151

def absolute_path
  path = full_path || @filename

  File.expand_path(path, Dir.pwd)
end

#absolute_path?(path) ⇒ Boolean

Returns:

  • (Boolean)


181
182
183
# File 'lib/html_proofer/attribute/url.rb', line 181

def absolute_path?(path)
  path.start_with?("/")
end

#base64?Boolean

Returns:

  • (Boolean)


147
148
149
# File 'lib/html_proofer/attribute/url.rb', line 147

def base64?
  /^data:image/.match?(@raw_attribute)
end

#domain_pathObject



110
111
112
# File 'lib/html_proofer/attribute/url.rb', line 110

def domain_path
  (host || "") + path
end

#exists?Boolean

checks if a file exists relative to the current pwd

Returns:

  • (Boolean)


119
120
121
122
123
# File 'lib/html_proofer/attribute/url.rb', line 119

def exists?
  return true if base64?

  !resolved_path.nil?
end

#external?Boolean

path is external to the file

Returns:

  • (Boolean)


186
187
188
# File 'lib/html_proofer/attribute/url.rb', line 186

def external?
  !internal?
end

#follow_location?Boolean

Returns:

  • (Boolean)


177
178
179
# File 'lib/html_proofer/attribute/url.rb', line 177

def follow_location?
  @runner.options[:typhoeus] && @runner.options[:typhoeus][:followlocation]
end

#full_pathObject



157
158
159
160
161
162
163
164
165
166
167
168
169
# File 'lib/html_proofer/attribute/url.rb', line 157

def full_path
  return if path.nil? || path.empty?

  base = if absolute_path?(path) # path relative to root
    # either overwrite with root_dir; or, if source is directory, use that; or, just get the source file's dirname
    @runner.options[:root_dir] || (File.directory?(@source) ? @source : File.dirname(@source))
  else
    # path relative to the file where the link is defined
    File.dirname(@filename)
  end

  File.join(base, path)
end

#has_hash?Boolean

Returns:

  • (Boolean)


212
213
214
# File 'lib/html_proofer/attribute/url.rb', line 212

def has_hash?
  url.include?("#")
end

#hashObject



77
78
79
# File 'lib/html_proofer/attribute/url.rb', line 77

def hash
  parts&.fragment
end

#hash?Boolean

Does the URL have a hash?

Returns:

  • (Boolean)


82
83
84
# File 'lib/html_proofer/attribute/url.rb', line 82

def hash?
  !blank?(hash)
end

#hash_link?Boolean

Returns:

  • (Boolean)


208
209
210
# File 'lib/html_proofer/attribute/url.rb', line 208

def hash_link?
  url.start_with?("#")
end

#hostObject



106
107
108
# File 'lib/html_proofer/attribute/url.rb', line 106

def host
  parts&.host
end

#http?Boolean

Returns:

  • (Boolean)


94
95
96
# File 'lib/html_proofer/attribute/url.rb', line 94

def http?
  scheme == "http"
end

#https?Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/html_proofer/attribute/url.rb', line 98

def https?
  scheme == "https"
end

#ignore?Boolean

Returns:

  • (Boolean)


53
54
55
56
57
# File 'lib/html_proofer/attribute/url.rb', line 53

def ignore?
  return true if /^javascript:/.match?(@url)

  true if ignores_pattern?(@runner.options[:ignore_urls])
end

#internal?Boolean

Returns:

  • (Boolean)


190
191
192
# File 'lib/html_proofer/attribute/url.rb', line 190

def internal?
  relative_link? || internal_absolute_link? || hash_link?
end

#internal_absolute_link?Boolean

Returns:

  • (Boolean)


194
195
196
# File 'lib/html_proofer/attribute/url.rb', line 194

def internal_absolute_link?
  url.start_with?("/")
end

#known_extension?Boolean

Returns:

  • (Boolean)


37
38
39
40
41
42
43
44
45
46
47
# File 'lib/html_proofer/attribute/url.rb', line 37

def known_extension?
  return true if hash_link?
  return true if path.end_with?("/")

  ext = File.extname(path)

  # no extension means we use the assumed one
  return @runner.options[:extensions].include?(@runner.options[:assume_extension]) if blank?(ext)

  @runner.options[:extensions].include?(ext)
end

Returns:

  • (Boolean)


204
205
206
# File 'lib/html_proofer/attribute/url.rb', line 204

def link_points_to_same_page?
  hash_link || param_link
end

#non_http_remote?Boolean

Returns:

  • (Boolean)


102
103
104
# File 'lib/html_proofer/attribute/url.rb', line 102

def non_http_remote?
  !scheme.nil? && !remote?
end

#param_link?Boolean

Returns:

  • (Boolean)


216
217
218
# File 'lib/html_proofer/attribute/url.rb', line 216

def param_link?
  url.start_with?("?")
end

#partsObject



67
68
69
70
71
# File 'lib/html_proofer/attribute/url.rb', line 67

def parts
  @parts ||= Addressable::URI.parse(@url)
rescue URI::Error, Addressable::URI::InvalidURIError
  @parts = nil
end

#pathObject



73
74
75
# File 'lib/html_proofer/attribute/url.rb', line 73

def path
  Addressable::URI.unencode(parts.path) unless parts.nil?
end

#path?Boolean

Returns:

  • (Boolean)


63
64
65
# File 'lib/html_proofer/attribute/url.rb', line 63

def path?
  !parts.host.nil? && !parts.path.nil?
end

#protocol_relative?Boolean

Returns:

  • (Boolean)


29
30
31
# File 'lib/html_proofer/attribute/url.rb', line 29

def protocol_relative?
  url.start_with?("//")
end

#query_valuesObject



114
115
116
# File 'lib/html_proofer/attribute/url.rb', line 114

def query_values
  parts&.query_values
end

#relative_link?Boolean

Returns:

  • (Boolean)


198
199
200
201
202
# File 'lib/html_proofer/attribute/url.rb', line 198

def relative_link?
  return false if remote?

  hash_link? || param_link? || url.start_with?(".") || url =~ /^\S/
end

#remote?Boolean

Returns:

  • (Boolean)


90
91
92
# File 'lib/html_proofer/attribute/url.rb', line 90

def remote?
  REMOTE_SCHEMES.include?(scheme)
end

#resolved_pathObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/html_proofer/attribute/url.rb', line 125

def resolved_path
  path_to_resolve = absolute_path

  return @runner.resolved_paths[path_to_resolve] if @runner.resolved_paths.key?(path_to_resolve)

  # extensionless URLs
  path_with_extension = "#{path_to_resolve}#{@runner.options[:assume_extension]}"
  resolved = if @runner.options[:assume_extension] && File.file?(path_with_extension)
    path_with_extension # existence checked implicitly by File.file?
  # implicit index support
  elsif File.directory?(path_to_resolve) && !unslashed_directory?(path_to_resolve)
    path_with_index = File.join(path_to_resolve, @runner.options[:directory_index_file])
    path_with_index if File.file?(path_with_index)
  # explicit file or directory
  elsif File.exist?(path_to_resolve)
    path_to_resolve
  end
  @runner.resolved_paths[path_to_resolve] = resolved

  resolved
end

#schemeObject



86
87
88
# File 'lib/html_proofer/attribute/url.rb', line 86

def scheme
  parts&.scheme
end

#to_sObject



33
34
35
# File 'lib/html_proofer/attribute/url.rb', line 33

def to_s
  @url
end

#unknown_extension?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'lib/html_proofer/attribute/url.rb', line 49

def unknown_extension?
  !known_extension?
end

#unslashed_directory?(file) ⇒ Boolean

Returns:

  • (Boolean)


171
172
173
174
175
# File 'lib/html_proofer/attribute/url.rb', line 171

def unslashed_directory?(file)
  return false unless File.directory?(file)

  !file.end_with?(File::SEPARATOR) && !follow_location?
end

#valid?Boolean

Returns:

  • (Boolean)


59
60
61
# File 'lib/html_proofer/attribute/url.rb', line 59

def valid?
  !parts.nil?
end

#without_hashObject



220
221
222
# File 'lib/html_proofer/attribute/url.rb', line 220

def without_hash
  @url.to_s.sub(/##{hash}/, "")
end