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

Added support for normally-indented Sass comments.

git-svn-id: svn://hamptoncatlin.com/haml/trunk@428 7063305b-7217-0410-af8c-cdc13e5119b9
This commit is contained in:
nex3 2007-03-17 20:48:29 +00:00
parent 50b3d7c8ab
commit e8e0cf6408
5 changed files with 70 additions and 25 deletions

View file

@ -356,6 +356,23 @@ $LOAD_PATH << dir unless $LOAD_PATH.include?(dir)
# #main h6 {
# font: italic small-caps bold 1.1em sans-serif; }
#
# == Comments
#
# It's simple to add non-printing comments to a Sass document.
# Simply use the familiar C-style notation for a one-line comment, "//",
# at the normal indentation level and all text following it won't be output.
# For example:
#
# // A very awesome rule.
# #awesome.rule
# // An equally awesome attribute.
# :awesomeness very
#
# becomes
#
# #awesome.rule {
# awesomeness: very; }
#
# == Output Style
#
# Although the default CSS style that Sass outputs is very nice,

View file

@ -20,9 +20,17 @@ module Sass
# The character that designates that
# an attribute should be assigned to the result of constant arithmetic.
SCRIPT_CHAR = ?=
# The character that designates the beginning of a comment,
# either Sass or CSS.
COMMENT_CHAR = ?/
# The character that follows the normal COMMENT_CHAR and designates a Sass comment,
# which is not output as a CSS comment.
SASS_COMMENT_CHAR = ?/
# The string that begins one-line comments.
COMMENT_STRING = '//'
COMMENT_STRING = COMMENT_CHAR.chr + '/'
# The regex that matches attributes.
ATTRIBUTE = /:([^\s=]+)\s*(=?)\s*(.*)/
@ -57,8 +65,11 @@ module Sass
index = 0
while @lines[index]
child, index = build_tree(index)
child.line = index if child
root << child if child
if child.is_a? Tree::Node
child.line = index
root << child
end
end
@line = nil
@ -80,21 +91,22 @@ module Sass
@template.each_with_index do |line, index|
@line = index + 1
# TODO: Allow comments appended to the end of lines,
# find some way to make url(http://www.google.com/) work
unless line[0..1] == COMMENT_STRING # unless line is a comment
tabs = count_tabs(line)
tabs = count_tabs(line)
if tabs # if line isn't blank
if tabs - old_tabs > 1
raise SyntaxError.new("Illegal Indentation: Only two space characters are allowed as tabulation.", @line)
end
@lines << [line.strip, tabs]
if line[0] == COMMENT_CHAR && line[1] == SASS_COMMENT_CHAR
tabs = old_tabs
end
old_tabs = tabs
if tabs # if line isn't blank
if tabs - old_tabs > 1
raise SyntaxError.new("Illegal Indentation: Only two space characters are allowed as tabulation.", @line)
end
@lines << [line.strip, tabs]
old_tabs = tabs
end
end
@line = nil
end
@ -118,19 +130,20 @@ module Sass
node = parse_line(line)
# Node is nil if it's non-outputting, like a constant assignment
return nil, index unless node
return node, index unless node.is_a? Tree::Node
has_children = has_children?(index, tabs)
while has_children
child, index = build_tree(index)
if child.nil?
if child == :constant
raise SyntaxError.new("Constants may only be declared at the root of a document.", @line)
elsif child.is_a? Tree::Node
child.line = @line
node << child
end
child.line = @line
node << child if child
has_children = has_children?(index, tabs)
end
@ -144,12 +157,14 @@ module Sass
def parse_line(line)
case line[0]
when ATTRIBUTE_CHAR
parse_attribute(line)
when Constant::CONSTANT_CHAR
parse_constant(line)
else
Tree::RuleNode.new(line, @options[:style])
when ATTRIBUTE_CHAR
parse_attribute(line)
when Constant::CONSTANT_CHAR
parse_constant(line)
when COMMENT_CHAR
parse_comment(line)
else
Tree::RuleNode.new(line, @options[:style])
end
end
@ -173,7 +188,15 @@ module Sass
raise SyntaxError.new("Invalid constant: \"#{line}\"", @line)
end
@constants[name] = Sass::Constant.parse(value, @constants, @line)
nil
:constant
end
def parse_comment(line)
if line[1] == SASS_COMMENT_CHAR
:comment
else
Tree::RuleNode.new(line, @options[:style])
end
end
end
end

View file

@ -31,7 +31,7 @@ class SassEngineTest < Test::Unit::TestCase
"a\n\t:b c" => "Illegal Indentation: Only two space characters are allowed as tabulation.",
"a\n :b c" => "Illegal Indentation: Only two space characters are allowed as tabulation.",
"a\n :b c" => "Illegal Indentation: Only two space characters are allowed as tabulation.",
"a\n :b\n !c = 3" => "Constants may only be declared at the root of a document.",
"a\n :b c\n !d = 3" => "Constants may only be declared at the root of a document.",
"!a = 1b + 2c" => "Incompatible units: b and c",
"& a\n :b c" => "Base-level rules cannot contain the parent-selector-referencing character '&'"
}

View file

@ -17,6 +17,7 @@ body { margin: 0; font: 0.85em "Lucida Grande", "Trebuchet MS", Verdana, sans-se
#menu { clear: both; text-align: right; height: 20px; border-bottom: 5px solid #006b95; background: #00a4e4; }
#menu .contests ul { margin: 0 5px 0 0; padding: 0; }
#menu .contests ul li { list-style-type: none; margin: 0 5px; padding: 5px 5px 0 5px; display: inline; font-size: 1.1em; color: #fff; background: #00a4e4; }
#menu .contests ul li / This rule isn't a comment! { red: green; }
#menu .contests a:link, #menu .contests a:visited { color: #fff; text-decoration: none; font-weight: bold; }
#menu .contests a:hover { text-decoration: underline; }

View file

@ -78,9 +78,13 @@ body
:margin 0 5px
:padding 5px 5px 0 5px
:display inline
// This comment is in the middle of this rule
:font-size 1.1em
// This comment is properly indented
:color #fff
:background #00a4e4
/ This rule isn't a comment!
:red green
a:link, a:visited
:color #fff
:text-decoration none