@@ -31,20 +31,28 @@ our $VERSION = "v3.2.1";
31
31
# ###############################################################################
32
32
use CSS::Sass qw( import_sv) ;
33
33
# ###############################################################################
34
+ use overload ' ""' => ' stringify' ;
35
+ use overload ' eq' => ' equals' ;
36
+ use overload ' ==' => ' equals' ;
37
+ use overload ' ne' => ' nequals' ;
38
+ use overload ' !=' => ' nequals' ;
39
+ # ###############################################################################
40
+
34
41
sub new { import_sv($_ [1]) }
42
+ sub clone { import_sv($_ [0]) }
43
+
44
+ # default implementations
45
+ sub quoted { shift -> stringify(@_ ) }
35
46
47
+ # generic implementations
48
+ sub equals { $_ [0]-> stringify eq $_ [1] ? 1 : 0; }
49
+ sub nequals { $_ [0]-> equals($_ [1]) ? 0 : 1; }
36
50
37
51
# ###############################################################################
38
52
package CSS::Sass::Type::Null ;
39
53
# ###############################################################################
40
54
use base ' CSS::Sass::Type' ;
41
55
# ###############################################################################
42
- use overload ' ""' => ' stringify' ;
43
- use overload ' eq' => ' equals' ;
44
- use overload ' ==' => ' equals' ;
45
- use overload ' ne' => ' nequals' ;
46
- use overload ' !=' => ' nequals' ;
47
- # ###############################################################################
48
56
49
57
sub new {
50
58
my ($class ) = @_ ;
@@ -64,15 +72,15 @@ package CSS::Sass::Type::Error;
64
72
# ###############################################################################
65
73
use base ' CSS::Sass::Type' ;
66
74
# ###############################################################################
67
- use overload ' ""' => ' stringify' ;
68
- use overload ' eq' => ' equals' ;
69
- # ###############################################################################
70
75
71
76
sub new {
72
77
my ($class , @msg ) = @_ ;
73
78
bless \\ [ @msg ], $class ;
74
79
}
75
80
81
+ # cloning through sass.xs does not work?
82
+ # sub clone { bless \\ [ @{${${$_[0]}}} ] }
83
+
76
84
sub message {
77
85
wantarray ? @{${${$_ [0]}}} :
78
86
join " " , @{${${$_ [0]}}};
@@ -84,18 +92,11 @@ sub stringify {
84
92
: " error" ;
85
93
}
86
94
87
- sub equals {
88
- shift -> stringify eq $_ [0]
89
- }
90
-
91
95
# ###############################################################################
92
96
package CSS::Sass::Type::Boolean ;
93
97
# ###############################################################################
94
98
use base ' CSS::Sass::Type' ;
95
99
# ###############################################################################
96
- use overload ' ""' => ' stringify' ;
97
- use overload ' eq' => ' equals' ;
98
- # ###############################################################################
99
100
100
101
sub new {
101
102
my ($class , $bool ) = @_ ;
@@ -114,53 +115,41 @@ sub stringify {
114
115
shift -> value ? " true" : " false" ;
115
116
}
116
117
117
- sub equals {
118
- shift -> stringify eq $_ [0]
119
- }
120
-
121
118
# ###############################################################################
122
119
package CSS::Sass::Type::String ;
123
120
# ###############################################################################
124
121
use base ' CSS::Sass::Type' ;
125
122
# ###############################################################################
126
- use CSS::Sass qw( quote unquote) ;
127
- # ###############################################################################
128
- use overload ' ""' => ' stringify' ;
129
- use overload ' eq' => ' equals' ;
123
+ use CSS::Sass qw( quote) ;
130
124
# ###############################################################################
131
125
132
126
sub new {
133
127
my ($class , $string ) = @_ ;
134
128
$string = " " unless defined $string ;
135
- # we may can unquote the string!
136
- # should we really do this here?
137
129
bless \ $string , $class ;
138
130
}
139
131
140
132
sub value {
141
133
if (scalar (@_ ) > 1) {
142
134
${$_ [0]} = defined $_ [1] ? $_ [1] : " " ;
143
135
}
144
- defined ${$_ [0]} ? unquote( ${$_ [0]}) : " " ;
136
+ defined ${$_ [0]} ? ${$_ [0]} : " " ;
145
137
}
146
138
147
139
sub stringify {
148
140
$_ = shift -> value;
149
- m / ^\w *$ / ? $_ : quote( $_ ) ;
141
+ m / ^\w *$ / ? $_ : $_ ;
150
142
}
151
143
152
- sub equals {
153
- shift -> stringify eq $_ [0]
144
+ sub quoted {
145
+ quote( $_ [0]);
154
146
}
155
147
156
148
# ###############################################################################
157
149
package CSS::Sass::Type::Number ;
158
150
# ###############################################################################
159
151
use base ' CSS::Sass::Type' ;
160
152
# ###############################################################################
161
- use overload ' ""' => ' stringify' ;
162
- use overload ' eq' => ' equals' ;
163
- # ###############################################################################
164
153
165
154
sub new {
166
155
my ($class , $number , $unit ) = @_ ;
@@ -187,18 +176,11 @@ sub stringify {
187
176
sprintf " %g%s " , @{${$_ [0]}};
188
177
}
189
178
190
- sub equals {
191
- shift -> stringify eq $_ [0]
192
- }
193
-
194
179
# ###############################################################################
195
180
package CSS::Sass::Type::Color ;
196
181
# ###############################################################################
197
182
use base ' CSS::Sass::Type' ;
198
183
# ###############################################################################
199
- use overload ' ""' => ' stringify' ;
200
- use overload ' eq' => ' equals' ;
201
- # ###############################################################################
202
184
203
185
sub new {
204
186
my ($class , $r , $g , $b , $a ) = @_ ;
@@ -234,18 +216,13 @@ sub stringify {
234
216
}
235
217
}
236
218
237
- sub equals {
238
- shift -> stringify eq $_ [0]
239
- }
240
-
241
219
242
220
# ###############################################################################
243
221
package CSS::Sass::Type::Map ;
244
222
# ###############################################################################
245
223
use base ' CSS::Sass::Type' ;
246
224
# ###############################################################################
247
- use overload ' ""' => ' stringify' ;
248
- use overload ' eq' => ' equals' ;
225
+ use CSS::Sass qw( quote) ;
249
226
# ###############################################################################
250
227
251
228
sub new {
@@ -261,11 +238,7 @@ sub keys { CORE::keys %{$_[0]} }
261
238
sub values { CORE::values %{$_ [0]} }
262
239
263
240
sub stringify {
264
- join ' , ' , map { join " : " , $_ , $_ [0]-> {$_ } } CORE::keys %{$_ [0]};
265
- }
266
-
267
- sub equals {
268
- shift -> stringify eq $_ [0]
241
+ join ' , ' , map { join " : " , quote($_ ), quote($_ [0]-> {$_ }) } CORE::keys %{$_ [0]};
269
242
}
270
243
271
244
@@ -274,8 +247,7 @@ package CSS::Sass::Type::List;
274
247
# ###############################################################################
275
248
use base ' CSS::Sass::Type' ;
276
249
# ###############################################################################
277
- use overload ' ""' => ' stringify' ;
278
- use overload ' eq' => ' equals' ;
250
+ use CSS::Sass qw( SASS_COMMA) ;
279
251
# ###############################################################################
280
252
281
253
sub new {
@@ -286,8 +258,42 @@ sub new {
286
258
287
259
sub values { @{$_ [0]} }
288
260
289
- sub stringify { join ' , ' , @{$_ [0]} }
290
- sub equals { shift -> stringify eq $_ [0] }
261
+ sub listjoint { ' , ' }
262
+ sub separator { return SASS_COMMA }
263
+
264
+ sub stringify
265
+ {
266
+ join $_ [0]-> listjoint,
267
+ map { ref $_ ? $_ -> quoted : $_ }
268
+ @{$_ [0]};
269
+ }
270
+
271
+ # ignore different separators
272
+ # they have different stringifies
273
+ # so we must overload generic method
274
+ sub equals {
275
+ # compare to native type
276
+ unless (ref $_ [1]) {
277
+ return $_ [0]-> stringify eq $_ [1]
278
+ }
279
+ # compare to another list (compore arrays)
280
+ elsif ($_ [1]-> isa(' CSS::Sass::Type::List' )) {
281
+ # both arrays must have same length
282
+ return 0 if $# {$_ [0]} != $# {$_ [1]};
283
+ # all items must be equal to the other items
284
+ for (my ($i , $L ) = (0, scalar (@{$_ [0]})); $i < $L ; $i ++)
285
+ { return 0 if $_ [0]-> [$i ] ne $_ [1]-> [$i ]; }
286
+ # no diffs
287
+ return 1;
288
+ }
289
+ # other value
290
+ else
291
+ {
292
+ return 0;
293
+ # is always false
294
+ # $_[0] !== $_[1];
295
+ }
296
+ }
291
297
292
298
# ###############################################################################
293
299
package CSS::Sass::Type::List::Comma ;
@@ -298,7 +304,7 @@ use CSS::Sass qw(SASS_COMMA);
298
304
# ###############################################################################
299
305
sub new { shift -> SUPER::new(@_ ) }
300
306
sub separator { return SASS_COMMA }
301
- sub stringify { join ' , ' , @{ $_ [0]} }
307
+ sub listjoint { ' , ' }
302
308
303
309
# ###############################################################################
304
310
package CSS::Sass::Type::List::Space ;
@@ -309,7 +315,7 @@ use CSS::Sass qw(SASS_SPACE);
309
315
# ###############################################################################
310
316
sub new { shift -> SUPER::new(@_ ) }
311
317
sub separator { return SASS_SPACE }
312
- sub stringify { join ' ' , @{ $_ [0]} }
318
+ sub listjoint { ' ' }
313
319
314
320
# ###############################################################################
315
321
package CSS::Sass::Type ;
@@ -385,19 +391,19 @@ It only implements a generic constructor, which accepts native perl data types
385
391
=head2 CSS::Sass::Type::Map
386
392
387
393
my $map = CSS::Sass::Type::Map->new(key => 'value');
388
- my $string = "$map"; # eq 'key: value'
389
- my $value = $map->{'key'}; # eq 'value'
394
+ my $string = "$map"; # eq 'key: " value" '
395
+ my $value = $map->{'key'}; # eq '" value" '
390
396
391
397
=head2 CSS::Sass::Type::List::Comma
392
398
393
399
my $list = CSS::Sass::Type::List::Comma->new('foo', 'bar');
394
- my $string = "$list"; # eq 'foo, bar'
400
+ my $string = "$list"; # eq '" foo", " bar" '
395
401
my $value = $list->[0]; # eq 'foo'
396
402
397
403
=head2 CSS::Sass::Type::List::Space
398
404
399
405
my $list = CSS::Sass::Type::List::Space->new('foo', 'bar');
400
- my $string = "$list"; # eq 'foo bar'
406
+ my $string = "$list"; # eq '" foo" " bar" '
401
407
my $value = $list->[-1]; # eq 'bar'
402
408
403
409
=head1 SEE ALSO
@@ -406,7 +412,7 @@ L<CSS::Sass>
406
412
407
413
=head1 AUTHOR
408
414
409
- David Caldwell E<lt> [email protected] E<gt>
415
+ David Caldwell E<lt> [email protected] E<gt>
410
416
Marcel Greter E<lt> [email protected] E<gt>
411
417
412
418
=head1 LICENSE
0 commit comments