haml 3.0.18 → 3.0.21

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of haml might be problematic. Click here for more details.

Files changed (206) hide show
  1. data/Rakefile +11 -1
  2. data/VERSION +1 -1
  3. data/extra/haml-mode.el +2 -2
  4. data/extra/sass-mode.el +1 -1
  5. data/lib/haml/engine.rb +1 -1
  6. data/lib/haml/exec.rb +3 -5
  7. data/lib/haml/precompiler.rb +9 -9
  8. data/lib/haml/util.rb +13 -0
  9. data/lib/sass/script/color.rb +2 -1
  10. data/lib/sass/script/funcall.rb +3 -5
  11. data/lib/sass/script/interpolation.rb +1 -1
  12. data/lib/sass/script/literal.rb +1 -1
  13. data/lib/sass/script/node.rb +11 -0
  14. data/lib/sass/script/number.rb +12 -9
  15. data/lib/sass/script/operation.rb +1 -3
  16. data/lib/sass/script/parser.rb +1 -1
  17. data/lib/sass/script/string_interpolation.rb +1 -1
  18. data/lib/sass/tree/rule_node.rb +1 -1
  19. data/test/haml/engine_test.rb +55 -189
  20. data/test/sass/engine_test.rb +32 -0
  21. data/test/sass/script_test.rb +18 -1
  22. data/test/sass/scss/scss_test.rb +14 -0
  23. data/vendor/sass/CONTRIBUTING +3 -0
  24. data/vendor/sass/MIT-LICENSE +20 -0
  25. data/vendor/sass/README.md +201 -0
  26. data/vendor/sass/Rakefile +363 -0
  27. data/vendor/sass/TODO +39 -0
  28. data/vendor/sass/VERSION +1 -0
  29. data/vendor/sass/VERSION_NAME +1 -0
  30. data/vendor/sass/bin/css2sass +13 -0
  31. data/vendor/sass/bin/sass +8 -0
  32. data/vendor/sass/bin/sass-convert +7 -0
  33. data/vendor/sass/doc-src/FAQ.md +35 -0
  34. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +210 -0
  35. data/vendor/sass/doc-src/SASS_CHANGELOG.md +1870 -0
  36. data/vendor/sass/doc-src/SASS_REFERENCE.md +1713 -0
  37. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +155 -0
  38. data/vendor/sass/ext/extconf.rb +10 -0
  39. data/vendor/sass/extra/update_watch.rb +13 -0
  40. data/vendor/sass/init.rb +18 -0
  41. data/vendor/sass/lib/sass.rb +71 -0
  42. data/vendor/sass/lib/sass/cache_store.rb +208 -0
  43. data/vendor/sass/lib/sass/callbacks.rb +66 -0
  44. data/vendor/sass/lib/sass/css.rb +294 -0
  45. data/vendor/sass/lib/sass/engine.rb +792 -0
  46. data/vendor/sass/lib/sass/environment.rb +143 -0
  47. data/vendor/sass/lib/sass/error.rb +201 -0
  48. data/vendor/sass/lib/sass/exec.rb +619 -0
  49. data/vendor/sass/lib/sass/importers.rb +22 -0
  50. data/vendor/sass/lib/sass/importers/base.rb +138 -0
  51. data/vendor/sass/lib/sass/importers/filesystem.rb +121 -0
  52. data/vendor/sass/lib/sass/less.rb +363 -0
  53. data/vendor/sass/lib/sass/plugin.rb +126 -0
  54. data/vendor/sass/lib/sass/plugin/compiler.rb +346 -0
  55. data/vendor/sass/lib/sass/plugin/configuration.rb +123 -0
  56. data/vendor/sass/lib/sass/plugin/generic.rb +15 -0
  57. data/vendor/sass/lib/sass/plugin/merb.rb +48 -0
  58. data/vendor/sass/lib/sass/plugin/rack.rb +47 -0
  59. data/vendor/sass/lib/sass/plugin/rails.rb +41 -0
  60. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +145 -0
  61. data/vendor/sass/lib/sass/railtie.rb +8 -0
  62. data/vendor/sass/lib/sass/repl.rb +58 -0
  63. data/vendor/sass/lib/sass/root.rb +7 -0
  64. data/vendor/sass/lib/sass/script.rb +63 -0
  65. data/vendor/sass/lib/sass/script/bool.rb +18 -0
  66. data/vendor/sass/lib/sass/script/color.rb +491 -0
  67. data/vendor/sass/lib/sass/script/css_lexer.rb +29 -0
  68. data/vendor/sass/lib/sass/script/css_parser.rb +31 -0
  69. data/vendor/sass/lib/sass/script/funcall.rb +79 -0
  70. data/vendor/sass/lib/sass/script/functions.rb +852 -0
  71. data/vendor/sass/lib/sass/script/interpolation.rb +70 -0
  72. data/vendor/sass/lib/sass/script/lexer.rb +337 -0
  73. data/vendor/sass/lib/sass/script/literal.rb +236 -0
  74. data/vendor/sass/lib/sass/script/node.rb +101 -0
  75. data/vendor/sass/lib/sass/script/number.rb +423 -0
  76. data/vendor/sass/lib/sass/script/operation.rb +92 -0
  77. data/vendor/sass/lib/sass/script/parser.rb +392 -0
  78. data/vendor/sass/lib/sass/script/string.rb +67 -0
  79. data/vendor/sass/lib/sass/script/string_interpolation.rb +93 -0
  80. data/vendor/sass/lib/sass/script/unary_operation.rb +57 -0
  81. data/vendor/sass/lib/sass/script/variable.rb +48 -0
  82. data/vendor/sass/lib/sass/scss.rb +17 -0
  83. data/vendor/sass/lib/sass/scss/css_parser.rb +51 -0
  84. data/vendor/sass/lib/sass/scss/parser.rb +838 -0
  85. data/vendor/sass/lib/sass/scss/rx.rb +126 -0
  86. data/vendor/sass/lib/sass/scss/sass_parser.rb +11 -0
  87. data/vendor/sass/lib/sass/scss/script_lexer.rb +15 -0
  88. data/vendor/sass/lib/sass/scss/script_parser.rb +25 -0
  89. data/vendor/sass/lib/sass/scss/static_parser.rb +40 -0
  90. data/vendor/sass/lib/sass/selector.rb +361 -0
  91. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +62 -0
  92. data/vendor/sass/lib/sass/selector/comma_sequence.rb +82 -0
  93. data/vendor/sass/lib/sass/selector/sequence.rb +236 -0
  94. data/vendor/sass/lib/sass/selector/simple.rb +113 -0
  95. data/vendor/sass/lib/sass/selector/simple_sequence.rb +135 -0
  96. data/vendor/sass/lib/sass/shared.rb +78 -0
  97. data/vendor/sass/lib/sass/tree/comment_node.rb +128 -0
  98. data/vendor/sass/lib/sass/tree/debug_node.rb +36 -0
  99. data/vendor/sass/lib/sass/tree/directive_node.rb +75 -0
  100. data/vendor/sass/lib/sass/tree/extend_node.rb +65 -0
  101. data/vendor/sass/lib/sass/tree/for_node.rb +67 -0
  102. data/vendor/sass/lib/sass/tree/if_node.rb +81 -0
  103. data/vendor/sass/lib/sass/tree/import_node.rb +124 -0
  104. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +60 -0
  105. data/vendor/sass/lib/sass/tree/mixin_node.rb +123 -0
  106. data/vendor/sass/lib/sass/tree/node.rb +490 -0
  107. data/vendor/sass/lib/sass/tree/prop_node.rb +220 -0
  108. data/vendor/sass/lib/sass/tree/root_node.rb +125 -0
  109. data/vendor/sass/lib/sass/tree/rule_node.rb +273 -0
  110. data/vendor/sass/lib/sass/tree/variable_node.rb +39 -0
  111. data/vendor/sass/lib/sass/tree/warn_node.rb +42 -0
  112. data/vendor/sass/lib/sass/tree/while_node.rb +48 -0
  113. data/vendor/sass/lib/sass/util.rb +700 -0
  114. data/vendor/sass/lib/sass/util/subset_map.rb +101 -0
  115. data/vendor/sass/lib/sass/version.rb +109 -0
  116. data/vendor/sass/rails/init.rb +1 -0
  117. data/vendor/sass/sass.gemspec +32 -0
  118. data/vendor/sass/test/sass/cache_test.rb +74 -0
  119. data/vendor/sass/test/sass/callbacks_test.rb +61 -0
  120. data/vendor/sass/test/sass/conversion_test.rb +1210 -0
  121. data/vendor/sass/test/sass/css2sass_test.rb +364 -0
  122. data/vendor/sass/test/sass/data/hsl-rgb.txt +319 -0
  123. data/vendor/sass/test/sass/engine_test.rb +2283 -0
  124. data/vendor/sass/test/sass/extend_test.rb +1348 -0
  125. data/vendor/sass/test/sass/functions_test.rb +565 -0
  126. data/vendor/sass/test/sass/importer_test.rb +104 -0
  127. data/vendor/sass/test/sass/less_conversion_test.rb +632 -0
  128. data/vendor/sass/test/sass/mock_importer.rb +49 -0
  129. data/vendor/sass/test/sass/more_results/more1.css +9 -0
  130. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +26 -0
  131. data/vendor/sass/test/sass/more_results/more_import.css +29 -0
  132. data/vendor/sass/test/sass/more_templates/_more_partial.sass +2 -0
  133. data/vendor/sass/test/sass/more_templates/more1.sass +23 -0
  134. data/vendor/sass/test/sass/more_templates/more_import.sass +11 -0
  135. data/vendor/sass/test/sass/plugin_test.rb +430 -0
  136. data/vendor/sass/test/sass/results/alt.css +4 -0
  137. data/vendor/sass/test/sass/results/basic.css +9 -0
  138. data/vendor/sass/test/sass/results/compact.css +5 -0
  139. data/vendor/sass/test/sass/results/complex.css +86 -0
  140. data/vendor/sass/test/sass/results/compressed.css +1 -0
  141. data/vendor/sass/test/sass/results/expanded.css +19 -0
  142. data/vendor/sass/test/sass/results/import.css +31 -0
  143. data/vendor/sass/test/sass/results/line_numbers.css +49 -0
  144. data/vendor/sass/test/sass/results/mixins.css +95 -0
  145. data/vendor/sass/test/sass/results/multiline.css +24 -0
  146. data/vendor/sass/test/sass/results/nested.css +22 -0
  147. data/vendor/sass/test/sass/results/options.css +1 -0
  148. data/vendor/sass/test/sass/results/parent_ref.css +13 -0
  149. data/vendor/sass/test/sass/results/script.css +16 -0
  150. data/vendor/sass/test/sass/results/scss_import.css +31 -0
  151. data/vendor/sass/test/sass/results/scss_importee.css +2 -0
  152. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  153. data/vendor/sass/test/sass/results/subdir/subdir.css +3 -0
  154. data/vendor/sass/test/sass/results/units.css +11 -0
  155. data/vendor/sass/test/sass/results/warn.css +0 -0
  156. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  157. data/vendor/sass/test/sass/script_conversion_test.rb +254 -0
  158. data/vendor/sass/test/sass/script_test.rb +470 -0
  159. data/vendor/sass/test/sass/scss/css_test.rb +897 -0
  160. data/vendor/sass/test/sass/scss/rx_test.rb +156 -0
  161. data/vendor/sass/test/sass/scss/scss_test.rb +1088 -0
  162. data/vendor/sass/test/sass/scss/test_helper.rb +37 -0
  163. data/vendor/sass/test/sass/templates/_partial.sass +2 -0
  164. data/vendor/sass/test/sass/templates/alt.sass +16 -0
  165. data/vendor/sass/test/sass/templates/basic.sass +23 -0
  166. data/vendor/sass/test/sass/templates/bork1.sass +2 -0
  167. data/vendor/sass/test/sass/templates/bork2.sass +2 -0
  168. data/vendor/sass/test/sass/templates/bork3.sass +2 -0
  169. data/vendor/sass/test/sass/templates/bork4.sass +2 -0
  170. data/vendor/sass/test/sass/templates/compact.sass +17 -0
  171. data/vendor/sass/test/sass/templates/complex.sass +305 -0
  172. data/vendor/sass/test/sass/templates/compressed.sass +15 -0
  173. data/vendor/sass/test/sass/templates/expanded.sass +17 -0
  174. data/vendor/sass/test/sass/templates/import.sass +12 -0
  175. data/vendor/sass/test/sass/templates/importee.less +2 -0
  176. data/vendor/sass/test/sass/templates/importee.sass +19 -0
  177. data/vendor/sass/test/sass/templates/line_numbers.sass +13 -0
  178. data/vendor/sass/test/sass/templates/mixin_bork.sass +5 -0
  179. data/vendor/sass/test/sass/templates/mixins.sass +76 -0
  180. data/vendor/sass/test/sass/templates/multiline.sass +20 -0
  181. data/vendor/sass/test/sass/templates/nested.sass +25 -0
  182. data/vendor/sass/test/sass/templates/nested_bork1.sass +2 -0
  183. data/vendor/sass/test/sass/templates/nested_bork2.sass +2 -0
  184. data/vendor/sass/test/sass/templates/nested_bork3.sass +2 -0
  185. data/vendor/sass/test/sass/templates/nested_bork4.sass +2 -0
  186. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +6 -0
  187. data/vendor/sass/test/sass/templates/options.sass +2 -0
  188. data/vendor/sass/test/sass/templates/parent_ref.sass +25 -0
  189. data/vendor/sass/test/sass/templates/script.sass +101 -0
  190. data/vendor/sass/test/sass/templates/scss_import.scss +11 -0
  191. data/vendor/sass/test/sass/templates/scss_importee.scss +1 -0
  192. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  193. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  194. data/vendor/sass/test/sass/templates/subdir/subdir.sass +6 -0
  195. data/vendor/sass/test/sass/templates/units.sass +11 -0
  196. data/vendor/sass/test/sass/templates/warn.sass +3 -0
  197. data/vendor/sass/test/sass/templates/warn_imported.sass +4 -0
  198. data/vendor/sass/test/sass/test_helper.rb +8 -0
  199. data/vendor/sass/test/sass/util/subset_map_test.rb +91 -0
  200. data/vendor/sass/test/sass/util_test.rb +275 -0
  201. data/vendor/sass/test/test_helper.rb +64 -0
  202. data/vendor/sass/yard/callbacks.rb +29 -0
  203. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +26 -0
  204. data/vendor/sass/yard/default/layout/html/footer.erb +12 -0
  205. data/vendor/sass/yard/inherited_hash.rb +41 -0
  206. metadata +422 -239
@@ -2073,6 +2073,38 @@ CSS
2073
2073
  SASS
2074
2074
  end
2075
2075
 
2076
+ def test_function_output_with_comma
2077
+ assert_equal <<CSS, render(<<SASS)
2078
+ foo {
2079
+ a: b(c), d(e); }
2080
+ CSS
2081
+ foo
2082
+ a: b(c), d(e)
2083
+ SASS
2084
+ end
2085
+
2086
+ def test_interpolation_with_comma
2087
+ assert_equal <<CSS, render(<<SASS)
2088
+ foo {
2089
+ a: foo, bar; }
2090
+ CSS
2091
+ $foo: foo
2092
+ foo
2093
+ a: \#{$foo}, bar
2094
+ SASS
2095
+ end
2096
+
2097
+ def test_string_interpolation_with_comma
2098
+ assert_equal <<CSS, render(<<SASS)
2099
+ foo {
2100
+ a: "bip foo bap", bar; }
2101
+ CSS
2102
+ $foo: foo
2103
+ foo
2104
+ a: "bip \#{$foo} bap", bar
2105
+ SASS
2106
+ end
2107
+
2076
2108
  # Encodings
2077
2109
 
2078
2110
  unless Haml::Util.ruby1_8?
@@ -79,9 +79,13 @@ class SassScriptTest < Test::Unit::TestCase
79
79
  assert_equal "rgba(100, 100, 100, 0.75)", resolve("rgba(50, 50, 50, 0.75) * 2")
80
80
  end
81
81
 
82
+ def test_rgba_rounding
83
+ assert_equal "rgba(10, 1, 0, 0.123)", resolve("rgba(10.0, 1.23456789, 0.0, 0.1234567)")
84
+ end
85
+
82
86
  def test_compressed_colors
83
87
  assert_equal "#123456", resolve("#123456", :style => :compressed)
84
- assert_equal "rgba(1, 2, 3, 0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
88
+ assert_equal "rgba(1,2,3,0.5)", resolve("rgba(1, 2, 3, 0.5)", :style => :compressed)
85
89
  assert_equal "#123", resolve("#112233", :style => :compressed)
86
90
  assert_equal "#000", resolve("black", :style => :compressed)
87
91
  assert_equal "red", resolve("#f00", :style => :compressed)
@@ -91,6 +95,12 @@ class SassScriptTest < Test::Unit::TestCase
91
95
  assert_equal "This color is #fff", resolve('"This color is #{ white }"', :style => :compressed)
92
96
  end
93
97
 
98
+ def test_compressed_comma
99
+ # assert_equal "foo,bar,baz", resolve("foo, bar, baz", :style => :compressed)
100
+ # assert_equal "foo,#baf,baz", resolve("foo, #baf, baz", :style => :compressed)
101
+ assert_equal "foo,#baf,red", resolve("foo, #baf, #f00", :style => :compressed)
102
+ end
103
+
94
104
  def test_implicit_strings
95
105
  assert_equal Sass::Script::String.new("foo"), eval("foo")
96
106
  assert_equal Sass::Script::String.new("foo bar"), eval("foo bar")
@@ -372,6 +382,12 @@ SASS
372
382
  "Colors must have either three or six digits: '#abcdEFA'") {eval("#abcdEFA")}
373
383
  end
374
384
 
385
+ def test_case_insensitive_color_names
386
+ assert_equal "blue", resolve("BLUE")
387
+ assert_equal "red", resolve("rEd")
388
+ assert_equal "#7f4000", resolve("mix(GrEeN, ReD)")
389
+ end
390
+
375
391
  # Regression Tests
376
392
 
377
393
  def test_funcall_has_higher_precedence_than_color_name
@@ -426,6 +442,7 @@ SASS
426
442
 
427
443
  def eval(str, opts = {}, environment = env)
428
444
  munge_filename opts
445
+ environment.options = opts
429
446
  Sass::Script.parse(str, opts.delete(:line) || 1,
430
447
  opts.delete(:offset) || 0, opts).perform(environment)
431
448
  end
@@ -1071,4 +1071,18 @@ $bar : "#foo";
1071
1071
  ul li\#{$bar} a span.label { foo: bar; }
1072
1072
  SCSS
1073
1073
  end
1074
+
1075
+ def test_newlines_removed_from_selectors_when_compressed
1076
+ assert_equal <<CSS, render(<<SCSS, :style=>:compressed)
1077
+ z a,z b{display:block}
1078
+ CSS
1079
+ a,
1080
+ b {
1081
+ z & {
1082
+ display: block;
1083
+ }
1084
+ }
1085
+ SCSS
1086
+
1087
+ end
1074
1088
  end
@@ -0,0 +1,3 @@
1
+ Contributions are welcomed. Please see the following sites for guidelines:
2
+
3
+ http://sass-lang.com/development.html#contributing
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2006-2009 Hampton Catlin, Nathan Weizenbaum, and Chris Eppstein
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,201 @@
1
+ # Sass
2
+
3
+ **Sass makes CSS fun again**. Sass is an extension of CSS3,
4
+ adding nested rules, variables, mixins, selector inheritance, and more.
5
+ It's translated to well-formatted, standard CSS
6
+ using the command line tool or a web-framework plugin.
7
+
8
+ Sass has two syntaxes. The new main syntax (as of Sass 3)
9
+ is known as "SCSS" (for "Sassy CSS"),
10
+ and is a superset of CSS3's syntax.
11
+ This means that every valid CSS3 stylesheet is valid SCSS as well.
12
+ SCSS files use the extension `.scss`.
13
+
14
+ The second, older syntax is known as the indented syntax (or just "Sass").
15
+ Inspired by Haml's terseness, it's intended for people
16
+ who prefer conciseness over similarity to CSS.
17
+ Instead of brackets and semicolons,
18
+ it uses the indentation of lines to specify blocks.
19
+ Although no longer the primary syntax,
20
+ the indented syntax will continue to be supported.
21
+ Files in the indented syntax use the extension `.sass`.
22
+
23
+ ## Using
24
+
25
+ Sass can be used from the command line
26
+ or as part of a web framework.
27
+ The first step is to install the gem:
28
+
29
+ gem install sass
30
+
31
+ After you convert some CSS to Sass, you can run
32
+
33
+ sass style.scss
34
+
35
+ to compile it back to CSS.
36
+ For more information on these commands, check out
37
+
38
+ sass --help
39
+
40
+ To install Sass in Rails 2,
41
+ just add `config.gem "sass"` to `config/environment.rb`.
42
+ In Rails 3, add `gem "sass"` to your Gemfile instead.
43
+ `.sass` or `.scss` files should be placed in `public/stylesheets/sass`,
44
+ where they'll be automatically compiled
45
+ to corresponding CSS files in `public/stylesheets` when needed
46
+ (the Sass template directory is customizable...
47
+ see [the Sass reference](http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#template_location-option) for details).
48
+
49
+ Sass can also be used with any Rack-enabled web framework.
50
+ To do so, just add
51
+
52
+ require 'sass/plugin/rack'
53
+ use Sass::Plugin::Rack
54
+
55
+ to `config.ru`.
56
+ Then any Sass files in `public/stylesheets/sass`
57
+ will be compiled CSS files in `public/stylesheets` on every request.
58
+
59
+ To use Sass programatically,
60
+ check out the [YARD documentation](http://sass-lang.com/docs/yardoc/).
61
+
62
+ ## Formatting
63
+
64
+ Sass is an extension of CSS
65
+ that adds power and elegance to the basic language.
66
+ It allows you to use [variables][vars], [nested rules][nested],
67
+ [mixins][mixins], [inline imports][imports],
68
+ and more, all with a fully CSS-compatible syntax.
69
+ Sass helps keep large stylesheets well-organized,
70
+ and get small stylesheets up and running quickly,
71
+ particularly with the help of
72
+ [the Compass style library](http://compass-style.org).
73
+
74
+ [vars]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#variables_
75
+ [nested]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#nested_rules_
76
+ [mixins]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#mixins
77
+ [imports]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#import
78
+
79
+ Sass has two syntaxes.
80
+ The one presented here, known as "SCSS" (for "Sassy CSS"),
81
+ is fully CSS-compatible.
82
+ The other (older) syntax, known as the indented syntax or just "Sass",
83
+ is whitespace-sensitive and indentation-based.
84
+ For more information, see the [reference documentation][syntax].
85
+
86
+ [syntax]: http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#syntax
87
+
88
+ To run the following examples and see the CSS they produce,
89
+ put them in a file called `test.scss` and run `sass test.scss`.
90
+
91
+ ### Nesting
92
+
93
+ Sass avoids repetition by nesting selectors within one another.
94
+ The same thing works for properties.
95
+
96
+ table.hl {
97
+ margin: 2em 0;
98
+ td.ln { text-align: right; }
99
+ }
100
+
101
+ li {
102
+ font: {
103
+ family: serif;
104
+ weight: bold;
105
+ size: 1.2em;
106
+ }
107
+ }
108
+
109
+ ### Variables
110
+
111
+ Use the same color all over the place?
112
+ Need to do some math with height and width and text size?
113
+ Sass supports variables, math operations, and many useful functions.
114
+
115
+ $blue: #3bbfce;
116
+ $margin: 16px;
117
+
118
+ .content_navigation {
119
+ border-color: $blue;
120
+ color: darken($blue, 10%);
121
+ }
122
+
123
+ .border {
124
+ padding: $margin / 2;
125
+ margin: $margin / 2;
126
+ border-color: $blue;
127
+ }
128
+
129
+ ### Mixins
130
+
131
+ Even more powerful than variables,
132
+ mixins allow you to re-use whole chunks of CSS,
133
+ properties or selectors.
134
+ You can even give them arguments.
135
+
136
+ @mixin table-scaffolding {
137
+ th {
138
+ text-align: center;
139
+ font-weight: bold;
140
+ }
141
+ td, th { padding: 2px; }
142
+ }
143
+
144
+ @mixin left($dist) {
145
+ float: left;
146
+ margin-left: $dist;
147
+ }
148
+
149
+ #data {
150
+ @include left(10px);
151
+ @include table-scaffolding;
152
+ }
153
+
154
+ A comprehensive list of features is available
155
+ in the [Sass reference](http://beta.sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html).
156
+
157
+ ## Executables
158
+
159
+ The Sass gem includes several executables that are useful
160
+ for dealing with Sass from the command line.
161
+
162
+ ### `sass`
163
+
164
+ The `sass` executable transforms a source Sass file into CSS.
165
+ See `sass --help` for further information and options.
166
+
167
+ ### `sass-convert`
168
+
169
+ The `sass-convert` executable converts between CSS, Sass, and SCSS.
170
+ When converting from CSS to Sass or SCSS,
171
+ nesting is applied where appropriate.
172
+ See `sass-convert --help` for further information and options.
173
+
174
+ ## Authors
175
+
176
+ Sass was envisioned by [Hampton Catlin](http://hamptoncatlin.com) (hcatlin).
177
+ However, Hampton doesn't even know his way around the code anymore and now
178
+ occasionally consults on the language issues. Hampton lives in Jacksonville,
179
+ Florida and is the lead mobile developer for Wikimedia.
180
+
181
+ [Nathan Weizenbaum](http://nex-3.com) is the primary developer and architect of
182
+ Sass. His hard work has kept the project alive by endlessly answering forum
183
+ posts, fixing bugs, refactoring, finding speed improvements, writing
184
+ documentation, implementing new features, and getting Hampton coffee (a fitting
185
+ task for a boy-genius). Nathan lives in Seattle, Washington and while not being
186
+ a student at the University of Washington or working at an internship, he
187
+ consults for Unspace Interactive.
188
+
189
+ [Chris Eppstein](http://acts-as-architect.blogspot.com) is a core contributor to
190
+ Sass and the creator of Compass, the first Sass-based framework. Chris focuses
191
+ on making Sass more powerful, easy to use, and on ways to speed its adoption
192
+ through the web development community. Chris lives in San Jose, California with
193
+ his wife and daughter. He is the Software Architect for
194
+ [Caring.com](http://caring.com), a website devoted to the 34 Million caregivers
195
+ whose parents are sick or elderly, that uses Haml and Sass.
196
+
197
+ If you use this software, you must pay Hampton a compliment. And
198
+ buy Nathan some jelly beans. Maybe pet a kitten. Yeah. Pet that kitty.
199
+
200
+ Beyond that, the implementation is licensed under the MIT License.
201
+ Okay, fine, I guess that means compliments aren't __required__.
@@ -0,0 +1,363 @@
1
+ # ----- Utility Functions -----
2
+
3
+ def scope(path)
4
+ File.join(File.dirname(__FILE__), path)
5
+ end
6
+
7
+ # ----- Default: Testing ------
8
+
9
+ task :default => :test
10
+
11
+ require 'rake/testtask'
12
+
13
+ Rake::TestTask.new do |t|
14
+ t.libs << 'lib'
15
+ test_files = FileList[scope('test/**/*_test.rb')]
16
+ test_files.exclude(scope('test/rails/*'))
17
+ test_files.exclude(scope('test/plugins/*'))
18
+ t.test_files = test_files
19
+ t.verbose = true
20
+ end
21
+
22
+ # ----- Packaging -----
23
+
24
+ # Don't use Rake::GemPackageTast because we want prerequisites to run
25
+ # before we load the gemspec.
26
+ desc "Build all the packages."
27
+ task :package => [:permissions, :revision_file, :submodules] do
28
+ load scope('sass.gemspec')
29
+ Gem::Builder.new(SASS_GEMSPEC).build
30
+ pkg = "#{SASS_GEMSPEC.name}-#{SASS_GEMSPEC.version}"
31
+ mkdir_p "pkg"
32
+ verbose(true) {mv "#{pkg}.gem", "pkg/#{pkg}.gem"}
33
+
34
+ sh %{rm -f pkg/#{pkg}.tar.gz}
35
+ verbose(false) {SASS_GEMSPEC.files.each {|f| sh %{tar rf pkg/#{pkg}.tar #{f}}}}
36
+ sh %{gzip pkg/#{pkg}.tar}
37
+ end
38
+
39
+ task :permissions do
40
+ sh %{chmod -R a+rx bin}
41
+ sh %{chmod -R a+r .}
42
+ require 'shellwords'
43
+ Dir.glob('test/**/*_test.rb') do |file|
44
+ next if file =~ %r{^test/haml/spec/}
45
+ sh %{chmod a+rx #{file}}
46
+ end
47
+ end
48
+
49
+ task :revision_file do
50
+ require 'lib/sass'
51
+
52
+ release = Rake.application.top_level_tasks.include?('release') || File.exist?(scope('EDGE_GEM_VERSION'))
53
+ if Sass.version[:rev] && !release
54
+ File.open(scope('REVISION'), 'w') { |f| f.puts Sass.version[:rev] }
55
+ elsif release
56
+ File.open(scope('REVISION'), 'w') { |f| f.puts "(release)" }
57
+ else
58
+ File.open(scope('REVISION'), 'w') { |f| f.puts "(unknown)" }
59
+ end
60
+ end
61
+
62
+ # We also need to get rid of this file after packaging.
63
+ at_exit { File.delete(scope('REVISION')) rescue nil }
64
+
65
+ desc "Install Sass as a gem. Use SUDO=1 to install with sudo."
66
+ task :install => [:package] do
67
+ gem = RUBY_PLATFORM =~ /java/ ? 'jgem' : 'gem'
68
+ sh %{#{'sudo ' if ENV["SUDO"]}#{gem} install --no-ri pkg/sass-#{File.read(scope('VERSION')).strip}}
69
+ end
70
+
71
+ desc "Release a new Sass package to Rubyforge."
72
+ task :release => [:check_release, :package] do
73
+ name = File.read(scope("VERSION_NAME")).strip
74
+ version = File.read(scope("VERSION")).strip
75
+ sh %{rubyforge add_release sass sass "#{name} (v#{version})" pkg/sass-#{version}.gem}
76
+ sh %{rubyforge add_file sass sass "#{name} (v#{version})" pkg/sass-#{version}.tar.gz}
77
+ sh %{gem push pkg/sass-#{version}.gem}
78
+ end
79
+
80
+ # Ensures that the VERSION file has been updated for a new release.
81
+ task :check_release do
82
+ version = File.read(scope("VERSION")).strip
83
+ raise "There have been changes since current version (#{version})" if changed_since?(version)
84
+ raise "VERSION_NAME must not be 'Bleeding Edge'" if File.read(scope("VERSION_NAME")) == "Bleeding Edge"
85
+ end
86
+
87
+ # Reads a password from the command line.
88
+ #
89
+ # @param name [String] The prompt to use to read the password
90
+ def read_password(prompt)
91
+ require 'readline'
92
+ system "stty -echo"
93
+ Readline.readline("#{prompt}: ").strip
94
+ ensure
95
+ system "stty echo"
96
+ puts
97
+ end
98
+
99
+ # Returns whether or not the repository, or specific files,
100
+ # has/have changed since a given revision.
101
+ #
102
+ # @param rev [String] The revision to check against
103
+ # @param files [Array<String>] The files to check.
104
+ # If this is empty, checks the entire repository
105
+ def changed_since?(rev, *files)
106
+ IO.popen("git diff --exit-code #{rev} #{files.join(' ')}") {}
107
+ return !$?.success?
108
+ end
109
+
110
+ task :submodules do
111
+ if File.exist?(File.dirname(__FILE__) + "/.git")
112
+ sh %{git submodule sync}
113
+ sh %{git submodule update --init}
114
+ elsif !File.exist?(File.dirname(__FILE__) + "/vendor/fssm/lib")
115
+ warn <<WARN
116
+ WARNING: vendor/fssm doesn't exist, and this isn't a git repository so
117
+ I can't get it automatically!
118
+ WARN
119
+ end
120
+ end
121
+
122
+ task :release_edge do
123
+ ensure_git_cleanup do
124
+ puts "#{'=' * 50} Running rake release_edge"
125
+
126
+ sh %{git checkout edge-gem}
127
+ sh %{git reset --hard origin/edge-gem}
128
+ sh %{git merge origin/master}
129
+
130
+ unless edge_version = bump_edge_version
131
+ puts "master is already a prerelease version, no use building an edge gem"
132
+ next
133
+ end
134
+
135
+ File.open(scope('EDGE_GEM_VERSION'), 'w') {|f| f.puts(edge_version)}
136
+ sh %{git commit -m "Bump edge gem version to #{edge_version}." EDGE_GEM_VERSION}
137
+ sh %{git push origin edge-gem}
138
+
139
+ # Package the edge gem with the proper version
140
+ File.open(scope('VERSION'), 'w') {|f| f.puts(edge_version)}
141
+ sh %{rake package}
142
+ sh %{git checkout VERSION}
143
+
144
+ sh %{rubyforge add_release sass sass "Bleeding Edge (v#{edge_version})" pkg/sass-#{edge_version}.gem}
145
+ sh %{gem push pkg/sass-#{edge_version}.gem}
146
+ end
147
+ end
148
+
149
+ # Reads the master version and the edge gem version,
150
+ # bump the latter, and return it.
151
+ #
152
+ # Returns nil if the current master version is already a non-alpha prerelease.
153
+ def bump_edge_version
154
+ # Get the current master branch version
155
+ version = File.read(scope('VERSION')).strip.split('.')
156
+ version.map! {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
157
+ unless version.size == 5 # prerelease
158
+ raise "master version #{version.join('.')} is not a prerelease version"
159
+ end
160
+
161
+ # Bump the edge gem version
162
+ edge_version = File.read(scope('EDGE_GEM_VERSION')).strip.split('.')
163
+ edge_version.map! {|n| n =~ /^[0-9]+$/ ? n.to_i : n}
164
+
165
+ if version[3] != "alpha"
166
+ return
167
+ elsif edge_version[0..2] != version[0..2]
168
+ # A new master branch version was released, reset the edge gem version
169
+ edge_version[0..2] = version[0..2]
170
+ edge_version[4] = 1
171
+ else
172
+ # Just bump the teeny version
173
+ edge_version[4] += 1
174
+ end
175
+
176
+ edge_version.join('.')
177
+ end
178
+
179
+ task :watch_for_update do
180
+ sh %{ruby extra/update_watch.rb}
181
+ end
182
+
183
+ # ----- Documentation -----
184
+
185
+ task :rdoc do
186
+ puts '=' * 100, <<END, '=' * 100
187
+ Sass uses the YARD documentation system (http://github.com/lsegal/yard).
188
+ Install the yard gem and then run "rake doc".
189
+ END
190
+ end
191
+
192
+ begin
193
+ require 'yard'
194
+
195
+ namespace :doc do
196
+ task :sass do
197
+ require scope('lib/sass')
198
+ Dir[scope("yard/default/**/*.sass")].each do |sass|
199
+ File.open(sass.gsub(/sass$/, 'css'), 'w') do |f|
200
+ f.write(Sass::Engine.new(File.read(sass)).render)
201
+ end
202
+ end
203
+ end
204
+
205
+ desc "List all undocumented methods and classes."
206
+ task :undocumented do
207
+ opts = ENV["YARD_OPTS"] || ""
208
+ ENV["YARD_OPTS"] = opts.dup + <<OPTS
209
+ --list --query "
210
+ object.docstring.blank? &&
211
+ !(object.type == :method && object.is_alias?)"
212
+ OPTS
213
+ Rake::Task['yard'].execute
214
+ end
215
+ end
216
+
217
+ YARD::Rake::YardocTask.new do |t|
218
+ t.files = FileList.new(scope('lib/**/*.rb')) do |list|
219
+ list.exclude('lib/sass/plugin/merb.rb')
220
+ list.exclude('lib/sass/plugin/rails.rb')
221
+ list.exclude('lib/sass/less.rb')
222
+ end.to_a
223
+ t.options << '--incremental' if Rake.application.top_level_tasks.include?('redoc')
224
+ t.options += FileList.new(scope('yard/*.rb')).to_a.map {|f| ['-e', f]}.flatten
225
+ files = FileList.new(scope('doc-src/*')).to_a.sort_by {|s| s.size} + %w[MIT-LICENSE VERSION]
226
+ t.options << '--files' << files.join(',')
227
+ t.options << '--template-path' << scope('yard')
228
+ t.options << '--title' << ENV["YARD_TITLE"] if ENV["YARD_TITLE"]
229
+
230
+ t.before = lambda do
231
+ if ENV["YARD_OPTS"]
232
+ require 'shellwords'
233
+ t.options.concat(Shellwords.shellwords(ENV["YARD_OPTS"]))
234
+ end
235
+ end
236
+ end
237
+ Rake::Task['yard'].prerequisites.insert(0, 'doc:sass')
238
+ Rake::Task['yard'].instance_variable_set('@comment', nil)
239
+
240
+ desc "Generate Documentation"
241
+ task :doc => :yard
242
+ task :redoc => :yard
243
+ rescue LoadError
244
+ desc "Generate Documentation"
245
+ task :doc => :rdoc
246
+ task :yard => :rdoc
247
+ end
248
+
249
+ task :pages do
250
+ ensure_git_cleanup do
251
+ puts "#{'=' * 50} Running rake pages"
252
+ sh %{git checkout sass-pages}
253
+ sh %{git reset --hard origin/sass-pages}
254
+
255
+ Dir.chdir("/var/www/sass-pages") do
256
+ sh %{git fetch origin}
257
+
258
+ sh %{git checkout stable}
259
+ sh %{git reset --hard origin/stable}
260
+
261
+ sh %{git checkout sass-pages}
262
+ sh %{git reset --hard origin/sass-pages}
263
+ sh %{rake build --trace}
264
+ sh %{mkdir -p tmp}
265
+ sh %{touch tmp/restart.txt}
266
+ end
267
+ end
268
+ end
269
+
270
+ # ----- Coverage -----
271
+
272
+ begin
273
+ require 'rcov/rcovtask'
274
+
275
+ Rcov::RcovTask.new do |t|
276
+ t.test_files = FileList[scope('test/**/*_test.rb')]
277
+ t.rcov_opts << '-x' << '"^\/"'
278
+ if ENV['NON_NATIVE']
279
+ t.rcov_opts << "--no-rcovrt"
280
+ end
281
+ t.verbose = true
282
+ end
283
+ rescue LoadError; end
284
+
285
+ # ----- Profiling -----
286
+
287
+ begin
288
+ require 'ruby-prof'
289
+
290
+ desc <<END
291
+ Run a profile of sass.
292
+ TIMES=n sets the number of runs. Defaults to 1000.
293
+ FILE=str sets the file to profile. Defaults to 'complex'.
294
+ OUTPUT=str sets the ruby-prof output format.
295
+ Can be Flat, CallInfo, or Graph. Defaults to Flat. Defaults to Flat.
296
+ END
297
+ task :profile do
298
+ times = (ENV['TIMES'] || '1000').to_i
299
+ file = ENV['FILE']
300
+
301
+ require 'lib/sass'
302
+
303
+ file = File.read(scope("test/sass/templates/#{file || 'complex'}.sass"))
304
+ result = RubyProf.profile { times.times { Sass::Engine.new(file).render } }
305
+
306
+ RubyProf.const_get("#{(ENV['OUTPUT'] || 'Flat').capitalize}Printer").new(result).print
307
+ end
308
+ rescue LoadError; end
309
+
310
+ # ----- Handling Updates -----
311
+
312
+ def email_on_error
313
+ yield
314
+ rescue Exception => e
315
+ IO.popen("sendmail nex342@gmail.com", "w") do |sm|
316
+ sm << "From: nex3@nex-3.com\n" <<
317
+ "To: nex342@gmail.com\n" <<
318
+ "Subject: Exception when running rake #{Rake.application.top_level_tasks.join(', ')}\n" <<
319
+ e.message << "\n\n" <<
320
+ e.backtrace.join("\n")
321
+ end
322
+ ensure
323
+ raise e if e
324
+ end
325
+
326
+ def ensure_git_cleanup
327
+ email_on_error {yield}
328
+ ensure
329
+ sh %{git reset --hard HEAD}
330
+ sh %{git clean -xdf}
331
+ sh %{git checkout master}
332
+ end
333
+
334
+ task :handle_update do
335
+ email_on_error do
336
+ unless ENV["REF"] =~ %r{^refs/heads/(master|stable|sass-pages)$}
337
+ puts "#{'=' * 20} Ignoring rake handle_update REF=#{ENV["REF"].inspect}"
338
+ next
339
+ end
340
+ branch = $1
341
+
342
+ puts
343
+ puts
344
+ puts '=' * 150
345
+ puts "Running rake handle_update REF=#{ENV["REF"].inspect}"
346
+
347
+ sh %{git fetch origin}
348
+ sh %{git checkout stable}
349
+ sh %{git reset --hard origin/stable}
350
+ sh %{git checkout master}
351
+ sh %{git reset --hard origin/master}
352
+
353
+ case branch
354
+ when "master"
355
+ sh %{rake release_edge --trace}
356
+ when "stable", "sass-pages"
357
+ sh %{rake pages --trace}
358
+ end
359
+
360
+ puts 'Done running handle_update'
361
+ puts '=' * 150
362
+ end
363
+ end