nanoc 4.11.12 → 4.11.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/NEWS.md +788 -743
  3. data/bin/nanoc +1 -1
  4. data/lib/nanoc.rb +6 -29
  5. data/lib/nanoc/data_sources/filesystem.rb +9 -3
  6. data/lib/nanoc/data_sources/filesystem/tools.rb +4 -4
  7. data/lib/nanoc/extra.rb +2 -1
  8. data/lib/nanoc/extra/core_ext.rb +0 -1
  9. data/lib/nanoc/extra/srcset_parser.rb +79 -0
  10. data/lib/nanoc/filters/colorize_syntax/colorizers.rb +1 -1
  11. data/lib/nanoc/filters/erb.rb +1 -5
  12. data/lib/nanoc/filters/relativize_paths.rb +62 -10
  13. data/lib/nanoc/filters/sass/functions.rb +1 -1
  14. data/lib/nanoc/helpers/blogging.rb +8 -8
  15. data/lib/nanoc/helpers/capturing.rb +1 -1
  16. data/lib/nanoc/helpers/link_to.rb +1 -1
  17. data/lib/nanoc/helpers/rendering.rb +5 -4
  18. data/lib/nanoc/orig_cli.rb +15 -0
  19. data/lib/nanoc/{cli → orig_cli}/commands/show-rules.rb +3 -3
  20. data/lib/nanoc/rule_dsl.rb +1 -0
  21. data/lib/nanoc/rule_dsl/action_provider.rb +6 -6
  22. data/lib/nanoc/rule_dsl/action_recorder.rb +4 -4
  23. data/lib/nanoc/rule_dsl/compilation_rule_context.rb +1 -1
  24. data/lib/nanoc/rule_dsl/compiler_dsl.rb +2 -2
  25. data/lib/nanoc/rule_dsl/errors.rb +25 -0
  26. data/lib/nanoc/rule_dsl/rule_context.rb +6 -6
  27. data/lib/nanoc/rule_dsl/rules_loader.rb +1 -1
  28. data/lib/nanoc/version.rb +1 -1
  29. metadata +23 -158
  30. data/lib/nanoc/base.rb +0 -16
  31. data/lib/nanoc/base/changes_stream.rb +0 -53
  32. data/lib/nanoc/base/error.rb +0 -7
  33. data/lib/nanoc/base/errors.rb +0 -163
  34. data/lib/nanoc/base/feature.rb +0 -104
  35. data/lib/nanoc/base/repos.rb +0 -4
  36. data/lib/nanoc/base/repos/config_loader.rb +0 -95
  37. data/lib/nanoc/base/repos/site_loader.rb +0 -102
  38. data/lib/nanoc/base/services.rb +0 -23
  39. data/lib/nanoc/base/services/compiler.rb +0 -214
  40. data/lib/nanoc/base/services/compiler/phases.rb +0 -19
  41. data/lib/nanoc/base/services/compiler/phases/abstract.rb +0 -50
  42. data/lib/nanoc/base/services/compiler/phases/cache.rb +0 -45
  43. data/lib/nanoc/base/services/compiler/phases/mark_done.rb +0 -25
  44. data/lib/nanoc/base/services/compiler/phases/notify.rb +0 -21
  45. data/lib/nanoc/base/services/compiler/phases/recalculate.rb +0 -51
  46. data/lib/nanoc/base/services/compiler/phases/resume.rb +0 -54
  47. data/lib/nanoc/base/services/compiler/phases/write.rb +0 -86
  48. data/lib/nanoc/base/services/compiler/stages.rb +0 -23
  49. data/lib/nanoc/base/services/compiler/stages/build_reps.rb +0 -38
  50. data/lib/nanoc/base/services/compiler/stages/calculate_checksums.rb +0 -44
  51. data/lib/nanoc/base/services/compiler/stages/cleanup.rb +0 -45
  52. data/lib/nanoc/base/services/compiler/stages/compile_reps.rb +0 -98
  53. data/lib/nanoc/base/services/compiler/stages/determine_outdatedness.rb +0 -51
  54. data/lib/nanoc/base/services/compiler/stages/forget_outdated_dependencies.rb +0 -22
  55. data/lib/nanoc/base/services/compiler/stages/load_stores.rb +0 -37
  56. data/lib/nanoc/base/services/compiler/stages/postprocess.rb +0 -23
  57. data/lib/nanoc/base/services/compiler/stages/preprocess.rb +0 -34
  58. data/lib/nanoc/base/services/compiler/stages/prune.rb +0 -32
  59. data/lib/nanoc/base/services/compiler/stages/store_post_compilation_state.rb +0 -22
  60. data/lib/nanoc/base/services/compiler/stages/store_pre_compilation_state.rb +0 -34
  61. data/lib/nanoc/base/services/compiler_loader.rb +0 -48
  62. data/lib/nanoc/base/services/executor.rb +0 -134
  63. data/lib/nanoc/base/services/filter.rb +0 -267
  64. data/lib/nanoc/base/services/item_rep_builder.rb +0 -54
  65. data/lib/nanoc/base/services/item_rep_selector.rb +0 -69
  66. data/lib/nanoc/base/services/item_rep_writer.rb +0 -86
  67. data/lib/nanoc/base/services/outdatedness_checker.rb +0 -222
  68. data/lib/nanoc/base/services/outdatedness_rules.rb +0 -18
  69. data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +0 -41
  70. data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +0 -31
  71. data/lib/nanoc/base/services/outdatedness_rules/content_modified.rb +0 -21
  72. data/lib/nanoc/base/services/outdatedness_rules/item_collection_extended.rb +0 -20
  73. data/lib/nanoc/base/services/outdatedness_rules/layout_collection_extended.rb +0 -20
  74. data/lib/nanoc/base/services/outdatedness_rules/not_written.rb +0 -17
  75. data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +0 -45
  76. data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +0 -26
  77. data/lib/nanoc/base/services/pruner.rb +0 -123
  78. data/lib/nanoc/base/views.rb +0 -40
  79. data/lib/nanoc/base/views/basic_item_rep_collection_view.rb +0 -86
  80. data/lib/nanoc/base/views/basic_item_rep_view.rb +0 -81
  81. data/lib/nanoc/base/views/basic_item_view.rb +0 -52
  82. data/lib/nanoc/base/views/compilation_item_rep_collection_view.rb +0 -10
  83. data/lib/nanoc/base/views/compilation_item_rep_view.rb +0 -49
  84. data/lib/nanoc/base/views/compilation_item_view.rb +0 -45
  85. data/lib/nanoc/base/views/config_view.rb +0 -68
  86. data/lib/nanoc/base/views/identifiable_collection_view.rb +0 -109
  87. data/lib/nanoc/base/views/item_collection_with_reps_view.rb +0 -10
  88. data/lib/nanoc/base/views/item_collection_without_reps_view.rb +0 -10
  89. data/lib/nanoc/base/views/layout_collection_view.rb +0 -10
  90. data/lib/nanoc/base/views/layout_view.rb +0 -7
  91. data/lib/nanoc/base/views/mixins/document_view_mixin.rb +0 -88
  92. data/lib/nanoc/base/views/mixins/mutable_document_view_mixin.rb +0 -58
  93. data/lib/nanoc/base/views/mutable_config_view.rb +0 -14
  94. data/lib/nanoc/base/views/mutable_identifiable_collection_view.rb +0 -17
  95. data/lib/nanoc/base/views/mutable_item_collection_view.rb +0 -32
  96. data/lib/nanoc/base/views/mutable_item_view.rb +0 -7
  97. data/lib/nanoc/base/views/mutable_layout_collection_view.rb +0 -24
  98. data/lib/nanoc/base/views/mutable_layout_view.rb +0 -7
  99. data/lib/nanoc/base/views/post_compile_item_collection_view.rb +0 -10
  100. data/lib/nanoc/base/views/post_compile_item_rep_collection_view.rb +0 -10
  101. data/lib/nanoc/base/views/post_compile_item_rep_view.rb +0 -31
  102. data/lib/nanoc/base/views/post_compile_item_view.rb +0 -18
  103. data/lib/nanoc/base/views/view.rb +0 -41
  104. data/lib/nanoc/checking.rb +0 -14
  105. data/lib/nanoc/checking/check.rb +0 -93
  106. data/lib/nanoc/checking/checks.rb +0 -14
  107. data/lib/nanoc/checking/checks/css.rb +0 -16
  108. data/lib/nanoc/checking/checks/external_links.rb +0 -151
  109. data/lib/nanoc/checking/checks/html.rb +0 -16
  110. data/lib/nanoc/checking/checks/internal_links.rb +0 -95
  111. data/lib/nanoc/checking/checks/mixed_content.rb +0 -37
  112. data/lib/nanoc/checking/checks/stale.rb +0 -41
  113. data/lib/nanoc/checking/checks/w3c_validator.rb +0 -31
  114. data/lib/nanoc/checking/dsl.rb +0 -27
  115. data/lib/nanoc/checking/issue.rb +0 -16
  116. data/lib/nanoc/checking/loader.rb +0 -50
  117. data/lib/nanoc/checking/runner.rb +0 -136
  118. data/lib/nanoc/cli.rb +0 -241
  119. data/lib/nanoc/cli/ansi_string_colorizer.rb +0 -28
  120. data/lib/nanoc/cli/cleaning_stream.rb +0 -160
  121. data/lib/nanoc/cli/command_runner.rb +0 -72
  122. data/lib/nanoc/cli/commands/check.rb +0 -43
  123. data/lib/nanoc/cli/commands/compile.rb +0 -57
  124. data/lib/nanoc/cli/commands/compile_listeners/abstract.rb +0 -58
  125. data/lib/nanoc/cli/commands/compile_listeners/aggregate.rb +0 -50
  126. data/lib/nanoc/cli/commands/compile_listeners/debug_printer.rb +0 -100
  127. data/lib/nanoc/cli/commands/compile_listeners/diff_generator.rb +0 -101
  128. data/lib/nanoc/cli/commands/compile_listeners/file_action_printer.rb +0 -76
  129. data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +0 -170
  130. data/lib/nanoc/cli/commands/create-site.rb +0 -257
  131. data/lib/nanoc/cli/commands/deploy.rb +0 -126
  132. data/lib/nanoc/cli/commands/nanoc.rb +0 -42
  133. data/lib/nanoc/cli/commands/prune.rb +0 -49
  134. data/lib/nanoc/cli/commands/shell.rb +0 -57
  135. data/lib/nanoc/cli/commands/show-data.rb +0 -185
  136. data/lib/nanoc/cli/commands/show-plugins.rb +0 -89
  137. data/lib/nanoc/cli/commands/view.rb +0 -68
  138. data/lib/nanoc/cli/error_handler.rb +0 -365
  139. data/lib/nanoc/cli/logger.rb +0 -75
  140. data/lib/nanoc/cli/stack_trace_writer.rb +0 -50
  141. data/lib/nanoc/cli/stream_cleaners.rb +0 -10
  142. data/lib/nanoc/cli/stream_cleaners/abstract.rb +0 -21
  143. data/lib/nanoc/cli/stream_cleaners/ansi_colors.rb +0 -13
  144. data/lib/nanoc/cli/stream_cleaners/utf8.rb +0 -17
  145. data/lib/nanoc/cli/transform.rb +0 -16
  146. data/lib/nanoc/deploying.rb +0 -10
  147. data/lib/nanoc/deploying/deployer.rb +0 -45
  148. data/lib/nanoc/deploying/deployers.rb +0 -11
  149. data/lib/nanoc/deploying/deployers/fog.rb +0 -220
  150. data/lib/nanoc/deploying/deployers/git.rb +0 -112
  151. data/lib/nanoc/deploying/deployers/rsync.rb +0 -68
  152. data/lib/nanoc/extra/core_ext/pathname.rb +0 -27
  153. 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/cli'
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`.'
@@ -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.0, wait_for_delay: 0.0) do |_modifieds, _addeds, _deleteds|
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::Int::Errors::AmbiguousMetadataAssociation.new(content_filenames, meta_filename)
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::Int::Errors::GenericTrivial
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::Int::Errors::GenericTrivial
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 [GenericTrivial] when pattern can not be handled
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::Int::Errors::GenericTrivial,
110
+ Nanoc::Core::TrivialError,
111
111
  "Do not know how to handle extra_files: #{extra_files.inspect}",
112
112
  )
113
113
  end
@@ -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'
@@ -1,4 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'nanoc/extra/core_ext/pathname'
4
3
  require 'nanoc/extra/core_ext/time'
@@ -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
@@ -4,7 +4,7 @@ module Nanoc::Filters::ColorizeSyntax::Colorizers
4
4
  class Abstract
5
5
  extend DDPlugin::Plugin
6
6
 
7
- def process(_code, _language, params = {}) # rubocop:disable Lint/UnusedMethodArgument
7
+ def process(_code, _language, params = {})
8
8
  raise NotImplementedError
9
9
  end
10
10
 
@@ -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, safe_level, trim_mode)
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 = ['*/@href', '*/@src', 'object/@data', 'param[@name="movie"]/@content', 'form/@action', 'comment()'].freeze
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
- selector = selectors.map { |sel| "descendant-or-self::#{sel}" }.join('|')
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.start_with?('/') && !exclude?(path, params)
231
+ path.match?(/\A\s*\//) && !exclude?(path, params)
180
232
  end
181
233
  end
182
234
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ::Sass::Script::Functions
4
- def nanoc(string, params)
4
+ def nanoc(string, params = {})
5
5
  assert_type string, :String
6
6
  assert_type params, :Hash
7
7
  result = options[:importer].filter.instance_eval(string.value)
@@ -83,28 +83,28 @@ module Nanoc::Helpers
83
83
 
84
84
  def validate_config
85
85
  if @config[:base_url].nil?
86
- raise Nanoc::Int::Errors::GenericTrivial.new('Cannot build Atom feed: site configuration has no base_url')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: no title in params, item or site config')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: no author_name in params, item or site config')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: no author_uri in params, item or site config')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: no articles')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: one or more articles lack created_at')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: site configuration has no base_url')
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::Int::Errors::GenericTrivial.new('Cannot build Atom feed: site configuration has no base_url')
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
@@ -68,7 +68,7 @@ module Nanoc::Helpers
68
68
 
69
69
  unless rep.compiled?
70
70
  # FIXME: is :last appropriate?
71
- Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep, :last))
71
+ Fiber.yield(Nanoc::Core::Errors::UnmetDependency.new(rep, :last))
72
72
  return run
73
73
  end
74
74
  end