Skip to content

Commit eeecd4e

Browse files
committed
Updates for libsass release 3.2.4
1 parent 1fc4976 commit eeecd4e

13 files changed

+820
-615
lines changed

Changes

+7
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
CSS::Sass (3.2.2)
2+
3+
* Update to latest libsass release (3.2.4)
4+
* Rename CSS::Sass::Type to CSS::Sass::Value
5+
* Old namespace is still supported ("linked")
6+
* Add more overload operators for sass values
7+
18
CSS::Sass (3.2.1)
29

310
* Update some outdated documentation

lib/CSS/Sass.pm

+19-17
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ our @ISA = qw(Exporter);
1818
our @EXPORT_OK = qw(
1919
quote
2020
unquote
21+
safequote
22+
need_quotes
2123
sass2scss
2224
import_sv
2325
sass_compile
@@ -50,11 +52,11 @@ our @EXPORT = qw(
5052
SASS2SCSS_CONVERT_COMMENT
5153
);
5254

53-
our $VERSION = "v3.2.1";
55+
our $VERSION = "v3.2.2";
5456

5557
require XSLoader;
5658
XSLoader::load('CSS::Sass', $VERSION);
57-
require CSS::Sass::Type;
59+
require CSS::Sass::Value;
5860

5961
sub new
6062
{
@@ -188,7 +190,7 @@ CSS::Sass - Compile .scss files using libsass
188190
my $css = $sass->compile_file('styles.scss');
189191
190192
# Add custom function to use inside your Sass code
191-
sub foobar { CSS::Sass::Type::String->new('blue') }
193+
sub foobar { CSS::Sass::Value::String->new('blue') }
192194
$sass->options->{sass_functions}->{'foobar'} = \ &foobar;
193195
194196
# Compile string and get css output and source-map json
@@ -427,20 +429,20 @@ This is a hash of Sass functions implemented in Perl. The key for each
427429
function should be the function's Sass signature and the value should be a
428430
Perl subroutine reference. This subroutine will be called whenever the
429431
function is used in the Sass being compiled. The arguments to the subroutine
430-
are L<CSS::Sass::Type> objects, which map to native perl types if possible.
431-
You can return either L<CSS::Sass::Type> objects or supported native perl data
432-
structures. C<undef> is an equivalent of CSS::Sass::Type::Null->new.
432+
are L<CSS::Sass::Value> objects, which map to native perl types if possible.
433+
You can return either L<CSS::Sass::Value> objects or supported native perl data
434+
structures. C<undef> is an equivalent of CSS::Sass::Value::Null->new.
433435
434436
The function is called with an C<eval> statement so you may use "die" to
435-
throw errors back to libsass (C<CSS::Sass::Type::Error>).
437+
throw errors back to libsass (C<CSS::Sass::Value::Error>).
436438
437439
A simple example:
438440
439441
sass_functions => {
440442
'append_hello($str)' => sub {
441443
my ($str) = @_;
442-
die '$str should be a string' unless $str->isa("CSS::Sass::Type::String");
443-
return CSS::Sass::Type::String->new($str->value . " hello");
444+
die '$str should be a string' unless $str->isa("CSS::Sass::Value::String");
445+
return CSS::Sass::Value::String->new($str->value . " hello");
444446
# equivalent to return $str->value . " hello";
445447
}
446448
}
@@ -484,11 +486,11 @@ Another highly experimental feature to prepend content on every compilation. It
484486
used to predefine mixins or other stuff. Internally the content is really just added to
485487
the top of the processed data. Custom headers have the same structure as importers. But
486488
all registered headers are called in the order given by the priority flag.
487-
489+
488490
=item C<Sass_Value> Types
489491
490492
Sass knowns various C<Sass_Value> types. We export the constants for completeness.
491-
Each type is mapped to a package inside the C<CSS::Sass::Type> namespace.
493+
Each type is mapped to a package inside the C<CSS::Sass::Value> namespace.
492494
493495
# Value types
494496
SASS_ERROR
@@ -511,11 +513,11 @@ mapped to C<string>, C<number> or C<null>. You can directly return these
511513
native data types from your custom functions or use the datastructures
512514
to access maps and lists.
513515
514-
undef; # same as CSS::Sass::Type::Null->new;
515-
42; # same as CSS::Sass::Type::Number->new(42);
516-
"foobar"; # same as CSS::Sass::Type::String->new("foobar");
517-
[ 'foo', 'bar' ]; # same as CSS::Sass::Type::List->new('foo', 'bar');
518-
{ key => 'value' }; # same as CSS::Sass::Type::Map->new(key => 'value');
516+
undef; # same as CSS::Sass::Value::Null->new;
517+
42; # same as CSS::Sass::Value::Number->new(42);
518+
"foobar"; # same as CSS::Sass::Value::String->new("foobar");
519+
[ 'foo', 'bar' ]; # same as CSS::Sass::Value::List->new('foo', 'bar');
520+
{ key => 'value' }; # same as CSS::Sass::Value::Map->new(key => 'value');
519521
520522
We bless native return values from custom functions into the correct package.
521523
@@ -574,7 +576,7 @@ automatically recognize the format of your string data.
574576
575577
=head1 SEE ALSO
576578
577-
L<CSS::Sass::Type>
579+
L<CSS::Sass::Value>
578580
579581
L<The Sass Home Page|http://sass-lang.com/>
580582

lib/CSS/Sass.xs

+83-13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,30 @@
2525

2626
#undef free
2727

28+
// implement this logic here for now
29+
// libsass has no auto quoting concept
30+
bool sass_string_need_quotes(char* str)
31+
{
32+
char* it = str;
33+
if (*it == 0) return false;
34+
if (!(
35+
(*it >= 'a' && *it <= 'z') ||
36+
(*it >= 'A' && *it <= 'Z')
37+
)) return false;
38+
++it;
39+
while (*it) {
40+
if (!(
41+
(*it >= 127) ||
42+
(*it >= '0' && *it <= '9') ||
43+
(*it >= 'a' && *it <= 'z') ||
44+
(*it >= 'A' && *it <= 'Z') ||
45+
(*it == '\\' && *(it+1) != 0)
46+
)) return true;
47+
++it;
48+
}
49+
return false;
50+
}
51+
2852
char* safe_svpv(SV* sv, char* _default)
2953
{
3054

@@ -73,9 +97,17 @@ union Sass_Value* sv_to_sass_value(SV* sv)
7397
}
7498
// perl string
7599
else if (SvPOK(sv)) { // i.e. "foobar"
100+
char* str = SvPV_nolen(sv);
76101
// coerce all other scalars into a string
77102
// IMO there should only be strings left!?
78-
return sass_make_string(SvPV_nolen(sv));
103+
if (sv_derived_from(org, "CSS::Sass::Value::String::Quoted"))
104+
{ return sass_make_qstring(str); }
105+
else if (sv_derived_from(org, "CSS::Sass::Value::String"))
106+
{ return sass_make_string(str); }
107+
// perl-libsass specific behavior
108+
if (sass_string_need_quotes(str))
109+
{ return sass_make_qstring(str); }
110+
else { return sass_make_string(str); }
79111
}
80112

81113
// perl reference
@@ -150,7 +182,7 @@ union Sass_Value* sv_to_sass_value(SV* sv)
150182
AV* av = (AV*) sv;
151183
enum Sass_Separator sep = SASS_COMMA;
152184
// special check for space separated lists
153-
if (sv_derived_from(org, "CSS::Sass::Type::List::Space")) sep = SASS_SPACE;
185+
if (sv_derived_from(org, "CSS::Sass::Value::List::Space")) sep = SASS_SPACE;
154186
union Sass_Value* list = sass_make_list(av_len(av) + 1, sep);
155187
int i;
156188
for (i = 0; i < sass_list_get_length(list); i++) {
@@ -186,19 +218,20 @@ union Sass_Value* sv_to_sass_value(SV* sv)
186218

187219
SV* new_sv_sass_null () {
188220
SV* sv = newRV_noinc(newRV_noinc(newSV(0)));
189-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Null", GV_ADD));
221+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Null", GV_ADD));
190222
return sv;
191223
}
192224

193-
SV* new_sv_sass_string (SV* string) {
225+
SV* new_sv_sass_string (SV* string, bool quoted) {
194226
SV* sv = newRV_noinc(string);
195-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::String", GV_ADD));
227+
if (quoted) sv_bless(sv, gv_stashpv("CSS::Sass::Value::String::Quoted", GV_ADD));
228+
else sv_bless(sv, gv_stashpv("CSS::Sass::Value::String::Constant", GV_ADD));
196229
return sv;
197230
}
198231

199232
SV* new_sv_sass_boolean (SV* boolean) {
200233
SV* sv = newRV_noinc(newRV_noinc(boolean));
201-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Boolean", GV_ADD));
234+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Boolean", GV_ADD));
202235
return sv;
203236
}
204237

@@ -207,7 +240,7 @@ SV* new_sv_sass_number (SV* number, SV* unit) {
207240
av_push(array, number);
208241
av_push(array, unit);
209242
SV* sv = newRV_noinc(newRV_noinc((SV*) array));
210-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Number", GV_ADD));
243+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Number", GV_ADD));
211244
return sv;
212245
}
213246

@@ -218,15 +251,15 @@ SV* new_sv_sass_color (SV* r, SV* g, SV* b, SV* a) {
218251
(void)hv_store(hash, "b", 1, b, 0);
219252
(void)hv_store(hash, "a", 1, a, 0);
220253
SV* sv = newRV_noinc(newRV_noinc((SV*) hash));
221-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Color", GV_ADD));
254+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Color", GV_ADD));
222255
return sv;
223256
}
224257

225258
SV* new_sv_sass_error (SV* msg) {
226259
AV* error = newAV();
227260
av_push(error, msg);
228261
SV* sv = newRV_noinc(newRV_noinc(newRV_noinc((SV*) error)));
229-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Error", GV_ADD));
262+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Error", GV_ADD));
230263
return sv;
231264
}
232265

@@ -259,17 +292,18 @@ SV* sass_value_to_sv(union Sass_Value* val)
259292
} break;
260293
case SASS_STRING: {
261294
sv = new_sv_sass_string(
262-
newSVpv(sass_string_get_value(val), 0)
295+
newSVpv(sass_string_get_value(val), 0),
296+
sass_string_is_quoted(val)
263297
);
264298
} break;
265299
case SASS_LIST: {
266300
int i;
267301
AV* list = newAV();
268302
sv = newRV_noinc((SV*) list);
269303
if (sass_list_get_separator(val) == SASS_SPACE) {
270-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::List::Space", GV_ADD));
304+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::List::Space", GV_ADD));
271305
} else {
272-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::List::Comma", GV_ADD));
306+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::List::Comma", GV_ADD));
273307
}
274308
for (i=0; i<sass_list_get_length(val); i++)
275309
av_push(list, sass_value_to_sv(sass_list_get_value(val, i)));
@@ -278,7 +312,7 @@ SV* sass_value_to_sv(union Sass_Value* val)
278312
int i;
279313
HV* map = newHV();
280314
sv = newRV_noinc((SV*) map);
281-
sv_bless(sv, gv_stashpv("CSS::Sass::Type::Map", GV_ADD));
315+
sv_bless(sv, gv_stashpv("CSS::Sass::Value::Map", GV_ADD));
282316
for (i=0; i<sass_map_get_length(val); i++) {
283317
// this should return a scalar sv
284318
union Sass_Value* key = sass_map_get_key(val, i);
@@ -831,6 +865,42 @@ unquote(str)
831865
OUTPUT:
832866
RETVAL
833867

868+
SV*
869+
safequote(str)
870+
char* str
871+
CODE:
872+
{
873+
874+
if (sass_string_need_quotes(str)) {
875+
876+
char* string = sass_string_quote(str, '*');
877+
878+
RETVAL = newSVpv(string, 0);
879+
880+
free (string);
881+
882+
} else {
883+
884+
RETVAL = newSVpv(str, 0);
885+
886+
}
887+
888+
}
889+
OUTPUT:
890+
RETVAL
891+
892+
SV*
893+
need_quotes(str)
894+
char* str
895+
CODE:
896+
{
897+
898+
RETVAL = sass_string_need_quotes(str) ? &PL_sv_yes : &PL_sv_no;
899+
900+
}
901+
OUTPUT:
902+
RETVAL
903+
834904
SV*
835905
resolve_file(file)
836906
char* file

0 commit comments

Comments
 (0)