sassc 1.9.0 → 1.10.0
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.
- checksums.yaml +4 -4
- data/README.md +30 -3
- data/ext/libsass/.gitignore +3 -0
- data/ext/libsass/.travis.yml +1 -1
- data/ext/libsass/GNUmakefile.am +7 -7
- data/ext/libsass/Makefile +7 -4
- data/ext/libsass/Makefile.conf +0 -1
- data/ext/libsass/appveyor.yml +6 -2
- data/ext/libsass/docs/api-context.md +4 -4
- data/ext/libsass/docs/api-doc.md +29 -11
- data/ext/libsass/docs/api-importer-example.md +5 -5
- data/ext/libsass/docs/build-on-windows.md +1 -1
- data/ext/libsass/include/sass/base.h +10 -0
- data/ext/libsass/include/sass/version.h +4 -0
- data/ext/libsass/include/sass/version.h.in +4 -0
- data/ext/libsass/include/sass2scss.h +1 -1
- data/ext/libsass/script/ci-build-libsass +15 -3
- data/ext/libsass/src/ast.cpp +161 -6
- data/ext/libsass/src/ast.hpp +71 -44
- data/ext/libsass/src/ast_factory.hpp +1 -1
- data/ext/libsass/src/ast_fwd_decl.hpp +2 -2
- data/ext/libsass/src/constants.cpp +2 -4
- data/ext/libsass/src/constants.hpp +3 -4
- data/ext/libsass/src/context.cpp +16 -17
- data/ext/libsass/src/context.hpp +2 -2
- data/ext/libsass/src/cssize.cpp +19 -8
- data/ext/libsass/src/cssize.hpp +5 -2
- data/ext/libsass/src/debugger.hpp +6 -3
- data/ext/libsass/src/emitter.cpp +1 -1
- data/ext/libsass/src/environment.cpp +1 -1
- data/ext/libsass/src/eval.cpp +42 -14
- data/ext/libsass/src/eval.hpp +1 -1
- data/ext/libsass/src/expand.cpp +24 -8
- data/ext/libsass/src/expand.hpp +2 -1
- data/ext/libsass/src/extend.cpp +55 -15
- data/ext/libsass/src/extend.hpp +5 -1
- data/ext/libsass/src/functions.cpp +10 -5
- data/ext/libsass/src/inspect.cpp +25 -19
- data/ext/libsass/src/inspect.hpp +2 -2
- data/ext/libsass/src/json.cpp +20 -9
- data/ext/libsass/src/json.hpp +5 -5
- data/ext/libsass/src/lexer.cpp +4 -1
- data/ext/libsass/src/lexer.hpp +21 -0
- data/ext/libsass/src/listize.cpp +2 -1
- data/ext/libsass/src/operation.hpp +4 -4
- data/ext/libsass/src/output.cpp +1 -1
- data/ext/libsass/src/output.hpp +1 -1
- data/ext/libsass/src/parser.cpp +189 -90
- data/ext/libsass/src/parser.hpp +42 -2
- data/ext/libsass/src/prelexer.cpp +474 -7
- data/ext/libsass/src/prelexer.hpp +15 -2
- data/ext/libsass/src/remove_placeholders.cpp +5 -5
- data/ext/libsass/src/remove_placeholders.hpp +3 -2
- data/ext/libsass/src/sass.cpp +33 -3
- data/ext/libsass/src/sass2scss.cpp +7 -0
- data/ext/libsass/src/sass_context.cpp +32 -62
- data/ext/libsass/src/sass_functions.cpp +3 -3
- data/ext/libsass/src/sass_values.cpp +5 -5
- data/ext/libsass/src/utf8/unchecked.h +16 -16
- data/ext/libsass/src/util.cpp +51 -30
- data/ext/libsass/src/util.hpp +6 -1
- data/ext/libsass/win/libsass.targets +0 -2
- data/ext/libsass/win/libsass.vcxproj.filters +0 -6
- data/lib/sassc/engine.rb +4 -1
- data/lib/sassc/error.rb +23 -1
- data/lib/sassc/version.rb +1 -1
- data/test/error_test.rb +27 -0
- data/test/native_test.rb +1 -1
- metadata +5 -5
- data/ext/libsass/include/sass/interface.h +0 -105
- data/ext/libsass/src/sass_interface.cpp +0 -215
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b52db28344dd1103c3d9c82150b7670f31e040d6
|
4
|
+
data.tar.gz: 0ce1622190528f513b5460017c4033da8932fb4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca2d6b6f548d6c73c419dc6ba94c3d0a20fbed1af6a95862a8ff3c68fb55e583c9a51f33b5122e353d6514d9998fad8a388131a9b74b3a9d06433eacae5461e6
|
7
|
+
data.tar.gz: 06e7cb73e2e52f756aa0980c449b8f32d6f10c6be9a9e8a4e223d9f34603221e2859ae80a41eca0e9066e0d9e8cc0848ab259b0c03a0f20dd927542b50609d7a
|
data/README.md
CHANGED
@@ -6,12 +6,36 @@ This gem combines the speed of `libsass`, the [Sass C implementation](https://gi
|
|
6
6
|
|
7
7
|
### libsass Version
|
8
8
|
|
9
|
-
[3.3.
|
9
|
+
[3.3.6](https://github.com/sass/libsass/releases/tag/3.3.6)
|
10
|
+
|
11
|
+
## Installation
|
12
|
+
|
13
|
+
Add this line to your application's Gemfile:
|
14
|
+
|
15
|
+
```ruby
|
16
|
+
gem 'sassc'
|
17
|
+
```
|
18
|
+
|
19
|
+
And then execute:
|
20
|
+
|
21
|
+
```bash
|
22
|
+
bundle
|
23
|
+
```
|
24
|
+
|
25
|
+
Or install it yourself as:
|
26
|
+
|
27
|
+
```bash
|
28
|
+
gem install sassc
|
29
|
+
```
|
10
30
|
|
11
31
|
## Usage
|
12
32
|
|
13
33
|
This library utilizes `libsass` to allow you to compile SCSS or SASS syntax
|
14
|
-
to CSS. To compile, use a `SassC::Engine
|
34
|
+
to CSS. To compile, use a `SassC::Engine`, e.g.:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
SassC::Engine.new(sass, style: :compressed).render
|
38
|
+
```
|
15
39
|
|
16
40
|
**Note**: If you want to use this library with Rails/Sprockets, check out
|
17
41
|
[sassc-rails](https://github.com/bolandrm/sassc-rails).
|
@@ -25,8 +49,11 @@ and [awesome contributors](https://github.com/bolandrm/sassc-ruby/graphs/contrib
|
|
25
49
|
|
26
50
|
## Changelog
|
27
51
|
|
52
|
+
- **1.10.0**
|
53
|
+
- [Improved error messages](https://github.com/sass/sassc-ruby/pull/34)
|
54
|
+
- Update to Libsass 3.3.6
|
28
55
|
- **1.9.0**
|
29
|
-
|
56
|
+
- Support boolean script support
|
30
57
|
- **1.8.5**
|
31
58
|
- Update to Libsass 3.3.4
|
32
59
|
- **1.8.4**
|
data/ext/libsass/.gitignore
CHANGED
data/ext/libsass/.travis.yml
CHANGED
data/ext/libsass/GNUmakefile.am
CHANGED
@@ -57,9 +57,9 @@ TESTS = \
|
|
57
57
|
$(SASS_SPEC_PATH)/spec/scss-tests \
|
58
58
|
$(SASS_SPEC_PATH)/spec/types
|
59
59
|
|
60
|
-
SASS_TEST_FLAGS =
|
60
|
+
SASS_TEST_FLAGS = -V 3.4 --impl libsass
|
61
61
|
LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) ./script/tap-driver
|
62
|
-
AM_LOG_FLAGS = -c ./tester
|
62
|
+
AM_LOG_FLAGS = -c ./tester $(LOG_FLAGS)
|
63
63
|
if USE_TAP
|
64
64
|
AM_LOG_FLAGS += -t
|
65
65
|
SASS_TEST_FLAGS += -t | tapout
|
@@ -72,16 +72,16 @@ SASS_TESTER = $(RUBY) $(SASS_SPEC_PATH)/sass-spec.rb
|
|
72
72
|
SASS_TESTER += -c $(SASS_LIBSASS_PATH)/tester$(EXEEXT)
|
73
73
|
|
74
74
|
test:
|
75
|
-
$(SASS_TESTER)
|
75
|
+
$(SASS_TESTER) $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
76
76
|
|
77
77
|
test_build:
|
78
|
-
$(SASS_TESTER)
|
78
|
+
$(SASS_TESTER) $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
79
79
|
|
80
80
|
test_full:
|
81
|
-
$(SASS_TESTER) $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
81
|
+
$(SASS_TESTER) --run-todo $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
82
82
|
|
83
|
-
|
84
|
-
$(SASS_TESTER) $(LOG_FLAGS) $(SASS_SPEC_PATH)
|
83
|
+
test_probe:
|
84
|
+
$(SASS_TESTER) --probe-todo $(LOG_FLAGS) $(SASS_SPEC_PATH) $(SASS_TEST_FLAGS)
|
85
85
|
|
86
86
|
endif
|
87
87
|
|
data/ext/libsass/Makefile
CHANGED
@@ -300,13 +300,16 @@ version: $(SASSC_BIN)
|
|
300
300
|
$(SASSC_BIN) -v
|
301
301
|
|
302
302
|
test: $(SASSC_BIN)
|
303
|
-
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN)
|
303
|
+
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -V 3.4 -c $(SASSC_BIN) --impl libsass $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
|
304
304
|
|
305
305
|
test_build: $(SASSC_BIN)
|
306
|
-
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN)
|
306
|
+
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -V 3.4 -c $(SASSC_BIN) --impl libsass $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
|
307
307
|
|
308
|
-
|
309
|
-
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -c $(SASSC_BIN) $(LOG_FLAGS) $(SASS_SPEC_PATH)
|
308
|
+
test_full: $(SASSC_BIN)
|
309
|
+
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -V 3.4 -c $(SASSC_BIN) --impl libsass --run-todo $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
|
310
|
+
|
311
|
+
test_probe: $(SASSC_BIN)
|
312
|
+
$(RUBY_BIN) $(SASS_SPEC_PATH)/sass-spec.rb -V 3.4 -c $(SASSC_BIN) --impl libsass --probe-todo $(LOG_FLAGS) $(SASS_SPEC_PATH)/$(SASS_SPEC_SPEC_DIR)
|
310
313
|
|
311
314
|
clean-objects: lib
|
312
315
|
-$(RM) lib/*.a lib/*.so lib/*.dll lib/*.la
|
data/ext/libsass/Makefile.conf
CHANGED
data/ext/libsass/appveyor.yml
CHANGED
@@ -63,8 +63,11 @@ test_script:
|
|
63
63
|
git -C sass-spec checkout -q --force ci-spec-pr-$SPEC_PR
|
64
64
|
}
|
65
65
|
}
|
66
|
-
ruby sass-spec/sass-spec.rb -c $env:TargetPath -s
|
67
|
-
|
66
|
+
ruby sass-spec/sass-spec.rb -V 3.4 --probe-todo --impl libsass -c $env:TargetPath -s sass-spec/spec
|
67
|
+
if(-not($?)) {
|
68
|
+
echo "sass-spec tests failed"
|
69
|
+
exit 1
|
70
|
+
}
|
68
71
|
Write-Host "Explicitly testing the case when cwd has Cyrillic characters: " -nonewline
|
69
72
|
# See comments in gh-1774 for details.
|
70
73
|
$env:TargetPath = Join-Path $pwd.Path $env:TargetPath
|
@@ -76,3 +79,4 @@ test_script:
|
|
76
79
|
} else {
|
77
80
|
echo "Success!"
|
78
81
|
}
|
82
|
+
|
@@ -88,7 +88,7 @@ char* source_map_file;
|
|
88
88
|
char* source_map_root;
|
89
89
|
```
|
90
90
|
```C
|
91
|
-
// Custom functions that can be called from
|
91
|
+
// Custom functions that can be called from Sass code
|
92
92
|
Sass_C_Function_List c_functions;
|
93
93
|
```
|
94
94
|
```C
|
@@ -168,12 +168,12 @@ struct Sass_Compiler* sass_make_data_compiler (struct Sass_Data_Context* data_ct
|
|
168
168
|
|
169
169
|
// Execute the different compilation steps individually
|
170
170
|
// Usefull if you only want to query the included files
|
171
|
-
int sass_compiler_parse(struct Sass_Compiler* compiler);
|
172
|
-
int sass_compiler_execute(struct Sass_Compiler* compiler);
|
171
|
+
int sass_compiler_parse (struct Sass_Compiler* compiler);
|
172
|
+
int sass_compiler_execute (struct Sass_Compiler* compiler);
|
173
173
|
|
174
174
|
// Release all memory allocated with the compiler
|
175
175
|
// This does _not_ include any contexts or options
|
176
|
-
void sass_delete_compiler(struct Sass_Compiler* compiler);
|
176
|
+
void sass_delete_compiler (struct Sass_Compiler* compiler);
|
177
177
|
|
178
178
|
// Release all memory allocated and also ourself
|
179
179
|
void sass_delete_file_context (struct Sass_File_Context* ctx);
|
data/ext/libsass/docs/api-doc.md
CHANGED
@@ -16,16 +16,6 @@ This will automatically load all other headers too!
|
|
16
16
|
#include "sass/context.h"
|
17
17
|
```
|
18
18
|
|
19
|
-
### Deprecated usage
|
20
|
-
|
21
|
-
The old API is kept in the source for backward compatibility.
|
22
|
-
It's deprecated and incompatible with this documentation, use `sass/context.h`!
|
23
|
-
|
24
|
-
```C
|
25
|
-
// deprecated interface
|
26
|
-
#include "sass/interface.h"
|
27
|
-
```
|
28
|
-
|
29
19
|
## Basic C Example
|
30
20
|
|
31
21
|
```C
|
@@ -33,7 +23,7 @@ It's deprecated and incompatible with this documentation, use `sass/context.h`!
|
|
33
23
|
#include "sass/context.h"
|
34
24
|
|
35
25
|
int main() {
|
36
|
-
puts(
|
26
|
+
puts(libsass_version());
|
37
27
|
return 0;
|
38
28
|
}
|
39
29
|
```
|
@@ -114,6 +104,34 @@ This mirrors very well how `libsass` uses these structures.
|
|
114
104
|
|
115
105
|
Structs can be down-casted to access `context` or `options`!
|
116
106
|
|
107
|
+
## Memory handling and life-cycles
|
108
|
+
|
109
|
+
We keep memory around for as long as the main [context](api-context.md) object is not destroyed (`sass_delete_context`). LibSass will create copies of most inputs/options beside the main sass code.
|
110
|
+
You need to allocate and fill that buffer before passing it to LibSass. You may also overtake memory management from libsass for certain return values (i.e. `sass_context_take_output_string`).
|
111
|
+
|
112
|
+
```C
|
113
|
+
// to allocate buffer to be filled
|
114
|
+
void* sass_alloc_memory(size_t size);
|
115
|
+
// to allocate a buffer from existing string
|
116
|
+
char* sass_copy_c_string(const char* str);
|
117
|
+
// to free overtaken memory when done
|
118
|
+
void sass_free_memory(void* ptr);
|
119
|
+
```
|
120
|
+
|
121
|
+
## Miscellaneous API functions
|
122
|
+
|
123
|
+
```C
|
124
|
+
// Some convenient string helper function
|
125
|
+
char* sass_string_unquote (const char* str);
|
126
|
+
char* sass_string_quote (const char* str, const char quote_mark);
|
127
|
+
|
128
|
+
// Resolve a file via the given include paths in the include char* array
|
129
|
+
char* sass_resolve_file (const char* path, const char* incs[]);
|
130
|
+
|
131
|
+
// Get compiled libsass version
|
132
|
+
const char* libsass_version(void);
|
133
|
+
```
|
134
|
+
|
117
135
|
## Common Pitfalls
|
118
136
|
|
119
137
|
**input_path**
|
@@ -10,10 +10,10 @@ Sass_Import_List sass_importer(const char* path, Sass_Importer_Entry cb, struct
|
|
10
10
|
// get the cookie from importer descriptor
|
11
11
|
void* cookie = sass_importer_get_cookie(cb);
|
12
12
|
Sass_Import_List list = sass_make_import_list(2);
|
13
|
-
|
14
|
-
|
15
|
-
list[0] = sass_make_import_entry("/tmp/styles.scss",
|
16
|
-
list[1] = sass_make_import_entry("http://www.example.com",
|
13
|
+
char* local = sass_copy_c_string("local { color: green; }");
|
14
|
+
char* remote = sass_copy_c_string("remote { color: red; }");
|
15
|
+
list[0] = sass_make_import_entry("/tmp/styles.scss", local, 0);
|
16
|
+
list[1] = sass_make_import_entry("http://www.example.com", remote, 0);
|
17
17
|
return list;
|
18
18
|
}
|
19
19
|
|
@@ -84,7 +84,7 @@ Sass_Import_List importer(const char* path, Sass_Importer_Entry cb, struct Sass_
|
|
84
84
|
Sass_Import_List list = sass_make_import_list(1);
|
85
85
|
const char* message = "some error message";
|
86
86
|
list[0] = sass_make_import_entry(path, 0, 0);
|
87
|
-
sass_import_set_error(list[0],
|
87
|
+
sass_import_set_error(list[0], sass_copy_c_string(message), 0, 0);
|
88
88
|
return list;
|
89
89
|
}
|
90
90
|
|
@@ -130,7 +130,7 @@ cd libsass
|
|
130
130
|
REM set PATH=%PATH%;%PROGRAMFILES%\MSBuild\12.0\Bin
|
131
131
|
msbuild /m:4 /p:Configuration=Release win\libsass.sln
|
132
132
|
REM running the spec test-suite manually (needs ruby and minitest gem)
|
133
|
-
ruby sass-spec\sass-spec.rb -c win\bin\sassc.exe -s --
|
133
|
+
ruby sass-spec\sass-spec.rb -V 3.4 -c win\bin\sassc.exe -s --impl libsass sass-spec/spec
|
134
134
|
cd ..
|
135
135
|
```
|
136
136
|
|
@@ -62,6 +62,13 @@ enum Sass_Output_Style {
|
|
62
62
|
SASS_STYLE_TO_SASS
|
63
63
|
};
|
64
64
|
|
65
|
+
// to allocate buffer to be filled
|
66
|
+
void* sass_alloc_memory(size_t size);
|
67
|
+
// to allocate a buffer from existing string
|
68
|
+
char* sass_copy_c_string(const char* str);
|
69
|
+
// to free overtaken memory when done
|
70
|
+
void sass_free_memory(void* ptr);
|
71
|
+
|
65
72
|
// Some convenient string helper function
|
66
73
|
ADDAPI char* ADDCALL sass_string_quote (const char* str, const char quote_mark);
|
67
74
|
ADDAPI char* ADDCALL sass_string_unquote (const char* str);
|
@@ -72,6 +79,9 @@ ADDAPI char* ADDCALL sass_resolve_file (const char* path, const char* incs[]);
|
|
72
79
|
// Get compiled libsass version
|
73
80
|
ADDAPI const char* ADDCALL libsass_version(void);
|
74
81
|
|
82
|
+
// Get compiled libsass language
|
83
|
+
ADDAPI const char* ADDCALL libsass_language_version(void);
|
84
|
+
|
75
85
|
#ifdef __cplusplus
|
76
86
|
} // __cplusplus defined.
|
77
87
|
#endif
|
@@ -48,6 +48,18 @@ if [ "x$PREFIX" == "x" ]; then
|
|
48
48
|
fi
|
49
49
|
fi
|
50
50
|
|
51
|
+
# enable address sanitation
|
52
|
+
# https://en.wikipedia.org/wiki/AddressSanitizer
|
53
|
+
if [ "x$CC" == "xclang" ]; then
|
54
|
+
if [ "x$COVERAGE" != "xyes" ]; then
|
55
|
+
if [ "$TRAVIS_OS_NAME" == "linux" ]; then
|
56
|
+
export EXTRA_CFLAGS="$EXTRA_CFLAGS -fsanitize=address"
|
57
|
+
export EXTRA_CXXFLAGS="$EXTRA_CXXFLAGS -fsanitize=address"
|
58
|
+
export EXTRA_LDFLAGS="$EXTRA_LDFLAGS -fsanitize=address"
|
59
|
+
fi
|
60
|
+
fi
|
61
|
+
fi
|
62
|
+
|
51
63
|
echo SASS_LIBSASS_PATH: $SASS_LIBSASS_PATH
|
52
64
|
echo TRAVIS_BUILD_DIR: $TRAVIS_BUILD_DIR
|
53
65
|
echo SASS_SASSC_PATH: $SASS_SASSC_PATH
|
@@ -108,10 +120,10 @@ then
|
|
108
120
|
echo "Fetching Sass Spec PR $SPEC_PR"
|
109
121
|
git -C sass-spec fetch -u origin pull/$SPEC_PR/head:ci-spec-pr-$SPEC_PR
|
110
122
|
git -C sass-spec checkout --force ci-spec-pr-$SPEC_PR
|
111
|
-
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS
|
123
|
+
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
|
112
124
|
else
|
113
|
-
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS
|
125
|
+
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
|
114
126
|
fi
|
115
127
|
else
|
116
|
-
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS
|
128
|
+
LD_LIBRARY_PATH="$PREFIX/lib/" make $MAKE_OPTS test_probe
|
117
129
|
fi
|
data/ext/libsass/src/ast.cpp
CHANGED
@@ -7,8 +7,11 @@
|
|
7
7
|
#include "color_maps.hpp"
|
8
8
|
#include <set>
|
9
9
|
#include <iomanip>
|
10
|
-
#include <algorithm>
|
11
10
|
#include <iostream>
|
11
|
+
#include <algorithm>
|
12
|
+
#include <functional>
|
13
|
+
#include <cctype>
|
14
|
+
#include <locale>
|
12
15
|
|
13
16
|
namespace Sass {
|
14
17
|
|
@@ -25,6 +28,80 @@ namespace Sass {
|
|
25
28
|
dynamic_cast<Supports_Operator*>(cond);
|
26
29
|
}
|
27
30
|
|
31
|
+
std::string & str_ltrim(std::string & str)
|
32
|
+
{
|
33
|
+
auto it2 = std::find_if( str.begin() , str.end() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
|
34
|
+
str.erase( str.begin() , it2);
|
35
|
+
return str;
|
36
|
+
}
|
37
|
+
|
38
|
+
std::string & str_rtrim(std::string & str)
|
39
|
+
{
|
40
|
+
auto it1 = std::find_if( str.rbegin() , str.rend() , [](char ch){ return !std::isspace<char>(ch , std::locale::classic() ) ; } );
|
41
|
+
str.erase( it1.base() , str.end() );
|
42
|
+
return str;
|
43
|
+
}
|
44
|
+
|
45
|
+
void String_Constant::rtrim()
|
46
|
+
{
|
47
|
+
value_ = str_rtrim(value_);
|
48
|
+
}
|
49
|
+
void String_Constant::ltrim()
|
50
|
+
{
|
51
|
+
value_ = str_ltrim(value_);
|
52
|
+
}
|
53
|
+
void String_Constant::trim()
|
54
|
+
{
|
55
|
+
rtrim();
|
56
|
+
ltrim();
|
57
|
+
}
|
58
|
+
|
59
|
+
void String_Schema::rtrim()
|
60
|
+
{
|
61
|
+
if (!empty()) {
|
62
|
+
if (String* str = dynamic_cast<String*>(last())) str->rtrim();
|
63
|
+
}
|
64
|
+
}
|
65
|
+
void String_Schema::ltrim()
|
66
|
+
{
|
67
|
+
if (!empty()) {
|
68
|
+
if (String* str = dynamic_cast<String*>(first())) str->ltrim();
|
69
|
+
}
|
70
|
+
}
|
71
|
+
void String_Schema::trim()
|
72
|
+
{
|
73
|
+
rtrim();
|
74
|
+
ltrim();
|
75
|
+
}
|
76
|
+
|
77
|
+
bool At_Root_Query::exclude(std::string str)
|
78
|
+
{
|
79
|
+
bool with = feature() && unquote(feature()->to_string()).compare("with") == 0;
|
80
|
+
List* l = static_cast<List*>(value());
|
81
|
+
std::string v;
|
82
|
+
|
83
|
+
if (with)
|
84
|
+
{
|
85
|
+
if (!l || l->length() == 0) return str.compare("rule") != 0;
|
86
|
+
for (size_t i = 0, L = l->length(); i < L; ++i)
|
87
|
+
{
|
88
|
+
v = unquote((*l)[i]->to_string());
|
89
|
+
if (v.compare("all") == 0 || v == str) return false;
|
90
|
+
}
|
91
|
+
return true;
|
92
|
+
}
|
93
|
+
else
|
94
|
+
{
|
95
|
+
if (!l || !l->length()) return str.compare("rule") == 0;
|
96
|
+
for (size_t i = 0, L = l->length(); i < L; ++i)
|
97
|
+
{
|
98
|
+
v = unquote((*l)[i]->to_string());
|
99
|
+
if (v.compare("all") == 0 || v == str) return true;
|
100
|
+
}
|
101
|
+
return false;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
|
28
105
|
void AST_Node::update_pstate(const ParserState& pstate)
|
29
106
|
{
|
30
107
|
pstate_.offset += pstate - pstate_ + pstate.offset;
|
@@ -60,7 +137,7 @@ namespace Sass {
|
|
60
137
|
bool Compound_Selector::has_parent_ref()
|
61
138
|
{
|
62
139
|
for (Simple_Selector* s : *this) {
|
63
|
-
if (s->has_parent_ref()) return true;
|
140
|
+
if (s && s->has_parent_ref()) return true;
|
64
141
|
}
|
65
142
|
return false;
|
66
143
|
}
|
@@ -209,6 +286,7 @@ namespace Sass {
|
|
209
286
|
|
210
287
|
bool Simple_Selector::operator== (const Simple_Selector& rhs) const
|
211
288
|
{
|
289
|
+
if (const Pseudo_Selector* lp = dynamic_cast<const Pseudo_Selector*>(this)) return *lp == rhs;
|
212
290
|
if (const Wrapped_Selector* lw = dynamic_cast<const Wrapped_Selector*>(this)) return *lw == rhs;
|
213
291
|
if (const Attribute_Selector* la = dynamic_cast<const Attribute_Selector*>(this)) return *la == rhs;
|
214
292
|
if (is_ns_eq(ns(), rhs.ns()))
|
@@ -218,6 +296,7 @@ namespace Sass {
|
|
218
296
|
|
219
297
|
bool Simple_Selector::operator< (const Simple_Selector& rhs) const
|
220
298
|
{
|
299
|
+
if (const Pseudo_Selector* lp = dynamic_cast<const Pseudo_Selector*>(this)) return *lp == rhs;
|
221
300
|
if (const Wrapped_Selector* lw = dynamic_cast<const Wrapped_Selector*>(this)) return *lw < rhs;
|
222
301
|
if (const Attribute_Selector* la = dynamic_cast<const Attribute_Selector*>(this)) return *la < rhs;
|
223
302
|
if (is_ns_eq(ns(), rhs.ns()))
|
@@ -481,6 +560,49 @@ namespace Sass {
|
|
481
560
|
return ns() == rhs.ns();
|
482
561
|
}
|
483
562
|
|
563
|
+
bool Pseudo_Selector::operator== (const Pseudo_Selector& rhs) const
|
564
|
+
{
|
565
|
+
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())
|
566
|
+
{
|
567
|
+
Expression* lhs_ex = expression();
|
568
|
+
Expression* rhs_ex = rhs.expression();
|
569
|
+
if (rhs_ex && lhs_ex) return *lhs_ex == *rhs_ex;
|
570
|
+
else return lhs_ex == rhs_ex;
|
571
|
+
}
|
572
|
+
else return false;
|
573
|
+
}
|
574
|
+
|
575
|
+
bool Pseudo_Selector::operator== (const Simple_Selector& rhs) const
|
576
|
+
{
|
577
|
+
if (const Pseudo_Selector* w = dynamic_cast<const Pseudo_Selector*>(&rhs))
|
578
|
+
{
|
579
|
+
return *this == *w;
|
580
|
+
}
|
581
|
+
if (is_ns_eq(ns(), rhs.ns()))
|
582
|
+
{ return name() == rhs.name(); }
|
583
|
+
return ns() == rhs.ns();
|
584
|
+
}
|
585
|
+
|
586
|
+
bool Pseudo_Selector::operator< (const Pseudo_Selector& rhs) const
|
587
|
+
{
|
588
|
+
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())
|
589
|
+
{ return *(expression()) < *(rhs.expression()); }
|
590
|
+
if (is_ns_eq(ns(), rhs.ns()))
|
591
|
+
{ return name() < rhs.name(); }
|
592
|
+
return ns() < rhs.ns();
|
593
|
+
}
|
594
|
+
|
595
|
+
bool Pseudo_Selector::operator< (const Simple_Selector& rhs) const
|
596
|
+
{
|
597
|
+
if (const Pseudo_Selector* w = dynamic_cast<const Pseudo_Selector*>(&rhs))
|
598
|
+
{
|
599
|
+
return *this < *w;
|
600
|
+
}
|
601
|
+
if (is_ns_eq(ns(), rhs.ns()))
|
602
|
+
{ return name() < rhs.name(); }
|
603
|
+
return ns() < rhs.ns();
|
604
|
+
}
|
605
|
+
|
484
606
|
bool Wrapped_Selector::operator== (const Wrapped_Selector& rhs) const
|
485
607
|
{
|
486
608
|
if (is_ns_eq(ns(), rhs.ns()) && name() == rhs.name())
|
@@ -1230,10 +1352,12 @@ namespace Sass {
|
|
1230
1352
|
if ((*this)[i]->head()->is_empty_reference()) {
|
1231
1353
|
// simply move to the next tail if we have "no" combinator
|
1232
1354
|
if ((*this)[i]->combinator() == Complex_Selector::ANCESTOR_OF) {
|
1233
|
-
if ((*this)[i]->tail()
|
1234
|
-
(*this)[i]->
|
1355
|
+
if ((*this)[i]->tail() != NULL) {
|
1356
|
+
if ((*this)[i]->has_line_feed()) {
|
1357
|
+
(*this)[i]->tail()->has_line_feed(true);
|
1358
|
+
}
|
1359
|
+
(*this)[i] = (*this)[i]->tail();
|
1235
1360
|
}
|
1236
|
-
(*this)[i] = (*this)[i]->tail();
|
1237
1361
|
}
|
1238
1362
|
// otherwise remove the first item from head
|
1239
1363
|
else {
|
@@ -1246,7 +1370,15 @@ namespace Sass {
|
|
1246
1370
|
bool Selector_List::has_parent_ref()
|
1247
1371
|
{
|
1248
1372
|
for (Complex_Selector* s : *this) {
|
1249
|
-
if (s->has_parent_ref()) return true;
|
1373
|
+
if (s && s->has_parent_ref()) return true;
|
1374
|
+
}
|
1375
|
+
return false;
|
1376
|
+
}
|
1377
|
+
|
1378
|
+
bool Selector_Schema::has_parent_ref()
|
1379
|
+
{
|
1380
|
+
if (String_Schema* schema = dynamic_cast<String_Schema*>(contents())) {
|
1381
|
+
return schema->length() > 0 && dynamic_cast<Parent_Selector*>(schema->at(0)) != NULL;
|
1250
1382
|
}
|
1251
1383
|
return false;
|
1252
1384
|
}
|
@@ -2017,6 +2149,29 @@ namespace Sass {
|
|
2017
2149
|
return is_interpolant() || (right() && right()->is_right_interpolant());
|
2018
2150
|
}
|
2019
2151
|
|
2152
|
+
// delay binary expressions in function arguments
|
2153
|
+
// https://github.com/sass/libsass/issues/1417
|
2154
|
+
bool Binary_Expression::can_delay(void) const
|
2155
|
+
{
|
2156
|
+
bool l_delay = false;
|
2157
|
+
bool r_delay = false;
|
2158
|
+
if (op().operand == Sass_OP::DIV) {
|
2159
|
+
if (Textual* tl = dynamic_cast<Textual*>(left())) {
|
2160
|
+
l_delay = tl->type() == Textual::NUMBER ||
|
2161
|
+
tl->type() == Textual::DIMENSION;
|
2162
|
+
} else {
|
2163
|
+
l_delay = dynamic_cast<Number*>(left()) != NULL;
|
2164
|
+
}
|
2165
|
+
if (Textual* tr = dynamic_cast<Textual*>(right())) {
|
2166
|
+
r_delay = tr->type() == Textual::NUMBER ||
|
2167
|
+
tr->type() == Textual::DIMENSION;
|
2168
|
+
} else {
|
2169
|
+
r_delay = dynamic_cast<Number*>(right()) != NULL;
|
2170
|
+
}
|
2171
|
+
}
|
2172
|
+
return l_delay && r_delay;
|
2173
|
+
}
|
2174
|
+
|
2020
2175
|
std::string AST_Node::to_string(Sass_Inspect_Options opt) const
|
2021
2176
|
{
|
2022
2177
|
Sass_Output_Options out(opt);
|