Add support for filenames in Sass line-number reporting.

This commit is contained in:
Nathan Weizenbaum 2008-07-20 12:12:37 -04:00
parent 8c2e67bbb5
commit b882ab197d
7 changed files with 92 additions and 8 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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; }

View File

@ -11,4 +11,9 @@ imported
@import basic
midrule
:inthe middle
:inthe middle
=crazymixin
foo: bar
baz
blat: bang

View File

@ -0,0 +1,13 @@
foo
bar: baz
=premixin
squggle
blat: bang
!preconst = 12
@import importee
umph
+crazymixin