haml 3.1.0.alpha.14 → 3.1.0.alpha.17

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 (222) hide show
  1. data/EDGE_GEM_VERSION +1 -1
  2. data/VERSION +1 -1
  3. data/lib/haml.rb +3 -2
  4. data/lib/haml/exec.rb +0 -226
  5. data/lib/sass.rb +8 -0
  6. data/lib/sass/plugin.rb +8 -0
  7. data/lib/sass/rails2_shim.rb +9 -0
  8. data/lib/sass/rails3_shim.rb +16 -0
  9. data/vendor/sass/CONTRIBUTING +3 -0
  10. data/vendor/sass/MIT-LICENSE +20 -0
  11. data/vendor/sass/README.md +201 -0
  12. data/vendor/sass/Rakefile +363 -0
  13. data/vendor/sass/TODO +39 -0
  14. data/vendor/sass/VERSION +1 -0
  15. data/vendor/sass/VERSION_NAME +1 -0
  16. data/vendor/sass/bin/css2sass +13 -0
  17. data/vendor/sass/bin/sass +8 -0
  18. data/vendor/sass/bin/sass-convert +7 -0
  19. data/vendor/sass/doc-src/FAQ.md +35 -0
  20. data/vendor/sass/doc-src/INDENTED_SYNTAX.md +210 -0
  21. data/vendor/sass/doc-src/SASS_CHANGELOG.md +1878 -0
  22. data/vendor/sass/doc-src/SASS_REFERENCE.md +1713 -0
  23. data/vendor/sass/doc-src/SCSS_FOR_SASS_USERS.md +155 -0
  24. data/vendor/sass/ext/extconf.rb +10 -0
  25. data/vendor/sass/extra/update_watch.rb +13 -0
  26. data/vendor/sass/init.rb +18 -0
  27. data/vendor/sass/lib/sass.rb +71 -0
  28. data/vendor/sass/lib/sass/cache_store.rb +208 -0
  29. data/vendor/sass/lib/sass/callbacks.rb +66 -0
  30. data/vendor/sass/lib/sass/css.rb +294 -0
  31. data/vendor/sass/lib/sass/engine.rb +792 -0
  32. data/vendor/sass/lib/sass/environment.rb +143 -0
  33. data/vendor/sass/lib/sass/error.rb +201 -0
  34. data/vendor/sass/lib/sass/exec.rb +619 -0
  35. data/vendor/sass/lib/sass/importers.rb +22 -0
  36. data/vendor/sass/lib/sass/importers/base.rb +138 -0
  37. data/vendor/sass/lib/sass/importers/filesystem.rb +121 -0
  38. data/vendor/sass/lib/sass/less.rb +363 -0
  39. data/vendor/sass/lib/sass/plugin.rb +126 -0
  40. data/vendor/sass/lib/sass/plugin/compiler.rb +346 -0
  41. data/vendor/sass/lib/sass/plugin/configuration.rb +123 -0
  42. data/vendor/sass/lib/sass/plugin/generic.rb +15 -0
  43. data/vendor/sass/lib/sass/plugin/merb.rb +48 -0
  44. data/vendor/sass/lib/sass/plugin/rack.rb +47 -0
  45. data/vendor/sass/lib/sass/plugin/rails.rb +41 -0
  46. data/vendor/sass/lib/sass/plugin/staleness_checker.rb +145 -0
  47. data/vendor/sass/lib/sass/railtie.rb +8 -0
  48. data/vendor/sass/lib/sass/repl.rb +58 -0
  49. data/vendor/sass/lib/sass/root.rb +7 -0
  50. data/vendor/sass/lib/sass/script.rb +63 -0
  51. data/vendor/sass/lib/sass/script/bool.rb +18 -0
  52. data/vendor/sass/lib/sass/script/color.rb +491 -0
  53. data/vendor/sass/lib/sass/script/css_lexer.rb +29 -0
  54. data/vendor/sass/lib/sass/script/css_parser.rb +31 -0
  55. data/vendor/sass/lib/sass/script/funcall.rb +76 -0
  56. data/vendor/sass/lib/sass/script/functions.rb +852 -0
  57. data/vendor/sass/lib/sass/script/interpolation.rb +70 -0
  58. data/vendor/sass/lib/sass/script/lexer.rb +337 -0
  59. data/vendor/sass/lib/sass/script/literal.rb +236 -0
  60. data/vendor/sass/lib/sass/script/node.rb +112 -0
  61. data/vendor/sass/lib/sass/script/number.rb +423 -0
  62. data/vendor/sass/lib/sass/script/operation.rb +90 -0
  63. data/vendor/sass/lib/sass/script/parser.rb +392 -0
  64. data/vendor/sass/lib/sass/script/string.rb +67 -0
  65. data/vendor/sass/lib/sass/script/string_interpolation.rb +93 -0
  66. data/vendor/sass/lib/sass/script/unary_operation.rb +57 -0
  67. data/vendor/sass/lib/sass/script/variable.rb +48 -0
  68. data/vendor/sass/lib/sass/scss.rb +17 -0
  69. data/vendor/sass/lib/sass/scss/css_parser.rb +51 -0
  70. data/vendor/sass/lib/sass/scss/parser.rb +838 -0
  71. data/vendor/sass/lib/sass/scss/rx.rb +126 -0
  72. data/vendor/sass/lib/sass/scss/sass_parser.rb +11 -0
  73. data/vendor/sass/lib/sass/scss/script_lexer.rb +15 -0
  74. data/vendor/sass/lib/sass/scss/script_parser.rb +25 -0
  75. data/vendor/sass/lib/sass/scss/static_parser.rb +40 -0
  76. data/vendor/sass/lib/sass/selector.rb +361 -0
  77. data/vendor/sass/lib/sass/selector/abstract_sequence.rb +62 -0
  78. data/vendor/sass/lib/sass/selector/comma_sequence.rb +82 -0
  79. data/vendor/sass/lib/sass/selector/sequence.rb +236 -0
  80. data/vendor/sass/lib/sass/selector/simple.rb +113 -0
  81. data/vendor/sass/lib/sass/selector/simple_sequence.rb +135 -0
  82. data/vendor/sass/lib/sass/shared.rb +78 -0
  83. data/vendor/sass/lib/sass/tree/comment_node.rb +128 -0
  84. data/vendor/sass/lib/sass/tree/debug_node.rb +36 -0
  85. data/vendor/sass/lib/sass/tree/directive_node.rb +75 -0
  86. data/vendor/sass/lib/sass/tree/extend_node.rb +65 -0
  87. data/vendor/sass/lib/sass/tree/for_node.rb +67 -0
  88. data/vendor/sass/lib/sass/tree/if_node.rb +81 -0
  89. data/vendor/sass/lib/sass/tree/import_node.rb +124 -0
  90. data/vendor/sass/lib/sass/tree/mixin_def_node.rb +60 -0
  91. data/vendor/sass/lib/sass/tree/mixin_node.rb +123 -0
  92. data/vendor/sass/lib/sass/tree/node.rb +490 -0
  93. data/vendor/sass/lib/sass/tree/prop_node.rb +220 -0
  94. data/vendor/sass/lib/sass/tree/root_node.rb +125 -0
  95. data/vendor/sass/lib/sass/tree/rule_node.rb +273 -0
  96. data/vendor/sass/lib/sass/tree/variable_node.rb +39 -0
  97. data/vendor/sass/lib/sass/tree/warn_node.rb +42 -0
  98. data/vendor/sass/lib/sass/tree/while_node.rb +48 -0
  99. data/vendor/sass/lib/sass/util.rb +700 -0
  100. data/vendor/sass/lib/sass/util/subset_map.rb +101 -0
  101. data/vendor/sass/lib/sass/version.rb +109 -0
  102. data/vendor/sass/rails/init.rb +1 -0
  103. data/vendor/sass/sass.gemspec +32 -0
  104. data/vendor/sass/test/sass/cache_test.rb +74 -0
  105. data/vendor/sass/test/sass/callbacks_test.rb +61 -0
  106. data/vendor/sass/test/sass/conversion_test.rb +1210 -0
  107. data/vendor/sass/test/sass/css2sass_test.rb +364 -0
  108. data/vendor/sass/test/sass/data/hsl-rgb.txt +319 -0
  109. data/vendor/sass/test/sass/engine_test.rb +2305 -0
  110. data/vendor/sass/test/sass/extend_test.rb +1348 -0
  111. data/vendor/sass/test/sass/functions_test.rb +565 -0
  112. data/vendor/sass/test/sass/importer_test.rb +104 -0
  113. data/vendor/sass/test/sass/less_conversion_test.rb +632 -0
  114. data/vendor/sass/test/sass/mock_importer.rb +49 -0
  115. data/vendor/sass/test/sass/more_results/more1.css +9 -0
  116. data/vendor/sass/test/sass/more_results/more1_with_line_comments.css +26 -0
  117. data/vendor/sass/test/sass/more_results/more_import.css +29 -0
  118. data/vendor/sass/test/sass/more_templates/_more_partial.sass +2 -0
  119. data/vendor/sass/test/sass/more_templates/more1.sass +23 -0
  120. data/vendor/sass/test/sass/more_templates/more_import.sass +11 -0
  121. data/vendor/sass/test/sass/plugin_test.rb +430 -0
  122. data/vendor/sass/test/sass/results/alt.css +4 -0
  123. data/vendor/sass/test/sass/results/basic.css +9 -0
  124. data/vendor/sass/test/sass/results/compact.css +5 -0
  125. data/vendor/sass/test/sass/results/complex.css +86 -0
  126. data/vendor/sass/test/sass/results/compressed.css +1 -0
  127. data/vendor/sass/test/sass/results/expanded.css +19 -0
  128. data/vendor/sass/test/sass/results/import.css +31 -0
  129. data/vendor/sass/test/sass/results/line_numbers.css +49 -0
  130. data/vendor/sass/test/sass/results/mixins.css +95 -0
  131. data/vendor/sass/test/sass/results/multiline.css +24 -0
  132. data/vendor/sass/test/sass/results/nested.css +22 -0
  133. data/vendor/sass/test/sass/results/options.css +1 -0
  134. data/vendor/sass/test/sass/results/parent_ref.css +13 -0
  135. data/vendor/sass/test/sass/results/script.css +16 -0
  136. data/vendor/sass/test/sass/results/scss_import.css +31 -0
  137. data/vendor/sass/test/sass/results/scss_importee.css +2 -0
  138. data/vendor/sass/test/sass/results/subdir/nested_subdir/nested_subdir.css +1 -0
  139. data/vendor/sass/test/sass/results/subdir/subdir.css +3 -0
  140. data/vendor/sass/test/sass/results/units.css +11 -0
  141. data/vendor/sass/test/sass/results/warn.css +0 -0
  142. data/vendor/sass/test/sass/results/warn_imported.css +0 -0
  143. data/vendor/sass/test/sass/script_conversion_test.rb +254 -0
  144. data/vendor/sass/test/sass/script_test.rb +470 -0
  145. data/vendor/sass/test/sass/scss/css_test.rb +897 -0
  146. data/vendor/sass/test/sass/scss/rx_test.rb +156 -0
  147. data/vendor/sass/test/sass/scss/scss_test.rb +1088 -0
  148. data/vendor/sass/test/sass/scss/test_helper.rb +37 -0
  149. data/vendor/sass/test/sass/templates/_partial.sass +2 -0
  150. data/vendor/sass/test/sass/templates/alt.sass +16 -0
  151. data/vendor/sass/test/sass/templates/basic.sass +23 -0
  152. data/vendor/sass/test/sass/templates/bork1.sass +2 -0
  153. data/vendor/sass/test/sass/templates/bork2.sass +2 -0
  154. data/vendor/sass/test/sass/templates/bork3.sass +2 -0
  155. data/vendor/sass/test/sass/templates/bork4.sass +2 -0
  156. data/vendor/sass/test/sass/templates/compact.sass +17 -0
  157. data/vendor/sass/test/sass/templates/complex.sass +305 -0
  158. data/vendor/sass/test/sass/templates/compressed.sass +15 -0
  159. data/vendor/sass/test/sass/templates/expanded.sass +17 -0
  160. data/vendor/sass/test/sass/templates/import.sass +12 -0
  161. data/vendor/sass/test/sass/templates/importee.less +2 -0
  162. data/vendor/sass/test/sass/templates/importee.sass +19 -0
  163. data/vendor/sass/test/sass/templates/line_numbers.sass +13 -0
  164. data/vendor/sass/test/sass/templates/mixin_bork.sass +5 -0
  165. data/vendor/sass/test/sass/templates/mixins.sass +76 -0
  166. data/vendor/sass/test/sass/templates/multiline.sass +20 -0
  167. data/vendor/sass/test/sass/templates/nested.sass +25 -0
  168. data/vendor/sass/test/sass/templates/nested_bork1.sass +2 -0
  169. data/vendor/sass/test/sass/templates/nested_bork2.sass +2 -0
  170. data/vendor/sass/test/sass/templates/nested_bork3.sass +2 -0
  171. data/vendor/sass/test/sass/templates/nested_bork4.sass +2 -0
  172. data/vendor/sass/test/sass/templates/nested_mixin_bork.sass +6 -0
  173. data/vendor/sass/test/sass/templates/options.sass +2 -0
  174. data/vendor/sass/test/sass/templates/parent_ref.sass +25 -0
  175. data/vendor/sass/test/sass/templates/script.sass +101 -0
  176. data/vendor/sass/test/sass/templates/scss_import.scss +11 -0
  177. data/vendor/sass/test/sass/templates/scss_importee.scss +1 -0
  178. data/vendor/sass/test/sass/templates/subdir/nested_subdir/_nested_partial.sass +2 -0
  179. data/vendor/sass/test/sass/templates/subdir/nested_subdir/nested_subdir.sass +3 -0
  180. data/vendor/sass/test/sass/templates/subdir/subdir.sass +6 -0
  181. data/vendor/sass/test/sass/templates/units.sass +11 -0
  182. data/vendor/sass/test/sass/templates/warn.sass +3 -0
  183. data/vendor/sass/test/sass/templates/warn_imported.sass +4 -0
  184. data/vendor/sass/test/sass/test_helper.rb +8 -0
  185. data/vendor/sass/test/sass/util/subset_map_test.rb +91 -0
  186. data/vendor/sass/test/sass/util_test.rb +275 -0
  187. data/vendor/sass/test/test_helper.rb +64 -0
  188. data/vendor/sass/vendor/fssm/LICENSE +20 -0
  189. data/vendor/sass/vendor/fssm/README.markdown +55 -0
  190. data/vendor/sass/vendor/fssm/Rakefile +59 -0
  191. data/vendor/sass/vendor/fssm/VERSION.yml +5 -0
  192. data/vendor/sass/vendor/fssm/example.rb +9 -0
  193. data/vendor/sass/vendor/fssm/fssm.gemspec +77 -0
  194. data/vendor/sass/vendor/fssm/lib/fssm.rb +33 -0
  195. data/vendor/sass/vendor/fssm/lib/fssm/backends/fsevents.rb +36 -0
  196. data/vendor/sass/vendor/fssm/lib/fssm/backends/inotify.rb +26 -0
  197. data/vendor/sass/vendor/fssm/lib/fssm/backends/polling.rb +25 -0
  198. data/vendor/sass/vendor/fssm/lib/fssm/backends/rubycocoa/fsevents.rb +131 -0
  199. data/vendor/sass/vendor/fssm/lib/fssm/monitor.rb +26 -0
  200. data/vendor/sass/vendor/fssm/lib/fssm/path.rb +91 -0
  201. data/vendor/sass/vendor/fssm/lib/fssm/pathname.rb +502 -0
  202. data/vendor/sass/vendor/fssm/lib/fssm/state/directory.rb +57 -0
  203. data/vendor/sass/vendor/fssm/lib/fssm/state/file.rb +24 -0
  204. data/vendor/sass/vendor/fssm/lib/fssm/support.rb +63 -0
  205. data/vendor/sass/vendor/fssm/lib/fssm/tree.rb +176 -0
  206. data/vendor/sass/vendor/fssm/profile/prof-cache.rb +40 -0
  207. data/vendor/sass/vendor/fssm/profile/prof-fssm-pathname.html +1231 -0
  208. data/vendor/sass/vendor/fssm/profile/prof-pathname.rb +68 -0
  209. data/vendor/sass/vendor/fssm/profile/prof-plain-pathname.html +988 -0
  210. data/vendor/sass/vendor/fssm/profile/prof.html +2379 -0
  211. data/vendor/sass/vendor/fssm/spec/path_spec.rb +75 -0
  212. data/vendor/sass/vendor/fssm/spec/root/duck/quack.txt +0 -0
  213. data/vendor/sass/vendor/fssm/spec/root/file.css +0 -0
  214. data/vendor/sass/vendor/fssm/spec/root/file.rb +0 -0
  215. data/vendor/sass/vendor/fssm/spec/root/file.yml +0 -0
  216. data/vendor/sass/vendor/fssm/spec/root/moo/cow.txt +0 -0
  217. data/vendor/sass/vendor/fssm/spec/spec_helper.rb +14 -0
  218. data/vendor/sass/yard/callbacks.rb +29 -0
  219. data/vendor/sass/yard/default/fulldoc/html/css/common.sass +26 -0
  220. data/vendor/sass/yard/default/layout/html/footer.erb +12 -0
  221. data/vendor/sass/yard/inherited_hash.rb +41 -0
  222. metadata +219 -2
@@ -0,0 +1,123 @@
1
+ # We keep configuration in its own self-contained file
2
+ # so that we can load it independently in Rails 3,
3
+ # where the full plugin stuff is lazy-loaded.
4
+
5
+ module Sass
6
+ module Plugin
7
+ module Configuration
8
+
9
+ # Returns the default options for a {Sass::Plugin::Compiler}.
10
+ #
11
+ # @return [{Symbol => Object}]
12
+ def default_options
13
+ @default_options ||= {
14
+ :css_location => './public/stylesheets',
15
+ :always_update => false,
16
+ :always_check => true,
17
+ :full_exception => true,
18
+ :cache_location => ".sass-cache"
19
+ }.freeze
20
+ end
21
+
22
+ # Resets the options and {Sass::Callbacks::InstanceMethods#clear_callbacks! clears all callbacks}.
23
+ def reset!
24
+ @options = nil
25
+ clear_callbacks!
26
+ end
27
+
28
+ # An options hash.
29
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
30
+ #
31
+ # @return [{Symbol => Object}]
32
+ def options
33
+ @options ||= default_options.dup
34
+ @options[:cache_store] ||= Sass::FileCacheStore.new(@options[:cache_location])
35
+ @options
36
+ end
37
+
38
+ # Sets the options hash.
39
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
40
+ # See {Sass::Plugin::Configuration#reset!}
41
+ # @deprecated Instead, modify the options hash in-place.
42
+ # @param value [{Symbol => Object}] The options hash
43
+ def options=(value)
44
+ Sass::Util.sass_warn("Setting Sass::Plugin.options is deprecated " +
45
+ "and will be removed in a future release.")
46
+ options.merge!(value)
47
+ end
48
+
49
+ # Adds a new template-location/css-location mapping.
50
+ # This means that Sass/SCSS files in `template_location`
51
+ # will be compiled to CSS files in `css_location`.
52
+ #
53
+ # This is preferred over manually manipulating the {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
54
+ # since the option can be in multiple formats.
55
+ #
56
+ # Note that this method will change `options[:template_location]`
57
+ # to be in the Array format.
58
+ # This means that even if `options[:template_location]`
59
+ # had previously been a Hash or a String,
60
+ # it will now be an Array.
61
+ #
62
+ # @param template_location [String] The location where Sass/SCSS files will be.
63
+ # @param css_location [String] The location where compiled CSS files will go.
64
+ def add_template_location(template_location, css_location = options[:css_location])
65
+ normalize_template_location!
66
+ template_location_array << [template_location, css_location]
67
+ end
68
+
69
+ # Removes a template-location/css-location mapping.
70
+ # This means that Sass/SCSS files in `template_location`
71
+ # will no longer be compiled to CSS files in `css_location`.
72
+ #
73
+ # This is preferred over manually manipulating the {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
74
+ # since the option can be in multiple formats.
75
+ #
76
+ # Note that this method will change `options[:template_location]`
77
+ # to be in the Array format.
78
+ # This means that even if `options[:template_location]`
79
+ # had previously been a Hash or a String,
80
+ # it will now be an Array.
81
+ #
82
+ # @param template_location [String]
83
+ # The location where Sass/SCSS files were,
84
+ # which is now going to be ignored.
85
+ # @param css_location [String]
86
+ # The location where compiled CSS files went, but will no longer go.
87
+ # @return [Boolean]
88
+ # Non-`nil` if the given mapping already existed and was removed,
89
+ # or `nil` if nothing was changed.
90
+ def remove_template_location(template_location, css_location = options[:css_location])
91
+ normalize_template_location!
92
+ template_location_array.delete([template_location, css_location])
93
+ end
94
+
95
+ # Returns the template locations configured for Sass
96
+ # as an array of `[template_location, css_location]` pairs.
97
+ # See the {file:SASS_REFERENCE.md#template_location-option `:template_location` option}
98
+ # for details.
99
+ #
100
+ # @return [Array<(String, String)>]
101
+ # An array of `[template_location, css_location]` pairs.
102
+ def template_location_array
103
+ old_template_location = options[:template_location]
104
+ normalize_template_location!
105
+ options[:template_location]
106
+ ensure
107
+ options[:template_location] = old_template_location
108
+ end
109
+
110
+ private
111
+
112
+ def normalize_template_location!
113
+ return if options[:template_location].is_a?(Array)
114
+ options[:template_location] =
115
+ case options[:template_location]
116
+ when nil; [[File.join(options[:css_location], 'sass'), options[:css_location]]]
117
+ when String; [[options[:template_location], options[:css_location]]]
118
+ else; options[:template_location].to_a
119
+ end
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,15 @@
1
+ # The reason some options are declared here rather than in sass/plugin/configuration.rb
2
+ # is that otherwise they'd clobber the Rails-specific options.
3
+ # Since Rails' options are lazy-loaded in Rails 3,
4
+ # they're reverse-merged with the default options
5
+ # so that user configuration is preserved.
6
+ # This means that defaults that differ from Rails'
7
+ # must be declared here.
8
+
9
+ unless defined?(Sass::GENERIC_LOADED)
10
+ Sass::GENERIC_LOADED = true
11
+
12
+ Sass::Plugin.options.merge!(:css_location => './public/stylesheets',
13
+ :always_update => false,
14
+ :always_check => true)
15
+ end
@@ -0,0 +1,48 @@
1
+ unless defined?(Sass::MERB_LOADED)
2
+ Sass::MERB_LOADED = true
3
+
4
+ module Sass::Plugin::Configuration
5
+ # Different default options in a m envirionment.
6
+ def default_options
7
+ @default_options ||= begin
8
+ version = Merb::VERSION.split('.').map { |n| n.to_i }
9
+ if version[0] <= 0 && version[1] < 5
10
+ root = MERB_ROOT
11
+ env = MERB_ENV
12
+ else
13
+ root = Merb.root.to_s
14
+ env = Merb.environment
15
+ end
16
+
17
+ {
18
+ :always_update => false,
19
+ :template_location => root + '/public/stylesheets/sass',
20
+ :css_location => root + '/public/stylesheets',
21
+ :cache_location => root + '/tmp/sass-cache',
22
+ :always_check => env != "production",
23
+ :quiet => env != "production",
24
+ :full_exception => env != "production"
25
+ }.freeze
26
+ end
27
+ end
28
+ end
29
+
30
+ config = Merb::Plugins.config[:sass] || Merb::Plugins.config["sass"] || {}
31
+
32
+ if defined? config.symbolize_keys!
33
+ config.symbolize_keys!
34
+ end
35
+
36
+ Sass::Plugin.options.merge!(config)
37
+
38
+ require 'sass/plugin/rack'
39
+ class Sass::Plugin::MerbBootLoader < Merb::BootLoader
40
+ after Merb::BootLoader::RackUpApplication
41
+
42
+ def self.run
43
+ # Apparently there's no better way than this to add Sass
44
+ # to Merb's Rack stack.
45
+ Merb::Config[:app] = Sass::Plugin::Rack.new(Merb::Config[:app])
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,47 @@
1
+ module Sass
2
+ module Plugin
3
+ # Rack middleware for compiling Sass code.
4
+ #
5
+ # ## Activate
6
+ #
7
+ # require 'sass/plugin/rack'
8
+ # use Sass::Plugin::Rack
9
+ #
10
+ # ## Customize
11
+ #
12
+ # Sass::Plugin.options.merge(
13
+ # :cache_location => './tmp/sass-cache',
14
+ # :never_update => environment != :production,
15
+ # :full_exception => environment != :production)
16
+ #
17
+ # {file:SASS_REFERENCE.md#options See the Reference for more options}.
18
+ #
19
+ # ## Use
20
+ #
21
+ # Put your Sass files in `public/stylesheets/sass`.
22
+ # Your CSS will be generated in `public/stylesheets`,
23
+ # and regenerated every request if necessary.
24
+ # The locations and frequency {file:SASS_REFERENCE.md#options can be customized}.
25
+ # That's all there is to it!
26
+ class Rack
27
+ # Initialize the middleware.
28
+ #
29
+ # @param app [#call] The Rack application
30
+ def initialize(app)
31
+ @app = app
32
+ end
33
+
34
+ # Process a request, checking the Sass stylesheets for changes
35
+ # and updating them if necessary.
36
+ #
37
+ # @param env The Rack request environment
38
+ # @return [(#to_i, {String => String}, Object)] The Rack response
39
+ def call(env)
40
+ Sass::Plugin.check_for_updates
41
+ @app.call(env)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ require 'sass/plugin'
@@ -0,0 +1,41 @@
1
+ unless defined?(Sass::RAILS_LOADED)
2
+ Sass::RAILS_LOADED = true
3
+
4
+ module Sass::Plugin::Configuration
5
+ # Different default options in a rails envirionment.
6
+ def default_options
7
+ @default_options ||= {
8
+ :always_update => false,
9
+ :template_location => Sass::Util.rails_root + '/public/stylesheets/sass',
10
+ :css_location => Sass::Util.rails_root + '/public/stylesheets',
11
+ :cache_location => Sass::Util.rails_root + '/tmp/sass-cache',
12
+ :always_check => Sass::Util.rails_env == "development",
13
+ :quiet => Sass::Util.rails_env != "production",
14
+ :full_exception => Sass::Util.rails_env != "production"
15
+ }.freeze
16
+ end
17
+ end
18
+
19
+ Sass::Plugin.options.reverse_merge!(Sass::Plugin.default_options)
20
+
21
+ if defined?(ActionController::Metal)
22
+ # Rails >= 3.0
23
+ require 'sass/plugin/rack'
24
+ Rails.configuration.middleware.use(Sass::Plugin::Rack)
25
+ elsif defined?(ActionController::Dispatcher) &&
26
+ defined?(ActionController::Dispatcher.middleware)
27
+ # Rails >= 2.3
28
+ require 'sass/plugin/rack'
29
+ ActionController::Dispatcher.middleware.use(Sass::Plugin::Rack)
30
+ else
31
+ module ActionController
32
+ class Base
33
+ alias_method :sass_old_process, :process
34
+ def process(*args)
35
+ Sass::Plugin.check_for_updates
36
+ sass_old_process(*args)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,145 @@
1
+ module Sass
2
+ module Plugin
3
+ # The class handles `.s[ca]ss` file staleness checks via their mtime timestamps.
4
+ #
5
+ # To speed things up two level of caches are employed:
6
+ #
7
+ # * A class-level dependency cache which stores @import paths for each file.
8
+ # This is a long-lived cache that is reused by every StalenessChecker instance.
9
+ # * Three short-lived instance-level caches, one for file mtimes,
10
+ # one for whether a file is stale during this particular run.
11
+ # and one for the parse tree for a file.
12
+ # These are only used by a single StalenessChecker instance.
13
+ #
14
+ # Usage:
15
+ #
16
+ # * For a one-off staleness check of a single `.s[ca]ss` file,
17
+ # the class-level {stylesheet_needs_update?} method
18
+ # should be used.
19
+ # * For a series of staleness checks (e.g. checking all files for staleness)
20
+ # a StalenessChecker instance should be created,
21
+ # and the instance-level \{#stylesheet\_needs\_update?} method should be used.
22
+ # the caches should make the whole process significantly faster.
23
+ # *WARNING*: It is important not to retain the instance for too long,
24
+ # as its instance-level caches are never explicitly expired.
25
+ class StalenessChecker
26
+ DELETED = 1.0/0.0 # positive Infinity
27
+ @dependencies_cache = {}
28
+
29
+ class << self
30
+ # TODO: attach this to a compiler instance.
31
+ # @private
32
+ attr_accessor :dependencies_cache
33
+ end
34
+
35
+ # Creates a new StalenessChecker
36
+ # for checking the staleness of several stylesheets at once.
37
+ #
38
+ # @param options [{Symbol => Object}]
39
+ # See {file:SASS_REFERENCE.md#sass_options the Sass options documentation}.
40
+ def initialize(options)
41
+ @dependencies = self.class.dependencies_cache
42
+
43
+ # Entries in the following instance-level caches are never explicitly expired.
44
+ # Instead they are supposed to automaticaly go out of scope when a series of staleness checks
45
+ # (this instance of StalenessChecker was created for) is finished.
46
+ @mtimes, @dependencies_stale, @parse_trees = {}, {}, {}
47
+ @options = Sass::Engine.normalize_options(options)
48
+ end
49
+
50
+ # Returns whether or not a given CSS file is out of date
51
+ # and needs to be regenerated.
52
+ #
53
+ # @param css_file [String] The location of the CSS file to check.
54
+ # @param template_file [String] The location of the Sass or SCSS template
55
+ # that is compiled to `css_file`.
56
+ def stylesheet_needs_update?(css_file, template_file)
57
+ template_file = File.expand_path(template_file)
58
+ begin
59
+ css_mtime = File.mtime(css_file).to_i
60
+ rescue Errno::ENOENT
61
+ return true
62
+ end
63
+
64
+ dependency_updated?(css_mtime).call(
65
+ template_file, @options[:filesystem_importer].new("."))
66
+ end
67
+
68
+ # Returns whether or not a given CSS file is out of date
69
+ # and needs to be regenerated.
70
+ #
71
+ # The distinction between this method and the instance-level \{#stylesheet\_needs\_update?}
72
+ # is that the instance method preserves mtime and stale-dependency caches,
73
+ # so it's better to use when checking multiple stylesheets at once.
74
+ #
75
+ # @param css_file [String] The location of the CSS file to check.
76
+ # @param template_file [String] The location of the Sass or SCSS template
77
+ # that is compiled to `css_file`.
78
+ def self.stylesheet_needs_update?(css_file, template_file)
79
+ new(Plugin.engine_options).stylesheet_needs_update?(css_file, template_file)
80
+ end
81
+
82
+ private
83
+
84
+ def dependencies_stale?(uri, importer, css_mtime)
85
+ timestamps = @dependencies_stale[[uri, importer]] ||= {}
86
+ timestamps.each_pair do |checked_css_mtime, is_stale|
87
+ if checked_css_mtime <= css_mtime && !is_stale
88
+ return false
89
+ elsif checked_css_mtime > css_mtime && is_stale
90
+ return true
91
+ end
92
+ end
93
+ timestamps[css_mtime] = dependencies(uri, importer).any?(&dependency_updated?(css_mtime))
94
+ rescue Sass::SyntaxError
95
+ # If there's an error finding dependencies, default to recompiling.
96
+ true
97
+ end
98
+
99
+ def mtime(uri, importer)
100
+ @mtimes[[uri, importer]] ||=
101
+ begin
102
+ mtime = importer.mtime(uri, @options)
103
+ if mtime.nil?
104
+ @dependencies.delete([uri, importer])
105
+ DELETED
106
+ else
107
+ mtime.to_i
108
+ end
109
+ end
110
+ end
111
+
112
+ def dependencies(uri, importer)
113
+ stored_mtime, dependencies = @dependencies[[uri, importer]]
114
+
115
+ if !stored_mtime || stored_mtime < mtime(uri, importer)
116
+ dependencies = compute_dependencies(uri, importer)
117
+ @dependencies[[uri, importer]] = [mtime(uri, importer), dependencies]
118
+ end
119
+
120
+ dependencies
121
+ end
122
+
123
+ def dependency_updated?(css_mtime)
124
+ lambda do |uri, importer|
125
+ mtime(uri, importer) > css_mtime ||
126
+ dependencies_stale?(uri, importer, css_mtime)
127
+ end
128
+ end
129
+
130
+ def compute_dependencies(uri, importer)
131
+ tree(uri, importer).grep(Tree::ImportNode) do |n|
132
+ next if n.css_import?
133
+ file = n.imported_file
134
+ key = [file.options[:filename], file.options[:importer]]
135
+ @parse_trees[key] = file.to_tree
136
+ key
137
+ end.compact
138
+ end
139
+
140
+ def tree(uri, importer)
141
+ @parse_trees[[uri, importer]] ||= importer.find(uri, @options).to_tree
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,8 @@
1
+ # Rails 3.0.0.beta.2+
2
+ if defined?(ActiveSupport) && Sass::Util.has?(:public_method, ActiveSupport, :on_load)
3
+ require 'sass/plugin/configuration'
4
+ ActiveSupport.on_load(:before_initialize) do
5
+ require 'sass'
6
+ require 'sass/plugin'
7
+ end
8
+ end
@@ -0,0 +1,58 @@
1
+ require 'readline'
2
+
3
+ module Sass
4
+ # Runs a SassScript read-eval-print loop.
5
+ # It presents a prompt on the terminal,
6
+ # reads in SassScript expressions,
7
+ # evaluates them,
8
+ # and prints the result.
9
+ class Repl
10
+ # @param options [{Symbol => Object}] An options hash.
11
+ def initialize(options = {})
12
+ @options = options
13
+ end
14
+
15
+ # Starts the read-eval-print loop.
16
+ def run
17
+ environment = Environment.new
18
+ environment.set_var('important', Script::String.new('!important'))
19
+ @line = 0
20
+ loop do
21
+ @line += 1
22
+ unless text = Readline.readline('>> ')
23
+ puts
24
+ return
25
+ end
26
+
27
+ Readline::HISTORY << text
28
+ parse_input(environment, text)
29
+ end
30
+ end
31
+
32
+ private
33
+
34
+ def parse_input(environment, text)
35
+ case text
36
+ when Script::MATCH
37
+ name = $1
38
+ guarded = $3 == '||=' || $4
39
+ val = Script::Parser.parse($3, @line, text.size - $3.size)
40
+
41
+ unless guarded && environment.var(name)
42
+ environment.set_var(name, val.perform(environment))
43
+ end
44
+
45
+ p environment.var(name)
46
+ else
47
+ p Script::Parser.parse(text, @line, 0).perform(environment)
48
+ end
49
+ rescue Sass::SyntaxError => e
50
+ puts "SyntaxError: #{e.message}"
51
+ if @options[:trace]
52
+ e.backtrace.each do |e|
53
+ puts "\tfrom #{e}"
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end