haml-edge 2.1.21 → 2.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/EDGE_GEM_VERSION +1 -1
- data/FAQ.md +142 -0
- data/{README.rdoc → README.md} +141 -141
- data/Rakefile +29 -17
- data/VERSION +1 -1
- data/lib/haml/buffer.rb +63 -27
- data/lib/haml/engine.rb +103 -80
- data/lib/haml/error.rb +7 -7
- data/lib/haml/exec.rb +80 -26
- data/lib/haml/filters.rb +106 -40
- data/lib/haml/helpers/action_view_extensions.rb +34 -39
- data/lib/haml/helpers/action_view_mods.rb +132 -139
- data/lib/haml/helpers.rb +207 -153
- data/lib/haml/html.rb +40 -21
- data/lib/haml/precompiler.rb +2 -0
- data/lib/haml/shared.rb +34 -3
- data/lib/haml/template/patch.rb +1 -1
- data/lib/haml/template/plugin.rb +0 -2
- data/lib/haml/template.rb +5 -0
- data/lib/haml/util.rb +136 -1
- data/lib/haml/version.rb +16 -4
- data/lib/haml.rb +502 -481
- data/lib/sass/css.rb +106 -68
- data/lib/sass/engine.rb +55 -22
- data/lib/sass/environment.rb +52 -21
- data/lib/sass/error.rb +23 -12
- data/lib/sass/files.rb +27 -0
- data/lib/sass/plugin/merb.rb +2 -2
- data/lib/sass/plugin/rails.rb +0 -2
- data/lib/sass/plugin.rb +32 -23
- data/lib/sass/repl.rb +7 -0
- data/lib/sass/script/bool.rb +9 -5
- data/lib/sass/script/color.rb +87 -1
- data/lib/sass/script/funcall.rb +23 -2
- data/lib/sass/script/functions.rb +93 -44
- data/lib/sass/script/lexer.rb +33 -3
- data/lib/sass/script/literal.rb +93 -1
- data/lib/sass/script/node.rb +14 -0
- data/lib/sass/script/number.rb +128 -4
- data/lib/sass/script/operation.rb +16 -1
- data/lib/sass/script/parser.rb +51 -21
- data/lib/sass/script/string.rb +7 -4
- data/lib/sass/script/unary_operation.rb +14 -1
- data/lib/sass/script/variable.rb +12 -1
- data/lib/sass/script.rb +26 -5
- data/lib/sass/tree/attr_node.rb +46 -9
- data/lib/sass/tree/comment_node.rb +41 -1
- data/lib/sass/tree/debug_node.rb +8 -0
- data/lib/sass/tree/directive_node.rb +20 -0
- data/lib/sass/tree/file_node.rb +12 -0
- data/lib/sass/tree/for_node.rb +15 -0
- data/lib/sass/tree/if_node.rb +22 -0
- data/lib/sass/tree/mixin_def_node.rb +12 -1
- data/lib/sass/tree/mixin_node.rb +13 -0
- data/lib/sass/tree/node.rb +136 -6
- data/lib/sass/tree/rule_node.rb +66 -7
- data/lib/sass/tree/variable_node.rb +10 -0
- data/lib/sass/tree/while_node.rb +11 -1
- data/lib/sass.rb +544 -534
- metadata +7 -6
- data/FAQ +0 -138
data/lib/sass/css.rb
CHANGED
@@ -3,14 +3,18 @@ require 'sass/tree/node'
|
|
3
3
|
require 'strscan'
|
4
4
|
|
5
5
|
module Sass
|
6
|
-
# :stopdoc:
|
7
6
|
module Tree
|
8
7
|
class Node
|
9
|
-
|
8
|
+
# Converts a node to Sass code that will generate it.
|
9
|
+
#
|
10
|
+
# @param tabs [Fixnum] The amount of tabulation to use for the Sass code
|
11
|
+
# @param opts [Hash<Symbol, Object>] An options hash (see {Sass::CSS#initialize})
|
12
|
+
# @return [String] The Sass code corresponding to the node
|
13
|
+
def to_sass(tabs = 0, opts = {})
|
10
14
|
result = ''
|
11
15
|
|
12
16
|
children.each do |child|
|
13
|
-
result << "#{child.to_sass(0, opts)}\n"
|
17
|
+
result << "#{' ' * tabs}#{child.to_sass(0, opts)}\n"
|
14
18
|
end
|
15
19
|
|
16
20
|
result
|
@@ -18,6 +22,7 @@ module Sass
|
|
18
22
|
end
|
19
23
|
|
20
24
|
class RuleNode
|
25
|
+
# @see Node#to_sass
|
21
26
|
def to_sass(tabs, opts = {})
|
22
27
|
str = "\n#{' ' * tabs}#{rules.first}#{children.any? { |c| c.is_a? AttrNode } ? "\n" : ''}"
|
23
28
|
|
@@ -30,26 +35,33 @@ module Sass
|
|
30
35
|
end
|
31
36
|
|
32
37
|
class AttrNode
|
38
|
+
# @see Node#to_sass
|
33
39
|
def to_sass(tabs, opts = {})
|
34
40
|
"#{' ' * tabs}#{opts[:alternate] ? '' : ':'}#{name}#{opts[:alternate] ? ':' : ''} #{value}\n"
|
35
41
|
end
|
36
42
|
end
|
37
43
|
|
38
44
|
class DirectiveNode
|
45
|
+
# @see Node#to_sass
|
39
46
|
def to_sass(tabs, opts = {})
|
40
47
|
"#{' ' * tabs}#{value}#{children.map {|c| c.to_sass(tabs + 1, opts)}}\n"
|
41
48
|
end
|
42
49
|
end
|
43
50
|
end
|
44
51
|
|
45
|
-
#
|
46
|
-
|
47
|
-
#
|
48
|
-
#
|
52
|
+
# This class converts CSS documents into Sass templates.
|
53
|
+
# It works by parsing the CSS document into a {Sass::Tree} structure,
|
54
|
+
# and then applying various transformations to the structure
|
55
|
+
# to produce more concise and idiomatic Sass.
|
56
|
+
#
|
57
|
+
# Example usage:
|
58
|
+
#
|
59
|
+
# Sass::CSS.new("p { color: blue }").render #=> "p\n :color blue"
|
49
60
|
class CSS
|
50
|
-
|
51
|
-
#
|
52
|
-
#
|
61
|
+
# @param template [String] The CSS code
|
62
|
+
# @option options :alternate [Boolean] (false)
|
63
|
+
# Whether or not to output alternate attribute syntax
|
64
|
+
# (`color: blue` as opposed to `:color blue`).
|
53
65
|
def initialize(template, options = {})
|
54
66
|
if template.is_a? IO
|
55
67
|
template = template.read
|
@@ -59,11 +71,12 @@ module Sass
|
|
59
71
|
@template = StringScanner.new(template)
|
60
72
|
end
|
61
73
|
|
62
|
-
#
|
63
|
-
#
|
74
|
+
# Converts the CSS template into Sass code.
|
75
|
+
#
|
76
|
+
# @return [String] The resulting Sass code
|
64
77
|
def render
|
65
78
|
begin
|
66
|
-
build_tree.to_sass(@options).strip + "\n"
|
79
|
+
build_tree.to_sass(0, @options).strip + "\n"
|
67
80
|
rescue Exception => err
|
68
81
|
line = @template.string[0...@template.pos].split("\n").size
|
69
82
|
|
@@ -74,6 +87,9 @@ module Sass
|
|
74
87
|
|
75
88
|
private
|
76
89
|
|
90
|
+
# Parses the CSS template and applies various transformations
|
91
|
+
#
|
92
|
+
# @return [Tree::Node] The root node of the parsed tree
|
77
93
|
def build_tree
|
78
94
|
root = Tree::Node.new
|
79
95
|
whitespace
|
@@ -86,6 +102,9 @@ module Sass
|
|
86
102
|
root
|
87
103
|
end
|
88
104
|
|
105
|
+
# Parses a set of CSS rules.
|
106
|
+
#
|
107
|
+
# @param root [Tree::Node] The parent node of the rules
|
89
108
|
def rules(root)
|
90
109
|
while r = rule
|
91
110
|
root << r
|
@@ -93,6 +112,9 @@ module Sass
|
|
93
112
|
end
|
94
113
|
end
|
95
114
|
|
115
|
+
# Parses a single CSS rule.
|
116
|
+
#
|
117
|
+
# @return [Tree::Node] The parsed rule
|
96
118
|
def rule
|
97
119
|
return unless rule = @template.scan(/[^\{\};]+/)
|
98
120
|
rule.strip!
|
@@ -115,6 +137,9 @@ module Sass
|
|
115
137
|
return node
|
116
138
|
end
|
117
139
|
|
140
|
+
# Parses a set of CSS attributes within a rule.
|
141
|
+
#
|
142
|
+
# @param rule [Tree::RuleNode] The parent node of the attributes
|
118
143
|
def attributes(rule)
|
119
144
|
while @template.scan(/[^:\}\s]+/)
|
120
145
|
name = @template[0]
|
@@ -134,6 +159,9 @@ module Sass
|
|
134
159
|
assert_match /\}/
|
135
160
|
end
|
136
161
|
|
162
|
+
# Moves the scanner over a section of whitespace or comments.
|
163
|
+
#
|
164
|
+
# @return [String] The ignored whitespace
|
137
165
|
def whitespace
|
138
166
|
space = @template.scan(/\s*/) || ''
|
139
167
|
|
@@ -146,6 +174,10 @@ module Sass
|
|
146
174
|
return space
|
147
175
|
end
|
148
176
|
|
177
|
+
# Moves the scanner over a regular expression,
|
178
|
+
# raising an exception if it doesn't match.
|
179
|
+
#
|
180
|
+
# @param re [Regexp] The regular expression to assert
|
149
181
|
def assert_match(re)
|
150
182
|
if !@template.scan(re)
|
151
183
|
line = @template.string[0..@template.pos].count "\n"
|
@@ -158,20 +190,19 @@ module Sass
|
|
158
190
|
|
159
191
|
# Transform
|
160
192
|
#
|
161
|
-
#
|
162
|
-
#
|
193
|
+
# foo, bar, baz
|
194
|
+
# color: blue
|
163
195
|
#
|
164
196
|
# into
|
165
197
|
#
|
166
|
-
#
|
167
|
-
#
|
168
|
-
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#
|
198
|
+
# foo
|
199
|
+
# color: blue
|
200
|
+
# bar
|
201
|
+
# color: blue
|
202
|
+
# baz
|
203
|
+
# color: blue
|
172
204
|
#
|
173
|
-
#
|
174
|
-
# but it's necessary to get nesting to work properly.
|
205
|
+
# @param root [Tree::Node] The parent node
|
175
206
|
def expand_commas(root)
|
176
207
|
root.children.map! do |child|
|
177
208
|
next child unless Tree::RuleNode === child && child.rules.first.include?(',')
|
@@ -186,37 +217,38 @@ module Sass
|
|
186
217
|
|
187
218
|
# Make rules use parent refs so that
|
188
219
|
#
|
189
|
-
#
|
190
|
-
#
|
191
|
-
#
|
192
|
-
#
|
220
|
+
# foo
|
221
|
+
# color: green
|
222
|
+
# foo.bar
|
223
|
+
# color: blue
|
193
224
|
#
|
194
225
|
# becomes
|
195
226
|
#
|
196
|
-
#
|
197
|
-
#
|
198
|
-
#
|
199
|
-
#
|
227
|
+
# foo
|
228
|
+
# color: green
|
229
|
+
# &.bar
|
230
|
+
# color: blue
|
200
231
|
#
|
201
232
|
# This has the side effect of nesting rules,
|
202
233
|
# so that
|
203
234
|
#
|
204
|
-
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
208
|
-
#
|
209
|
-
#
|
235
|
+
# foo
|
236
|
+
# color: green
|
237
|
+
# foo bar
|
238
|
+
# color: red
|
239
|
+
# foo baz
|
240
|
+
# color: blue
|
210
241
|
#
|
211
242
|
# becomes
|
212
243
|
#
|
213
|
-
#
|
214
|
-
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
#
|
218
|
-
#
|
244
|
+
# foo
|
245
|
+
# color: green
|
246
|
+
# & bar
|
247
|
+
# color: red
|
248
|
+
# & baz
|
249
|
+
# color: blue
|
219
250
|
#
|
251
|
+
# @param root [Tree::Node] The parent node
|
220
252
|
def parent_ref_rules(root)
|
221
253
|
current_rule = nil
|
222
254
|
root.children.select { |c| Tree::RuleNode === c }.each do |child|
|
@@ -241,16 +273,17 @@ module Sass
|
|
241
273
|
|
242
274
|
# Remove useless parent refs so that
|
243
275
|
#
|
244
|
-
#
|
245
|
-
#
|
246
|
-
#
|
276
|
+
# foo
|
277
|
+
# & bar
|
278
|
+
# color: blue
|
247
279
|
#
|
248
280
|
# becomes
|
249
281
|
#
|
250
|
-
#
|
251
|
-
#
|
252
|
-
#
|
282
|
+
# foo
|
283
|
+
# bar
|
284
|
+
# color: blue
|
253
285
|
#
|
286
|
+
# @param root [Tree::Node] The parent node
|
254
287
|
def remove_parent_refs(root)
|
255
288
|
root.children.each do |child|
|
256
289
|
if child.is_a?(Tree::RuleNode)
|
@@ -262,31 +295,35 @@ module Sass
|
|
262
295
|
|
263
296
|
# Flatten rules so that
|
264
297
|
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
268
|
-
# color: red
|
298
|
+
# foo
|
299
|
+
# bar
|
300
|
+
# :color red
|
269
301
|
#
|
270
302
|
# becomes
|
271
303
|
#
|
272
|
-
#
|
273
|
-
#
|
304
|
+
# foo bar
|
305
|
+
# :color red
|
274
306
|
#
|
275
307
|
# and
|
276
308
|
#
|
277
|
-
#
|
278
|
-
#
|
279
|
-
#
|
309
|
+
# foo
|
310
|
+
# &.bar
|
311
|
+
# color: blue
|
280
312
|
#
|
281
313
|
# becomes
|
282
314
|
#
|
283
|
-
#
|
284
|
-
#
|
315
|
+
# foo.bar
|
316
|
+
# color: blue
|
285
317
|
#
|
318
|
+
# @param root [Tree::Node] The parent node
|
286
319
|
def flatten_rules(root)
|
287
320
|
root.children.each { |child| flatten_rule(child) if child.is_a?(Tree::RuleNode) }
|
288
321
|
end
|
289
322
|
|
323
|
+
# Flattens a single rule
|
324
|
+
#
|
325
|
+
# @param rule [Tree::RuleNode] The candidate for flattening
|
326
|
+
# @see #flatten_rules
|
290
327
|
def flatten_rule(rule)
|
291
328
|
while rule.children.size == 1 && rule.children.first.is_a?(Tree::RuleNode)
|
292
329
|
child = rule.children.first
|
@@ -305,18 +342,19 @@ module Sass
|
|
305
342
|
|
306
343
|
# Transform
|
307
344
|
#
|
308
|
-
#
|
309
|
-
#
|
310
|
-
#
|
311
|
-
#
|
312
|
-
#
|
345
|
+
# foo
|
346
|
+
# bar
|
347
|
+
# color: blue
|
348
|
+
# baz
|
349
|
+
# color: blue
|
313
350
|
#
|
314
351
|
# into
|
315
352
|
#
|
316
|
-
#
|
317
|
-
#
|
318
|
-
#
|
353
|
+
# foo
|
354
|
+
# bar, baz
|
355
|
+
# color: blue
|
319
356
|
#
|
357
|
+
# @param rule [Tree::RuleNode] The candidate for flattening
|
320
358
|
def fold_commas(root)
|
321
359
|
prev_rule = nil
|
322
360
|
root.children.map! do |child|
|
data/lib/sass/engine.rb
CHANGED
@@ -20,20 +20,55 @@ require 'sass/files'
|
|
20
20
|
require 'haml/shared'
|
21
21
|
|
22
22
|
module Sass
|
23
|
-
#
|
23
|
+
# A Sass mixin.
|
24
|
+
#
|
25
|
+
# `name`: [{String}]
|
26
|
+
# : The name of the mixin.
|
27
|
+
#
|
28
|
+
# `args`: [{Array}<({String}, {Script::Node})>]
|
29
|
+
# : The arguments for the mixin.
|
30
|
+
# Each element is a tuple containing the name of the argument
|
31
|
+
# and the parse tree for the default value of the argument.
|
32
|
+
#
|
33
|
+
# `environment`: [{Sass::Environment}]
|
34
|
+
# : The environment in which the mixin was defined.
|
35
|
+
# This is captured so that the mixin can have access
|
36
|
+
# to local variables defined in its scope.
|
37
|
+
#
|
38
|
+
# `tree`: [{Sass::Tree::Node}]
|
39
|
+
# : The parse tree for the mixin.
|
24
40
|
Mixin = Struct.new(:name, :args, :environment, :tree)
|
25
|
-
# :startdoc:
|
26
41
|
|
27
|
-
# This
|
28
|
-
#
|
29
|
-
# new instance and calling <tt>render</tt> to render the template. For example:
|
42
|
+
# This class handles the parsing and compilation of the Sass template.
|
43
|
+
# Example usage:
|
30
44
|
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
45
|
+
# template = File.load('stylesheets/sassy.sass')
|
46
|
+
# sass_engine = Sass::Engine.new(template)
|
47
|
+
# output = sass_engine.render
|
48
|
+
# puts output
|
35
49
|
class Engine
|
36
50
|
include Haml::Util
|
51
|
+
|
52
|
+
# A line of Sass code.
|
53
|
+
#
|
54
|
+
# `text`: [{String}]
|
55
|
+
# : The text in the line, without any whitespace at the beginning or end.
|
56
|
+
#
|
57
|
+
# `tabs`: [{Fixnum}]
|
58
|
+
# : The level of indentation of the line.
|
59
|
+
#
|
60
|
+
# `index`: [{Fixnum}]
|
61
|
+
# : The line number in the original document.
|
62
|
+
#
|
63
|
+
# `offset`: [{Fixnum}]
|
64
|
+
# : The number of bytes in on the line that the text begins.
|
65
|
+
# This ends up being the number of bytes of leading whitespace.
|
66
|
+
#
|
67
|
+
# `filename`: [{String}]
|
68
|
+
# : The name of the file in which this line appeared.
|
69
|
+
#
|
70
|
+
# `children`: [{Array}<{Line}>]
|
71
|
+
# : The lines nested below this one.
|
37
72
|
Line = Struct.new(:text, :tabs, :index, :offset, :filename, :children)
|
38
73
|
|
39
74
|
# The character that begins a CSS attribute.
|
@@ -86,30 +121,28 @@ module Sass
|
|
86
121
|
:cache_location => './.sass-cache',
|
87
122
|
}.freeze
|
88
123
|
|
89
|
-
#
|
90
|
-
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#--
|
94
|
-
#
|
95
|
-
# TODO: Add current options to REFRENCE. Remember :filename!
|
96
|
-
#
|
97
|
-
# When adding options, remember to add information about them
|
98
|
-
# to README.rdoc!
|
99
|
-
#++
|
100
|
-
#
|
124
|
+
# @param template [String] The Sass template.
|
125
|
+
# @param options [Hash<Symbol, Object>] An options hash;
|
126
|
+
# see [the Sass options documentation](../Sass.html#sass_options)
|
101
127
|
def initialize(template, options={})
|
102
128
|
@options = DEFAULT_OPTIONS.merge(options)
|
103
129
|
@template = template
|
104
130
|
end
|
105
131
|
|
106
|
-
#
|
132
|
+
# Render the template to CSS.
|
133
|
+
#
|
134
|
+
# @return [String] The CSS
|
135
|
+
# @raise [Sass::SyntaxError] if there's an error in the document
|
107
136
|
def render
|
108
137
|
to_tree.render
|
109
138
|
end
|
110
139
|
|
111
140
|
alias_method :to_css, :render
|
112
141
|
|
142
|
+
# Parses the document into its parse tree.
|
143
|
+
#
|
144
|
+
# @return [Sass::Tree::Node] The root of the parse tree.
|
145
|
+
# @raise [Sass::SyntaxError] if there's an error in the document
|
113
146
|
def to_tree
|
114
147
|
root = Tree::Node.new
|
115
148
|
append_children(root, tree(tabulate(@template)).first, true)
|
data/lib/sass/environment.rb
CHANGED
@@ -1,8 +1,24 @@
|
|
1
1
|
module Sass
|
2
|
+
# The lexical environment for SassScript.
|
3
|
+
# This keeps track of variable and mixin definitions.
|
4
|
+
#
|
5
|
+
# A new environment is created for each level of Sass nesting.
|
6
|
+
# This allows variables to be lexically scoped.
|
7
|
+
# The new environment refers to the environment in the upper scope,
|
8
|
+
# so it has access to variables defined in enclosing scopes,
|
9
|
+
# but new variables are defined locally.
|
10
|
+
#
|
11
|
+
# Environment also keeps track of the {Engine} options
|
12
|
+
# so that they can be made available to {Sass::Script::Functions}.
|
2
13
|
class Environment
|
14
|
+
# The enclosing environment,
|
15
|
+
# or nil if this is the global environment.
|
16
|
+
#
|
17
|
+
# @return [Environment]
|
3
18
|
attr_reader :parent
|
4
19
|
attr_writer :options
|
5
20
|
|
21
|
+
# @param parent [Environment] See \{#parent}
|
6
22
|
def initialize(parent = nil)
|
7
23
|
@vars = {}
|
8
24
|
@mixins = {}
|
@@ -11,38 +27,53 @@ module Sass
|
|
11
27
|
set_var("important", Script::String.new("!important")) unless @parent
|
12
28
|
end
|
13
29
|
|
30
|
+
# The options hash.
|
31
|
+
# See [the Sass options documentation](../Sass.html#sass_options).
|
32
|
+
#
|
33
|
+
# @return [Hash<Symbol, Object>]
|
14
34
|
def options
|
15
35
|
@options || (parent && parent.options) || {}
|
16
36
|
end
|
17
37
|
|
18
|
-
|
19
|
-
|
20
|
-
def #{name}(name)
|
21
|
-
@#{name}s[name] || @parent && @parent.#{name}(name)
|
22
|
-
end
|
38
|
+
class << self
|
39
|
+
private
|
23
40
|
|
24
|
-
|
25
|
-
|
26
|
-
|
41
|
+
# Note: when updating this,
|
42
|
+
# update haml/yard/inherited_hash.rb as well.
|
43
|
+
def inherited_hash(name)
|
44
|
+
class_eval <<RUBY, __FILE__, __LINE__ + 1
|
45
|
+
def #{name}(name)
|
46
|
+
@#{name}s[name] || @parent && @parent.#{name}(name)
|
47
|
+
end
|
27
48
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
49
|
+
def set_#{name}(name, value)
|
50
|
+
@#{name}s[name] = value unless try_set_#{name}(name, value)
|
51
|
+
end
|
52
|
+
|
53
|
+
def try_set_#{name}(name, value)
|
54
|
+
if @#{name}s.include?(name)
|
55
|
+
@#{name}s[name] = value
|
56
|
+
true
|
57
|
+
elsif @parent
|
58
|
+
@parent.try_set_#{name}(name, value)
|
59
|
+
else
|
60
|
+
false
|
61
|
+
end
|
36
62
|
end
|
37
|
-
|
38
|
-
protected :try_set_#{name}
|
63
|
+
protected :try_set_#{name}
|
39
64
|
|
40
|
-
|
41
|
-
|
42
|
-
|
65
|
+
def set_local_#{name}(name, value)
|
66
|
+
@#{name}s[name] = value
|
67
|
+
end
|
43
68
|
RUBY
|
69
|
+
end
|
44
70
|
end
|
71
|
+
|
72
|
+
# variable
|
73
|
+
# Script::Literal
|
45
74
|
inherited_hash :var
|
75
|
+
# mixin
|
76
|
+
# Engine::Mixin
|
46
77
|
inherited_hash :mixin
|
47
78
|
end
|
48
79
|
end
|
data/lib/sass/error.rb
CHANGED
@@ -1,25 +1,34 @@
|
|
1
1
|
module Sass
|
2
|
-
#
|
3
|
-
#
|
2
|
+
# An exception class that keeps track of
|
3
|
+
# the line of the Sass template it was raised on
|
4
4
|
# and the Sass file that was being parsed (if applicable).
|
5
|
-
#
|
6
|
-
#
|
5
|
+
#
|
6
|
+
# All Sass errors are raised as {Sass::SyntaxError}s.
|
7
7
|
class SyntaxError < StandardError
|
8
|
-
# The line of the Sass template on which the
|
8
|
+
# The line of the Sass template on which the error occurred.
|
9
|
+
#
|
10
|
+
# @return [Fixnum]
|
9
11
|
attr_accessor :sass_line
|
10
12
|
|
11
13
|
# The name of the file that was being parsed when the exception was raised.
|
12
|
-
# This
|
14
|
+
# This could be `nil` if no filename is available.
|
15
|
+
#
|
16
|
+
# @return [String]
|
13
17
|
attr_reader :sass_filename
|
14
18
|
|
15
|
-
#
|
16
|
-
#
|
19
|
+
# @param msg [String] The error message
|
20
|
+
# @param lineno [Fixnum] See \{#sass\_line}
|
17
21
|
def initialize(msg, lineno = nil)
|
18
22
|
@message = msg
|
19
23
|
@sass_line = lineno
|
20
24
|
end
|
21
25
|
|
22
|
-
# Add information about the filename and line on which the error was raised
|
26
|
+
# Add information about the filename and line on which the error was raised,
|
27
|
+
# and re-raises the exception.
|
28
|
+
#
|
29
|
+
# @param filename [String] See \{#sass\_filename}
|
30
|
+
# @param line [Fixnum] See \{#sass\_line}
|
31
|
+
# @raise [Sass::SyntaxError] self
|
23
32
|
def add_metadata(filename, line)
|
24
33
|
self.sass_line ||= line
|
25
34
|
add_backtrace_entry(filename) unless sass_filename
|
@@ -27,15 +36,17 @@ module Sass
|
|
27
36
|
end
|
28
37
|
|
29
38
|
# Adds a properly formatted entry to the exception's backtrace.
|
30
|
-
#
|
31
|
-
#
|
39
|
+
#
|
40
|
+
# @param filename [String] The file in which the error occurred,
|
41
|
+
# if applicable (defaults to "(sass)")
|
32
42
|
def add_backtrace_entry(filename) # :nodoc:
|
33
43
|
@sass_filename ||= filename
|
34
44
|
self.backtrace ||= []
|
35
45
|
self.backtrace.unshift "#{@sass_filename || '(sass)'}:#{@sass_line}"
|
36
46
|
end
|
37
47
|
|
38
|
-
|
48
|
+
# @return [String] The error message
|
49
|
+
def to_s
|
39
50
|
@message
|
40
51
|
end
|
41
52
|
end
|
data/lib/sass/files.rb
CHANGED
@@ -7,6 +7,13 @@ module Sass
|
|
7
7
|
module Files
|
8
8
|
extend self
|
9
9
|
|
10
|
+
# Returns the {Sass::Tree} for the given file,
|
11
|
+
# reading it from the Sass cache if possible.
|
12
|
+
#
|
13
|
+
# @param filename [String] The path to the Sass file
|
14
|
+
# @param options [Hash<Symbol, Object>] The options hash.
|
15
|
+
# Only the [`:cache_location`](../Sass.html#cache-option) option is used
|
16
|
+
# @raise [Sass::SyntaxError] if there's an error in the document
|
10
17
|
def tree_for(filename, options)
|
11
18
|
options = Sass::Engine::DEFAULT_OPTIONS.merge(options)
|
12
19
|
text = File.read(filename)
|
@@ -35,6 +42,26 @@ module Sass
|
|
35
42
|
root
|
36
43
|
end
|
37
44
|
|
45
|
+
# Find the full filename of a Sass or CSS file to import.
|
46
|
+
# This follows Sass's import rules:
|
47
|
+
# if the filename given ends in `".sass"` or `".css"`,
|
48
|
+
# it will try to find that type of file;
|
49
|
+
# otherwise, it will try to find the corresponding Sass file
|
50
|
+
# and fall back on CSS if it's not available.
|
51
|
+
#
|
52
|
+
# Any Sass filename returned will correspond to
|
53
|
+
# an actual Sass file on the filesystem.
|
54
|
+
# CSS filenames, however, may not;
|
55
|
+
# they're expected to be put through directly to the stylesheet
|
56
|
+
# as CSS `@import` statements.
|
57
|
+
#
|
58
|
+
# @param filename [String] The filename to search for
|
59
|
+
# @param load_paths [Array<String>] The set of filesystem paths
|
60
|
+
# to search for Sass files.
|
61
|
+
# @return [String] The filename of the imported file.
|
62
|
+
# This is an absolute path if the file is a `".sass"` file.
|
63
|
+
# @raise [Sass::SyntaxError] if `filename` ends in ``".sass"``
|
64
|
+
# and no corresponding Sass file could be found.
|
38
65
|
def find_file_to_import(filename, load_paths)
|
39
66
|
was_sass = false
|
40
67
|
original_filename = filename
|
data/lib/sass/plugin/merb.rb
CHANGED
@@ -25,7 +25,7 @@ unless defined?(Sass::MERB_LOADED)
|
|
25
25
|
|
26
26
|
if version[0] > 0 || version[1] >= 9
|
27
27
|
|
28
|
-
class Merb::Rack::Application
|
28
|
+
class Merb::Rack::Application
|
29
29
|
def call_with_sass(env)
|
30
30
|
if !Sass::Plugin.checked_for_updates ||
|
31
31
|
Sass::Plugin.options[:always_update] || Sass::Plugin.options[:always_check]
|
@@ -40,7 +40,7 @@ unless defined?(Sass::MERB_LOADED)
|
|
40
40
|
|
41
41
|
else
|
42
42
|
|
43
|
-
class MerbHandler
|
43
|
+
class MerbHandler
|
44
44
|
def process_with_sass(request, response)
|
45
45
|
if !Sass::Plugin.checked_for_updates ||
|
46
46
|
Sass::Plugin.options[:always_update] || Sass::Plugin.options[:always_check]
|
data/lib/sass/plugin/rails.rb
CHANGED
@@ -7,7 +7,6 @@ unless defined?(Sass::RAILS_LOADED)
|
|
7
7
|
:always_check => RAILS_ENV != "production",
|
8
8
|
:full_exception => RAILS_ENV != "production")
|
9
9
|
|
10
|
-
# :stopdoc:
|
11
10
|
module ActionController
|
12
11
|
class Base
|
13
12
|
alias_method :sass_old_process, :process
|
@@ -21,5 +20,4 @@ unless defined?(Sass::RAILS_LOADED)
|
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
24
|
-
# :startdoc:
|
25
23
|
end
|