def filter(filter_name, filter_args={})
klass = filter_named(filter_name)
raise Nanoc::Errors::UnknownFilter.new(filter_name) if klass.nil?
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
Nanoc::NotificationCenter.post(:filtering_started, self, filter_name)
filter = klass.new(assigns)
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?
if self.binary? && !File.file?(filter.output_filename)
raise RuntimeError,
"The #{filter_name.inspect} filter did not write anything to the required output file, #{filter.output_filename}."
end
snapshot(@content[:post] ? :post : :pre, :final => false) unless self.binary?
ensure
Nanoc::NotificationCenter.post(:filtering_ended, self, filter_name)
end
end