diff --git a/lib/sass/engine.rb b/lib/sass/engine.rb index cfedab31..91e9717f 100644 --- a/lib/sass/engine.rb +++ b/lib/sass/engine.rb @@ -215,6 +215,7 @@ END end node.line = @line + node.filename = @options[:filename] if node.is_a? Tree::CommentNode while has_children @@ -410,7 +411,7 @@ END File.open(filename) do |file| new_options = @options.dup new_options[:filename] = filename - engine = Sass::Engine.new(file.read, @options) + engine = Sass::Engine.new(file.read, new_options) end engine.constants.merge! @constants @@ -422,10 +423,7 @@ END err.add_backtrace_entry(filename) raise err end - root.children.each do |child| - child.filename = filename - nodes << child - end + nodes += root.children @constants = engine.constants @mixins = engine.mixins end diff --git a/lib/sass/plugin.rb b/lib/sass/plugin.rb index 7c0dd984..11176f2d 100644 --- a/lib/sass/plugin.rb +++ b/lib/sass/plugin.rb @@ -1,4 +1,5 @@ require 'sass/engine' +require 'pathname' module Sass # This module contains methods to aid in using Sass @@ -54,6 +55,7 @@ module Sass filename = template_filename(name) l_options = @@options.dup + l_options[:css_filename] = css l_options[:filename] = filename l_options[:load_paths] = load_paths engine = Engine.new(File.read(filename), l_options) diff --git a/lib/sass/tree/rule_node.rb b/lib/sass/tree/rule_node.rb index 49cf1195..1711958b 100644 --- a/lib/sass/tree/rule_node.rb +++ b/lib/sass/tree/rule_node.rb @@ -66,7 +66,14 @@ module Sass::Tree old_spaces = ' ' * (tabs - 1) spaces = ' ' * tabs if @options[:line_comments] && @style != :compressed - to_return << "/* line #{line} */\n" + to_return << "#{old_spaces}/* line #{line}" + + if filename && @options[:css_filename] + relative_filename = Pathname.new(filename).relative_path_from(Pathname.new(File.dirname(@options[:css_filename]))).to_s + to_return << ", #{relative_filename}" + end + + to_return << " */\n" end if @style == :compact diff --git a/test/sass/engine_test.rb b/test/sass/engine_test.rb index 35091735..0447bc32 100755 --- a/test/sass/engine_test.rb +++ b/test/sass/engine_test.rb @@ -298,6 +298,10 @@ bip, skip SASS end + def test_line_annotations_with_filename + renders_correctly "line_numbers", :line_comments => true, :load_paths => [File.dirname(__FILE__) + "/templates"] + end + def test_empty_first_line assert_equal("#a {\n b: c; }\n", render("#a\n\n b: c")) end @@ -349,13 +353,19 @@ SASS def renders_correctly(name, options={}) sass_file = load_file(name, "sass") css_file = load_file(name, "css") + options[:filename] ||= filename(name, "sass") + options[:css_filename] ||= filename(name, "css") css_result = Sass::Engine.new(sass_file, options).render assert_equal css_file, css_result end def load_file(name, type = "sass") @result = '' - File.new(File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}").each_line { |l| @result += l } + File.new(filename(name, type)).each_line { |l| @result += l } @result end + + def filename(name, type) + File.dirname(__FILE__) + "/#{type == 'sass' ? 'templates' : 'results'}/#{name}.#{type}" + end end diff --git a/test/sass/results/line_numbers.css b/test/sass/results/line_numbers.css new file mode 100644 index 00000000..3c657f93 --- /dev/null +++ b/test/sass/results/line_numbers.css @@ -0,0 +1,49 @@ +/* line 1, ../templates/line_numbers.sass */ +foo { + bar: baz; } + +/* line 6, ../templates/importee.sass */ +imported { + otherconst: 12; + myconst: goodbye; } + /* line 5, ../templates/line_numbers.sass */ + imported squggle { + blat: bang; } + +/* line 3, ../templates/basic.sass */ +body { + font: Arial; + background: blue; } + +/* line 7, ../templates/basic.sass */ +#page { + width: 700px; + height: 100; } + /* line 10, ../templates/basic.sass */ + #page #header { + height: 300px; } + /* line 12, ../templates/basic.sass */ + #page #header h1 { + font-size: 50px; + color: blue; } + +/* line 18, ../templates/basic.sass */ +#content.user.show #container.top #column.left { + width: 100px; } +/* line 20, ../templates/basic.sass */ +#content.user.show #container.top #column.right { + width: 600px; } +/* line 22, ../templates/basic.sass */ +#content.user.show #container.bottom { + background: brown; } + +/* line 13, ../templates/importee.sass */ +midrule { + inthe: middle; } + +/* line 12, ../templates/line_numbers.sass */ +umph { + foo: bar; } + /* line 18, ../templates/importee.sass */ + umph baz { + blat: bang; } diff --git a/test/sass/templates/importee.sass b/test/sass/templates/importee.sass index 4c8492ab..aa2a0261 100644 --- a/test/sass/templates/importee.sass +++ b/test/sass/templates/importee.sass @@ -11,4 +11,9 @@ imported @import basic midrule - :inthe middle \ No newline at end of file + :inthe middle + +=crazymixin + foo: bar + baz + blat: bang diff --git a/test/sass/templates/line_numbers.sass b/test/sass/templates/line_numbers.sass new file mode 100644 index 00000000..c554d581 --- /dev/null +++ b/test/sass/templates/line_numbers.sass @@ -0,0 +1,13 @@ +foo + bar: baz + +=premixin + squggle + blat: bang + +!preconst = 12 + +@import importee + +umph + +crazymixin \ No newline at end of file