nanoc 3.7.5 → 3.8.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/ChangeLog +2 -2
- data/Gemfile +1 -1
- data/NEWS.md +24 -3
- data/README.md +1 -1
- data/bin/nanoc +1 -1
- data/lib/nanoc/base/compilation/dependency_tracker.rb +1 -1
- data/lib/nanoc/base/compilation/item_rep_recorder_proxy.rb +1 -1
- data/lib/nanoc/base/compilation/rule.rb +15 -1
- data/lib/nanoc/base/result_data/item_rep.rb +27 -10
- data/lib/nanoc/base/source_data/item_array.rb +2 -0
- data/lib/nanoc/base/source_data/site.rb +1 -0
- data/lib/nanoc/cli.rb +16 -7
- data/lib/nanoc/cli/commands/autocompile.rb +1 -1
- data/lib/nanoc/cli/commands/create-site.rb +2 -2
- data/lib/nanoc/cli/commands/show-rules.rb +3 -6
- data/lib/nanoc/cli/commands/watch.rb +3 -3
- data/lib/nanoc/cli/error_handler.rb +1 -1
- data/lib/nanoc/cli/logger.rb +3 -5
- data/lib/nanoc/data_sources/filesystem.rb +2 -2
- data/lib/nanoc/extra/auto_compiler.rb +1 -1
- data/lib/nanoc/extra/checking/checks.rb +2 -0
- data/lib/nanoc/extra/checking/checks/mixed_content.rb +31 -0
- data/lib/nanoc/extra/deployers/fog.rb +24 -0
- data/lib/nanoc/extra/link_collector.rb +42 -9
- data/lib/nanoc/extra/pruner.rb +1 -1
- data/lib/nanoc/filters/colorize_syntax.rb +4 -4
- data/lib/nanoc/filters/pandoc.rb +23 -4
- data/lib/nanoc/filters/sass/sass_filesystem_importer.rb +4 -2
- data/lib/nanoc/helpers/blogging.rb +17 -6
- data/lib/nanoc/helpers/tagging.rb +1 -1
- data/lib/nanoc/helpers/text.rb +1 -1
- data/lib/nanoc/version.rb +1 -1
- data/tasks/test.rake +1 -1
- data/test/base/test_item_array.rb +8 -0
- data/test/base/test_item_rep.rb +51 -0
- data/test/base/test_item_rep_recorder_proxy.rb +19 -0
- data/test/base/test_rule.rb +10 -0
- data/test/cli/commands/test_create_site.rb +13 -0
- data/test/cli/test_cli.rb +30 -0
- data/test/extra/checking/checks/test_mixed_content.rb +188 -0
- data/test/extra/deployers/test_fog.rb +32 -0
- data/test/filters/test_pandoc.rb +17 -3
- data/test/filters/test_sass.rb +11 -0
- data/test/helper.rb +3 -3
- data/test/helpers/test_blogging.rb +30 -0
- metadata +6 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e62cf6c5f843fd4a0ed676cac0ce30d3cb8e45b9
|
|
4
|
+
data.tar.gz: c9cb11079a6a930f93e3e977e50b28db2d8bc5e9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d5417fff2968fb9b1efbdc49095ebb4b2e0ff17cd1cdbfeb7a2e81ad059c0bdad3940bfeaa06956b9d07a923e2c2e4b50d4470851a07b5071b6f3409c3f124c2
|
|
7
|
+
data.tar.gz: cb15bed72ebe0b15babbee93386554fc2512fbd17c8ffce24a2224448a22ab8876d551a2ab550cdd396bbcfa84106405c1e87e7f7e6d1f2078fda4054a10cb36
|
data/ChangeLog
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
For a list of all changes, please see the changelog on the project repository
|
|
2
|
-
instead (
|
|
3
|
-
|
|
2
|
+
instead (https://github.com/nanoc/nanoc). For release notes, please see the
|
|
3
|
+
NEWS file.
|
data/Gemfile
CHANGED
data/NEWS.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# nanoc news
|
|
2
2
|
|
|
3
|
+
## 3.8.0 (2015-05-04)
|
|
4
|
+
|
|
5
|
+
Features:
|
|
6
|
+
|
|
7
|
+
* Added `mixed_content` check (#542, #543) [Mike Pennisi]
|
|
8
|
+
* Added `commands_dirs` configuration option for specifying directories to read commands from (#475) [Gregory Pakosz]
|
|
9
|
+
* Added `:cdn_id` option to fog deployer for invalidating CDN objects (#451) [Vlatko Kosturjak]
|
|
10
|
+
* Add access to regular expressions group matches in rules (#478) [Michal Papis]
|
|
11
|
+
* Allow filtering the items array by regex (#458) [Mike Pennisi]
|
|
12
|
+
|
|
13
|
+
Enhancements:
|
|
14
|
+
|
|
15
|
+
* Added `:preserve_order` option to preserve order in Atom feed (#533, #534)
|
|
16
|
+
* Allowed accessing `:pre` snapshot from within item itself (#537, #538, #548)
|
|
17
|
+
|
|
18
|
+
Fixes:
|
|
19
|
+
|
|
20
|
+
* Allowed passing generic Pandoc options with :args (#526, #535)
|
|
21
|
+
* Fix crash when compiling extensionless binary items (#524, #525)
|
|
22
|
+
* Fix double snapshot creation error (#547)
|
|
23
|
+
|
|
3
24
|
## 3.7.5 (2015-01-12)
|
|
4
25
|
|
|
5
26
|
Enhancements:
|
|
@@ -631,7 +652,7 @@ Removed:
|
|
|
631
652
|
New:
|
|
632
653
|
|
|
633
654
|
* `--pages` and `--assets` compiler options
|
|
634
|
-
* `--no-color`
|
|
655
|
+
* `--no-color` command-line option
|
|
635
656
|
* `Filtering` helper
|
|
636
657
|
* `#relative_path_to` function in `LinkTo` helper
|
|
637
658
|
* `rainpress` filter ([Rainpress site](http://code.google.com/p/rainpress/))
|
|
@@ -641,7 +662,7 @@ New:
|
|
|
641
662
|
|
|
642
663
|
Changed:
|
|
643
664
|
|
|
644
|
-
* The
|
|
665
|
+
* The command-line option parser is now a lot more reliable
|
|
645
666
|
* `#atom_feed` now takes optional `:content_proc`, `:excerpt_proc` and `:articles` parameters
|
|
646
667
|
* The compile command show non-written items (those with `skip_output: true`)
|
|
647
668
|
* The compile command compiles everything by default
|
|
@@ -696,7 +717,7 @@ New:
|
|
|
696
717
|
* New `rdiscount` filter ([RDiscount site](http://github.com/rtomayko/rdiscount))
|
|
697
718
|
* New `maruku` filter ([Maruku site](https://github.com/bhollis/maruku/))
|
|
698
719
|
* New `erubis` filter ([Erubis site](http://www.kuwata-lab.com/erubis/))
|
|
699
|
-
* A better
|
|
720
|
+
* A better command-line frontend
|
|
700
721
|
* A new filesystem data source named `filesystem_combined`
|
|
701
722
|
* Routers, which decide where compiled pages should be written to
|
|
702
723
|
* Page/layout mtimes can now be retrieved through `page.mtime`/`layout.mtime`
|
data/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
[](https://travis-ci.org/nanoc/nanoc)
|
|
3
3
|
[](https://codeclimate.com/github/nanoc/nanoc)
|
|
4
4
|
[](https://coveralls.io/r/nanoc/nanoc)
|
|
5
|
-
[](http://inch-ci.org/github/nanoc/nanoc/)
|
|
6
6
|
|
|
7
7
|

|
|
8
8
|
|
data/bin/nanoc
CHANGED
|
@@ -192,7 +192,7 @@ module Nanoc
|
|
|
192
192
|
new_data[:edges].each do |edge|
|
|
193
193
|
from_index, to_index = *edge
|
|
194
194
|
from = from_index && previous_objects[from_index]
|
|
195
|
-
to = to_index
|
|
195
|
+
to = to_index && previous_objects[to_index]
|
|
196
196
|
@graph.add_edge(from, to)
|
|
197
197
|
end
|
|
198
198
|
|
|
@@ -70,7 +70,7 @@ module Nanoc
|
|
|
70
70
|
|
|
71
71
|
# Count
|
|
72
72
|
existing = Set.new
|
|
73
|
-
names = @rule_memory.select { |r| r[0] == :snapshot }.map { |r| r[
|
|
73
|
+
names = @rule_memory.select { |r| r[0] == :snapshot }.map { |r| r[1] }
|
|
74
74
|
names.each do |n|
|
|
75
75
|
if existing.include?(n)
|
|
76
76
|
raise Nanoc::Errors::CannotCreateMultipleSnapshotsWithSameName.new(@item_rep, snapshot_name)
|
|
@@ -65,7 +65,21 @@ module Nanoc
|
|
|
65
65
|
raise ArgumentError, 'Required :compiler option is missing'
|
|
66
66
|
end
|
|
67
67
|
rep = Nanoc::ItemRepProxy.new(rep, compiler) unless rep.proxy?
|
|
68
|
-
Nanoc::RuleContext.new(rep: rep, compiler: compiler)
|
|
68
|
+
context = Nanoc::RuleContext.new(rep: rep, compiler: compiler)
|
|
69
|
+
context.instance_exec(matches(rep.item.identifier), &@block)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
protected
|
|
73
|
+
|
|
74
|
+
# Matches the rule regexp against items identifier and gives back group
|
|
75
|
+
# captures if any
|
|
76
|
+
#
|
|
77
|
+
# @param [String] identifier Identifier to capture groups for
|
|
78
|
+
#
|
|
79
|
+
# @return [nil, Array] Captured groups, if any
|
|
80
|
+
def matches(identifier)
|
|
81
|
+
matches = @identifier_regex.match(identifier)
|
|
82
|
+
matches && matches.captures
|
|
69
83
|
end
|
|
70
84
|
end
|
|
71
85
|
end
|
|
@@ -235,20 +235,29 @@ module Nanoc
|
|
|
235
235
|
Nanoc::NotificationCenter.post(:visit_ended, item)
|
|
236
236
|
|
|
237
237
|
# Get name of last pre-layout snapshot
|
|
238
|
-
|
|
239
|
-
is_moving = [:pre, :post, :last].include?(
|
|
238
|
+
snapshot_name = params.fetch(:snapshot) { @content[:pre] ? :pre : :last }
|
|
239
|
+
is_moving = [:pre, :post, :last].include?(snapshot_name)
|
|
240
240
|
|
|
241
241
|
# Check existance of snapshot
|
|
242
|
-
|
|
243
|
-
|
|
242
|
+
snapshot = snapshots.find { |s| s.first == snapshot_name }
|
|
243
|
+
if !is_moving && (snapshot.nil? || snapshot[-1] == false)
|
|
244
|
+
raise Nanoc::Errors::NoSuchSnapshot.new(self, snapshot_name)
|
|
244
245
|
end
|
|
245
246
|
|
|
246
|
-
#
|
|
247
|
-
|
|
247
|
+
# Verify snapshot is usable
|
|
248
|
+
is_still_moving =
|
|
249
|
+
case snapshot_name
|
|
250
|
+
when :post, :last
|
|
251
|
+
true
|
|
252
|
+
when :pre
|
|
253
|
+
snapshot.nil? || !snapshot[-1]
|
|
254
|
+
end
|
|
255
|
+
is_usable_snapshot = @content[snapshot_name] && (self.compiled? || !is_still_moving)
|
|
256
|
+
unless is_usable_snapshot
|
|
248
257
|
raise Nanoc::Errors::UnmetDependency.new(self)
|
|
249
|
-
else
|
|
250
|
-
@content[snapshot]
|
|
251
258
|
end
|
|
259
|
+
|
|
260
|
+
@content[snapshot_name]
|
|
252
261
|
end
|
|
253
262
|
|
|
254
263
|
# Checks whether content exists at a given snapshot.
|
|
@@ -416,8 +425,16 @@ module Nanoc
|
|
|
416
425
|
#
|
|
417
426
|
# @return [void]
|
|
418
427
|
def snapshot(snapshot_name, params = {})
|
|
419
|
-
is_final = params.fetch(:final
|
|
420
|
-
|
|
428
|
+
is_final = params.fetch(:final, true)
|
|
429
|
+
|
|
430
|
+
unless self.binary?
|
|
431
|
+
@content[snapshot_name] = @content[:last]
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
if snapshot_name == :pre && is_final
|
|
435
|
+
snapshots << [:pre, true]
|
|
436
|
+
end
|
|
437
|
+
|
|
421
438
|
write(snapshot_name) if is_final
|
|
422
439
|
end
|
|
423
440
|
|
|
@@ -32,6 +32,7 @@ module Nanoc
|
|
|
32
32
|
DEFAULT_CONFIG = {
|
|
33
33
|
text_extensions: %w( css erb haml htm html js less markdown md php rb sass scss txt xhtml xml coffee hb handlebars mustache ms slim ).sort,
|
|
34
34
|
lib_dirs: %w( lib ),
|
|
35
|
+
commands_dirs: %w( commands ),
|
|
35
36
|
output_dir: 'output',
|
|
36
37
|
data_sources: [{}],
|
|
37
38
|
index_filenames: ['index.html'],
|
data/lib/nanoc/cli.rb
CHANGED
|
@@ -47,9 +47,9 @@ module Nanoc::CLI
|
|
|
47
47
|
@debug = boolean
|
|
48
48
|
end
|
|
49
49
|
|
|
50
|
-
# Invokes the nanoc
|
|
50
|
+
# Invokes the nanoc command-line tool with the given arguments.
|
|
51
51
|
#
|
|
52
|
-
# @param [Array<String>] args An array of
|
|
52
|
+
# @param [Array<String>] args An array of command-line arguments
|
|
53
53
|
#
|
|
54
54
|
# @return [void]
|
|
55
55
|
def self.run(args)
|
|
@@ -59,7 +59,7 @@ module Nanoc::CLI
|
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
-
# @return [Cri::Command] The root command, i.e. the
|
|
62
|
+
# @return [Cri::Command] The root command, i.e. the command-line tool itself
|
|
63
63
|
def self.root_command
|
|
64
64
|
@root_command
|
|
65
65
|
end
|
|
@@ -83,7 +83,7 @@ module Nanoc::CLI
|
|
|
83
83
|
|
|
84
84
|
protected
|
|
85
85
|
|
|
86
|
-
# Makes the
|
|
86
|
+
# Makes the command-line interface ready for use.
|
|
87
87
|
#
|
|
88
88
|
# @return [void]
|
|
89
89
|
def self.setup
|
|
@@ -117,16 +117,25 @@ module Nanoc::CLI
|
|
|
117
117
|
end
|
|
118
118
|
end
|
|
119
119
|
|
|
120
|
-
# Loads site-specific commands
|
|
120
|
+
# Loads site-specific commands.
|
|
121
121
|
#
|
|
122
122
|
# @return [void]
|
|
123
123
|
def self.load_custom_commands
|
|
124
|
-
|
|
124
|
+
if Nanoc::Site.cwd_is_nanoc_site?
|
|
125
|
+
site = Nanoc::Site.new('.')
|
|
126
|
+
site.config[:commands_dirs].each do |path|
|
|
127
|
+
load_commands_at(path)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def self.load_commands_at(path)
|
|
133
|
+
recursive_contents_of(path).each do |filename|
|
|
125
134
|
# Create command
|
|
126
135
|
command = Nanoc::CLI.load_command_at(filename)
|
|
127
136
|
|
|
128
137
|
# Get supercommand
|
|
129
|
-
pieces = filename.gsub(
|
|
138
|
+
pieces = filename.gsub(/^#{path}\/|\.rb$/, '').split('/')
|
|
130
139
|
pieces = pieces[0, pieces.size - 1] || []
|
|
131
140
|
root = Nanoc::CLI.root_command
|
|
132
141
|
supercommand = pieces.reduce(root) do |cmd, piece|
|
|
@@ -5,7 +5,7 @@ summary 'start the autocompiler'
|
|
|
5
5
|
be_hidden
|
|
6
6
|
aliases :aco
|
|
7
7
|
description <<-EOS
|
|
8
|
-
Start the autocompiler web server. Unless overridden with
|
|
8
|
+
Start the autocompiler web server. Unless overridden with command-line options
|
|
9
9
|
or configuration entries, the web server will run on port 3000 and listen on all
|
|
10
10
|
IP addresses. Running the autocompiler requires the `mime/types` and `rack` gems.
|
|
11
11
|
|
|
@@ -4,7 +4,7 @@ usage 'create-site [options] path'
|
|
|
4
4
|
aliases :create_site, :cs
|
|
5
5
|
summary 'create a site'
|
|
6
6
|
description "
|
|
7
|
-
Create a new site at the given path. The site will use the `filesystem_unified` data source by default, but this can be changed using the `--datasource`
|
|
7
|
+
Create a new site at the given path. The site will use the `filesystem_unified` data source by default, but this can be changed using the `--datasource` command-line option.
|
|
8
8
|
"
|
|
9
9
|
|
|
10
10
|
required :d, :datasource, 'specify the data source for the new site'
|
|
@@ -130,7 +130,7 @@ route '*' do
|
|
|
130
130
|
item.identifier.chop + '.css'
|
|
131
131
|
elsif item.binary?
|
|
132
132
|
# Write item with identifier /foo/ to /foo.ext
|
|
133
|
-
item.identifier.chop + '.' + item[:extension]
|
|
133
|
+
item.identifier.chop + (item[:extension] ? '.' + item[:extension] : '')
|
|
134
134
|
else
|
|
135
135
|
# Write item with identifier /foo/ to /foo/index.html
|
|
136
136
|
item.identifier + 'index.html'
|
|
@@ -36,14 +36,12 @@ module Nanoc::CLI::Commands
|
|
|
36
36
|
@calc[rep].each do |mem|
|
|
37
37
|
puts format(' %s %s',
|
|
38
38
|
@c.c(format('%-10s', mem[0].to_s), :blue),
|
|
39
|
-
mem[1..-1].map(&:inspect).join(', ')
|
|
40
|
-
)
|
|
39
|
+
mem[1..-1].map(&:inspect).join(', '))
|
|
41
40
|
end
|
|
42
41
|
if rep.raw_path
|
|
43
42
|
puts format(' %s %s',
|
|
44
43
|
@c.c(format('%-10s', 'write to'), :blue),
|
|
45
|
-
rep.raw_path
|
|
46
|
-
)
|
|
44
|
+
rep.raw_path)
|
|
47
45
|
end
|
|
48
46
|
end
|
|
49
47
|
end
|
|
@@ -55,8 +53,7 @@ module Nanoc::CLI::Commands
|
|
|
55
53
|
puts " (from #{layout[:filename]})" if layout[:filename]
|
|
56
54
|
puts format(' %s %s',
|
|
57
55
|
@c.c(format('%-10s', 'filter'), :blue),
|
|
58
|
-
@calc[layout].map(&:inspect).join(', ')
|
|
59
|
-
)
|
|
56
|
+
@calc[layout].map(&:inspect).join(', '))
|
|
60
57
|
puts
|
|
61
58
|
end
|
|
62
59
|
end
|
|
@@ -67,8 +67,8 @@ module Nanoc::CLI::Commands
|
|
|
67
67
|
rebuilder.call(nil)
|
|
68
68
|
|
|
69
69
|
# Get directories to watch
|
|
70
|
-
dirs_to_watch = watcher_config
|
|
71
|
-
files_to_watch = watcher_config
|
|
70
|
+
dirs_to_watch = watcher_config.fetch(:dirs_to_watch, %w( content layouts lib ))
|
|
71
|
+
files_to_watch = watcher_config.fetch(:files_to_watch, %w( nanoc.yaml config.yaml Rules rules Rules.rb rules.rb ))
|
|
72
72
|
files_to_watch = Regexp.new(files_to_watch.map { |name| Regexp.quote(name) + '$' }.join('|'))
|
|
73
73
|
ignore_dir = Regexp.new(Dir.glob('*').map { |dir| dir if File.directory?(dir) }.compact.join('|'))
|
|
74
74
|
|
|
@@ -95,7 +95,7 @@ module Nanoc::CLI::Commands
|
|
|
95
95
|
|
|
96
96
|
# Allows sending user notifications in a cross-platform way.
|
|
97
97
|
class Notifier
|
|
98
|
-
# A list of
|
|
98
|
+
# A list of command-line tool names that can be used to send notifications
|
|
99
99
|
TOOLS = %w( growlnotify notify-send ) unless defined? TOOLS
|
|
100
100
|
|
|
101
101
|
# Send a notification. If no notifier is found, no notification will be
|
|
@@ -283,7 +283,7 @@ module Nanoc::CLI
|
|
|
283
283
|
if stack.empty?
|
|
284
284
|
stream.puts ' (empty)'
|
|
285
285
|
else
|
|
286
|
-
stack.
|
|
286
|
+
stack.reverse_each do |obj|
|
|
287
287
|
if obj.is_a?(Nanoc::ItemRep)
|
|
288
288
|
stream.puts " - [item] #{obj.item.identifier} (rep #{obj.name})"
|
|
289
289
|
else # layout
|
data/lib/nanoc/cli/logger.rb
CHANGED
|
@@ -11,8 +11,8 @@ module Nanoc::CLI
|
|
|
11
11
|
ACTION_COLORS = {
|
|
12
12
|
create: "\e[32m", # green
|
|
13
13
|
update: "\e[33m", # yellow
|
|
14
|
-
identical: '',
|
|
15
|
-
skip: '',
|
|
14
|
+
identical: '', # (nothing)
|
|
15
|
+
skip: '', # (nothing)
|
|
16
16
|
delete: "\e[31m" # red
|
|
17
17
|
}
|
|
18
18
|
|
|
@@ -46,9 +46,7 @@ module Nanoc::CLI
|
|
|
46
46
|
action,
|
|
47
47
|
"\e[0m",
|
|
48
48
|
duration.nil? ? '' : format('[%2.2fs] ', duration),
|
|
49
|
-
name
|
|
50
|
-
)
|
|
51
|
-
)
|
|
49
|
+
name))
|
|
52
50
|
end
|
|
53
51
|
|
|
54
52
|
# Logs a message.
|
|
@@ -119,7 +119,7 @@ module Nanoc::DataSources
|
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
# Get modification times
|
|
122
|
-
meta_mtime
|
|
122
|
+
meta_mtime = meta_filename ? File.stat(meta_filename).mtime : nil
|
|
123
123
|
content_mtime = content_filename ? File.stat(content_filename).mtime : nil
|
|
124
124
|
if meta_mtime && content_mtime
|
|
125
125
|
mtime = meta_mtime > content_mtime ? meta_mtime : content_mtime
|
|
@@ -170,7 +170,7 @@ module Nanoc::DataSources
|
|
|
170
170
|
end
|
|
171
171
|
|
|
172
172
|
# Reorder elements and convert to extnames
|
|
173
|
-
filenames[0] = meta_filenames[0]
|
|
173
|
+
filenames[0] = meta_filenames[0] ? 'yaml' : nil
|
|
174
174
|
filenames[1] = content_filenames[0] ? ext_of(content_filenames[0])[1..-1] || '' : nil
|
|
175
175
|
end
|
|
176
176
|
|
|
@@ -65,7 +65,7 @@ module Nanoc::Extra
|
|
|
65
65
|
rescue StandardError, ScriptError => e
|
|
66
66
|
# Add compilation stack to env
|
|
67
67
|
env['nanoc.stack'] = []
|
|
68
|
-
stack.
|
|
68
|
+
stack.reverse_each do |obj|
|
|
69
69
|
if obj.is_a?(Nanoc::ItemRep) # item rep
|
|
70
70
|
env['nanoc.stack'] << "[item] #{obj.item.identifier} (rep #{obj.name})"
|
|
71
71
|
else # layout
|
|
@@ -6,6 +6,7 @@ module Nanoc::Extra::Checking::Checks
|
|
|
6
6
|
autoload 'HTML', 'nanoc/extra/checking/checks/html'
|
|
7
7
|
autoload 'InternalLinks', 'nanoc/extra/checking/checks/internal_links'
|
|
8
8
|
autoload 'Stale', 'nanoc/extra/checking/checks/stale'
|
|
9
|
+
autoload 'MixedContent', 'nanoc/extra/checking/checks/mixed_content'
|
|
9
10
|
|
|
10
11
|
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::CSS', :css
|
|
11
12
|
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::ExternalLinks', :external_links
|
|
@@ -14,4 +15,5 @@ module Nanoc::Extra::Checking::Checks
|
|
|
14
15
|
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::InternalLinks', :internal_links
|
|
15
16
|
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::InternalLinks', :ilinks
|
|
16
17
|
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::Stale', :stale
|
|
18
|
+
Nanoc::Extra::Checking::Check.register '::Nanoc::Extra::Checking::Checks::MixedContent', :mixed_content
|
|
17
19
|
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
module Nanoc::Extra::Checking::Checks
|
|
4
|
+
# A check that verifies HTML files do not reference external resources with
|
|
5
|
+
# URLs that would trigger "mixed content" warnings.
|
|
6
|
+
class MixedContent < ::Nanoc::Extra::Checking::Check
|
|
7
|
+
PROTOCOL_PATTERN = /^(\w+):\/\//
|
|
8
|
+
|
|
9
|
+
def run
|
|
10
|
+
filenames = output_filenames.select { |f| File.extname(f) == '.html' }
|
|
11
|
+
resource_uris_with_filenames = ::Nanoc::Extra::LinkCollector.new(filenames).filenames_per_resource_uri
|
|
12
|
+
|
|
13
|
+
resource_uris_with_filenames.each_pair do |uri, fns|
|
|
14
|
+
next unless guaranteed_insecure?(uri)
|
|
15
|
+
fns.each do |filename|
|
|
16
|
+
add_issue(
|
|
17
|
+
"mixed content include: #{uri}",
|
|
18
|
+
subject: filename)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def guaranteed_insecure?(href)
|
|
26
|
+
protocol = PROTOCOL_PATTERN.match(href)
|
|
27
|
+
|
|
28
|
+
protocol && protocol[1].downcase == 'http'
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|