html-proofer 5.0.5 → 5.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/html_proofer/attribute/url.rb +34 -35
- data/lib/html_proofer/check/favicon.rb +2 -4
- data/lib/html_proofer/check/images.rb +10 -17
- data/lib/html_proofer/check/links.rb +13 -20
- data/lib/html_proofer/check/open_graph.rb +5 -7
- data/lib/html_proofer/check/scripts.rb +6 -11
- data/lib/html_proofer/check.rb +6 -6
- data/lib/html_proofer/element.rb +1 -1
- data/lib/html_proofer/runner.rb +3 -3
- data/lib/html_proofer/url_validator/internal.rb +5 -14
- data/lib/html_proofer/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 96326ab8326657b7f11d5cc1baddfb82e8dcb115e4a2aa576161642ebbe9afe4
|
4
|
+
data.tar.gz: ce761e92fcfe407fa4711558b60a6453545cdba6b7b97f8be8da22109e451256
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2c66bf1334c00dacb13d2789f119cf5e0f2da723afd59e82948589e26e54e6e12bb5778b23cc758fe81a9d99d112c501e607eacc2247a3258bda60904d7ec65d
|
7
|
+
data.tar.gz: c81c4482233aa8fe86721de10332dc9f42ed03c4103ff0c77144a6fffc0f715e7964be2a0b935a04fbc586b4f78a2b445eebb9df5912076e910ab387add299cd
|
@@ -3,13 +3,16 @@
|
|
3
3
|
module HTMLProofer
|
4
4
|
class Attribute
|
5
5
|
class Url < HTMLProofer::Attribute
|
6
|
-
attr_reader :url, :size
|
6
|
+
attr_reader :url, :size, :source, :filename
|
7
7
|
|
8
8
|
REMOTE_SCHEMES = ["http", "https"].freeze
|
9
9
|
|
10
|
-
def initialize(runner, link_attribute, base_url: nil, extract_size: false)
|
10
|
+
def initialize(runner, link_attribute, base_url: nil, source: nil, filename: nil, extract_size: false)
|
11
11
|
super
|
12
12
|
|
13
|
+
@source = source
|
14
|
+
@filename = filename
|
15
|
+
|
13
16
|
if @raw_attribute.nil?
|
14
17
|
@url = nil
|
15
18
|
else
|
@@ -115,9 +118,29 @@ module HTMLProofer
|
|
115
118
|
def exists?
|
116
119
|
return true if base64?
|
117
120
|
|
118
|
-
|
121
|
+
!resolved_path.nil?
|
122
|
+
end
|
123
|
+
|
124
|
+
def resolved_path
|
125
|
+
path_to_resolve = absolute_path
|
126
|
+
|
127
|
+
return @runner.resolved_paths[path_to_resolve] if @runner.resolved_paths.key?(path_to_resolve)
|
128
|
+
|
129
|
+
# extensionless URLs
|
130
|
+
path_with_extension = "#{path_to_resolve}#{@runner.options[:assume_extension]}"
|
131
|
+
resolved = if @runner.options[:assume_extension] && File.file?(path_with_extension)
|
132
|
+
path_with_extension # existence checked implicitly by File.file?
|
133
|
+
# implicit index support
|
134
|
+
elsif File.directory?(path_to_resolve) && !unslashed_directory?(path_to_resolve)
|
135
|
+
path_with_index = File.join(path_to_resolve, @runner.options[:directory_index_file])
|
136
|
+
path_with_index if File.file?(path_with_index)
|
137
|
+
# explicit file or directory
|
138
|
+
elsif File.exist?(path_to_resolve)
|
139
|
+
path_to_resolve
|
140
|
+
end
|
141
|
+
@runner.resolved_paths[path_to_resolve] = resolved
|
119
142
|
|
120
|
-
|
143
|
+
resolved
|
121
144
|
end
|
122
145
|
|
123
146
|
def base64?
|
@@ -125,47 +148,23 @@ module HTMLProofer
|
|
125
148
|
end
|
126
149
|
|
127
150
|
def absolute_path
|
128
|
-
path =
|
151
|
+
path = full_path || @filename
|
129
152
|
|
130
153
|
File.expand_path(path, Dir.pwd)
|
131
154
|
end
|
132
155
|
|
133
|
-
def
|
156
|
+
def full_path
|
134
157
|
return if path.nil? || path.empty?
|
135
158
|
|
136
|
-
path_dot_ext = ""
|
137
|
-
|
138
|
-
path_dot_ext = path + @runner.options[:assume_extension] unless blank?(@runner.options[:assume_extension])
|
139
|
-
|
140
159
|
base = if absolute_path?(path) # path relative to root
|
141
|
-
# either overwrite with root_dir; or, if source is directory, use that; or, just get the
|
142
|
-
@runner.options[:root_dir] || (File.directory?(@
|
143
|
-
# relative links, path is a file
|
144
|
-
elsif File.exist?(File.expand_path(
|
145
|
-
path,
|
146
|
-
@runner.current_source,
|
147
|
-
)) || File.exist?(File.expand_path(path_dot_ext, @runner.current_source))
|
148
|
-
File.dirname(@runner.current_filename)
|
149
|
-
# relative links in nested dir, path is a file
|
150
|
-
elsif File.exist?(File.join(
|
151
|
-
File.dirname(@runner.current_filename),
|
152
|
-
path,
|
153
|
-
)) || File.exist?(File.join(File.dirname(@runner.current_filename), path_dot_ext))
|
154
|
-
File.dirname(@runner.current_filename)
|
155
|
-
# relative link, path is a directory
|
160
|
+
# either overwrite with root_dir; or, if source is directory, use that; or, just get the source file's dirname
|
161
|
+
@runner.options[:root_dir] || (File.directory?(@source) ? @source : File.dirname(@source))
|
156
162
|
else
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
file = File.join(base, path)
|
161
|
-
|
162
|
-
if @runner.options[:assume_extension] && File.file?("#{file}#{@runner.options[:assume_extension]}")
|
163
|
-
file = "#{file}#{@runner.options[:assume_extension]}"
|
164
|
-
elsif File.directory?(file) && !unslashed_directory?(file) # implicit index support
|
165
|
-
file = File.join(file, @runner.options[:directory_index_file])
|
163
|
+
# path relative to the file where the link is defined
|
164
|
+
File.dirname(@filename)
|
166
165
|
end
|
167
166
|
|
168
|
-
|
167
|
+
File.join(base, path)
|
169
168
|
end
|
170
169
|
|
171
170
|
def unslashed_directory?(file)
|
@@ -19,16 +19,14 @@ module HTMLProofer
|
|
19
19
|
if @favicon.url.protocol_relative?
|
20
20
|
add_failure(
|
21
21
|
"favicon link #{@favicon.url} is a protocol-relative URL, use explicit https:// instead",
|
22
|
-
|
23
|
-
content: @favicon.content,
|
22
|
+
element: @favicon,
|
24
23
|
)
|
25
24
|
elsif @favicon.url.remote?
|
26
25
|
add_to_external_urls(@favicon.url, @favicon.line)
|
27
26
|
elsif !@favicon.url.exists?
|
28
27
|
add_failure(
|
29
28
|
"internal favicon #{@favicon.url.raw_attribute} does not exist",
|
30
|
-
|
31
|
-
content: @favicon.content,
|
29
|
+
element: @favicon,
|
32
30
|
)
|
33
31
|
end
|
34
32
|
else
|
@@ -14,41 +14,37 @@ module HTMLProofer
|
|
14
14
|
# screenshot filenames should return because of terrible names
|
15
15
|
add_failure(
|
16
16
|
"image has a terrible filename (#{@img.url.raw_attribute})",
|
17
|
-
|
18
|
-
content: @img.content,
|
17
|
+
element: @img,
|
19
18
|
) if terrible_filename?
|
20
19
|
|
21
20
|
# does the image exist?
|
22
21
|
if missing_src?
|
23
|
-
add_failure("image has no src or srcset attribute",
|
22
|
+
add_failure("image has no src or srcset attribute", element: @img)
|
24
23
|
elsif @img.url.protocol_relative?
|
25
24
|
add_failure(
|
26
25
|
"image link #{@img.url} is a protocol-relative URL, use explicit https:// instead",
|
27
|
-
|
28
|
-
content: @img.content,
|
26
|
+
element: @img,
|
29
27
|
)
|
30
28
|
elsif @img.url.remote?
|
31
29
|
add_to_external_urls(@img.url, @img.line)
|
32
30
|
elsif !@img.url.exists? && !@img.multiple_srcsets? && !@img.multiple_sizes?
|
33
31
|
add_failure(
|
34
32
|
"internal image #{@img.url.raw_attribute} does not exist",
|
35
|
-
|
36
|
-
content: @img.content,
|
33
|
+
element: @img,
|
37
34
|
)
|
38
35
|
elsif @img.multiple_srcsets? || @img.multiple_sizes?
|
39
36
|
@img.srcsets_wo_sizes.each do |srcset|
|
40
|
-
srcset_url = HTMLProofer::Attribute::Url.new(@runner, srcset, base_url: @img.base_url, extract_size: true)
|
37
|
+
srcset_url = HTMLProofer::Attribute::Url.new(@runner, srcset, base_url: @img.base_url, source: @img.url.source, filename: @img.url.filename, extract_size: true)
|
41
38
|
|
42
39
|
if srcset_url.protocol_relative?
|
43
40
|
add_failure(
|
44
41
|
"image link #{srcset_url.url} is a protocol-relative URL, use explicit https:// instead",
|
45
|
-
|
46
|
-
content: @img.content,
|
42
|
+
element: @img,
|
47
43
|
)
|
48
44
|
elsif srcset_url.remote?
|
49
45
|
add_to_external_urls(srcset_url.url, @img.line)
|
50
46
|
elsif !srcset_url.exists?
|
51
|
-
add_failure("internal image #{srcset} does not exist",
|
47
|
+
add_failure("internal image #{srcset} does not exist", element: @img)
|
52
48
|
end
|
53
49
|
end
|
54
50
|
end
|
@@ -58,22 +54,19 @@ module HTMLProofer
|
|
58
54
|
if missing_alt_tag? && !ignore_missing_alt?
|
59
55
|
add_failure(
|
60
56
|
"image #{@img.url.raw_attribute} does not have an alt attribute",
|
61
|
-
|
62
|
-
content: @img.content,
|
57
|
+
element: @img,
|
63
58
|
)
|
64
59
|
elsif (empty_alt_tag? || alt_all_spaces?) && !ignore_empty_alt?
|
65
60
|
add_failure(
|
66
61
|
"image #{@img.url.raw_attribute} has an alt attribute, but no content",
|
67
|
-
|
68
|
-
content: @img.content,
|
62
|
+
element: @img,
|
69
63
|
)
|
70
64
|
end
|
71
65
|
end
|
72
66
|
|
73
67
|
add_failure(
|
74
68
|
"image #{@img.url.raw_attribute} uses the http scheme",
|
75
|
-
|
76
|
-
content: @img.content,
|
69
|
+
element: @img,
|
77
70
|
) if @runner.enforce_https? && @img.url.http?
|
78
71
|
end
|
79
72
|
|
@@ -10,7 +10,7 @@ module HTMLProofer
|
|
10
10
|
next if @link.ignore?
|
11
11
|
|
12
12
|
if !allow_hash_href? && @link.node["href"] == "#"
|
13
|
-
add_failure("linking to internal hash #, which points to nowhere",
|
13
|
+
add_failure("linking to internal hash #, which points to nowhere", element: @link)
|
14
14
|
next
|
15
15
|
end
|
16
16
|
|
@@ -18,21 +18,20 @@ module HTMLProofer
|
|
18
18
|
if blank?(@link.url.raw_attribute)
|
19
19
|
next if allow_missing_href?
|
20
20
|
|
21
|
-
add_failure("'#{@link.node.name}' tag is missing a reference",
|
21
|
+
add_failure("'#{@link.node.name}' tag is missing a reference", element: @link)
|
22
22
|
next
|
23
23
|
end
|
24
24
|
|
25
25
|
# is it even a valid URL?
|
26
26
|
unless @link.url.valid?
|
27
|
-
add_failure("#{@link.href} is an invalid URL",
|
27
|
+
add_failure("#{@link.href} is an invalid URL", element: @link)
|
28
28
|
next
|
29
29
|
end
|
30
30
|
|
31
31
|
if @link.url.protocol_relative?
|
32
32
|
add_failure(
|
33
33
|
"#{@link.url} is a protocol-relative URL, use explicit https:// instead",
|
34
|
-
|
35
|
-
content: @link.content,
|
34
|
+
element: @link,
|
36
35
|
)
|
37
36
|
next
|
38
37
|
end
|
@@ -50,7 +49,7 @@ module HTMLProofer
|
|
50
49
|
next if @link.node["rel"] == "dns-prefetch"
|
51
50
|
|
52
51
|
unless @link.url.path?
|
53
|
-
add_failure("#{@link.url.raw_attribute} is an invalid URL",
|
52
|
+
add_failure("#{@link.url.raw_attribute} is an invalid URL", element: @link)
|
54
53
|
next
|
55
54
|
end
|
56
55
|
|
@@ -60,8 +59,7 @@ module HTMLProofer
|
|
60
59
|
if @link.url.unslashed_directory?(@link.url.absolute_path)
|
61
60
|
add_failure(
|
62
61
|
"internally linking to a directory #{@link.url.raw_attribute} without trailing slash",
|
63
|
-
|
64
|
-
content: @link.content,
|
62
|
+
element: @link,
|
65
63
|
)
|
66
64
|
next
|
67
65
|
end
|
@@ -88,7 +86,7 @@ module HTMLProofer
|
|
88
86
|
when "http"
|
89
87
|
return unless @runner.options[:enforce_https]
|
90
88
|
|
91
|
-
add_failure("#{@link.url.raw_attribute} is not an HTTPS link",
|
89
|
+
add_failure("#{@link.url.raw_attribute} is not an HTTPS link", element: @link)
|
92
90
|
end
|
93
91
|
end
|
94
92
|
|
@@ -96,14 +94,12 @@ module HTMLProofer
|
|
96
94
|
if @link.url.path.empty?
|
97
95
|
add_failure(
|
98
96
|
"#{@link.url.raw_attribute} contains no email address",
|
99
|
-
|
100
|
-
content: @link.content,
|
97
|
+
element: @link,
|
101
98
|
) unless ignore_empty_mailto?
|
102
99
|
elsif !/#{URI::MailTo::EMAIL_REGEXP}/o.match?(@link.url.path)
|
103
100
|
add_failure(
|
104
101
|
"#{@link.url.raw_attribute} contains an invalid email address",
|
105
|
-
|
106
|
-
content: @link.content,
|
102
|
+
element: @link,
|
107
103
|
)
|
108
104
|
end
|
109
105
|
end
|
@@ -111,8 +107,7 @@ module HTMLProofer
|
|
111
107
|
def handle_tel
|
112
108
|
add_failure(
|
113
109
|
"#{@link.url.raw_attribute} contains no phone number",
|
114
|
-
|
115
|
-
content: @link.content,
|
110
|
+
element: @link,
|
116
111
|
) if @link.url.path.empty?
|
117
112
|
end
|
118
113
|
|
@@ -130,16 +125,14 @@ module HTMLProofer
|
|
130
125
|
if blank?(@link.node["integrity"]) && blank?(@link.node["crossorigin"])
|
131
126
|
add_failure(
|
132
127
|
"SRI and CORS not provided in: #{@link.url.raw_attribute}",
|
133
|
-
|
134
|
-
content: @link.content,
|
128
|
+
element: @link,
|
135
129
|
)
|
136
130
|
elsif blank?(@link.node["integrity"])
|
137
|
-
add_failure("Integrity is missing in: #{@link.url.raw_attribute}",
|
131
|
+
add_failure("Integrity is missing in: #{@link.url.raw_attribute}", element: @link)
|
138
132
|
elsif blank?(@link.node["crossorigin"])
|
139
133
|
add_failure(
|
140
134
|
"CORS not provided for external resource in: #{@link.link.url.raw_attribute}",
|
141
|
-
|
142
|
-
content: @link.content,
|
135
|
+
element: @link,
|
143
136
|
)
|
144
137
|
end
|
145
138
|
end
|
@@ -11,24 +11,22 @@ module HTMLProofer
|
|
11
11
|
|
12
12
|
# does the open_graph exist?
|
13
13
|
if missing_content?
|
14
|
-
add_failure("open graph has no content attribute",
|
14
|
+
add_failure("open graph has no content attribute", element: @open_graph)
|
15
15
|
elsif empty_content?
|
16
|
-
add_failure("open graph content attribute is empty",
|
16
|
+
add_failure("open graph content attribute is empty", element: @open_graph)
|
17
17
|
elsif !@open_graph.url.valid?
|
18
|
-
add_failure("#{@open_graph.src} is an invalid URL",
|
18
|
+
add_failure("#{@open_graph.src} is an invalid URL", element: @open_graph)
|
19
19
|
elsif @open_graph.url.protocol_relative?
|
20
20
|
add_failure(
|
21
21
|
"open graph link #{@open_graph.url} is a protocol-relative URL, use explicit https:// instead",
|
22
|
-
|
23
|
-
content: @open_graph.content,
|
22
|
+
element: @open_graph,
|
24
23
|
)
|
25
24
|
elsif @open_graph.url.remote?
|
26
25
|
add_to_external_urls(@open_graph.url, @open_graph.line)
|
27
26
|
else
|
28
27
|
add_failure(
|
29
28
|
"internal open graph #{@open_graph.url.raw_attribute} does not exist",
|
30
|
-
|
31
|
-
content: @open_graph.content,
|
29
|
+
element: @open_graph,
|
32
30
|
) unless @open_graph.url.exists?
|
33
31
|
end
|
34
32
|
end
|
@@ -12,12 +12,11 @@ module HTMLProofer
|
|
12
12
|
|
13
13
|
# does the script exist?
|
14
14
|
if missing_src?
|
15
|
-
add_failure("script is empty and has no src attribute",
|
15
|
+
add_failure("script is empty and has no src attribute", element: @script)
|
16
16
|
elsif @script.url.protocol_relative?
|
17
17
|
add_failure(
|
18
18
|
"script link #{@script.url} is a protocol-relative URL, use explicit https:// instead",
|
19
|
-
|
20
|
-
content: @script.content,
|
19
|
+
element: @script,
|
21
20
|
)
|
22
21
|
elsif @script.url.remote?
|
23
22
|
add_to_external_urls(@script.url, @script.line)
|
@@ -25,8 +24,7 @@ module HTMLProofer
|
|
25
24
|
elsif !@script.url.exists?
|
26
25
|
add_failure(
|
27
26
|
"internal script reference #{@script.src} does not exist",
|
28
|
-
|
29
|
-
content: @script.content,
|
27
|
+
element: @script,
|
30
28
|
)
|
31
29
|
end
|
32
30
|
end
|
@@ -42,20 +40,17 @@ module HTMLProofer
|
|
42
40
|
if blank?(@script.node["integrity"]) && blank?(@script.node["crossorigin"])
|
43
41
|
add_failure(
|
44
42
|
"SRI and CORS not provided in: #{@script.url.raw_attribute}",
|
45
|
-
|
46
|
-
content: @script.content,
|
43
|
+
element: @script,
|
47
44
|
)
|
48
45
|
elsif blank?(@script.node["integrity"])
|
49
46
|
add_failure(
|
50
47
|
"Integrity is missing in: #{@script.url.raw_attribute}",
|
51
|
-
|
52
|
-
content: @script.content,
|
48
|
+
element: @script,
|
53
49
|
)
|
54
50
|
elsif blank?(@script.node["crossorigin"])
|
55
51
|
add_failure(
|
56
52
|
"CORS not provided for external resource in: #{@script.url.raw_attribute}",
|
57
|
-
|
58
|
-
content: @script.content,
|
53
|
+
element: @script,
|
59
54
|
)
|
60
55
|
end
|
61
56
|
end
|
data/lib/html_proofer/check.rb
CHANGED
@@ -24,14 +24,14 @@ module HTMLProofer
|
|
24
24
|
raise NotImplementedError, "HTMLProofer::Check subclasses must implement #run"
|
25
25
|
end
|
26
26
|
|
27
|
-
def add_failure(description, line: nil, status: nil, content: nil)
|
27
|
+
def add_failure(description, element: nil, line: nil, status: nil, content: nil)
|
28
28
|
@failures << Failure.new(
|
29
29
|
@runner.current_filename,
|
30
30
|
short_name,
|
31
31
|
description,
|
32
|
-
line: line,
|
32
|
+
line: element.nil? ? line : element.line,
|
33
33
|
status: status,
|
34
|
-
content: content,
|
34
|
+
content: element.nil? ? content : element.content,
|
35
35
|
)
|
36
36
|
end
|
37
37
|
|
@@ -45,8 +45,8 @@ module HTMLProofer
|
|
45
45
|
@internal_urls[url_string] = [] if @internal_urls[url_string].nil?
|
46
46
|
|
47
47
|
metadata = {
|
48
|
-
source:
|
49
|
-
filename:
|
48
|
+
source: url.source,
|
49
|
+
filename: url.filename,
|
50
50
|
line: line,
|
51
51
|
base_url: base_url,
|
52
52
|
found: false,
|
@@ -59,7 +59,7 @@ module HTMLProofer
|
|
59
59
|
|
60
60
|
@external_urls[url_string] = [] if @external_urls[url_string].nil?
|
61
61
|
|
62
|
-
@external_urls[url_string] << { filename:
|
62
|
+
@external_urls[url_string] << { filename: url.filename, line: line }
|
63
63
|
end
|
64
64
|
|
65
65
|
class << self
|
data/lib/html_proofer/element.rb
CHANGED
@@ -16,7 +16,7 @@ module HTMLProofer
|
|
16
16
|
swap_attributes!
|
17
17
|
|
18
18
|
@base_url = base_url
|
19
|
-
@url = Attribute::Url.new(runner, link_attribute, base_url: base_url)
|
19
|
+
@url = Attribute::Url.new(runner, link_attribute, base_url: base_url, source: @runner.current_source, filename: @runner.current_filename)
|
20
20
|
|
21
21
|
@line = node.line
|
22
22
|
@content = node.content
|
data/lib/html_proofer/runner.rb
CHANGED
@@ -6,8 +6,8 @@ module HTMLProofer
|
|
6
6
|
class Runner
|
7
7
|
include HTMLProofer::Utils
|
8
8
|
|
9
|
-
attr_reader :options, :cache, :logger, :internal_urls, :external_urls, :
|
10
|
-
attr_accessor :
|
9
|
+
attr_reader :options, :cache, :logger, :internal_urls, :external_urls, :resolved_paths, :current_check, :current_filename, :current_source
|
10
|
+
attr_accessor :reporter
|
11
11
|
|
12
12
|
URL_TYPES = [:external, :internal].freeze
|
13
13
|
|
@@ -26,7 +26,7 @@ module HTMLProofer
|
|
26
26
|
|
27
27
|
@before_request = []
|
28
28
|
|
29
|
-
@
|
29
|
+
@resolved_paths = {}
|
30
30
|
|
31
31
|
@current_check = nil
|
32
32
|
@current_source = nil
|
@@ -29,15 +29,11 @@ module HTMLProofer
|
|
29
29
|
matched_count_to_log = pluralize(matched_files.count, "reference", "references")
|
30
30
|
@logger.log(:debug, "(#{i + 1} / #{links.count}) Internal link #{link}: Checking #{matched_count_to_log}")
|
31
31
|
matched_files.each do |metadata|
|
32
|
-
url = HTMLProofer::Attribute::Url.new(@runner, link, base_url: metadata[:base_url])
|
32
|
+
url = HTMLProofer::Attribute::Url.new(@runner, link, base_url: metadata[:base_url], source: metadata[:source], filename: metadata[:filename])
|
33
33
|
|
34
|
-
|
35
|
-
@runner.current_filename = metadata[:filename]
|
36
|
-
|
37
|
-
target_file_path = url.absolute_path
|
38
|
-
unless file_exists?(target_file_path)
|
34
|
+
unless url.exists?
|
39
35
|
@failed_checks << Failure.new(
|
40
|
-
|
36
|
+
metadata[:filename],
|
41
37
|
"Links > Internal",
|
42
38
|
"internally linking to #{url}, which does not exist",
|
43
39
|
line: metadata[:line],
|
@@ -51,6 +47,7 @@ module HTMLProofer
|
|
51
47
|
hash_exists = hash_exists_for_url?(url)
|
52
48
|
if hash_exists.nil?
|
53
49
|
# the hash needs to be checked in the target file, we collect the url and metadata
|
50
|
+
target_file_path = url.resolved_path
|
54
51
|
unless file_paths_hashes_to_check.key?(target_file_path)
|
55
52
|
file_paths_hashes_to_check[target_file_path] = {}
|
56
53
|
end
|
@@ -62,7 +59,7 @@ module HTMLProofer
|
|
62
59
|
end
|
63
60
|
unless hash_exists
|
64
61
|
@failed_checks << Failure.new(
|
65
|
-
|
62
|
+
metadata[:filename],
|
66
63
|
"Links > Internal",
|
67
64
|
"internally linking to #{url}; the file exists, but the hash '#{url.hash}' does not",
|
68
65
|
line: metadata[:line],
|
@@ -109,12 +106,6 @@ module HTMLProofer
|
|
109
106
|
@failed_checks
|
110
107
|
end
|
111
108
|
|
112
|
-
private def file_exists?(absolute_path)
|
113
|
-
return @runner.checked_paths[absolute_path] if @runner.checked_paths.key?(absolute_path)
|
114
|
-
|
115
|
-
@runner.checked_paths[absolute_path] = File.exist?(absolute_path)
|
116
|
-
end
|
117
|
-
|
118
109
|
# verify the hash w/o just based on the URL, w/o looking at the target file
|
119
110
|
# => returns nil if the has could not be verified
|
120
111
|
private def hash_exists_for_url?(url)
|
data/lib/html_proofer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: html-proofer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Garen Torikian
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-03-
|
11
|
+
date: 2023-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|