A single representation (rep) of an item ({Nanoc::Item}). An item can have multiple representations. A representation has its own output file. A single item can therefore have multiple output files, each run through a different set of filters with a different layout.
Creates a new item representation for the given item.
@param [Nanoc::Item] item The item to which the new representation will
belong.
@param [Symbol] name The unique name for the new item representation.
# File lib/nanoc/base/result_data/item_rep.rb, line 204 def initialize(item, name) # Set primary attributes @item = item @name = name # Set binary @binary = @item.binary? # Set default attributes @raw_paths = {} @paths = {} @assigns = {} @snapshots = [] initialize_content # Reset flags @compiled = false end
Returns the compiled content from a given snapshot.
@option params [String] :snapshot The name of the snapshot from which to
fetch the compiled content. By default, the returned compiled content will be the content compiled right before the first layout call (if any).
@return [String] The compiled content at the given snapshot (or the
default snapshot if no snapshot is specified)
# File lib/nanoc/base/result_data/item_rep.rb, line 232 def compiled_content(params = {}) # Make sure we're not binary if item.binary? raise Nanoc::Errors::CannotGetCompiledContentOfBinaryItem.new(self) end # Notify Nanoc::NotificationCenter.post(:visit_started, item) Nanoc::NotificationCenter.post(:visit_ended, item) # Get name of last pre-layout snapshot snapshot = params.fetch(:snapshot) { @content[:pre] ? :pre : :last } is_moving = [ :pre, :post, :last ].include?(snapshot) # Check existance of snapshot if !is_moving && snapshots.find { |s| s.first == snapshot && s.last == true }.nil? raise Nanoc::Errors::NoSuchSnapshot.new(self, snapshot) end # Require compilation if @content[snapshot].nil? || (!self.compiled? && is_moving) raise Nanoc::Errors::UnmetDependency.new(self) else @content[snapshot] end end
Runs the item content through the given filter with the given arguments. This method will replace the content of the `:last` snapshot with the filtered content of the last snapshot.
This method is supposed to be called only in a compilation rule block (see {Nanoc::CompilerDSL#compile}).
@see Nanoc::ItemRepProxy#filter
@param [Symbol] filter_name The name of the filter to run the item
representations' content through
@param [Hash] filter_args The filter arguments that should be passed to
the filter's #run method
@return [void]
# File lib/nanoc/base/result_data/item_rep.rb, line 317 def filter(filter_name, filter_args = {}) # Get filter class klass = filter_named(filter_name) raise Nanoc::Errors::UnknownFilter.new(filter_name) if klass.nil? # Check whether filter can be applied if klass.from_binary? && !self.binary? raise Nanoc::Errors::CannotUseBinaryFilter.new(self, klass) elsif !klass.from_binary? && self.binary? raise Nanoc::Errors::CannotUseTextualFilter.new(self, klass) end begin # Notify start Nanoc::NotificationCenter.post(:filtering_started, self, filter_name) # Create filter filter = klass.new(assigns) # Run filter source = self.binary? ? temporary_filenames[:last] : @content[:last] result = filter.setup_and_run(source, filter_args) if klass.to_binary? temporary_filenames[:last] = filter.output_filename else @content[:last] = result @content[:last].freeze end @binary = klass.to_binary? # Check whether file was written if self.binary? && !File.file?(filter.output_filename) raise "The #{filter_name.inspect} filter did not write anything to the required output file, #{filter.output_filename}." end # Create snapshot snapshot(@content[:post] ? :post : :pre, :final => false) unless self.binary? ensure # Notify end Nanoc::NotificationCenter.post(:filtering_ended, self, filter_name) end end
Checks whether content exists at a given snapshot.
@return [Boolean] True if content exists for the snapshot with the
given name, false otherwise
@since 3.2.0
# File lib/nanoc/base/result_data/item_rep.rb, line 265 def has_snapshot?(snapshot_name) !@content[snapshot_name].nil? end
# File lib/nanoc/base/result_data/item_rep.rb, line 461 def inspect "<#{self.class} name=\"#{name}\" binary=#{self.binary?} raw_path=\"#{raw_path}\" item.identifier=\"#{item.identifier}\">" end
Returns false because this item is not yet a proxy, and therefore does need to be wrapped in a proxy during compilation.
@api private
@return [false]
@see Nanoc::ItemRepRecorderProxy#is_proxy? @see Nanoc::ItemRepProxy#is_proxy?
# File lib/nanoc/base/result_data/item_rep.rb, line 448 def is_proxy? false end
Lays out the item using the given layout. This method will replace the content of the `:last` snapshot with the laid out content of the last snapshot.
This method is supposed to be called only in a compilation rule block (see {Nanoc::CompilerDSL#compile}).
@see Nanoc::ItemRepProxy#layout
@param [Nanoc::Layout] layout The layout to use
@param [Symbol] filter_name The name of the filter to layout the item
representations' content with
@param [Hash] filter_args The filter arguments that should be passed to
the filter's #run method
@return [void]
# File lib/nanoc/base/result_data/item_rep.rb, line 378 def layout(layout, filter_name, filter_args) # Check whether item can be laid out raise Nanoc::Errors::CannotLayoutBinaryItem.new(self) if self.binary? # Create "pre" snapshot if @content[:post].nil? snapshot(:pre, :final => true) end # Create filter klass = filter_named(filter_name) raise Nanoc::Errors::UnknownFilter.new(filter_name) if klass.nil? filter = klass.new(assigns.merge({ :layout => layout })) # Visit Nanoc::NotificationCenter.post(:visit_started, layout) Nanoc::NotificationCenter.post(:visit_ended, layout) begin # Notify start Nanoc::NotificationCenter.post(:processing_started, layout) Nanoc::NotificationCenter.post(:filtering_started, self, filter_name) # Layout @content[:last] = filter.setup_and_run(layout.raw_content, filter_args) # Create "post" snapshot snapshot(:post, :final => false) ensure # Notify end Nanoc::NotificationCenter.post(:filtering_ended, self, filter_name) Nanoc::NotificationCenter.post(:processing_ended, layout) end end
Returns the item rep’s path, as used when being linked to. It starts with a slash and it is relative to the output directory. It does not include the path to the output directory. It will not include the filename if the filename is an index filename.
@option params [Symbol] :snapshot (:last) The snapshot for which the
path should be returned
@return [String] The item rep’s path
# File lib/nanoc/base/result_data/item_rep.rb, line 293 def path(params = {}) Nanoc3::NotificationCenter.post(:visit_started, item) Nanoc3::NotificationCenter.post(:visit_ended, item) snapshot_name = params[:snapshot] || :last @paths[snapshot_name] end
Returns the item rep’s raw path. It includes the path to the output directory and the full filename.
@option params [Symbol] :snapshot (:last) The snapshot for which the
path should be returned
@return [String] The item rep’s path
# File lib/nanoc/base/result_data/item_rep.rb, line 276 def raw_path(params = {}) Nanoc3::NotificationCenter.post(:visit_started, item) Nanoc3::NotificationCenter.post(:visit_ended, item) snapshot_name = params[:snapshot] || :last @raw_paths[snapshot_name] end
Returns an object that can be used for uniquely identifying objects.
@api private
@return [Object] An unique reference to this object
# File lib/nanoc/base/result_data/item_rep.rb, line 457 def reference [ type, item.identifier, name ] end
Creates a snapshot of the current compiled item content.
@param [Symbol] snapshot_name The name of the snapshot to create
@option params [Boolean] :final (true) True if this is the final time
the snapshot will be updated; false if it is a non-final moving snapshot (such as `:pre`, `:post` or `:last`)
@return [void]
# File lib/nanoc/base/result_data/item_rep.rb, line 422 def snapshot(snapshot_name, params = {}) is_final = params.fetch(:final) { true } @content[snapshot_name] = @content[:last] unless self.binary? write(snapshot_name) if is_final end
Returns a recording proxy that is used for determining whether the compilation has changed, and thus whether the item rep needs to be recompiled.
@api private
@return [Nanoc::ItemRepRecorderProxy] The recording proxy
# File lib/nanoc/base/result_data/item_rep.rb, line 435 def to_recording_proxy Nanoc::ItemRepRecorderProxy.new(self) end
Generated with the Darkfish Rdoc Generator 2.