nanoc 4.7.5 → 4.7.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +4 -3
  3. data/Gemfile.lock +18 -13
  4. data/NEWS.md +7 -1
  5. data/Rakefile +2 -2
  6. data/lib/nanoc/base/entities/action_sequence.rb +3 -12
  7. data/lib/nanoc/base/entities/configuration.rb +3 -3
  8. data/lib/nanoc/base/entities/identifiable_collection.rb +2 -4
  9. data/lib/nanoc/base/memoization.rb +1 -0
  10. data/lib/nanoc/base/repos/config_loader.rb +1 -1
  11. data/lib/nanoc/base/services/compilation_context.rb +3 -3
  12. data/lib/nanoc/base/services/compiler.rb +2 -3
  13. data/lib/nanoc/base/services/compiler/stages/cleanup.rb +1 -1
  14. data/lib/nanoc/base/services/filter.rb +4 -12
  15. data/lib/nanoc/base/services/item_rep_router.rb +3 -3
  16. data/lib/nanoc/base/services/outdatedness_checker.rb +1 -2
  17. data/lib/nanoc/base/services/outdatedness_rules/attributes_modified.rb +1 -2
  18. data/lib/nanoc/base/services/outdatedness_rules/code_snippets_modified.rb +1 -2
  19. data/lib/nanoc/base/services/outdatedness_rules/configuration_modified.rb +1 -2
  20. data/lib/nanoc/base/services/outdatedness_rules/paths_modified.rb +5 -5
  21. data/lib/nanoc/base/services/outdatedness_rules/rules_modified.rb +3 -3
  22. data/lib/nanoc/base/services/outdatedness_rules/uses_always_outdated_filter.rb +4 -4
  23. data/lib/nanoc/checking/checks/external_links.rb +0 -2
  24. data/lib/nanoc/cli.rb +1 -1
  25. data/lib/nanoc/cli/commands/compile_listeners/timing_recorder.rb +7 -5
  26. data/lib/nanoc/cli/commands/create-site.rb +1 -1
  27. data/lib/nanoc/cli/commands/nanoc.rb +1 -4
  28. data/lib/nanoc/cli/commands/show-plugins.rb +1 -1
  29. data/lib/nanoc/cli/error_handler.rb +2 -1
  30. data/lib/nanoc/deploying/deployers/git.rb +7 -7
  31. data/lib/nanoc/extra/link_collector.rb +2 -2
  32. data/lib/nanoc/filters/asciidoc.rb +1 -1
  33. data/lib/nanoc/filters/colorize_syntax.rb +46 -19
  34. data/lib/nanoc/filters/relativize_paths.rb +33 -9
  35. data/lib/nanoc/rule_dsl/action_sequence_calculator.rb +15 -7
  36. data/lib/nanoc/version.rb +1 -1
  37. data/nanoc.gemspec +1 -1
  38. data/spec/nanoc/base/checksummer_spec.rb +2 -2
  39. data/spec/nanoc/base/entities/action_sequence_spec.rb +0 -36
  40. data/spec/nanoc/base/entities/identifier_spec.rb +1 -1
  41. data/spec/nanoc/base/entities/outdatedness_status_spec.rb +1 -1
  42. data/spec/nanoc/base/entities/processing_actions/snapshot_spec.rb +1 -1
  43. data/spec/nanoc/base/entities/props_spec.rb +13 -13
  44. data/spec/nanoc/base/memoization_spec.rb +31 -0
  45. data/spec/nanoc/base/services/executor_spec.rb +2 -2
  46. data/spec/nanoc/base/services/item_rep_selector_spec.rb +12 -12
  47. data/spec/nanoc/base/services/outdatedness_checker_spec.rb +23 -23
  48. data/spec/nanoc/base/views/post_compile_item_view_spec.rb +1 -1
  49. data/spec/nanoc/cli/commands/deploy_spec.rb +8 -8
  50. data/spec/nanoc/filters/less_spec.rb +11 -11
  51. data/spec/nanoc/helpers/capturing_spec.rb +2 -2
  52. data/spec/nanoc/helpers/tagging_spec.rb +5 -5
  53. data/spec/nanoc/integration/outdatedness_integration_spec.rb +29 -29
  54. data/spec/nanoc/integration/partial_recompilation_spec.rb +8 -8
  55. data/spec/nanoc/regressions/gh_1015_spec.rb +1 -1
  56. data/spec/nanoc/regressions/gh_1022_spec.rb +1 -1
  57. data/spec/nanoc/regressions/gh_1031_spec.rb +3 -3
  58. data/spec/nanoc/regressions/gh_1035_spec.rb +1 -1
  59. data/spec/nanoc/regressions/gh_1037a_spec.rb +2 -2
  60. data/spec/nanoc/regressions/gh_1037b_spec.rb +1 -1
  61. data/spec/nanoc/regressions/gh_1040_spec.rb +1 -1
  62. data/spec/nanoc/regressions/gh_1045_spec.rb +3 -3
  63. data/spec/nanoc/regressions/gh_1047_spec.rb +3 -3
  64. data/spec/nanoc/regressions/gh_1064_spec.rb +1 -1
  65. data/spec/nanoc/regressions/gh_1067_spec.rb +3 -3
  66. data/spec/nanoc/regressions/gh_1082a_spec.rb +1 -1
  67. data/spec/nanoc/regressions/gh_1082b_spec.rb +1 -1
  68. data/spec/nanoc/regressions/gh_1082c_spec.rb +1 -1
  69. data/spec/nanoc/regressions/gh_1082d_spec.rb +1 -1
  70. data/spec/nanoc/regressions/gh_1093_spec.rb +1 -1
  71. data/spec/nanoc/regressions/gh_1094_spec.rb +1 -1
  72. data/spec/nanoc/regressions/gh_1097_spec.rb +1 -1
  73. data/spec/nanoc/regressions/gh_1100_spec.rb +1 -1
  74. data/spec/nanoc/regressions/gh_1102_spec.rb +3 -3
  75. data/spec/nanoc/regressions/gh_1107_spec.rb +1 -1
  76. data/spec/nanoc/regressions/gh_1130_spec.rb +1 -1
  77. data/spec/nanoc/regressions/gh_1134_spec.rb +2 -2
  78. data/spec/nanoc/regressions/gh_1145_spec.rb +1 -1
  79. data/spec/nanoc/regressions/gh_804_spec.rb +1 -1
  80. data/spec/nanoc/regressions/gh_809_spec.rb +1 -1
  81. data/spec/nanoc/regressions/gh_841_spec.rb +1 -1
  82. data/spec/nanoc/regressions/gh_867_spec.rb +1 -1
  83. data/spec/nanoc/regressions/gh_882_spec.rb +3 -3
  84. data/spec/nanoc/regressions/gh_885_spec.rb +2 -2
  85. data/spec/nanoc/regressions/gh_891_spec.rb +2 -2
  86. data/spec/nanoc/regressions/gh_913_spec.rb +1 -1
  87. data/spec/nanoc/regressions/gh_924_spec.rb +2 -2
  88. data/spec/nanoc/regressions/gh_928_spec.rb +1 -1
  89. data/spec/nanoc/regressions/gh_937_spec.rb +2 -2
  90. data/spec/nanoc/regressions/gh_942_spec.rb +1 -1
  91. data/spec/nanoc/regressions/gh_947_spec.rb +1 -1
  92. data/spec/nanoc/regressions/gh_948_spec.rb +1 -1
  93. data/spec/nanoc/regressions/gh_951_spec.rb +1 -1
  94. data/spec/nanoc/regressions/gh_954_spec.rb +1 -1
  95. data/spec/nanoc/regressions/gh_970a_spec.rb +1 -1
  96. data/spec/nanoc/regressions/gh_970b_spec.rb +7 -7
  97. data/spec/nanoc/regressions/gh_974_spec.rb +1 -1
  98. data/spec/nanoc/regressions/gh_981_spec.rb +3 -3
  99. data/spec/nanoc/rule_dsl/action_sequence_calculator_spec.rb +43 -4
  100. data/test/base/core_ext/array_spec.rb +2 -2
  101. data/test/base/test_compiler.rb +6 -6
  102. data/test/base/test_filter.rb +0 -8
  103. data/test/base/test_site.rb +1 -1
  104. data/test/checking/test_runner.rb +2 -2
  105. data/test/cli/commands/test_check.rb +2 -2
  106. data/test/cli/commands/test_compile.rb +6 -6
  107. data/test/cli/commands/test_create_site.rb +12 -12
  108. data/test/cli/commands/test_help.rb +2 -2
  109. data/test/cli/commands/test_info.rb +1 -1
  110. data/test/cli/commands/test_prune.rb +6 -6
  111. data/test/cli/test_cleaning_stream.rb +1 -1
  112. data/test/cli/test_cli.rb +9 -9
  113. data/test/data_sources/test_filesystem.rb +8 -8
  114. data/test/extra/core_ext/test_pathname.rb +1 -1
  115. data/test/extra/test_link_collector.rb +3 -3
  116. data/test/extra/test_piper.rb +3 -3
  117. data/test/filters/colorize_syntax/test_common.rb +25 -1
  118. data/test/filters/test_relativize_paths.rb +38 -0
  119. data/test/helper.rb +1 -1
  120. data/test/helpers/test_capturing.rb +8 -8
  121. data/test/rule_dsl/test_action_provider.rb +2 -2
  122. data/test/rule_dsl/test_rule.rb +1 -1
  123. data/test/test_gem.rb +1 -1
  124. metadata +4 -4
@@ -3,14 +3,14 @@ module Nanoc::Int::OutdatednessRules
3
3
  affects_props :raw_content, :attributes, :path
4
4
 
5
5
  def apply(obj, outdatedness_checker)
6
- mem = outdatedness_checker.action_sequence_for(obj)
7
- if any_always_outdated?(mem)
6
+ seq = outdatedness_checker.action_sequence_for(obj)
7
+ if any_always_outdated?(seq)
8
8
  Nanoc::Int::OutdatednessReasons::UsesAlwaysOutdatedFilter
9
9
  end
10
10
  end
11
11
 
12
- def any_always_outdated?(mem)
13
- mem
12
+ def any_always_outdated?(seq)
13
+ seq
14
14
  .select { |a| a.is_a?(Nanoc::Int::ProcessingActions::Filter) }
15
15
  .map { |a| Nanoc::Filter.named(a.filter_name) }
16
16
  .compact
@@ -11,8 +11,6 @@ module ::Nanoc::Checking::Checks
11
11
  identifiers :external_links, :elinks
12
12
 
13
13
  def run
14
- require 'nokogiri'
15
-
16
14
  # Find all broken external hrefs
17
15
  # TODO: de-duplicate this (duplicated in internal links check)
18
16
  filenames = output_filenames.select { |f| File.extname(f) == '.html' && !excluded_file?(f) }
data/lib/nanoc/cli.rb CHANGED
@@ -214,7 +214,7 @@ module Nanoc::CLI
214
214
  def self.enable_utf8?(io)
215
215
  return true unless io.tty?
216
216
 
217
- %w(LC_ALL LC_CTYPE LANG).any? { |e| ENV[e] =~ /UTF/i }
217
+ %w[LC_ALL LC_CTYPE LANG].any? { |e| ENV[e] =~ /UTF/i }
218
218
  end
219
219
 
220
220
  # @return [Boolean] true if color support is present, false if not
@@ -17,13 +17,14 @@ module Nanoc::CLI::Commands::CompileListeners
17
17
  def start
18
18
  stage_stopwatch = Nanoc::Telemetry::Stopwatch.new
19
19
 
20
- on(:stage_started) do |_stage_name|
20
+ on(:stage_started) do |_klass|
21
21
  stage_stopwatch.start
22
22
  end
23
23
 
24
- on(:stage_ended) do |stage_name|
24
+ on(:stage_ended) do |klass|
25
25
  stage_stopwatch.stop
26
- @telemetry.summary(:stages).observe(stage_stopwatch.duration, stage_name.to_s)
26
+ name = klass.to_s.sub(/.*::/, '')
27
+ @telemetry.summary(:stages).observe(stage_stopwatch.duration, name)
27
28
  stage_stopwatch = Nanoc::Telemetry::Stopwatch.new
28
29
  end
29
30
 
@@ -40,7 +41,8 @@ module Nanoc::CLI::Commands::CompileListeners
40
41
  stopwatch = stopwatches.fetch(obj)
41
42
  stopwatch.stop
42
43
 
43
- @telemetry.summary(:outdatedness_rules).observe(stopwatch.duration, klass.to_s.sub(/.*::/, ''))
44
+ name = klass.to_s.sub(/.*::/, '')
45
+ @telemetry.summary(:outdatedness_rules).observe(stopwatch.duration, name)
44
46
  end
45
47
 
46
48
  filter_stopwatches = {}
@@ -143,7 +145,7 @@ module Nanoc::CLI::Commands::CompileListeners
143
145
  end
144
146
 
145
147
  def table_for_memoization
146
- headers = %w(memoization hit miss %)
148
+ headers = %w[memoization hit miss %]
147
149
 
148
150
  rows_raw = @telemetry.counter(:memoization).map do |(name, type), counter|
149
151
  { name: name, type: type, count: counter.value }
@@ -300,7 +300,7 @@ EOS
300
300
  path = arguments[0]
301
301
 
302
302
  # Check whether site exists
303
- if File.exist?(path) && (!File.directory?(path) || !(Dir.entries(path) - %w(. ..)).empty?) && !options[:force]
303
+ if File.exist?(path) && (!File.directory?(path) || !(Dir.entries(path) - %w[. ..]).empty?) && !options[:force]
304
304
  raise(
305
305
  Nanoc::Int::Errors::GenericTrivial,
306
306
  "The site was not created because '#{path}' already exists. " \
@@ -1,5 +1,6 @@
1
1
  usage 'nanoc command [options] [arguments]'
2
2
  summary 'Nanoc, a static site compiler written in Ruby'
3
+ default_subcommand 'compile'
3
4
 
4
5
  opt :l, :color, 'enable color' do
5
6
  $stdout.remove_stream_cleaner(Nanoc::CLI::StreamCleaners::ANSIColors)
@@ -37,7 +38,3 @@ end
37
38
  opt :w, :warn, 'enable warnings' do
38
39
  $-w = true
39
40
  end
40
-
41
- run do |_opts, _args, cmd|
42
- cmd.command_named('compile').run([])
43
- end
@@ -41,7 +41,7 @@ module Nanoc::CLI::Commands
41
41
  puts
42
42
 
43
43
  # Print plugins organised by subtype
44
- %i(builtin custom).each do |type|
44
+ %i[builtin custom].each do |type|
45
45
  # Find relevant plugins
46
46
  relevant_plugins = plugins_with_this_superclass[type]
47
47
 
@@ -42,7 +42,7 @@ module Nanoc::CLI
42
42
  # @return [void]
43
43
  def handle_while(&_block)
44
44
  # Set exit handler
45
- %w(INT TERM).each do |signal|
45
+ %w[INT TERM].each do |signal|
46
46
  Signal.trap(signal) do
47
47
  puts
48
48
  exit!(0)
@@ -193,6 +193,7 @@ module Nanoc::CLI
193
193
  'maruku' => 'maruku',
194
194
  'mime/types' => 'mime-types',
195
195
  'nokogiri' => 'nokogiri',
196
+ 'nokogumbo' => 'nokogumbo',
196
197
  'pry' => 'pry',
197
198
  'rack' => 'rack',
198
199
  'rack/cache' => 'rack-cache',
@@ -61,7 +61,7 @@ module Nanoc::Deploying::Deployers
61
61
  # Verify existence of remote, if remote is not a URL
62
62
  if remote_is_name?(remote)
63
63
  begin
64
- run_cmd(%W(git config --get remote.#{remote}.url))
64
+ run_cmd(%W[git config --get remote.#{remote}.url])
65
65
  rescue Nanoc::Extra::Piper::Error
66
66
  raise Errors::RemoteDoesNotExist.new(remote)
67
67
  end
@@ -69,7 +69,7 @@ module Nanoc::Deploying::Deployers
69
69
 
70
70
  # If the branch exists then switch to it, otherwise prompt the user to create one.
71
71
  begin
72
- run_cmd_unless_dry(%W(git checkout #{branch}))
72
+ run_cmd_unless_dry(%W[git checkout #{branch}])
73
73
  rescue Nanoc::Extra::Piper::Error
74
74
  raise Errors::BranchDoesNotExist.new(branch)
75
75
  end
@@ -78,13 +78,13 @@ module Nanoc::Deploying::Deployers
78
78
 
79
79
  msg = "Automated commit at #{Time.now.utc} by Nanoc #{Nanoc::VERSION}"
80
80
  author = 'Nanoc <>'
81
- run_cmd_unless_dry(%w(git add -A))
82
- run_cmd_unless_dry(%W(git commit -a --author #{author} -m #{msg}))
81
+ run_cmd_unless_dry(%w[git add -A])
82
+ run_cmd_unless_dry(%W[git commit -a --author #{author} -m #{msg}])
83
83
 
84
84
  if forced
85
- run_cmd_unless_dry(%W(git push -f #{remote} #{branch}))
85
+ run_cmd_unless_dry(%W[git push -f #{remote} #{branch}])
86
86
  else
87
- run_cmd_unless_dry(%W(git push #{remote} #{branch}))
87
+ run_cmd_unless_dry(%W[git push #{remote} #{branch}])
88
88
  end
89
89
  end
90
90
  end
@@ -111,7 +111,7 @@ module Nanoc::Deploying::Deployers
111
111
  def clean_repo?
112
112
  stdout = StringIO.new
113
113
  piper = Nanoc::Extra::Piper.new(stdout: stdout, stderr: $stderr)
114
- piper.run(%w(git status --porcelain), nil)
114
+ piper.run(%w[git status --porcelain], nil)
115
115
  stdout.string.empty?
116
116
  end
117
117
  end
@@ -44,11 +44,11 @@ module ::Nanoc::Extra
44
44
  end
45
45
 
46
46
  def hrefs_in_file(filename)
47
- uris_in_file filename, %w(a img)
47
+ uris_in_file filename, %w[a img]
48
48
  end
49
49
 
50
50
  def resource_uris_in_file(filename)
51
- uris_in_file filename, %w(audio form img iframe link script video)
51
+ uris_in_file filename, %w[audio form img iframe link script video]
52
52
  end
53
53
 
54
54
  private
@@ -13,7 +13,7 @@ module Nanoc::Filters
13
13
  stdout = StringIO.new
14
14
  stderr = $stderr
15
15
  piper = Nanoc::Extra::Piper.new(stdout: stdout, stderr: stderr)
16
- piper.run(%w(asciidoc -o - -), content)
16
+ piper.run(%w[asciidoc -o - -], content)
17
17
  stdout.string
18
18
  end
19
19
  end
@@ -92,19 +92,11 @@ module Nanoc::Filters
92
92
  @colorizers[language] = colorizer
93
93
  end
94
94
 
95
- # Determine syntax (HTML or XML)
96
- syntax = params[:syntax] || :html
97
- case syntax
98
- when :html
99
- klass = Nokogiri::HTML
100
- when :xml, :xhtml
101
- klass = Nokogiri::XML
102
- else
103
- raise "unknown syntax: #{syntax.inspect} (expected :html or :xml)"
104
- end
95
+ syntax = params.fetch(:syntax, :html)
96
+ parser = parser_for(syntax)
105
97
 
106
98
  # Colorize
107
- doc = parse(content, klass, params.fetch(:is_fullpage, false))
99
+ doc = parse(content, parser, params.fetch(:is_fullpage, false))
108
100
  selector = params[:outside_pre] ? 'code' : 'pre > code'
109
101
  doc.css(selector).each do |element|
110
102
  # Get language
@@ -128,7 +120,7 @@ module Nanoc::Filters
128
120
  # Highlight
129
121
  raw = strip(element.inner_text)
130
122
  highlighted_code = highlight(raw, language, params)
131
- element.children = Nokogiri::HTML.fragment(strip(highlighted_code), 'utf-8')
123
+ element.children = parse_fragment(parser, strip(highlighted_code))
132
124
 
133
125
  # Add language-something class
134
126
  unless has_class
@@ -141,8 +133,44 @@ module Nanoc::Filters
141
133
  highlight_postprocess(language, element.parent)
142
134
  end
143
135
 
144
- method = "to_#{syntax}".to_sym
145
- doc.send(method, encoding: 'UTF-8')
136
+ serialize(doc, syntax)
137
+ end
138
+
139
+ def parser_for(syntax)
140
+ case syntax
141
+ when :html
142
+ require 'nokogiri'
143
+ Nokogiri::HTML
144
+ when :html5
145
+ require 'nokogumbo'
146
+ Nokogiri::HTML5
147
+ when :xml, :xhtml
148
+ require 'nokogiri'
149
+ Nokogiri::XML
150
+ else
151
+ raise "unknown syntax: #{syntax.inspect} (expected :html, :html5, or :xml)"
152
+ end
153
+ end
154
+
155
+ def serialize(doc, syntax)
156
+ case syntax
157
+ when :html5
158
+ doc.to_html
159
+ else
160
+ doc.send("to_#{syntax}", encoding: 'UTF-8')
161
+ end
162
+ end
163
+
164
+ def parse_full(parser_class, content)
165
+ if parser_class.to_s == 'Nokogiri::HTML5'
166
+ parser_class.parse(content)
167
+ else
168
+ parser_class.parse(content, nil, 'UTF-8')
169
+ end
170
+ end
171
+
172
+ def parse_fragment(parser_class, content)
173
+ parser_class.fragment(content)
146
174
  end
147
175
 
148
176
  # Parses the given content using the given class. This method also handles
@@ -151,16 +179,15 @@ module Nanoc::Filters
151
179
  #
152
180
  # @param [String] content The content to parse
153
181
  #
154
- # @param [Class] klass The Nokogiri parser class (either Nokogiri::HTML
155
- # or Nokogiri::XML)
182
+ # @param [Class] klass The Nokogiri parser class
156
183
  #
157
184
  # @param [Boolean] is_fullpage true if the given content is a full page,
158
185
  # false if it is a fragment
159
186
  def parse(content, klass, is_fullpage)
160
187
  if is_fullpage
161
- klass.parse(content, nil, 'UTF-8')
188
+ parse_full(klass, content)
162
189
  else
163
- klass.fragment(content)
190
+ parse_fragment(klass, content)
164
191
  end
165
192
  rescue => e
166
193
  if e.message =~ /can't modify frozen string/
@@ -358,7 +385,7 @@ module Nanoc::Filters
358
385
 
359
386
  protected
360
387
 
361
- KNOWN_COLORIZERS = %i(coderay dummy pygmentize pygmentsrb simon_highlight rouge).freeze
388
+ KNOWN_COLORIZERS = %i[coderay dummy pygmentize pygmentsrb simon_highlight rouge].freeze
362
389
 
363
390
  # Removes the first blank lines and any whitespace at the end.
364
391
  def strip(s)
@@ -38,7 +38,7 @@ module Nanoc::Filters
38
38
  case params[:type]
39
39
  when :css
40
40
  relativize_css(content)
41
- when :html, :xml, :xhtml
41
+ when :html, :html5, :xml, :xhtml
42
42
  relativize_html_like(content, params)
43
43
  else
44
44
  raise 'The relativize_paths needs to know the type of content to ' \
@@ -63,22 +63,40 @@ module Nanoc::Filters
63
63
  namespaces = params.fetch(:namespaces, {})
64
64
  type = params.fetch(:type)
65
65
 
66
- require 'nokogiri'
66
+ parser = parser_for(type)
67
+ content = fix_content(content, type)
68
+
69
+ nokogiri_process(content, selectors, namespaces, parser, type)
70
+ end
71
+
72
+ def parser_for(type)
67
73
  case type
68
74
  when :html
69
- klass = ::Nokogiri::HTML
75
+ require 'nokogiri'
76
+ ::Nokogiri::HTML
77
+ when :html5
78
+ require 'nokogumbo'
79
+ ::Nokogiri::HTML5
70
80
  when :xml
71
- klass = ::Nokogiri::XML
81
+ require 'nokogiri'
82
+ ::Nokogiri::XML
83
+ when :xhtml
84
+ require 'nokogiri'
85
+ ::Nokogiri::XML
86
+ end
87
+ end
88
+
89
+ def fix_content(content, type)
90
+ case type
72
91
  when :xhtml
73
- klass = ::Nokogiri::XML
74
92
  # FIXME: cleanup because it is ugly
75
93
  # this cleans the XHTML namespace to process fragments and full
76
94
  # documents in the same way. At least, Nokogiri adds this namespace
77
95
  # if detects the `html` element.
78
- content = content.sub(%r{(<html[^>]+)xmlns="http://www.w3.org/1999/xhtml"}, '\1')
96
+ content.sub(%r{(<html[^>]+)xmlns="http://www.w3.org/1999/xhtml"}, '\1')
97
+ else
98
+ content
79
99
  end
80
-
81
- nokogiri_process(content, selectors, namespaces, klass, type)
82
100
  end
83
101
 
84
102
  def nokogiri_process(content, selectors, namespaces, klass, type)
@@ -95,7 +113,13 @@ module Nanoc::Filters
95
113
  end
96
114
  end
97
115
  end
98
- doc.send("to_#{type}")
116
+
117
+ case type
118
+ when :html5
119
+ doc.to_html
120
+ else
121
+ doc.send("to_#{type}")
122
+ end
99
123
  end
100
124
 
101
125
  def nokogiri_process_comment(node, doc, selectors, namespaces, klass, type)
@@ -54,10 +54,6 @@ module Nanoc::RuleDSL
54
54
  end
55
55
  end
56
56
 
57
- # @param [Nanoc::Int::ItemRep] rep The item representation to get the rule
58
- # memory for
59
- #
60
- # @return [Nanoc::Int::ActionSequence]
61
57
  def new_action_sequence_for_rep(rep)
62
58
  dependency_tracker = Nanoc::Int::DependencyTracker::Null.new
63
59
  view_context = @site.compiler.compilation_context.create_view_context(dependency_tracker)
@@ -82,7 +78,7 @@ module Nanoc::RuleDSL
82
78
  executor.snapshot(:pre)
83
79
  end
84
80
 
85
- copy_paths_from_routing_rules(action_sequence.compact_snapshots, rep: rep)
81
+ copy_paths_from_routing_rules(compact_snapshots(action_sequence), rep: rep)
86
82
  end
87
83
 
88
84
  # @param [Nanoc::Int::Layout] layout
@@ -100,8 +96,20 @@ module Nanoc::RuleDSL
100
96
  end
101
97
  end
102
98
 
103
- def copy_paths_from_routing_rules(mem, rep:)
104
- mem.map do |action|
99
+ def compact_snapshots(seq)
100
+ actions = []
101
+ seq.actions.each do |action|
102
+ if [actions.last, action].all? { |a| a.is_a?(Nanoc::Int::ProcessingActions::Snapshot) }
103
+ actions[-1] = actions.last.update(snapshot_names: action.snapshot_names, paths: action.paths)
104
+ else
105
+ actions << action
106
+ end
107
+ end
108
+ Nanoc::Int::ActionSequence.new(seq.item_rep, actions: actions)
109
+ end
110
+
111
+ def copy_paths_from_routing_rules(seq, rep:)
112
+ seq.map do |action|
105
113
  if action.is_a?(Nanoc::Int::ProcessingActions::Snapshot) && action.paths.empty?
106
114
  copy_path_from_routing_rule(action, rep: rep)
107
115
  else
data/lib/nanoc/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Nanoc
2
2
  # The current Nanoc version.
3
- VERSION = '4.7.5'.freeze
3
+ VERSION = '4.7.6'.freeze
4
4
  end
data/nanoc.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |s|
24
24
 
25
25
  s.required_ruby_version = '>= 2.1.0'
26
26
 
27
- s.add_runtime_dependency('cri', '~> 2.3')
27
+ s.add_runtime_dependency('cri', '~> 2.8')
28
28
  s.add_runtime_dependency('hamster', '~> 3.0')
29
29
  s.add_runtime_dependency('ref', '~> 2.0')
30
30
  s.add_runtime_dependency('ddplugin', '~> 1.0')
@@ -69,11 +69,11 @@ describe Nanoc::Int::Checksummer do
69
69
  end
70
70
 
71
71
  context 'Array' do
72
- let(:obj) { %w(hello goodbye) }
72
+ let(:obj) { %w[hello goodbye] }
73
73
  it { is_expected.to eql('Array<String<hello>,String<goodbye>,>') }
74
74
 
75
75
  context 'different order' do
76
- let(:obj) { %w(goodbye hello) }
76
+ let(:obj) { %w[goodbye hello] }
77
77
  it { is_expected.to eql('Array<String<goodbye>,String<hello>,>') }
78
78
  end
79
79