nanoc3 3.2.4 → 3.3.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.
- metadata +14 -313
- data/.gemtest +0 -0
- data/ChangeLog +0 -3
- data/Gemfile +0 -29
- data/LICENSE +0 -19
- data/NEWS.md +0 -449
- data/README.md +0 -108
- data/Rakefile +0 -14
- data/bin/nanoc3 +0 -12
- data/doc/yardoc_templates/default/layout/html/footer.erb +0 -10
- data/lib/nanoc3.rb +0 -28
- data/lib/nanoc3/base.rb +0 -49
- data/lib/nanoc3/base/compilation/checksum_store.rb +0 -57
- data/lib/nanoc3/base/compilation/compiled_content_cache.rb +0 -62
- data/lib/nanoc3/base/compilation/compiler.rb +0 -455
- data/lib/nanoc3/base/compilation/compiler_dsl.rb +0 -214
- data/lib/nanoc3/base/compilation/dependency_tracker.rb +0 -196
- data/lib/nanoc3/base/compilation/filter.rb +0 -165
- data/lib/nanoc3/base/compilation/item_rep_proxy.rb +0 -102
- data/lib/nanoc3/base/compilation/item_rep_recorder_proxy.rb +0 -88
- data/lib/nanoc3/base/compilation/outdatedness_checker.rb +0 -223
- data/lib/nanoc3/base/compilation/outdatedness_reasons.rb +0 -46
- data/lib/nanoc3/base/compilation/rule.rb +0 -73
- data/lib/nanoc3/base/compilation/rule_context.rb +0 -84
- data/lib/nanoc3/base/compilation/rule_memory_calculator.rb +0 -40
- data/lib/nanoc3/base/compilation/rule_memory_store.rb +0 -53
- data/lib/nanoc3/base/compilation/rules_collection.rb +0 -231
- data/lib/nanoc3/base/context.rb +0 -47
- data/lib/nanoc3/base/core_ext.rb +0 -6
- data/lib/nanoc3/base/core_ext/array.rb +0 -62
- data/lib/nanoc3/base/core_ext/hash.rb +0 -63
- data/lib/nanoc3/base/core_ext/pathname.rb +0 -26
- data/lib/nanoc3/base/core_ext/string.rb +0 -46
- data/lib/nanoc3/base/directed_graph.rb +0 -275
- data/lib/nanoc3/base/errors.rb +0 -174
- data/lib/nanoc3/base/memoization.rb +0 -67
- data/lib/nanoc3/base/notification_center.rb +0 -84
- data/lib/nanoc3/base/ordered_hash.rb +0 -200
- data/lib/nanoc3/base/plugin_registry.rb +0 -165
- data/lib/nanoc3/base/result_data/item_rep.rb +0 -488
- data/lib/nanoc3/base/source_data/code_snippet.rb +0 -58
- data/lib/nanoc3/base/source_data/configuration.rb +0 -24
- data/lib/nanoc3/base/source_data/data_source.rb +0 -234
- data/lib/nanoc3/base/source_data/item.rb +0 -301
- data/lib/nanoc3/base/source_data/layout.rb +0 -130
- data/lib/nanoc3/base/source_data/site.rb +0 -361
- data/lib/nanoc3/base/store.rb +0 -135
- data/lib/nanoc3/cli.rb +0 -133
- data/lib/nanoc3/cli/command.rb +0 -139
- data/lib/nanoc3/cli/commands/autocompile.rb +0 -60
- data/lib/nanoc3/cli/commands/compile.rb +0 -280
- data/lib/nanoc3/cli/commands/create_item.rb +0 -62
- data/lib/nanoc3/cli/commands/create_layout.rb +0 -75
- data/lib/nanoc3/cli/commands/create_site.rb +0 -410
- data/lib/nanoc3/cli/commands/debug.rb +0 -119
- data/lib/nanoc3/cli/commands/info.rb +0 -98
- data/lib/nanoc3/cli/commands/nanoc.rb +0 -37
- data/lib/nanoc3/cli/commands/update.rb +0 -72
- data/lib/nanoc3/cli/commands/view.rb +0 -84
- data/lib/nanoc3/cli/commands/watch.rb +0 -125
- data/lib/nanoc3/cli/error_handler.rb +0 -193
- data/lib/nanoc3/cli/logger.rb +0 -91
- data/lib/nanoc3/data_sources.rb +0 -29
- data/lib/nanoc3/data_sources/deprecated/delicious.rb +0 -42
- data/lib/nanoc3/data_sources/deprecated/last_fm.rb +0 -87
- data/lib/nanoc3/data_sources/deprecated/twitter.rb +0 -38
- data/lib/nanoc3/data_sources/filesystem.rb +0 -299
- data/lib/nanoc3/data_sources/filesystem_unified.rb +0 -116
- data/lib/nanoc3/data_sources/filesystem_verbose.rb +0 -86
- data/lib/nanoc3/extra.rb +0 -22
- data/lib/nanoc3/extra/auto_compiler.rb +0 -103
- data/lib/nanoc3/extra/chick.rb +0 -125
- data/lib/nanoc3/extra/core_ext.rb +0 -4
- data/lib/nanoc3/extra/core_ext/enumerable.rb +0 -33
- data/lib/nanoc3/extra/core_ext/time.rb +0 -19
- data/lib/nanoc3/extra/deployers.rb +0 -11
- data/lib/nanoc3/extra/deployers/rsync.rb +0 -114
- data/lib/nanoc3/extra/file_proxy.rb +0 -40
- data/lib/nanoc3/extra/validators.rb +0 -12
- data/lib/nanoc3/extra/validators/links.rb +0 -264
- data/lib/nanoc3/extra/validators/w3c.rb +0 -95
- data/lib/nanoc3/extra/vcs.rb +0 -66
- data/lib/nanoc3/extra/vcses.rb +0 -17
- data/lib/nanoc3/extra/vcses/bazaar.rb +0 -25
- data/lib/nanoc3/extra/vcses/dummy.rb +0 -24
- data/lib/nanoc3/extra/vcses/git.rb +0 -25
- data/lib/nanoc3/extra/vcses/mercurial.rb +0 -25
- data/lib/nanoc3/extra/vcses/subversion.rb +0 -25
- data/lib/nanoc3/filters.rb +0 -53
- data/lib/nanoc3/filters/asciidoc.rb +0 -38
- data/lib/nanoc3/filters/bluecloth.rb +0 -19
- data/lib/nanoc3/filters/coderay.rb +0 -21
- data/lib/nanoc3/filters/colorize_syntax.rb +0 -261
- data/lib/nanoc3/filters/erb.rb +0 -35
- data/lib/nanoc3/filters/erubis.rb +0 -27
- data/lib/nanoc3/filters/haml.rb +0 -27
- data/lib/nanoc3/filters/kramdown.rb +0 -20
- data/lib/nanoc3/filters/less.rb +0 -53
- data/lib/nanoc3/filters/markaby.rb +0 -20
- data/lib/nanoc3/filters/maruku.rb +0 -20
- data/lib/nanoc3/filters/mustache.rb +0 -24
- data/lib/nanoc3/filters/rainpress.rb +0 -19
- data/lib/nanoc3/filters/rdiscount.rb +0 -22
- data/lib/nanoc3/filters/rdoc.rb +0 -33
- data/lib/nanoc3/filters/redcarpet.rb +0 -27
- data/lib/nanoc3/filters/redcloth.rb +0 -47
- data/lib/nanoc3/filters/relativize_paths.rb +0 -45
- data/lib/nanoc3/filters/rubypants.rb +0 -20
- data/lib/nanoc3/filters/sass.rb +0 -66
- data/lib/nanoc3/filters/slim.rb +0 -25
- data/lib/nanoc3/filters/typogruby.rb +0 -23
- data/lib/nanoc3/filters/uglify_js.rb +0 -42
- data/lib/nanoc3/helpers.rb +0 -16
- data/lib/nanoc3/helpers/blogging.rb +0 -319
- data/lib/nanoc3/helpers/breadcrumbs.rb +0 -40
- data/lib/nanoc3/helpers/capturing.rb +0 -138
- data/lib/nanoc3/helpers/filtering.rb +0 -50
- data/lib/nanoc3/helpers/html_escape.rb +0 -55
- data/lib/nanoc3/helpers/link_to.rb +0 -151
- data/lib/nanoc3/helpers/rendering.rb +0 -140
- data/lib/nanoc3/helpers/tagging.rb +0 -71
- data/lib/nanoc3/helpers/text.rb +0 -44
- data/lib/nanoc3/helpers/xml_sitemap.rb +0 -76
- data/lib/nanoc3/tasks.rb +0 -10
- data/lib/nanoc3/tasks/clean.rake +0 -16
- data/lib/nanoc3/tasks/clean.rb +0 -29
- data/lib/nanoc3/tasks/deploy/rsync.rake +0 -14
- data/lib/nanoc3/tasks/validate.rake +0 -92
- data/nanoc3.gemspec +0 -49
- data/tasks/doc.rake +0 -16
- data/tasks/test.rake +0 -44
- data/test/base/core_ext/array_spec.rb +0 -73
- data/test/base/core_ext/hash_spec.rb +0 -98
- data/test/base/core_ext/pathname_spec.rb +0 -27
- data/test/base/core_ext/string_spec.rb +0 -37
- data/test/base/test_checksum_store.rb +0 -35
- data/test/base/test_code_snippet.rb +0 -31
- data/test/base/test_compiler.rb +0 -316
- data/test/base/test_compiler_dsl.rb +0 -161
- data/test/base/test_context.rb +0 -31
- data/test/base/test_data_source.rb +0 -46
- data/test/base/test_dependency_tracker.rb +0 -262
- data/test/base/test_directed_graph.rb +0 -283
- data/test/base/test_filter.rb +0 -83
- data/test/base/test_item.rb +0 -179
- data/test/base/test_item_rep.rb +0 -553
- data/test/base/test_layout.rb +0 -59
- data/test/base/test_memoization.rb +0 -90
- data/test/base/test_notification_center.rb +0 -34
- data/test/base/test_outdatedness_checker.rb +0 -394
- data/test/base/test_plugin.rb +0 -30
- data/test/base/test_rule.rb +0 -19
- data/test/base/test_rule_context.rb +0 -65
- data/test/base/test_site.rb +0 -190
- data/test/cli/commands/test_compile.rb +0 -33
- data/test/cli/commands/test_create_item.rb +0 -14
- data/test/cli/commands/test_create_layout.rb +0 -28
- data/test/cli/commands/test_create_site.rb +0 -24
- data/test/cli/commands/test_help.rb +0 -12
- data/test/cli/commands/test_info.rb +0 -11
- data/test/cli/commands/test_update.rb +0 -10
- data/test/cli/test_cli.rb +0 -102
- data/test/cli/test_error_handler.rb +0 -29
- data/test/cli/test_logger.rb +0 -10
- data/test/data_sources/test_filesystem.rb +0 -433
- data/test/data_sources/test_filesystem_unified.rb +0 -536
- data/test/data_sources/test_filesystem_verbose.rb +0 -357
- data/test/extra/core_ext/test_enumerable.rb +0 -30
- data/test/extra/core_ext/test_time.rb +0 -15
- data/test/extra/deployers/test_rsync.rb +0 -232
- data/test/extra/test_auto_compiler.rb +0 -417
- data/test/extra/test_file_proxy.rb +0 -19
- data/test/extra/test_vcs.rb +0 -22
- data/test/extra/validators/test_links.rb +0 -51
- data/test/extra/validators/test_w3c.rb +0 -47
- data/test/filters/test_asciidoc.rb +0 -22
- data/test/filters/test_bluecloth.rb +0 -18
- data/test/filters/test_coderay.rb +0 -44
- data/test/filters/test_colorize_syntax.rb +0 -283
- data/test/filters/test_erb.rb +0 -99
- data/test/filters/test_erubis.rb +0 -70
- data/test/filters/test_haml.rb +0 -96
- data/test/filters/test_kramdown.rb +0 -18
- data/test/filters/test_less.rb +0 -113
- data/test/filters/test_markaby.rb +0 -24
- data/test/filters/test_maruku.rb +0 -18
- data/test/filters/test_mustache.rb +0 -25
- data/test/filters/test_rainpress.rb +0 -29
- data/test/filters/test_rdiscount.rb +0 -31
- data/test/filters/test_rdoc.rb +0 -18
- data/test/filters/test_redcarpet.rb +0 -63
- data/test/filters/test_redcloth.rb +0 -33
- data/test/filters/test_relativize_paths.rb +0 -332
- data/test/filters/test_rubypants.rb +0 -18
- data/test/filters/test_sass.rb +0 -229
- data/test/filters/test_slim.rb +0 -35
- data/test/filters/test_typogruby.rb +0 -21
- data/test/filters/test_uglify_js.rb +0 -30
- data/test/gem_loader.rb +0 -11
- data/test/helper.rb +0 -179
- data/test/helpers/test_blogging.rb +0 -754
- data/test/helpers/test_breadcrumbs.rb +0 -81
- data/test/helpers/test_capturing.rb +0 -41
- data/test/helpers/test_filtering.rb +0 -106
- data/test/helpers/test_html_escape.rb +0 -32
- data/test/helpers/test_link_to.rb +0 -249
- data/test/helpers/test_rendering.rb +0 -89
- data/test/helpers/test_tagging.rb +0 -87
- data/test/helpers/test_text.rb +0 -24
- data/test/helpers/test_xml_sitemap.rb +0 -103
- data/test/tasks/test_clean.rb +0 -67
|
@@ -1,264 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3::Extra::Validators
|
|
4
|
-
|
|
5
|
-
# A validator that verifies that all links (`<a href="…">…</a>`) point to a
|
|
6
|
-
# location that exists.
|
|
7
|
-
class Links
|
|
8
|
-
|
|
9
|
-
# @param [String] dir The directory that will be searched for HTML files
|
|
10
|
-
# to validate
|
|
11
|
-
#
|
|
12
|
-
# @param [Array<String>] index_filenames An array of index filenames that
|
|
13
|
-
# will be appended to URLs by web servers if a directory is requested
|
|
14
|
-
# instead of a file
|
|
15
|
-
#
|
|
16
|
-
# @option params [Boolean] :internal (false) True if internal links should
|
|
17
|
-
# be checked; false if they should not
|
|
18
|
-
#
|
|
19
|
-
# @option params [Boolean] :external (false) True if external links should
|
|
20
|
-
# be checked; false if they should not
|
|
21
|
-
def initialize(dir, index_filenames, params={})
|
|
22
|
-
@dir = dir
|
|
23
|
-
@index_filenames = index_filenames
|
|
24
|
-
@include_internal = params.has_key?(:internal) && params[:internal]
|
|
25
|
-
@include_external = params.has_key?(:external) && params[:external]
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
# Starts the validator. The results will be printed to stdout.
|
|
29
|
-
#
|
|
30
|
-
# @return [void]
|
|
31
|
-
def run
|
|
32
|
-
require 'nokogiri'
|
|
33
|
-
|
|
34
|
-
@delegate = self
|
|
35
|
-
links = all_broken_hrefs
|
|
36
|
-
if links.empty?
|
|
37
|
-
puts "No broken links found!"
|
|
38
|
-
else
|
|
39
|
-
links.each_pair do |href, origins|
|
|
40
|
-
puts "Broken link: #{href} -- referenced from:"
|
|
41
|
-
origins.each do |origin|
|
|
42
|
-
puts " #{origin}"
|
|
43
|
-
end
|
|
44
|
-
puts
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
private
|
|
50
|
-
|
|
51
|
-
# Enumerates all key-value pairs of a given hash in a thread-safe way.
|
|
52
|
-
#
|
|
53
|
-
# This class is a helper class, which means that it is not used directly
|
|
54
|
-
# by nanoc. Future versions of nanoc may no longer contain this class. Do
|
|
55
|
-
# not depend on this class to be available.
|
|
56
|
-
class ThreadsafeHashEnumerator
|
|
57
|
-
|
|
58
|
-
# Creates a new enumerator for the given hash.
|
|
59
|
-
#
|
|
60
|
-
# @param [Hash] hash The hash for which the enumerator should return
|
|
61
|
-
# key-value pairs
|
|
62
|
-
def initialize(hash)
|
|
63
|
-
@hash = hash
|
|
64
|
-
@unprocessed_keys = @hash.keys.dup
|
|
65
|
-
@mutex = Mutex.new
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# Returns the next key-value pair in the hash.
|
|
69
|
-
#
|
|
70
|
-
# @return [Array] An array containing the key and the corresponding
|
|
71
|
-
# value of teh next key-value pair
|
|
72
|
-
def next_pair
|
|
73
|
-
@mutex.synchronize do
|
|
74
|
-
key = @unprocessed_keys.shift
|
|
75
|
-
return (key ? [ key, @hash[key] ] : nil)
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
def all_broken_hrefs
|
|
82
|
-
broken_hrefs = {}
|
|
83
|
-
|
|
84
|
-
internal_hrefs = {}
|
|
85
|
-
external_hrefs = {}
|
|
86
|
-
|
|
87
|
-
# Split into internal and external hrefs
|
|
88
|
-
all_hrefs_per_filename.each_pair do |filename, hrefs|
|
|
89
|
-
hrefs.each do |href|
|
|
90
|
-
if is_external_href?(href)
|
|
91
|
-
external_hrefs[href] ||= []
|
|
92
|
-
external_hrefs[href] << filename
|
|
93
|
-
else
|
|
94
|
-
internal_hrefs[href] ||= []
|
|
95
|
-
internal_hrefs[href] << filename
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
# Validate hrefs
|
|
101
|
-
validate_internal_hrefs(internal_hrefs, broken_hrefs) if @include_internal
|
|
102
|
-
validate_external_hrefs(external_hrefs, broken_hrefs) if @include_external
|
|
103
|
-
|
|
104
|
-
# Done
|
|
105
|
-
broken_hrefs
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def all_files
|
|
109
|
-
Dir[@dir + '/**/*.html']
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def all_hrefs_per_filename
|
|
113
|
-
hrefs = {}
|
|
114
|
-
all_files.each do |filename|
|
|
115
|
-
hrefs[filename] ||= all_hrefs_in_file(filename)
|
|
116
|
-
end
|
|
117
|
-
hrefs
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def all_hrefs_in_file(filename)
|
|
121
|
-
doc = Nokogiri::HTML(::File.read(filename))
|
|
122
|
-
doc.css('a').map { |l| l[:href] }.compact
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def is_external_href?(href)
|
|
126
|
-
!!(href =~ %r{^[a-z\-]+:})
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def is_valid_internal_href?(href, origin)
|
|
130
|
-
# Skip hrefs that point to self
|
|
131
|
-
# FIXME this is ugly and won’t always be correct
|
|
132
|
-
return true if href == '.'
|
|
133
|
-
|
|
134
|
-
# Remove target
|
|
135
|
-
path = href.sub(/#.*$/, '')
|
|
136
|
-
return true if path.empty?
|
|
137
|
-
|
|
138
|
-
# Make absolute
|
|
139
|
-
if path[0, 1] == '/'
|
|
140
|
-
path = @dir + path
|
|
141
|
-
else
|
|
142
|
-
path = ::File.expand_path(path, ::File.dirname(origin))
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# Check whether file exists
|
|
146
|
-
return true if File.file?(path)
|
|
147
|
-
|
|
148
|
-
# Check whether directory with index file exists
|
|
149
|
-
return true if File.directory?(path) && @index_filenames.any? { |fn| File.file?(File.join(path, fn)) }
|
|
150
|
-
|
|
151
|
-
# Nope :(
|
|
152
|
-
return false
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
def is_valid_external_href?(href)
|
|
156
|
-
require 'net/http'
|
|
157
|
-
require 'uri'
|
|
158
|
-
|
|
159
|
-
# Parse
|
|
160
|
-
uri = nil
|
|
161
|
-
begin
|
|
162
|
-
uri = URI.parse(href)
|
|
163
|
-
rescue URI::InvalidURIError
|
|
164
|
-
@delegate && @delegate.send(:external_href_validated, href, false)
|
|
165
|
-
return false
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
# Skip non-HTTP URLs
|
|
169
|
-
return true if uri.scheme !~ /^https?$/
|
|
170
|
-
|
|
171
|
-
# Get status
|
|
172
|
-
status = fetch_http_status_for(uri)
|
|
173
|
-
is_valid = !!(status && status >= 200 && status <= 299)
|
|
174
|
-
|
|
175
|
-
# Notify
|
|
176
|
-
@delegate && @delegate.send(:external_href_validated, href, is_valid)
|
|
177
|
-
|
|
178
|
-
# Done
|
|
179
|
-
is_valid
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def validate_internal_hrefs(hrefs, broken_hrefs)
|
|
183
|
-
hrefs.each_pair do |href, filenames|
|
|
184
|
-
filenames.each do |filename|
|
|
185
|
-
if !is_valid_internal_href?(href, filename)
|
|
186
|
-
broken_hrefs[href] = filenames
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def validate_external_hrefs(hrefs, broken_hrefs)
|
|
193
|
-
@mutex = Mutex.new
|
|
194
|
-
|
|
195
|
-
enum = ThreadsafeHashEnumerator.new(hrefs)
|
|
196
|
-
|
|
197
|
-
threads = []
|
|
198
|
-
10.times do
|
|
199
|
-
threads << Thread.new do
|
|
200
|
-
loop do
|
|
201
|
-
# Get next pair
|
|
202
|
-
pair = enum.next_pair
|
|
203
|
-
break if pair.nil?
|
|
204
|
-
href, filenames = pair[0], pair[1]
|
|
205
|
-
|
|
206
|
-
# Validate
|
|
207
|
-
if !is_valid_external_href?(href)
|
|
208
|
-
@mutex.synchronize do
|
|
209
|
-
broken_hrefs[href] = filenames
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
end
|
|
215
|
-
threads.each { |t| t.join }
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def fetch_http_status_for(url, params={})
|
|
219
|
-
5.times do |i|
|
|
220
|
-
begin
|
|
221
|
-
res = nil
|
|
222
|
-
Timeout::timeout(10) do
|
|
223
|
-
res = request_url_once(url)
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
if res.code =~ /^3..$/
|
|
227
|
-
url = URI.parse(res['location'])
|
|
228
|
-
return nil if i == 5
|
|
229
|
-
else
|
|
230
|
-
return res.code.to_i
|
|
231
|
-
end
|
|
232
|
-
rescue
|
|
233
|
-
return nil
|
|
234
|
-
end
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
def request_url_once(url)
|
|
239
|
-
path = (url.path.nil? || url.path.empty? ? '/' : url.path)
|
|
240
|
-
req = Net::HTTP::Head.new(path)
|
|
241
|
-
res = Net::HTTP.start(url.host, url.port) { |h| h.request(req) }
|
|
242
|
-
res
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
def external_href_validated(href, is_valid)
|
|
246
|
-
texts = {
|
|
247
|
-
true => 'ok',
|
|
248
|
-
false => ' ERROR '
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
colors = {
|
|
252
|
-
true => "\e[32m",
|
|
253
|
-
false => "\e[41m\e[37m",
|
|
254
|
-
:off => "\033[0m"
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
@mutex.synchronize do
|
|
258
|
-
puts href + ': ' + colors[is_valid] + texts[is_valid] + colors[:off]
|
|
259
|
-
end
|
|
260
|
-
end
|
|
261
|
-
|
|
262
|
-
end
|
|
263
|
-
|
|
264
|
-
end
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3::Extra::Validators
|
|
4
|
-
|
|
5
|
-
# A validator that uses the W3C web service to validate HTML and CSS files.
|
|
6
|
-
class W3C
|
|
7
|
-
|
|
8
|
-
# @param [String] dir The directory that will be searched for HTML and/or
|
|
9
|
-
# CSS files to validate
|
|
10
|
-
#
|
|
11
|
-
# @param [Array<Symbol>] types A list of types to check. Allowed types are
|
|
12
|
-
# `:html` and `:css`.
|
|
13
|
-
def initialize(dir, types)
|
|
14
|
-
@dir = dir
|
|
15
|
-
@types = types
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# Starts the validator. The results will be printed to stdout.
|
|
19
|
-
#
|
|
20
|
-
# @return [void]
|
|
21
|
-
def run
|
|
22
|
-
# Load validator
|
|
23
|
-
require 'w3c_validators'
|
|
24
|
-
|
|
25
|
-
# Find all files
|
|
26
|
-
filenames = []
|
|
27
|
-
extensions = types_to_extensions(@types)
|
|
28
|
-
extensions.each { |extension| filenames.concat(Dir[@dir + '/**/*.' + extension]) }
|
|
29
|
-
|
|
30
|
-
# Validate each file
|
|
31
|
-
filenames.each do |filename|
|
|
32
|
-
validation_started(filename)
|
|
33
|
-
|
|
34
|
-
extension = File.extname(filename)[1..-1]
|
|
35
|
-
results = validator_for(extension).validate_file(filename)
|
|
36
|
-
|
|
37
|
-
validation_ended(filename, results.errors)
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
private
|
|
42
|
-
|
|
43
|
-
# Returns all extensions for the given types
|
|
44
|
-
def types_to_extensions(types)
|
|
45
|
-
extensions = []
|
|
46
|
-
types.each { |type| extensions.concat(type_to_extensions(type)) }
|
|
47
|
-
extensions
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
# Returns all extensions for the given type
|
|
51
|
-
def type_to_extensions(type)
|
|
52
|
-
case type
|
|
53
|
-
when :html
|
|
54
|
-
[ 'html', 'htm' ]
|
|
55
|
-
when :css
|
|
56
|
-
[ 'css' ]
|
|
57
|
-
else
|
|
58
|
-
raise RuntimeError, "unknown type: #{type}"
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# Returns the validator class for the given extension
|
|
63
|
-
def validator_class_for(extension)
|
|
64
|
-
case extension
|
|
65
|
-
when 'html', 'htm'
|
|
66
|
-
::W3CValidators::MarkupValidator
|
|
67
|
-
when 'css'
|
|
68
|
-
::W3CValidators::CSSValidator
|
|
69
|
-
else
|
|
70
|
-
raise RuntimeError, "unknown extension: #{extension}"
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Returns the validator for the given extension
|
|
75
|
-
def validator_for(extension)
|
|
76
|
-
@validators ||= {}
|
|
77
|
-
@validators[extension] ||= validator_class_for(extension).new
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def validation_started(file)
|
|
81
|
-
$stdout.print "Validating #{file}... "
|
|
82
|
-
$stdout.flush
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def validation_ended(file, errors)
|
|
86
|
-
$stdout.puts(errors.empty? ? "valid" : "INVALID")
|
|
87
|
-
|
|
88
|
-
errors.each do |err|
|
|
89
|
-
puts " #{err}"
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
end
|
data/lib/nanoc3/extra/vcs.rb
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3::Extra
|
|
4
|
-
|
|
5
|
-
# A very simple representation of a version control system (VCS) that
|
|
6
|
-
# abstracts the add, remove and move operations. It does not commit. This
|
|
7
|
-
# class is primarily used by data sources that store data as flat files on
|
|
8
|
-
# the disk.
|
|
9
|
-
#
|
|
10
|
-
# @abstract Subclass and override {#add}, {#remove} and {#move} to implement
|
|
11
|
-
# a custom VCS.
|
|
12
|
-
class VCS
|
|
13
|
-
|
|
14
|
-
extend Nanoc3::PluginRegistry::PluginMethods
|
|
15
|
-
|
|
16
|
-
# Adds the file with the given filename to the working copy.
|
|
17
|
-
#
|
|
18
|
-
# @param [String] filename The name of the file to add
|
|
19
|
-
#
|
|
20
|
-
# @return [void]
|
|
21
|
-
#
|
|
22
|
-
# @abstract
|
|
23
|
-
def add(filename)
|
|
24
|
-
not_implemented('add')
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
# Removes the file with the given filename from the working copy. When
|
|
28
|
-
# this method is executed, the file should no longer be present on the
|
|
29
|
-
# disk.
|
|
30
|
-
#
|
|
31
|
-
# @param [String] filename The name of the file to remove
|
|
32
|
-
#
|
|
33
|
-
# @return [void]
|
|
34
|
-
#
|
|
35
|
-
# @abstract
|
|
36
|
-
def remove(filename)
|
|
37
|
-
not_implemented('remove')
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# Moves the file with the given filename to a new location. When this
|
|
41
|
-
# method is executed, the original file should no longer be present on the
|
|
42
|
-
# disk.
|
|
43
|
-
#
|
|
44
|
-
# @param [String] src The old filename
|
|
45
|
-
#
|
|
46
|
-
# @param [String] dst The new filename
|
|
47
|
-
#
|
|
48
|
-
# @return [void]
|
|
49
|
-
#
|
|
50
|
-
# @abstract
|
|
51
|
-
def move(src, dst)
|
|
52
|
-
not_implemented('move')
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
private
|
|
56
|
-
|
|
57
|
-
def not_implemented(name)
|
|
58
|
-
raise NotImplementedError.new(
|
|
59
|
-
"#{self.class} does not override ##{name}, which is required for " +
|
|
60
|
-
"this data source to be used."
|
|
61
|
-
)
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
end
|
data/lib/nanoc3/extra/vcses.rb
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
|
|
3
|
-
module Nanoc3::Extra::VCSes
|
|
4
|
-
|
|
5
|
-
autoload 'Bazaar', 'nanoc3/extra/vcses/bazaar'
|
|
6
|
-
autoload 'Dummy', 'nanoc3/extra/vcses/dummy'
|
|
7
|
-
autoload 'Git', 'nanoc3/extra/vcses/git'
|
|
8
|
-
autoload 'Mercurial', 'nanoc3/extra/vcses/mercurial'
|
|
9
|
-
autoload 'Subversion', 'nanoc3/extra/vcses/subversion'
|
|
10
|
-
|
|
11
|
-
Nanoc3::Extra::VCS.register '::Nanoc3::Extra::VCSes::Bazaar', :bazaar, :bzr
|
|
12
|
-
Nanoc3::Extra::VCS.register '::Nanoc3::Extra::VCSes::Dummy', :dummy
|
|
13
|
-
Nanoc3::Extra::VCS.register '::Nanoc3::Extra::VCSes::Git', :git
|
|
14
|
-
Nanoc3::Extra::VCS.register '::Nanoc3::Extra::VCSes::Mercurial', :mercurial, :hg
|
|
15
|
-
Nanoc3::Extra::VCS.register '::Nanoc3::Extra::VCSes::Subversion', :subversion, :svn
|
|
16
|
-
|
|
17
|
-
end
|