nanoc 4.7.5 → 4.7.6

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.
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