lib/nanoc/helpers/capturing.rb in nanoc-4.5.4 vs lib/nanoc/helpers/capturing.rb in nanoc-4.6.0
- old
+ new
@@ -1,40 +1,28 @@
module Nanoc::Helpers
# @see http://nanoc.ws/doc/reference/helpers/#capturing
module Capturing
- # @overload content_for(name, params = {}, &block)
- # @param [Symbol, String] name
- # @option params [Symbol] existing
- # @return [void]
- #
- # @overload content_for(item, name)
- # @param [Symbol, String] name
- # @return [String]
- def content_for(*args, &block)
- if block_given? # Set content
- # Get args
- case args.size
- when 1
- name = args[0]
- params = {}
- when 2
- name = args[0]
- params = args[1]
- else
- raise ArgumentError, 'expected 1 or 2 argument (the name ' \
- "of the capture, and optionally params) but got #{args.size} instead"
- end
- name = args[0]
- existing_behavior = params.fetch(:existing, :error)
+ # @api private
+ class SetContent
+ include Nanoc::Helpers::Capturing
+ def initialize(name, params, item)
+ @name = name
+ @params = params
+ @item = item
+ end
+
+ def run(&block)
+ existing_behavior = @params.fetch(:existing, :error)
+
# Capture
content_string = capture(&block)
# Get existing contents and prep for store
snapshot_repo = @item._context.snapshot_repo
rep = @item.reps[:default].unwrap
- capture_name = "__capture_#{name}".to_sym
+ capture_name = "__capture_#{@name}".to_sym
old_content_string =
case existing_behavior
when :overwrite
''
when :append
@@ -42,11 +30,11 @@
c ? c.string : ''
when :error
contents = snapshot_repo.get(rep, capture_name)
if contents && contents.string != content_string
# FIXME: get proper exception
- raise "a capture named #{name.inspect} for #{@item.identifier} already exists"
+ raise "a capture named #{@name.inspect} for #{@item.identifier} already exists"
else
''
end
else
raise ArgumentError, 'expected :existing_behavior param to #content_for to be one of ' \
@@ -54,33 +42,104 @@
end
# Store
new_content = Nanoc::Int::TextualContent.new(old_content_string + content_string)
snapshot_repo.set(rep, capture_name, new_content)
- else # Get content
- if args.size != 2
- raise ArgumentError, 'expected 2 arguments (the item ' \
- "and the name of the capture) but got #{args.size} instead"
- end
- item = args[0]
- name = args[1]
+ end
+ end
- rep = item.reps[:default].unwrap
+ # @api private
+ class GetContent
+ def initialize(requested_item, name, item, config)
+ @requested_item = requested_item
+ @name = name
+ @item = item
+ @config = config
+ end
+ def run
+ rep = @requested_item.reps[:default].unwrap
+
# Create dependency
- if @item.nil? || item != @item.unwrap
+ if @item.nil? || @requested_item != @item.unwrap
dependency_tracker = @config._context.dependency_tracker
- dependency_tracker.bounce(item.unwrap, compiled_content: true)
+ dependency_tracker.bounce(@requested_item.unwrap, compiled_content: true)
unless rep.compiled?
Fiber.yield(Nanoc::Int::Errors::UnmetDependency.new(rep))
- return content_for(*args, &block)
+ return run
end
end
snapshot_repo = @config._context.snapshot_repo
- content = snapshot_repo.get(rep, "__capture_#{name}".to_sym)
+ content = snapshot_repo.get(rep, "__capture_#{@name}".to_sym)
content ? content.string : nil
+ end
+ end
+
+ # @overload content_for(name, &block)
+ # @param [Symbol, String] name
+ # @return [void]
+ #
+ # @overload content_for(name, params, &block)
+ # @param [Symbol, String] name
+ # @option params [Symbol] existing
+ # @return [void]
+ #
+ # @overload content_for(name, content)
+ # @param [Symbol, String] name
+ # @param [String] content
+ # @return [void]
+ #
+ # @overload content_for(name, params, content)
+ # @param [Symbol, String] name
+ # @param [String] content
+ # @option params [Symbol] existing
+ # @return [void]
+ #
+ # @overload content_for(item, name)
+ # @param [Symbol, String] name
+ # @return [String]
+ def content_for(*args, &block)
+ if block_given? # Set content
+ name = args[0]
+ params =
+ case args.size
+ when 1
+ {}
+ when 2
+ args[1]
+ else
+ raise ArgumentError, 'expected 1 or 2 argument (the name ' \
+ "of the capture, and optionally params) but got #{args.size} instead"
+ end
+
+ SetContent.new(name, params, @item).run(&block)
+ elsif args.size > 1 && (args.first.is_a?(Symbol) || args.first.is_a?(String)) # Set content
+ name = args[0]
+ content = args.last
+ params =
+ case args.size
+ when 2
+ {}
+ when 3
+ args[1]
+ else
+ raise ArgumentError, 'expected 2 or 3 arguments (the name ' \
+ "of the capture, optionally params, and the content) but got #{args.size} instead"
+ end
+
+ _erbout = '' # rubocop:disable Lint/UnderscorePrefixedVariableName
+ SetContent.new(name, params, @item).run { _erbout << content }
+ else # Get content
+ if args.size != 2
+ raise ArgumentError, 'expected 2 arguments (the item ' \
+ "and the name of the capture) but got #{args.size} instead"
+ end
+ requested_item = args[0]
+ name = args[1]
+
+ GetContent.new(requested_item, name, @item, @config).run
end
end
# @return [String]
def capture(&block)