25
25
26
26
#undef free
27
27
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
+
28
52
char * safe_svpv (SV * sv , char * _default )
29
53
{
30
54
@@ -73,9 +97,17 @@ union Sass_Value* sv_to_sass_value(SV* sv)
73
97
}
74
98
// perl string
75
99
else if (SvPOK (sv )) { // i.e. "foobar"
100
+ char * str = SvPV_nolen (sv );
76
101
// coerce all other scalars into a string
77
102
// 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 ); }
79
111
}
80
112
81
113
// perl reference
@@ -150,7 +182,7 @@ union Sass_Value* sv_to_sass_value(SV* sv)
150
182
AV * av = (AV * ) sv ;
151
183
enum Sass_Separator sep = SASS_COMMA ;
152
184
// 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 ;
154
186
union Sass_Value * list = sass_make_list (av_len (av ) + 1 , sep );
155
187
int i ;
156
188
for (i = 0 ; i < sass_list_get_length (list ); i ++ ) {
@@ -186,19 +218,20 @@ union Sass_Value* sv_to_sass_value(SV* sv)
186
218
187
219
SV * new_sv_sass_null () {
188
220
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 ));
190
222
return sv ;
191
223
}
192
224
193
- SV * new_sv_sass_string (SV * string ) {
225
+ SV * new_sv_sass_string (SV * string , bool quoted ) {
194
226
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 ));
196
229
return sv ;
197
230
}
198
231
199
232
SV * new_sv_sass_boolean (SV * boolean ) {
200
233
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 ));
202
235
return sv ;
203
236
}
204
237
@@ -207,7 +240,7 @@ SV* new_sv_sass_number (SV* number, SV* unit) {
207
240
av_push (array , number );
208
241
av_push (array , unit );
209
242
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 ));
211
244
return sv ;
212
245
}
213
246
@@ -218,15 +251,15 @@ SV* new_sv_sass_color (SV* r, SV* g, SV* b, SV* a) {
218
251
(void )hv_store (hash , "b" , 1 , b , 0 );
219
252
(void )hv_store (hash , "a" , 1 , a , 0 );
220
253
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 ));
222
255
return sv ;
223
256
}
224
257
225
258
SV * new_sv_sass_error (SV * msg ) {
226
259
AV * error = newAV ();
227
260
av_push (error , msg );
228
261
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 ));
230
263
return sv ;
231
264
}
232
265
@@ -259,17 +292,18 @@ SV* sass_value_to_sv(union Sass_Value* val)
259
292
} break ;
260
293
case SASS_STRING : {
261
294
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 )
263
297
);
264
298
} break ;
265
299
case SASS_LIST : {
266
300
int i ;
267
301
AV * list = newAV ();
268
302
sv = newRV_noinc ((SV * ) list );
269
303
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 ));
271
305
} 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 ));
273
307
}
274
308
for (i = 0 ; i < sass_list_get_length (val ); i ++ )
275
309
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)
278
312
int i ;
279
313
HV * map = newHV ();
280
314
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 ));
282
316
for (i = 0 ; i < sass_map_get_length (val ); i ++ ) {
283
317
// this should return a scalar sv
284
318
union Sass_Value * key = sass_map_get_key (val , i );
@@ -831,6 +865,42 @@ unquote(str)
831
865
OUTPUT :
832
866
RETVAL
833
867
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
+
834
904
SV *
835
905
resolve_file (file )
836
906
char * file
0 commit comments