1
0
Fork 0
mirror of https://github.com/haml/haml.git synced 2022-11-09 12:33:31 -05:00

[Sass] [SCSS] Record the line numbers of nodes.

This commit is contained in:
Nathan Weizenbaum 2009-12-21 20:41:27 -08:00
parent b6511d3ed1
commit 11bd2274b7

View file

@ -8,6 +8,7 @@ module Sass
class Parser class Parser
def initialize(str) def initialize(str)
@scanner = StringScanner.new(str) @scanner = StringScanner.new(str)
@line = 1
end end
def parse def parse
@ -21,7 +22,7 @@ module Sass
include Sass::SCSS::RX include Sass::SCSS::RX
def stylesheet def stylesheet
block_contents(Sass::Tree::RootNode.new(@scanner.string)) {s} block_contents(node(Sass::Tree::RootNode.new(@scanner.string))) {s}
end end
def s def s
@ -48,7 +49,7 @@ module Sass
# but some (e.g. @page) take selector-like arguments # but some (e.g. @page) take selector-like arguments
expr || selector expr || selector
end end
node = Sass::Tree::DirectiveNode.new("#{name} #{val.strip}") node = node(Sass::Tree::DirectiveNode.new("#{name} #{val.strip}"))
@expected = '"{" or ";"' @expected = '"{" or ";"'
if raw '{' if raw '{'
@ -61,13 +62,13 @@ module Sass
end end
def mixin def mixin
node = Sass::Tree::MixinDefNode.new(tok!(IDENT), []) node = node(Sass::Tree::MixinDefNode.new(tok!(IDENT), []))
ss ss
block(node) block(node)
end end
def include def include
node = Sass::Tree::MixinNode.new(tok!(IDENT), []) node = node(Sass::Tree::MixinNode.new(tok!(IDENT), []))
ss ss
node node
end end
@ -100,7 +101,7 @@ module Sass
end end
end end
block(Sass::Tree::RuleNode.new(rules.strip)) block(node(Sass::Tree::RuleNode.new(rules.strip)))
end end
def block(node) def block(node)
@ -139,12 +140,14 @@ module Sass
# but I'm not sure the gains would be worth the added complexity. # but I'm not sure the gains would be worth the added complexity.
def declaration_or_ruleset def declaration_or_ruleset
pos = @scanner.pos pos = @scanner.pos
line = @line
begin begin
decl = declaration decl = declaration
rescue Sass::SyntaxError rescue Sass::SyntaxError
end end
return decl if decl && tok?(/[;}]/) return decl if decl && tok?(/[;}]/)
@line = line
@scanner.pos = pos @scanner.pos = pos
return ruleset return ruleset
end end
@ -264,7 +267,7 @@ module Sass
expr! :expr expr! :expr
prio prio
end end
Sass::Tree::PropNode.new(name, value.strip, :new) node(Sass::Tree::PropNode.new(name, value.strip, :new))
end end
def prio def prio
@ -316,6 +319,11 @@ module Sass
@str = nil @str = nil
end end
def node(node)
node.line = @line
node
end
EXPR_NAMES = { EXPR_NAMES = {
:medium => "medium (e.g. print, screen)", :medium => "medium (e.g. print, screen)",
:pseudo_expr => "expression (e.g. fr, 2n+1)", :pseudo_expr => "expression (e.g. fr, 2n+1)",
@ -347,7 +355,6 @@ module Sass
def expected(name) def expected(name)
pos = @scanner.pos pos = @scanner.pos
line = @scanner.string[0...pos].count("\n") + 1
after = @scanner.string[[pos - 15, 0].max...pos].gsub(/.*\n/m, '') after = @scanner.string[[pos - 15, 0].max...pos].gsub(/.*\n/m, '')
after = "..." + after if pos >= 15 after = "..." + after if pos >= 15
@ -358,13 +365,17 @@ module Sass
was += "..." if @scanner.rest.size >= 15 was += "..." if @scanner.rest.size >= 15
raise Sass::SyntaxError.new( raise Sass::SyntaxError.new(
"Invalid CSS after #{after.inspect}: expected #{expected}, was #{was.inspect}", "Invalid CSS after #{after.inspect}: expected #{expected}, was #{was.inspect}",
:line => line) :line => @line)
end end
def tok(rx) def tok(rx)
res = @scanner.scan(rx) res = @scanner.scan(rx)
@expected = nil if res if res
@str << res if res && @str && rx != COMMENT @line += res.count("\n")
@expected = nil
@str << res if @str && rx != COMMENT
end
res res
end end