def run(content, params={})
require 'sass'
methods = ::Sass::Tree::ImportNode.instance_methods
if !methods.include?(:import_filename) && !methods.include?('import_filename')
::Sass::Tree::ImportNode.send(:attr_reader, :imported_filename)
end
options = params.dup
sass_filename = options[:filename] || (@item && @item[:content_filename])
options[:filename] ||= sass_filename
engine = ::Sass::Engine.new(content, options)
require 'set'
imported_nodes = []
unprocessed_nodes = Set.new([ engine.to_tree ])
until unprocessed_nodes.empty?
node = unprocessed_nodes.each { |n| break n }
unprocessed_nodes.delete(node)
imported_nodes << node if node.is_a?(::Sass::Tree::ImportNode)
node.children.each { |c| unprocessed_nodes << c }
end
import_paths = (options[:load_paths] || []).dup
import_paths.unshift(File.dirname(sass_filename)) if sass_filename
imported_filenames = imported_nodes.map do |node|
::Sass::Files.find_file_to_import(node.imported_filename, import_paths)
end
imported_items = imported_filenames.map do |filename|
pathname = Pathname.new(filename)
next unless pathname.file?
normalized_filename = pathname.realpath
@items.find { |i| i[:content_filename] && Pathname.new(i[:content_filename]).realpath == normalized_filename }
end.compact
imported_items.each do |item|
Nanoc3::NotificationCenter.post(:visit_started, item)
Nanoc3::NotificationCenter.post(:visit_ended, item)
any_uncompiled_rep = item.reps.find { |r| !r.compiled? }
raise Nanoc3::Errors::UnmetDependency.new(any_uncompiled_rep) if any_uncompiled_rep
end
engine.render
end