nanoc 4.11.12 → 4.11.17
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS.md +788 -743
- data/bin/nanoc +1 -1
- data/lib/nanoc.rb +6 -29
- data/lib/nanoc/data_sources/filesystem.rb +9 -3
- data/lib/nanoc/data_sources/filesystem/tools.rb +4 -4
- data/lib/nanoc/extra.rb +2 -1
- data/lib/nanoc/extra/core_ext.rb +0 -1
- data/lib/nanoc/extra/srcset_parser.rb +79 -0
- data/lib/nanoc/filters/colorize_syntax/colorizers.rb +1 -1
- data/lib/nanoc/filters/erb.rb +1 -5
- data/lib/nanoc/filters/relativize_paths.rb +62 -10
- data/lib/nanoc/filters/sass/functions.rb +1 -1
- data/lib/nanoc/helpers/blogging.rb +8 -8
- data/lib/nanoc/helpers/capturing.rb +1 -1
- data/lib/nanoc/helpers/link_to.rb +1 -1
- data/lib/nanoc/helpers/rendering.rb +5 -4
- data/lib/nanoc/orig_cli.rb +15 -0
- data/lib/nanoc/{cli → orig_cli}/commands/show-rules.rb +3 -3
- data/lib/nanoc/rule_dsl.rb +1 -0
- data/lib/nanoc/rule_dsl/action_provider.rb +6 -6
- data/lib/nanoc/rule_dsl/action_recorder.rb +4 -4
- data/lib/nanoc/rule_dsl/compilation_rule_context.rb +1 -1
- data/lib/nanoc/rule_dsl/compiler_dsl.rb +2 -2
- data/lib/nanoc/rule_dsl/errors.rb +25 -0
- data/lib/nanoc/rule_dsl/rule_context.rb +6 -6
- data/lib/nanoc/rule_dsl/rules_loader.rb +1 -1
- data/lib/nanoc/version.rb +1 -1
- metadata +23 -158
- data/lib/nanoc/base.rb +0 -16
- data/lib/nanoc/base/changes_stream.rb +0 -53
- data/lib/nanoc/base/error.rb +0 -7
- data/lib/nanoc/base/errors.rb +0 -163
- data/lib/nanoc/base/feature.rb +0 -104
- data/lib/nanoc/base/repos.rb +0 -4
- data/lib/nanoc/base/repos/config_loader.rb +0 -95
- data/lib/nanoc/base/repos/site_loader.rb +0 -102
- data/lib/nanoc/base/services.rb +0 -23
- data/lib/nanoc/base/services/compiler.rb +0 -214
- data/lib/nanoc/base/services/compiler/phases.rb +0 -19
- data/lib/nanoc/base/services/compiler/phases/abstract.rb +0 -50
- data/lib/nanoc/base/services/compiler/phases/cache.rb +0 -45
- data/lib/nanoc/base/services/compiler/phases/mark_done.rb +0 -25
- data/lib/nanoc/base/services/compiler/phases/notify.rb +0 -21
- data/lib/nanoc/base/services/compiler/phases/recalculate.rb +0 -51
- data/lib/nanoc/base/services/compiler/phases/resume.rb +0 -54
- data/lib/nanoc/base/services/compiler/phases/write.rb +0 -86
- data/lib/nanoc/base/services/compiler/stages.rb +0 -23
- data/lib/nanoc/base/services/compiler/stages/build_reps.rb +0 -38
- data/lib/nanoc/base/services/compiler/stages/calculate_checksums.rb +0 -44
- data/lib/nanoc/base/services/compiler/stages/cleanup.rb +0 -45
- data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +0 -98
- data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +0 -51
- data/lib/nanoc/base/services/compiler/stages/forget_outdated_dependencies.rb +0 -22
- data/lib/nanoc/base/services/compiler/stages/load_stores.rb +0 -37
- data/lib/nanoc/base/services/compiler/stages/postprocess.rb +0 -23
- data/lib/nanoc/base/services/compiler/stages/preprocess.rb +0 -34
- data/lib/nanoc/base/services/compiler/stages/prune.rb +0 -32
- data/lib/nanoc/base/services/compiler/stages/store_post_compilation_state.rb +0 -22
- data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +0 -34
- data/lib/nanoc/base/services/compiler_loader.rb +0 -48
- data/lib/nanoc/base/services/executor.rb +0 -134
- data/lib/nanoc/base/services/filter.rb +0 -267
- data/lib/nanoc/base/services/item_rep_builder.rb +0 -54
- data/lib/nanoc/base/services/item_rep_selector.rb +0 -69
- data/lib/nanoc/base/services/item_rep_writer.rb +0 -86
- data/lib/nanoc/base/services/outdatedness_checker.rb +0 -222
- data/lib/nanoc/base/services/outdatedness_rules.rb +0 -18
- data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +0 -41
- data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +0 -31
- data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +0 -21
- data/lib/nanoc/base/services/outdatedness_rules/item_collection_extended.rb +0 -20
- data/lib/nanoc/base/services/outdatedness_rules/layout_collection_extended.rb +0 -20
- data/lib/nanoc/base/services/outdatedness_rules/not_written.rb +0 -17
- data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +0 -45
- data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +0 -26
- data/lib/nanoc/base/services/pruner.rb +0 -123
- data/lib/nanoc/base/views.rb +0 -40
- data/lib/nanoc/base/views/basic_item_rep_collection_view.rb +0 -86
- data/lib/nanoc/base/views/basic_item_rep_view.rb +0 -81
- data/lib/nanoc/base/views/basic_item_view.rb +0 -52
- data/lib/nanoc/base/views/compilation_item_rep_collection_view.rb +0 -10
- data/lib/nanoc/base/views/compilation_item_rep_view.rb +0 -49
- data/lib/nanoc/base/views/compilation_item_view.rb +0 -45
- data/lib/nanoc/base/views/config_view.rb +0 -68
- data/lib/nanoc/base/views/identifiable_collection_view.rb +0 -109
- data/lib/nanoc/base/views/item_collection_with_reps_view.rb +0 -10
- data/lib/nanoc/base/views/item_collection_without_reps_view.rb +0 -10
- data/lib/nanoc/base/views/layout_collection_view.rb +0 -10
- data/lib/nanoc/base/views/layout_view.rb +0 -7
- data/lib/nanoc/base/views/mixins/document_view_mixin.rb +0 -88
- data/lib/nanoc/base/views/mixins/mutable_document_view_mixin.rb +0 -58
- data/lib/nanoc/base/views/mutable_config_view.rb +0 -14
- data/lib/nanoc/base/views/mutable_identifiable_collection_view.rb +0 -17
- data/lib/nanoc/base/views/mutable_item_collection_view.rb +0 -32
- data/lib/nanoc/base/views/mutable_item_view.rb +0 -7
- data/lib/nanoc/base/views/mutable_layout_collection_view.rb +0 -24
- data/lib/nanoc/base/views/mutable_layout_view.rb +0 -7
- data/lib/nanoc/base/views/post_compile_item_collection_view.rb +0 -10
- data/lib/nanoc/base/views/post_compile_item_rep_collection_view.rb +0 -10
- data/lib/nanoc/base/views/post_compile_item_rep_view.rb +0 -31
- data/lib/nanoc/base/views/post_compile_item_view.rb +0 -18
- data/lib/nanoc/base/views/view.rb +0 -41
- data/lib/nanoc/checking.rb +0 -14
- data/lib/nanoc/checking/check.rb +0 -93
- data/lib/nanoc/checking/checks.rb +0 -14
- data/lib/nanoc/checking/checks/css.rb +0 -16
- data/lib/nanoc/checking/checks/external_links.rb +0 -151
- data/lib/nanoc/checking/checks/html.rb +0 -16
- data/lib/nanoc/checking/checks/internal_links.rb +0 -95
- data/lib/nanoc/checking/checks/mixed_content.rb +0 -37
- data/lib/nanoc/checking/checks/stale.rb +0 -41
- data/lib/nanoc/checking/checks/w3c_validator.rb +0 -31
- data/lib/nanoc/checking/dsl.rb +0 -27
- data/lib/nanoc/checking/issue.rb +0 -16
- data/lib/nanoc/checking/loader.rb +0 -50
- data/lib/nanoc/checking/runner.rb +0 -136
- data/lib/nanoc/cli.rb +0 -241
- data/lib/nanoc/cli/ansi_string_colorizer.rb +0 -28
- data/lib/nanoc/cli/cleaning_stream.rb +0 -160
- data/lib/nanoc/cli/command_runner.rb +0 -72
- data/lib/nanoc/cli/commands/check.rb +0 -43
- data/lib/nanoc/cli/commands/compile.rb +0 -57
- data/lib/nanoc/cli/commands/compile_listeners/abstract.rb +0 -58
- data/lib/nanoc/cli/commands/compile_listeners/aggregate.rb +0 -50
- data/lib/nanoc/cli/commands/compile_listeners/debug_printer.rb +0 -100
- data/lib/nanoc/cli/commands/compile_listeners/diff_generator.rb +0 -101
- data/lib/nanoc/cli/commands/compile_listeners/file_action_printer.rb +0 -76
- data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +0 -170
- data/lib/nanoc/cli/commands/create-site.rb +0 -257
- data/lib/nanoc/cli/commands/deploy.rb +0 -126
- data/lib/nanoc/cli/commands/nanoc.rb +0 -42
- data/lib/nanoc/cli/commands/prune.rb +0 -49
- data/lib/nanoc/cli/commands/shell.rb +0 -57
- data/lib/nanoc/cli/commands/show-data.rb +0 -185
- data/lib/nanoc/cli/commands/show-plugins.rb +0 -89
- data/lib/nanoc/cli/commands/view.rb +0 -68
- data/lib/nanoc/cli/error_handler.rb +0 -365
- data/lib/nanoc/cli/logger.rb +0 -75
- data/lib/nanoc/cli/stack_trace_writer.rb +0 -50
- data/lib/nanoc/cli/stream_cleaners.rb +0 -10
- data/lib/nanoc/cli/stream_cleaners/abstract.rb +0 -21
- data/lib/nanoc/cli/stream_cleaners/ansi_colors.rb +0 -13
- data/lib/nanoc/cli/stream_cleaners/utf8.rb +0 -17
- data/lib/nanoc/cli/transform.rb +0 -16
- data/lib/nanoc/deploying.rb +0 -10
- data/lib/nanoc/deploying/deployer.rb +0 -45
- data/lib/nanoc/deploying/deployers.rb +0 -11
- data/lib/nanoc/deploying/deployers/fog.rb +0 -220
- data/lib/nanoc/deploying/deployers/git.rb +0 -112
- data/lib/nanoc/deploying/deployers/rsync.rb +0 -68
- data/lib/nanoc/extra/core_ext/pathname.rb +0 -27
- data/lib/nanoc/spec.rb +0 -240
data/bin/nanoc
CHANGED
@@ -9,7 +9,7 @@ begin
|
|
9
9
|
rescue LoadError
|
10
10
|
end
|
11
11
|
|
12
|
-
require 'nanoc/
|
12
|
+
require 'nanoc/orig_cli'
|
13
13
|
|
14
14
|
if File.file?('Gemfile') && !defined?(Bundler)
|
15
15
|
warn 'A Gemfile was detected, but Bundler is not loaded. This is probably not what you want. To run Nanoc with Bundler, use `bundle exec nanoc`.'
|
data/lib/nanoc.rb
CHANGED
@@ -8,38 +8,14 @@ require 'json'
|
|
8
8
|
require 'parallel'
|
9
9
|
|
10
10
|
module Nanoc
|
11
|
-
# @return [String] A string containing information about this Nanoc version
|
12
|
-
# and its environment (Ruby engine and version, Rubygems version if any).
|
13
|
-
#
|
14
|
-
# @api private
|
15
|
-
def self.version_information
|
16
|
-
"Nanoc #{Nanoc::VERSION} © 2007–2019 Denis Defreyne.\n" \
|
17
|
-
"Running #{RUBY_ENGINE} #{RUBY_VERSION} (#{RUBY_RELEASE_DATE}) on #{RUBY_PLATFORM} with RubyGems #{Gem::VERSION}.\n"
|
18
|
-
end
|
19
|
-
|
20
|
-
# @return [Boolean] True if the current platform is Windows, false otherwise.
|
21
|
-
#
|
22
|
-
# @api private
|
23
|
-
def self.on_windows?
|
24
|
-
@_on_windows ||= TTY::Platform.new.windows?
|
25
|
-
end
|
26
|
-
|
27
|
-
# Similar to `nil` except that it can only be compared against using
|
28
|
-
# `UNDEFINED.equal?(x)`. Used in places where `nil` already has meaning, and
|
29
|
-
# thus cannot be used to mean the presence of nothing.
|
30
|
-
UNDEFINED = Object.new
|
31
11
|
end
|
32
12
|
|
33
13
|
# Load general requirements
|
34
14
|
require 'base64'
|
35
15
|
require 'cgi'
|
36
|
-
require 'diff/lcs'
|
37
|
-
require 'diff/lcs/hunk'
|
38
16
|
require 'digest'
|
39
17
|
require 'English'
|
40
|
-
require 'fiber'
|
41
18
|
require 'fileutils'
|
42
|
-
require 'find'
|
43
19
|
require 'forwardable'
|
44
20
|
require 'logger'
|
45
21
|
require 'net/http'
|
@@ -52,25 +28,26 @@ require 'stringio'
|
|
52
28
|
require 'tempfile'
|
53
29
|
require 'time'
|
54
30
|
require 'timeout'
|
55
|
-
require 'tomlrb'
|
56
31
|
require 'tmpdir'
|
57
|
-
require 'tty-platform'
|
58
32
|
require 'tty-which'
|
59
33
|
require 'uri'
|
60
|
-
require 'yaml'
|
61
34
|
|
62
35
|
# Load extracted Nanoc dependencies
|
63
36
|
require 'nanoc-core'
|
37
|
+
require 'nanoc-cli'
|
38
|
+
require 'nanoc-checking'
|
39
|
+
require 'nanoc-deploying'
|
64
40
|
|
65
41
|
# Re-export from Nanoc::Core
|
66
42
|
Nanoc::Identifier = Nanoc::Core::Identifier
|
67
43
|
Nanoc::DataSource = Nanoc::Core::DataSource
|
44
|
+
Nanoc::Filter = Nanoc::Core::Filter
|
45
|
+
Nanoc::Error = Nanoc::Core::Error
|
46
|
+
Nanoc::Check = Nanoc::Checking::Check
|
68
47
|
|
69
48
|
# Load Nanoc
|
70
49
|
require 'nanoc/version'
|
71
|
-
require 'nanoc/base'
|
72
50
|
require 'nanoc/checking'
|
73
|
-
require 'nanoc/deploying'
|
74
51
|
require 'nanoc/extra'
|
75
52
|
require 'nanoc/data_sources'
|
76
53
|
require 'nanoc/filters'
|
@@ -48,6 +48,12 @@ module Nanoc::DataSources
|
|
48
48
|
#
|
49
49
|
# @api private
|
50
50
|
class Filesystem < Nanoc::DataSource
|
51
|
+
class AmbiguousMetadataAssociationError < ::Nanoc::Core::Error
|
52
|
+
def initialize(content_filenames, meta_filename)
|
53
|
+
super("There are multiple content files (#{content_filenames.sort.join(', ')}) that could match the file containing metadata (#{meta_filename}).")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
51
57
|
identifiers :filesystem, :filesystem_unified
|
52
58
|
|
53
59
|
# See {Nanoc::DataSource#up}.
|
@@ -85,9 +91,9 @@ module Nanoc::DataSources
|
|
85
91
|
def changes_for_dir(dir)
|
86
92
|
require 'listen'
|
87
93
|
|
88
|
-
Nanoc::ChangesStream.new do |cl|
|
94
|
+
Nanoc::Core::ChangesStream.new do |cl|
|
89
95
|
listener =
|
90
|
-
Listen.to(dir, latency: 0.
|
96
|
+
Listen.to(dir, latency: 0.1, wait_for_delay: 0.0) do |_modifieds, _addeds, _deleteds|
|
91
97
|
cl.unknown
|
92
98
|
end
|
93
99
|
|
@@ -203,7 +209,7 @@ module Nanoc::DataSources
|
|
203
209
|
|
204
210
|
have_possible_ambiguity = meta_filename && content_filenames.size > 1
|
205
211
|
if have_possible_ambiguity && content_filenames.count { |fn| !parser.frontmatter?(fn) } != 1
|
206
|
-
raise Nanoc::
|
212
|
+
raise Nanoc::DataSources::Filesystem::AmbiguousMetadataAssociationError.new(content_filenames, meta_filename)
|
207
213
|
end
|
208
214
|
|
209
215
|
content_filenames.each do |content_filename|
|
@@ -6,7 +6,7 @@ class Nanoc::DataSources::Filesystem < Nanoc::DataSource
|
|
6
6
|
# @api private
|
7
7
|
module Tools
|
8
8
|
# Error that is raised when too many symlink indirections are encountered.
|
9
|
-
class MaxSymlinkDepthExceededError < ::Nanoc::
|
9
|
+
class MaxSymlinkDepthExceededError < ::Nanoc::Core::TrivialError
|
10
10
|
# @return [String] The last filename that was attempted to be
|
11
11
|
# resolved before giving up
|
12
12
|
attr_reader :filename
|
@@ -21,7 +21,7 @@ class Nanoc::DataSources::Filesystem < Nanoc::DataSource
|
|
21
21
|
|
22
22
|
# Error that is raised when a file of an unknown type is encountered
|
23
23
|
# (something other than file, directory or link).
|
24
|
-
class UnsupportedFileTypeError < ::Nanoc::
|
24
|
+
class UnsupportedFileTypeError < ::Nanoc::Core::TrivialError
|
25
25
|
# @return [String] The filename of the file whose type is not supported
|
26
26
|
attr_reader :filename
|
27
27
|
|
@@ -93,7 +93,7 @@ class Nanoc::DataSources::Filesystem < Nanoc::DataSource
|
|
93
93
|
#
|
94
94
|
# @return [Array<String>] A list of files and directories
|
95
95
|
#
|
96
|
-
# @raise [
|
96
|
+
# @raise [Nanoc::Core::TrivialError] when pattern can not be handled
|
97
97
|
def all_files_and_dirs_in(dir_name, extra_files)
|
98
98
|
base_patterns = ["#{dir_name}/**/*"]
|
99
99
|
|
@@ -107,7 +107,7 @@ class Nanoc::DataSources::Filesystem < Nanoc::DataSource
|
|
107
107
|
extra_files.map { |extra_file| "#{dir_name}/#{extra_file}" }
|
108
108
|
else
|
109
109
|
raise(
|
110
|
-
Nanoc::
|
110
|
+
Nanoc::Core::TrivialError,
|
111
111
|
"Do not know how to handle extra_files: #{extra_files.inspect}",
|
112
112
|
)
|
113
113
|
end
|
data/lib/nanoc/extra.rb
CHANGED
@@ -12,9 +12,10 @@ module Nanoc::Extra
|
|
12
12
|
Deployer = Nanoc::Deploying::Deployer
|
13
13
|
|
14
14
|
# @deprecated
|
15
|
-
Pruner = Nanoc::Pruner
|
15
|
+
Pruner = Nanoc::Core::Pruner
|
16
16
|
end
|
17
17
|
|
18
18
|
require_relative 'extra/link_collector'
|
19
19
|
require_relative 'extra/jruby_nokogiri_warner'
|
20
|
+
require_relative 'extra/srcset_parser'
|
20
21
|
require_relative 'extra/core_ext'
|
data/lib/nanoc/extra/core_ext.rb
CHANGED
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Nanoc
|
4
|
+
module Extra
|
5
|
+
# @api private
|
6
|
+
class SrcsetParser
|
7
|
+
class InvalidFormat < ::Nanoc::Core::Error
|
8
|
+
def initialize
|
9
|
+
super('Invalid srcset format')
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
REGEX_REST =
|
14
|
+
/
|
15
|
+
( # Zero or one of the following:
|
16
|
+
( # A width descriptor, consisting of:
|
17
|
+
\s+ # ASCII whitespace
|
18
|
+
\d+ # a valid non-negative integer
|
19
|
+
w # a U+0077 LATIN SMALL LETTER W character
|
20
|
+
)
|
21
|
+
|
|
22
|
+
( # A pixel density descriptor, consisting of
|
23
|
+
\s+ # ASCII whitespace
|
24
|
+
(\d*\.)?\d+ # a valid floating-point number
|
25
|
+
x # and a U+0078 LATIN SMALL LETTER X character.
|
26
|
+
)
|
27
|
+
)*
|
28
|
+
/x.freeze
|
29
|
+
|
30
|
+
def initialize(value)
|
31
|
+
@value = value
|
32
|
+
end
|
33
|
+
|
34
|
+
def call
|
35
|
+
matches = []
|
36
|
+
|
37
|
+
loop do
|
38
|
+
match = {}
|
39
|
+
|
40
|
+
scan(/\s*/)
|
41
|
+
match[:url] = scan(/[^, ]+/)
|
42
|
+
match[:rest] = scan(REGEX_REST)
|
43
|
+
scan(/\s*/)
|
44
|
+
|
45
|
+
matches << match
|
46
|
+
|
47
|
+
next if try_scan(/,/)
|
48
|
+
break if eos?
|
49
|
+
|
50
|
+
raise(InvalidFormat)
|
51
|
+
end
|
52
|
+
|
53
|
+
matches
|
54
|
+
rescue InvalidFormat
|
55
|
+
@value
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def scan(pattern)
|
61
|
+
match = try_scan(pattern)
|
62
|
+
|
63
|
+
match || raise(InvalidFormat)
|
64
|
+
end
|
65
|
+
|
66
|
+
def try_scan(pattern)
|
67
|
+
scanner.scan(pattern)
|
68
|
+
end
|
69
|
+
|
70
|
+
def eos?
|
71
|
+
scanner.eos?
|
72
|
+
end
|
73
|
+
|
74
|
+
def scanner
|
75
|
+
@_scanner ||= StringScanner.new(@value)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/nanoc/filters/erb.rb
CHANGED
@@ -11,9 +11,6 @@ module Nanoc::Filters
|
|
11
11
|
#
|
12
12
|
# @param [String] content The content to filter
|
13
13
|
#
|
14
|
-
# @option params [Integer] :safe_level (nil) The safe level (`$SAFE`) to
|
15
|
-
# use while running this filter
|
16
|
-
#
|
17
14
|
# @option params [String] :trim_mode (nil) The trim mode to use
|
18
15
|
#
|
19
16
|
# @return [String] The filtered content
|
@@ -29,9 +26,8 @@ module Nanoc::Filters
|
|
29
26
|
assigns_binding = context.get_binding(&proc)
|
30
27
|
|
31
28
|
# Get result
|
32
|
-
safe_level = params[:safe_level]
|
33
29
|
trim_mode = params[:trim_mode]
|
34
|
-
erb = ::ERB.new(content,
|
30
|
+
erb = ::ERB.new(content, nil, trim_mode)
|
35
31
|
erb.filename = filename
|
36
32
|
erb.result(assigns_binding)
|
37
33
|
end
|
@@ -10,7 +10,16 @@ module Nanoc::Filters
|
|
10
10
|
|
11
11
|
DDMemoize.activate(self)
|
12
12
|
|
13
|
-
SELECTORS =
|
13
|
+
SELECTORS =
|
14
|
+
[
|
15
|
+
'*/@href',
|
16
|
+
'*/@src',
|
17
|
+
'object/@data',
|
18
|
+
'param[@name="movie"]/@value',
|
19
|
+
'form/@action',
|
20
|
+
'comment()',
|
21
|
+
{ path: '*/@srcset', type: :srcset },
|
22
|
+
].freeze
|
14
23
|
|
15
24
|
GCSE_SEARCH_WORKAROUND = 'nanoc__gcse_search__f7ac3462f628a053f86fe6563c0ec98f1fe45cee'
|
16
25
|
|
@@ -135,14 +144,7 @@ module Nanoc::Filters
|
|
135
144
|
content = apply_gcse_search_workaround(content)
|
136
145
|
|
137
146
|
doc = /<html[\s>]/.match?(content) ? klass.parse(content) : klass.fragment(content)
|
138
|
-
|
139
|
-
doc.xpath(selector, namespaces).each do |node|
|
140
|
-
if node.name == 'comment'
|
141
|
-
nokogiri_process_comment(node, doc, selectors, namespaces, klass, type, params)
|
142
|
-
elsif path_is_relativizable?(node.content, params)
|
143
|
-
node.content = relative_path_to(node.content)
|
144
|
-
end
|
145
|
-
end
|
147
|
+
handle_selectors(selectors, doc, namespaces, klass, type, params)
|
146
148
|
|
147
149
|
output =
|
148
150
|
case type
|
@@ -163,6 +165,33 @@ module Nanoc::Filters
|
|
163
165
|
content.gsub(GCSE_SEARCH_WORKAROUND, 'gcse:search')
|
164
166
|
end
|
165
167
|
|
168
|
+
def handle_selectors(selectors, doc, namespaces, klass, type, params)
|
169
|
+
selectors_by_type(selectors).each do |selector_type, sub_selectors|
|
170
|
+
selector = sub_selectors.map { |sel| "descendant-or-self::#{sel.fetch(:path)}" }.join('|')
|
171
|
+
|
172
|
+
doc.xpath(selector, namespaces).each do |node|
|
173
|
+
if node.name == 'comment'
|
174
|
+
nokogiri_process_comment(node, doc, sub_selectors, namespaces, klass, type, params)
|
175
|
+
elsif path_is_relativizable?(node.content, params)
|
176
|
+
node.content = relativize_node(node, selector_type)
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
def selectors_by_type(selectors)
|
183
|
+
typed_selectors =
|
184
|
+
selectors.map do |s|
|
185
|
+
if s.respond_to?(:keys)
|
186
|
+
s
|
187
|
+
else
|
188
|
+
{ path: s, type: :basic }
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
typed_selectors.group_by { |s| s.fetch(:type) }
|
193
|
+
end
|
194
|
+
|
166
195
|
def nokogiri_process_comment(node, doc, selectors, namespaces, klass, type, params)
|
167
196
|
content = node.content.dup.sub(%r{^(\s*\[.+?\]>\s*)(.+?)(\s*<!\[endif\])}m) do |_m|
|
168
197
|
beginning = Regexp.last_match[1]
|
@@ -175,8 +204,31 @@ module Nanoc::Filters
|
|
175
204
|
node.replace(Nokogiri::XML::Comment.new(doc, content))
|
176
205
|
end
|
177
206
|
|
207
|
+
def relativize_node(node, selector_type)
|
208
|
+
case selector_type
|
209
|
+
when :basic
|
210
|
+
relative_path_to(node.content)
|
211
|
+
when :srcset
|
212
|
+
handle_srcset_node(node)
|
213
|
+
else
|
214
|
+
raise Nanoc::Core::Errors::InternalInconsistency, "Unsupported selector type #{selector_type.inspect} in #{self.class}"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
def handle_srcset_node(node)
|
219
|
+
parsed = Nanoc::Extra::SrcsetParser.new(node.content).call
|
220
|
+
|
221
|
+
if parsed.is_a?(Array)
|
222
|
+
parsed.map do |pair|
|
223
|
+
[relative_path_to(pair[:url]), pair[:rest]].join('')
|
224
|
+
end.join(',')
|
225
|
+
else
|
226
|
+
relative_path_to(parsed)
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
178
230
|
def path_is_relativizable?(path, params)
|
179
|
-
path.
|
231
|
+
path.match?(/\A\s*\//) && !exclude?(path, params)
|
180
232
|
end
|
181
233
|
end
|
182
234
|
end
|
@@ -83,28 +83,28 @@ module Nanoc::Helpers
|
|
83
83
|
|
84
84
|
def validate_config
|
85
85
|
if @config[:base_url].nil?
|
86
|
-
raise Nanoc::
|
86
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: site configuration has no base_url')
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
90
90
|
def validate_feed_item
|
91
91
|
if title.nil?
|
92
|
-
raise Nanoc::
|
92
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: no title in params, item or site config')
|
93
93
|
end
|
94
94
|
if author_name.nil?
|
95
|
-
raise Nanoc::
|
95
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: no author_name in params, item or site config')
|
96
96
|
end
|
97
97
|
if author_uri.nil?
|
98
|
-
raise Nanoc::
|
98
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: no author_uri in params, item or site config')
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
102
|
def validate_articles
|
103
103
|
if relevant_articles.empty?
|
104
|
-
raise Nanoc::
|
104
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: no articles')
|
105
105
|
end
|
106
106
|
if relevant_articles.any? { |a| a[:created_at].nil? }
|
107
|
-
raise Nanoc::
|
107
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: one or more articles lack created_at')
|
108
108
|
end
|
109
109
|
end
|
110
110
|
|
@@ -218,7 +218,7 @@ module Nanoc::Helpers
|
|
218
218
|
def url_for(item)
|
219
219
|
# Check attributes
|
220
220
|
if @config[:base_url].nil?
|
221
|
-
raise Nanoc::
|
221
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: site configuration has no base_url')
|
222
222
|
end
|
223
223
|
|
224
224
|
# Build URL
|
@@ -235,7 +235,7 @@ module Nanoc::Helpers
|
|
235
235
|
def feed_url
|
236
236
|
# Check attributes
|
237
237
|
if @config[:base_url].nil?
|
238
|
-
raise Nanoc::
|
238
|
+
raise Nanoc::Core::TrivialError.new('Cannot build Atom feed: site configuration has no base_url')
|
239
239
|
end
|
240
240
|
|
241
241
|
@item[:feed_url] || @config[:base_url] + @item.path
|