class HTMLProofer::Attribute::Url

Constants

REMOTE_SCHEMES

Attributes

filename[R]
size[R]
source[R]
url[R]

Public Class Methods

new(runner, link_attribute, base_url: nil, source: nil, filename: nil, extract_size: false) click to toggle source
Calls superclass method HTMLProofer::Attribute::new
# 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

Public Instance Methods

absolute_path() click to toggle source
# 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) click to toggle source
# File lib/html_proofer/attribute/url.rb, line 181
def absolute_path?(path)
  path.start_with?("/")
end
base64?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 147
def base64?
  /^data:image/.match?(@raw_attribute)
end
domain_path() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 110
def domain_path
  (host || "") + path
end
exists?() click to toggle source

checks if a file exists relative to the current pwd

# File lib/html_proofer/attribute/url.rb, line 119
def exists?
  return true if base64?

  !resolved_path.nil?
end
external?() click to toggle source

path is external to the file

# File lib/html_proofer/attribute/url.rb, line 186
def external?
  !internal?
end
follow_location?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 177
def follow_location?
  @runner.options[:typhoeus] && @runner.options[:typhoeus][:followlocation]
end
full_path() click to toggle source
# 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?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 212
def has_hash?
  url.include?("#")
end
hash() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 77
def hash
  parts&.fragment
end
hash?() click to toggle source

Does the URL have a hash?

# File lib/html_proofer/attribute/url.rb, line 82
def hash?
  !blank?(hash)
end
host() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 106
def host
  parts&.host
end
http?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 94
def http?
  scheme == "http"
end
https?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 98
def https?
  scheme == "https"
end
ignore?() click to toggle source
# 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?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 190
def internal?
  relative_link? || internal_absolute_link? || hash_link?
end
known_extension?() click to toggle source
# 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
non_http_remote?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 102
def non_http_remote?
  !scheme.nil? && !remote?
end
parts() click to toggle source
# 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
path() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 73
def path
  Addressable::URI.unencode(parts.path) unless parts.nil?
end
path?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 63
def path?
  !parts.host.nil? && !parts.path.nil?
end
protocol_relative?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 29
def protocol_relative?
  url.start_with?("//")
end
query_values() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 114
def query_values
  parts&.query_values
end
remote?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 90
def remote?
  REMOTE_SCHEMES.include?(scheme)
end
resolved_path() click to toggle source
# 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
scheme() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 86
def scheme
  parts&.scheme
end
to_s() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 33
def to_s
  @url
end
unknown_extension?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 49
def unknown_extension?
  !known_extension?
end
unslashed_directory?(file) click to toggle source
# 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?() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 59
def valid?
  !parts.nil?
end
without_hash() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 220
def without_hash
  @url.to_s.sub(/##{hash}/, "")
end

Private Instance Methods

clean_url!() click to toggle source

catch any obvious issues

# File lib/html_proofer/attribute/url.rb, line 225
        def clean_url!
  parsed_url = Addressable::URI.parse(@url)
  url = if parsed_url.scheme.nil?
    parsed_url
  else
    parsed_url.normalize
  end.to_s

  # normalize strips this off, which causes issues with cache
  @url = if @url.end_with?("/") && !url.end_with?("/")
    "#{url}/"
  elsif !@url.end_with?("/") && url.end_with?("/")
    url.chop
  else
    url
  end
rescue Addressable::URI::InvalidURIError # rubocop:disable Lint/SuppressedException; error will be reported at check time
end
ignores_pattern?(links_to_ignore) click to toggle source
# File lib/html_proofer/attribute/url.rb, line 252
        def ignores_pattern?(links_to_ignore)
  return false unless links_to_ignore.is_a?(Array)

  links_to_ignore.each do |link_to_ignore|
    case link_to_ignore
    when String
      return true if link_to_ignore == @raw_attribute
    when Regexp
      return true if link_to_ignore&.match?(@raw_attribute)
    end
  end

  false
end
swap_urls!() click to toggle source
# File lib/html_proofer/attribute/url.rb, line 244
        def swap_urls!
  return @url if blank?(replacements = @runner.options[:swap_urls])

  replacements.each do |link, replace|
    @url = @url.gsub(link, replace)
  end
end