html-proofer 2.4.2 → 2.5.0
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/README.md +56 -46
- data/bin/htmlproof +4 -2
- data/lib/html/proofer.rb +20 -13
- data/lib/html/proofer/cache.rb +16 -0
- data/lib/html/proofer/check_runner.rb +39 -6
- data/lib/html/proofer/checkable.rb +5 -5
- data/lib/html/proofer/checks/favicon.rb +8 -8
- data/lib/html/proofer/checks/html.rb +6 -4
- data/lib/html/proofer/checks/images.rb +9 -12
- data/lib/html/proofer/checks/links.rb +47 -32
- data/lib/html/proofer/checks/scripts.rb +6 -5
- data/lib/html/proofer/log.rb +6 -2
- data/lib/html/proofer/url_validator.rb +6 -6
- data/lib/html/proofer/utils.rb +17 -15
- data/lib/html/proofer/version.rb +1 -1
- data/spec/html/proofer/fixtures/links/check_just_once.html +8 -0
- data/spec/html/proofer/fixtures/vcr_cassettes/links/check_just_once_html.yml +87 -0
- data/spec/html/proofer/fixtures/vcr_cassettes/sorting/status_verbosity_info_typhoeus_followlocation_false_error_sort_status_.yml +244 -0
- data/spec/html/proofer/links_spec.rb +6 -0
- data/spec/html/proofer/utils_spec.rb +3 -3
- data/spec/html/proofer_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -0
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b2c47bd5d3ea56e4d6f2a5f4ee3ba01ed43b337
|
4
|
+
data.tar.gz: 381527e029581dcb0249372f345d838a2950f136
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0a72bfe1b0702177843865d6b36008a1136a1e8366c37ffce4ea37a91d8dc876e394167328a77068ae1f2b70d2fa48f7fa0bcd82d0d8b7518d219949ae8cd056
|
7
|
+
data.tar.gz: 25a3d37a3dcf3ff4f8ea439ac1344bdac5f55b4d5621017f7b8b22d4e963fb5f7c8e49d774a223a251117e7407afad464aae471839bdb04f4174edaa3f170370
|
data/README.md
CHANGED
@@ -22,16 +22,10 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
**NOTE:** When installation speed matters, set `NOKOGIRI_USE_SYSTEM_LIBRARIES` to `true` in your environment. This is useful for increasing the speed of your Continuous Integration builds.
|
24
24
|
|
25
|
-
### Real-life examples
|
26
|
-
|
27
|
-
Project | Repository
|
28
|
-
:--- | :---
|
29
|
-
[Raspberry Pi documentation](http://www.raspberrypi.org/documentation/) | [raspberrypi/documentation]( https://github.com/raspberrypi/documentation)
|
30
|
-
[Open Whisper Systems website](https://whispersystems.org/) | [WhisperSystems/whispersystems.org](https://github.com/WhisperSystems/whispersystems.org)
|
31
|
-
[Jekyll website](http://jekyllrb.com/) | [jekyll/jekyll](https://github.com/jekyll/jekyll)
|
32
|
-
|
33
25
|
## What's Tested?
|
34
26
|
|
27
|
+
You can enable or disable most of the following checks.
|
28
|
+
|
35
29
|
### Images
|
36
30
|
|
37
31
|
`img` elements:
|
@@ -44,24 +38,24 @@ Project | Repository
|
|
44
38
|
|
45
39
|
`a`, `link` elements:
|
46
40
|
|
47
|
-
* Whether your internal links are
|
41
|
+
* Whether your internal links are working
|
42
|
+
* Whether your internal hash references (`#linkToMe`) are working
|
48
43
|
* Whether external links are working
|
49
44
|
|
50
45
|
### Scripts
|
51
46
|
|
52
47
|
`script` elements:
|
53
48
|
|
54
|
-
* Whether your internal script references are
|
49
|
+
* Whether your internal script references are working
|
55
50
|
* Whether external scripts are loading
|
56
51
|
|
57
52
|
### Favicon
|
58
53
|
|
59
|
-
|
54
|
+
* Whether your favicons are valid.
|
60
55
|
|
61
56
|
### HTML
|
62
57
|
|
63
|
-
|
64
|
-
This is an optional feature, set the `check_html` option to enable validation errors from Nokogiri.
|
58
|
+
* Whether your HTML markup is valid. This is done via [Nokogiri, to ensure well-formed markup](http://www.nokogiri.org/tutorials/ensuring_well_formed_markup.html).
|
65
59
|
|
66
60
|
## Usage
|
67
61
|
|
@@ -125,12 +119,34 @@ task :test do
|
|
125
119
|
end
|
126
120
|
```
|
127
121
|
|
128
|
-
Don't have or want a `Rakefile`? You
|
122
|
+
Don't have or want a `Rakefile`? You can also do something like the following:
|
129
123
|
|
130
124
|
```bash
|
131
125
|
htmlproof ./_site
|
132
126
|
```
|
133
127
|
|
128
|
+
### Array of links
|
129
|
+
|
130
|
+
Instead of a directory as the first argument, you can also pass in an array of links:
|
131
|
+
|
132
|
+
``` ruby
|
133
|
+
HTML::Proofer.new(["http://github.com", "http://jekyllrb.com"])
|
134
|
+
```
|
135
|
+
|
136
|
+
This configures Proofer to just test those links to ensure they are valid. Note that for the command-line, you'll need to pass a special `--as-links` argument:
|
137
|
+
|
138
|
+
``` bash
|
139
|
+
htmlproof www.google.com,www.github.com --as-links
|
140
|
+
```
|
141
|
+
|
142
|
+
## Ignoring content
|
143
|
+
|
144
|
+
Add the `data-proofer-ignore` attribute to any tag to ignore it from every check.
|
145
|
+
|
146
|
+
``` html
|
147
|
+
<a href="http://notareallink" data-proofer-ignore>Not checked.</a>
|
148
|
+
```
|
149
|
+
|
134
150
|
## Configuration
|
135
151
|
|
136
152
|
The `HTML::Proofer` constructor takes an optional hash of additional options:
|
@@ -148,12 +164,13 @@ The `HTML::Proofer` constructor takes an optional hash of additional options:
|
|
148
164
|
| `error_sort` | Defines the sort order for error output. Can be `:path`, `:desc`, or `:status`. | `:path`
|
149
165
|
| `ext` | The extension of your HTML files including the dot. | `.html`
|
150
166
|
| `file_ignore` | An array of Strings or RegExps containing file paths that are safe to ignore. | `[]` |
|
151
|
-
| `href_ignore` | An array of Strings or RegExps containing `href`s that are safe to ignore. Note that non-HTTP(S) URIs are always ignored. | `[]` |
|
152
|
-
| `href_swap` | A hash containing key-value pairs of `RegExp => String`. It transforms links that match `RegExp` into `String` via `gsub`. | `{}` |
|
167
|
+
| `href_ignore` | An array of Strings or RegExps containing `href`s that are safe to ignore. Note that non-HTTP(S) URIs are always ignored. **Will be renamed in a future release.** | `[]` |
|
168
|
+
| `href_swap` | A hash containing key-value pairs of `RegExp => String`. It transforms links that match `RegExp` into `String` via `gsub`. **Will be renamed in a future release.** | `{}` |
|
153
169
|
| `ignore_script_embeds` | When `check_html` is enabled, `script` tags containing markup [are reported as errors](http://git.io/vOovv). Enabling this option ignores those errors. | `false`
|
154
170
|
| `only_4xx` | Only reports errors for links that fall within the 4xx status code range. | `false` |
|
155
171
|
| `url_ignore` | An array of Strings or RegExps containing URLs that are safe to ignore. It affects all HTML attributes. Note that non-HTTP(S) URIs are always ignored. | `[]` |
|
156
|
-
| `verbose` | If `true`, outputs extra information as the checking happens. Useful for debugging.
|
172
|
+
| `verbose` | If `true`, outputs extra information as the checking happens. Useful for debugging. **Will be deprecated in a future release.**| `false` |
|
173
|
+
| `verbosity` | Sets the logging level, as determined by [Yell](https://github.com/rudionrails/yell). | `:info`
|
157
174
|
|
158
175
|
### Configuring Typhoeus and Hydra
|
159
176
|
|
@@ -163,7 +180,7 @@ The `HTML::Proofer` constructor takes an optional hash of additional options:
|
|
163
180
|
HTML::Proofer.new("out/", {:ext => ".htm", :typhoeus => { :verbose => true, :ssl_verifyhost => 2 } })
|
164
181
|
```
|
165
182
|
|
166
|
-
This sets `HTML::Proofer`'s extensions to use _.htm_,
|
183
|
+
This sets `HTML::Proofer`'s extensions to use _.htm_, gives Typhoeus a configuration for it to be verbose, and use specific SSL settings. Check [the Typhoeus documentation](https://github.com/typhoeus/typhoeus#other-curl-options) for more information on what options it can receive.
|
167
184
|
|
168
185
|
You can similarly pass in a `:hydra` option with a hash configuration for Hydra.
|
169
186
|
|
@@ -171,40 +188,26 @@ The default value is `typhoeus => { :followlocation => true }`.
|
|
171
188
|
|
172
189
|
### Configuring Parallel
|
173
190
|
|
174
|
-
[Parallel](https://github.com/grosser/parallel) is
|
191
|
+
[Parallel](https://github.com/grosser/parallel) is used to speed internal file checks. You can pass in any of its options with the options namespace `:parallel`. For example:
|
175
192
|
|
176
193
|
``` ruby
|
177
194
|
HTML::Proofer.new("out/", {:ext => ".htm", :parallel => { :in_processes => 3} })
|
178
195
|
```
|
179
196
|
|
180
|
-
`:in_processes => 3`
|
181
|
-
|
182
|
-
### Array of links
|
183
|
-
|
184
|
-
Instead of a directory as the first argument, you can also pass in an array of links:
|
185
|
-
|
186
|
-
``` ruby
|
187
|
-
HTML::Proofer.new(["http://github.com", "http://jekyllrb.com"])
|
188
|
-
```
|
189
|
-
|
190
|
-
This configures Proofer to just test those links to ensure they are valid. Note that for the command-line, you'll need to pass a special `--as-links` argument:
|
197
|
+
In this example, `:in_processes => 3` is passed into Parallel as a configuration option.
|
191
198
|
|
192
|
-
|
193
|
-
bin/htmlproof www.google.com,www.github.com --as-links
|
194
|
-
```
|
199
|
+
## Logging
|
195
200
|
|
196
|
-
|
201
|
+
HTML-Proofer can be as noisy or as quiet as you'd like. There are two ways to log information:
|
197
202
|
|
198
|
-
|
203
|
+
* If you set the `:verbose` option to `true`, HTML-Proofer will provide some debug information.
|
204
|
+
* If you set the `:verbosity` option, you can better define the level of logging. See the configuration table above for more information.
|
199
205
|
|
200
|
-
|
201
|
-
``` html
|
202
|
-
<a href="http://notareallink" data-proofer-ignore>Not checked.</a>
|
203
|
-
```
|
206
|
+
`:verbosity` is newer and offers better configuration. `:verbose` will be deprecated in a future 3.x.x release.
|
204
207
|
|
205
208
|
## Custom tests
|
206
209
|
|
207
|
-
Want to write your own test? Sure! Just create two classes--one that inherits from `HTML::Proofer::
|
210
|
+
Want to write your own test? Sure! Just create two classes--one that inherits from `HTML::Proofer::Checkable`, and another that inherits from `HTML::Proofer::CheckRunner`.
|
208
211
|
|
209
212
|
The `CheckRunner` subclass must define one method called `run`. This is called on your content, and is responsible for performing the validation on whatever elements you like. When you catch a broken issue, call `add_issue(message)` to explain the error.
|
210
213
|
|
@@ -214,7 +217,6 @@ Here's an example custom test that protects against `mailto` links that point to
|
|
214
217
|
|
215
218
|
``` ruby
|
216
219
|
class OctocatLinkCheck < ::HTML::Proofer::Checkable
|
217
|
-
|
218
220
|
def mailto?
|
219
221
|
return false if @data_ignore_proofer || @href.nil? || @href.empty?
|
220
222
|
return @href.match /^mailto\:/
|
@@ -227,13 +229,13 @@ class OctocatLinkCheck < ::HTML::Proofer::Checkable
|
|
227
229
|
end
|
228
230
|
|
229
231
|
class MailToOctocat < ::HTML::Proofer::CheckRunner
|
230
|
-
|
231
232
|
def run
|
232
|
-
@html.css('a').each do |
|
233
|
-
link = OctocatLinkCheck.new
|
233
|
+
@html.css('a').each do |node|
|
234
|
+
link = OctocatLinkCheck.new(node, self)
|
235
|
+
line = node.line
|
234
236
|
|
235
237
|
if link.mailto? && link.octocat?
|
236
|
-
return add_issue("Don't email the Octocat directly!")
|
238
|
+
return add_issue("Don't email the Octocat directly!", line)
|
237
239
|
end
|
238
240
|
end
|
239
241
|
end
|
@@ -244,7 +246,7 @@ end
|
|
244
246
|
|
245
247
|
### Certificates
|
246
248
|
|
247
|
-
To ignore certificates turn off
|
249
|
+
To ignore certificates, turn off Typhoeus' SSL verification:
|
248
250
|
|
249
251
|
``` ruby
|
250
252
|
HTML::Proofer.new("out/", {
|
@@ -264,3 +266,11 @@ HTML::Proofer.new("out/", {
|
|
264
266
|
:headers => { "User-Agent" => "Mozilla/5.0 (compatible; My New User-Agent)" }
|
265
267
|
}}).run
|
266
268
|
```
|
269
|
+
|
270
|
+
## Real-life examples
|
271
|
+
|
272
|
+
Project | Repository
|
273
|
+
:--- | :---
|
274
|
+
[Raspberry Pi documentation](http://www.raspberrypi.org/documentation/) | [raspberrypi/documentation]( https://github.com/raspberrypi/documentation)
|
275
|
+
[Open Whisper Systems website](https://whispersystems.org/) | [WhisperSystems/whispersystems.org](https://github.com/WhisperSystems/whispersystems.org)
|
276
|
+
[Jekyll website](http://jekyllrb.com/) | [jekyll/jekyll](https://github.com/jekyll/jekyll)
|
data/bin/htmlproof
CHANGED
@@ -8,7 +8,7 @@ require 'mercenary'
|
|
8
8
|
require 'rubygems'
|
9
9
|
|
10
10
|
def to_regex?(item)
|
11
|
-
if item.start_with?
|
11
|
+
if item.start_with?('/') && item.end_with?('/')
|
12
12
|
Regexp.new item[1...-1]
|
13
13
|
else
|
14
14
|
item
|
@@ -40,6 +40,7 @@ Mercenary.program(:htmlproof) do |p|
|
|
40
40
|
p.option 'only_4xx', '--only-4xx', 'Only reports errors for links that fall within the 4x status code range.'
|
41
41
|
p.option 'url_ignore', '--url-ignore link1,[link2,...]', Array, 'Comma-separated list of Strings or RegExps containing URLs that are safe to ignore.'
|
42
42
|
p.option 'verbose', '--verbose', 'Enables more verbose logging.'
|
43
|
+
p.option 'verbosity', '--verbosity', String, 'Sets the logging level, as determined by Yell'
|
43
44
|
|
44
45
|
p.action do |args, opts|
|
45
46
|
args = ['.'] if args.empty?
|
@@ -47,7 +48,7 @@ Mercenary.program(:htmlproof) do |p|
|
|
47
48
|
|
48
49
|
options = {}
|
49
50
|
|
50
|
-
# prepare
|
51
|
+
# prepare everything to go to proofer
|
51
52
|
p.options.select { |o| !opts[o.config_key].nil? }.each do |option|
|
52
53
|
if option.return_type.to_s == 'Array' # TODO: is_a? doesn't work here?
|
53
54
|
opts[option.config_key] = opts[option.config_key].map { |i| to_regex?(i) }
|
@@ -65,6 +66,7 @@ Mercenary.program(:htmlproof) do |p|
|
|
65
66
|
end
|
66
67
|
|
67
68
|
options[:error_sort] = opts['error-sort'].to_sym unless opts['error-sort'].nil?
|
69
|
+
options[:verbosity] = opts['verbosity'].to_sym unless opts['verbosity'].nil?
|
68
70
|
|
69
71
|
path = path.delete(' ').split(',') if opts['as_links']
|
70
72
|
|
data/lib/html/proofer.rb
CHANGED
@@ -20,20 +20,27 @@ rescue LoadError; end
|
|
20
20
|
module HTML
|
21
21
|
|
22
22
|
class Proofer
|
23
|
-
include Utils
|
23
|
+
include HTML::Proofer::Utils
|
24
24
|
|
25
|
-
attr_reader :options, :typhoeus_opts, :hydra_opts, :parallel_opts, :validation_opts
|
25
|
+
attr_reader :options, :typhoeus_opts, :hydra_opts, :parallel_opts, :validation_opts, :external_urls
|
26
26
|
|
27
27
|
TYPHOEUS_DEFAULTS = {
|
28
28
|
:followlocation => true,
|
29
29
|
:headers => {
|
30
|
-
|
30
|
+
'User-Agent' => "Mozilla/5.0 (compatible; HTML Proofer/#{VERSION}; +https://github.com/gjtorikian/html-proofer)"
|
31
31
|
}
|
32
32
|
}
|
33
33
|
|
34
34
|
def initialize(src, opts = {})
|
35
35
|
@src = src
|
36
36
|
|
37
|
+
if opts[:verbose]
|
38
|
+
warn '`@options[:verbose]` will be removed in a future 3.x.x release: http://git.io/vGHHh'
|
39
|
+
end
|
40
|
+
if opts[:href_ignore]
|
41
|
+
warn '`@options[:href_ignore]` will be renamed in a future 3.x.x release: http://git.io/vGHHy'
|
42
|
+
end
|
43
|
+
|
37
44
|
@proofer_opts = {
|
38
45
|
:ext => '.html',
|
39
46
|
:check_favicon => false,
|
@@ -72,7 +79,7 @@ module HTML
|
|
72
79
|
end
|
73
80
|
|
74
81
|
def logger
|
75
|
-
@logger ||= HTML::Proofer::Log.new(@options[:verbose])
|
82
|
+
@logger ||= HTML::Proofer::Log.new(@options[:verbose], @options[:verbosity])
|
76
83
|
end
|
77
84
|
|
78
85
|
def run
|
@@ -95,27 +102,27 @@ module HTML
|
|
95
102
|
|
96
103
|
def check_list_of_links
|
97
104
|
if @options[:href_swap]
|
98
|
-
@src = @src.map do |
|
99
|
-
swap(
|
105
|
+
@src = @src.map do |url|
|
106
|
+
swap(url, @options[:href_swap])
|
100
107
|
end
|
101
108
|
end
|
102
|
-
external_urls = Hash[*@src.map { |s| [s, nil] }.flatten]
|
103
|
-
validate_urls
|
109
|
+
@external_urls = Hash[*@src.map { |s| [s, nil] }.flatten]
|
110
|
+
validate_urls
|
104
111
|
end
|
105
112
|
|
106
113
|
# Collects any external URLs found in a directory of files. Also collectes
|
107
114
|
# every failed test from check_files_for_internal_woes.
|
108
115
|
# Sends the external URLs to Typhoeus for batch processing.
|
109
116
|
def check_directory_of_files
|
110
|
-
external_urls = {}
|
117
|
+
@external_urls = {}
|
111
118
|
results = check_files_for_internal_woes
|
112
119
|
|
113
120
|
results.each do |item|
|
114
|
-
external_urls.merge!(item[:external_urls])
|
121
|
+
@external_urls.merge!(item[:external_urls])
|
115
122
|
@failed_tests.concat(item[:failed_tests])
|
116
123
|
end
|
117
124
|
|
118
|
-
validate_urls
|
125
|
+
validate_urls unless @options[:disable_external]
|
119
126
|
|
120
127
|
logger.log :info, :blue, "Ran on #{files.length} files!\n\n"
|
121
128
|
end
|
@@ -137,8 +144,8 @@ module HTML
|
|
137
144
|
end
|
138
145
|
end
|
139
146
|
|
140
|
-
def validate_urls
|
141
|
-
url_validator = HTML::Proofer::UrlValidator.new(logger, external_urls, @options, @typhoeus_opts, @hydra_opts)
|
147
|
+
def validate_urls
|
148
|
+
url_validator = HTML::Proofer::UrlValidator.new(logger, @external_urls, @options, @typhoeus_opts, @hydra_opts)
|
142
149
|
@failed_tests.concat(url_validator.run)
|
143
150
|
end
|
144
151
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module HTML
|
2
|
+
class Proofer
|
3
|
+
module Cache
|
4
|
+
def create_nokogiri(path)
|
5
|
+
if File.exist? path
|
6
|
+
content = File.open(path).read
|
7
|
+
else
|
8
|
+
content = path
|
9
|
+
end
|
10
|
+
|
11
|
+
Nokogiri::HTML(content)
|
12
|
+
end
|
13
|
+
module_function :create_nokogiri
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -6,7 +6,8 @@ module HTML
|
|
6
6
|
class CheckRunner
|
7
7
|
|
8
8
|
attr_reader :issues, :src, :path, :options, :typhoeus_opts, :hydra_opts, :parallel_opts, \
|
9
|
-
:validation_opts, :external_urls, :href_ignores, :url_ignores, :alt_ignores,
|
9
|
+
:validation_opts, :external_urls, :href_ignores, :url_ignores, :alt_ignores, \
|
10
|
+
:empty_alt_ignore
|
10
11
|
|
11
12
|
def initialize(src, path, html, options, typhoeus_opts, hydra_opts, parallel_opts, validation_opts)
|
12
13
|
@src = src
|
@@ -23,6 +24,7 @@ module HTML
|
|
23
24
|
@alt_ignores = @options[:alt_ignore]
|
24
25
|
@empty_alt_ignore = @options[:empty_alt_ignore]
|
25
26
|
@external_urls = {}
|
27
|
+
@external_domain_paths_with_queries = {}
|
26
28
|
end
|
27
29
|
|
28
30
|
def run
|
@@ -33,14 +35,45 @@ module HTML
|
|
33
35
|
@issues << Issue.new(@path, desc, line_number, status)
|
34
36
|
end
|
35
37
|
|
36
|
-
def add_to_external_urls(
|
37
|
-
if @external_urls[
|
38
|
-
|
38
|
+
def add_to_external_urls(url, line)
|
39
|
+
return if @external_urls[url]
|
40
|
+
uri = Addressable::URI.parse(url)
|
41
|
+
|
42
|
+
if uri.query.nil?
|
43
|
+
add_path_for_url(url)
|
44
|
+
else
|
45
|
+
new_url_query_values?(uri, url)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_path_for_url(url)
|
50
|
+
if @external_urls[url]
|
51
|
+
@external_urls[url] << @path
|
39
52
|
else
|
40
|
-
@external_urls[
|
53
|
+
@external_urls[url] = [@path]
|
41
54
|
end
|
42
55
|
end
|
43
56
|
|
57
|
+
def new_url_query_values?(uri, url)
|
58
|
+
queries = uri.query_values.keys.join('-')
|
59
|
+
domain_path = extract_domain_path(uri)
|
60
|
+
if @external_domain_paths_with_queries[domain_path].nil?
|
61
|
+
add_path_for_url(url)
|
62
|
+
# remember queries we've seen, ignore future ones
|
63
|
+
@external_domain_paths_with_queries[domain_path] = [queries]
|
64
|
+
else
|
65
|
+
# add queries we haven't seen
|
66
|
+
unless @external_domain_paths_with_queries[domain_path].include?(queries)
|
67
|
+
add_path_for_url(url)
|
68
|
+
@external_domain_paths_with_queries[domain_path] << queries
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def extract_domain_path(uri)
|
74
|
+
uri.host + uri.path
|
75
|
+
end
|
76
|
+
|
44
77
|
def self.checks
|
45
78
|
classes = []
|
46
79
|
|
@@ -52,7 +85,7 @@ module HTML
|
|
52
85
|
classes
|
53
86
|
end
|
54
87
|
|
55
|
-
|
88
|
+
private
|
56
89
|
|
57
90
|
def remove_ignored(html)
|
58
91
|
html.css('code, pre').each(&:unlink)
|
@@ -5,7 +5,8 @@ module HTML
|
|
5
5
|
class Proofer
|
6
6
|
# Represents the superclass from which all checks derive.
|
7
7
|
class Checkable
|
8
|
-
include HTML::Utils
|
8
|
+
include HTML::Proofer::Utils
|
9
|
+
|
9
10
|
attr_reader :line
|
10
11
|
|
11
12
|
def initialize(obj, check)
|
@@ -75,12 +76,12 @@ module HTML
|
|
75
76
|
return true if ignores_pattern_check(@check.url_ignores)
|
76
77
|
|
77
78
|
# ignore user defined hrefs
|
78
|
-
if 'LinkCheckable'
|
79
|
+
if 'LinkCheckable' == @type
|
79
80
|
return true if ignores_pattern_check(@check.href_ignores)
|
80
81
|
end
|
81
82
|
|
82
83
|
# ignore user defined alts
|
83
|
-
if 'ImageCheckable'
|
84
|
+
if 'ImageCheckable' == @type
|
84
85
|
return true if ignores_pattern_check(@check.alt_ignores)
|
85
86
|
end
|
86
87
|
end
|
@@ -102,7 +103,7 @@ module HTML
|
|
102
103
|
def file_path
|
103
104
|
return if path.nil?
|
104
105
|
|
105
|
-
if path =~
|
106
|
+
if path =~ %r{^/} # path relative to root
|
106
107
|
base = File.directory?(@check.src) ? @check.src : File.dirname(@check.src)
|
107
108
|
elsif File.exist?(File.expand_path path, @check.src) # relative links, path is a file
|
108
109
|
base = File.dirname @check.path
|
@@ -158,7 +159,6 @@ module HTML
|
|
158
159
|
def real_attr(attr)
|
159
160
|
attr.to_s unless attr.nil? || attr.empty?
|
160
161
|
end
|
161
|
-
|
162
162
|
end
|
163
163
|
end
|
164
164
|
end
|