Sha256: f87c45a10f23471f16974d92c9fb583ca3a85b968d6b251dabf5cb2acdd4419a

Contents?: true

Size: 1.46 KB

Versions: 1

Compression:

Stored size: 1.46 KB

Contents

module Smurfville
  class SassVisitor < Sass::Tree::Visitors::Base

    def visit_import(node)
      if path = node.css_import?
        return Sass::Tree::CssImportNode.resolved("url(#{path})")
      end
      file = node.imported_file
      handle_import_loop!(node) if @stack.any? {|e| e[:filename] == file.options[:filename]}

      @stack.push(:filename => node.filename, :line => node.line)
      root = file.to_tree
      Sass::Tree::Visitors::CheckNesting.visit(root)
      node.children = root.children.map {|c| visit(c)}.flatten
      node
    rescue Sass::SyntaxError => e
      e.modify_backtrace(:filename => node.imported_file.options[:filename])
      e.add_backtrace(:filename => node.filename, :line => node.line)
      raise e
    ensure
      @stack.pop unless path
    end

    protected

      def initialize
        # Stack trace information, including mixin includes and imports.
        @stack = []
      end

      def handle_import_loop!(node)
        msg = "An @import loop has been found:"
        files = @stack.map {|s| s[:filename]}.compact
        if node.filename == node.imported_file.options[:filename]
          raise Sass::SyntaxError.new("#{msg} #{node.filename} imports itself")
        end

        files << node.filename << node.imported_file.options[:filename]
        msg << "\n" << Sass::Util.enum_cons(files, 2).map do |m1, m2|
          "    #{m1} imports #{m2}"
        end.join("\n")
        raise Sass::SyntaxError.new(msg)
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
smurfville-0.0.6 lib/smurfville/sass_visitor.rb