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



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

def absolute_path
  path = full_path || @filename

  File.expand_path(path, Dir.pwd)
end

#absolute_path?(path) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#base64?Boolean

Returns:

  • (Boolean)


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

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

#domain_pathObject



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

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

#exists?Boolean

checks if a file exists relative to the current pwd

Returns:

  • (Boolean)


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

def exists?
  return true if base64?

  !resolved_path.nil?
end

#external?Boolean

path is external to the file

Returns:

  • (Boolean)


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

def external?
  !internal?
end

#follow_location?Boolean

Returns:

  • (Boolean)


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

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

#full_pathObject



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

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)


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

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

#hashObject



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

def hash
  parts&.fragment
end

#hash?Boolean

Does the URL have a hash?

Returns:

  • (Boolean)


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

def hash?
  !blank?(hash)
end

#hash_link?Boolean

Returns:

  • (Boolean)


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

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

#hostObject



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

def host
  parts&.host
end

#http?Boolean

Returns:

  • (Boolean)


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

def http?
  scheme == "http"
end

#https?Boolean

Returns:

  • (Boolean)


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

def https?
  scheme == "https"
end

#ignore?Boolean

Returns:

  • (Boolean)


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

def ignore?
  return true if /^javascript:/.match?(@url)
  return true if ignores_pattern?(@runner.options[:ignore_urls])
end

#internal?Boolean

Returns:

  • (Boolean)


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

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

#internal_absolute_link?Boolean

Returns:

  • (Boolean)


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

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)


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

def link_points_to_same_page?
  hash_link || param_link
end

#non_http_remote?Boolean

Returns:

  • (Boolean)


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

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

#param_link?Boolean

Returns:

  • (Boolean)


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

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

#partsObject



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

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

#pathObject



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

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

#path?Boolean

Returns:

  • (Boolean)


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

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



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

def query_values
  parts&.query_values
end

#relative_link?Boolean

Returns:

  • (Boolean)


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

def relative_link?
  return false if remote?

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

#remote?Boolean

Returns:

  • (Boolean)


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

def remote?
  REMOTE_SCHEMES.include?(scheme)
end

#resolved_pathObject



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

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



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

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)


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

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

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

#valid?Boolean

Returns:

  • (Boolean)


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

def valid?
  !parts.nil?
end

#without_hashObject



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

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