sassc 2.0.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.gitmodules +1 -1
  4. data/.travis.yml +9 -3
  5. data/CHANGELOG.md +36 -0
  6. data/CODE_OF_CONDUCT.md +1 -1
  7. data/README.md +1 -1
  8. data/Rakefile +43 -7
  9. data/ext/depend +4 -0
  10. data/ext/extconf.rb +92 -0
  11. data/ext/libsass/VERSION +1 -0
  12. data/ext/libsass/include/sass/base.h +9 -1
  13. data/ext/libsass/include/sass/context.h +5 -1
  14. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  15. data/ext/libsass/src/ast.cpp +755 -2028
  16. data/ext/libsass/src/ast.hpp +492 -2477
  17. data/ext/libsass/src/{to_c.cpp → ast2c.cpp} +22 -16
  18. data/ext/libsass/src/ast2c.hpp +39 -0
  19. data/ext/libsass/src/ast_def_macros.hpp +70 -10
  20. data/ext/libsass/src/ast_fwd_decl.cpp +5 -3
  21. data/ext/libsass/src/ast_fwd_decl.hpp +107 -296
  22. data/ext/libsass/src/ast_helpers.hpp +292 -0
  23. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  24. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  25. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  26. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  27. data/ext/libsass/src/ast_selectors.cpp +1043 -0
  28. data/ext/libsass/src/ast_selectors.hpp +522 -0
  29. data/ext/libsass/src/ast_supports.cpp +114 -0
  30. data/ext/libsass/src/ast_supports.hpp +121 -0
  31. data/ext/libsass/src/ast_values.cpp +1154 -0
  32. data/ext/libsass/src/ast_values.hpp +498 -0
  33. data/ext/libsass/src/backtrace.cpp +11 -7
  34. data/ext/libsass/src/backtrace.hpp +5 -5
  35. data/ext/libsass/src/base64vlq.cpp +5 -2
  36. data/ext/libsass/src/base64vlq.hpp +1 -1
  37. data/ext/libsass/src/bind.cpp +35 -34
  38. data/ext/libsass/src/bind.hpp +3 -1
  39. data/ext/libsass/src/c2ast.cpp +64 -0
  40. data/ext/libsass/src/c2ast.hpp +14 -0
  41. data/ext/libsass/src/cencode.c +4 -6
  42. data/ext/libsass/src/check_nesting.cpp +83 -88
  43. data/ext/libsass/src/check_nesting.hpp +39 -34
  44. data/ext/libsass/src/color_maps.cpp +168 -164
  45. data/ext/libsass/src/color_maps.hpp +152 -160
  46. data/ext/libsass/src/constants.cpp +20 -0
  47. data/ext/libsass/src/constants.hpp +19 -0
  48. data/ext/libsass/src/context.cpp +104 -121
  49. data/ext/libsass/src/context.hpp +43 -55
  50. data/ext/libsass/src/cssize.cpp +103 -188
  51. data/ext/libsass/src/cssize.hpp +45 -51
  52. data/ext/libsass/src/dart_helpers.hpp +199 -0
  53. data/ext/libsass/src/debugger.hpp +524 -361
  54. data/ext/libsass/src/emitter.cpp +26 -26
  55. data/ext/libsass/src/emitter.hpp +20 -18
  56. data/ext/libsass/src/environment.cpp +41 -27
  57. data/ext/libsass/src/environment.hpp +33 -22
  58. data/ext/libsass/src/error_handling.cpp +92 -94
  59. data/ext/libsass/src/error_handling.hpp +73 -50
  60. data/ext/libsass/src/eval.cpp +380 -515
  61. data/ext/libsass/src/eval.hpp +64 -57
  62. data/ext/libsass/src/eval_selectors.cpp +75 -0
  63. data/ext/libsass/src/expand.cpp +322 -263
  64. data/ext/libsass/src/expand.hpp +55 -39
  65. data/ext/libsass/src/extender.cpp +1188 -0
  66. data/ext/libsass/src/extender.hpp +399 -0
  67. data/ext/libsass/src/extension.cpp +43 -0
  68. data/ext/libsass/src/extension.hpp +89 -0
  69. data/ext/libsass/src/file.cpp +134 -88
  70. data/ext/libsass/src/file.hpp +28 -37
  71. data/ext/libsass/src/fn_colors.cpp +596 -0
  72. data/ext/libsass/src/fn_colors.hpp +85 -0
  73. data/ext/libsass/src/fn_lists.cpp +285 -0
  74. data/ext/libsass/src/fn_lists.hpp +34 -0
  75. data/ext/libsass/src/fn_maps.cpp +94 -0
  76. data/ext/libsass/src/fn_maps.hpp +30 -0
  77. data/ext/libsass/src/fn_miscs.cpp +244 -0
  78. data/ext/libsass/src/fn_miscs.hpp +40 -0
  79. data/ext/libsass/src/fn_numbers.cpp +227 -0
  80. data/ext/libsass/src/fn_numbers.hpp +45 -0
  81. data/ext/libsass/src/fn_selectors.cpp +205 -0
  82. data/ext/libsass/src/fn_selectors.hpp +35 -0
  83. data/ext/libsass/src/fn_strings.cpp +268 -0
  84. data/ext/libsass/src/fn_strings.hpp +34 -0
  85. data/ext/libsass/src/fn_utils.cpp +158 -0
  86. data/ext/libsass/src/fn_utils.hpp +62 -0
  87. data/ext/libsass/src/inspect.cpp +253 -266
  88. data/ext/libsass/src/inspect.hpp +72 -74
  89. data/ext/libsass/src/json.cpp +2 -2
  90. data/ext/libsass/src/lexer.cpp +25 -84
  91. data/ext/libsass/src/lexer.hpp +5 -16
  92. data/ext/libsass/src/listize.cpp +27 -43
  93. data/ext/libsass/src/listize.hpp +14 -11
  94. data/ext/libsass/src/mapping.hpp +1 -0
  95. data/ext/libsass/src/memory.hpp +12 -0
  96. data/ext/libsass/src/memory/allocator.cpp +48 -0
  97. data/ext/libsass/src/memory/allocator.hpp +138 -0
  98. data/ext/libsass/src/memory/config.hpp +20 -0
  99. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  100. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  101. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  102. data/ext/libsass/src/operation.hpp +193 -143
  103. data/ext/libsass/src/operators.cpp +56 -29
  104. data/ext/libsass/src/operators.hpp +11 -11
  105. data/ext/libsass/src/ordered_map.hpp +112 -0
  106. data/ext/libsass/src/output.cpp +59 -75
  107. data/ext/libsass/src/output.hpp +15 -22
  108. data/ext/libsass/src/parser.cpp +662 -818
  109. data/ext/libsass/src/parser.hpp +96 -100
  110. data/ext/libsass/src/parser_selectors.cpp +189 -0
  111. data/ext/libsass/src/permutate.hpp +164 -0
  112. data/ext/libsass/src/plugins.cpp +12 -8
  113. data/ext/libsass/src/plugins.hpp +8 -8
  114. data/ext/libsass/src/position.cpp +10 -26
  115. data/ext/libsass/src/position.hpp +44 -21
  116. data/ext/libsass/src/prelexer.cpp +14 -8
  117. data/ext/libsass/src/prelexer.hpp +9 -9
  118. data/ext/libsass/src/remove_placeholders.cpp +59 -57
  119. data/ext/libsass/src/remove_placeholders.hpp +20 -18
  120. data/ext/libsass/src/sass.cpp +25 -18
  121. data/ext/libsass/src/sass.hpp +22 -14
  122. data/ext/libsass/src/sass2scss.cpp +49 -18
  123. data/ext/libsass/src/sass_context.cpp +104 -132
  124. data/ext/libsass/src/sass_context.hpp +2 -2
  125. data/ext/libsass/src/sass_functions.cpp +7 -4
  126. data/ext/libsass/src/sass_functions.hpp +1 -1
  127. data/ext/libsass/src/sass_values.cpp +26 -21
  128. data/ext/libsass/src/settings.hpp +19 -0
  129. data/ext/libsass/src/source.cpp +69 -0
  130. data/ext/libsass/src/source.hpp +95 -0
  131. data/ext/libsass/src/source_data.hpp +32 -0
  132. data/ext/libsass/src/source_map.cpp +27 -20
  133. data/ext/libsass/src/source_map.hpp +14 -11
  134. data/ext/libsass/src/stylesheet.cpp +22 -0
  135. data/ext/libsass/src/stylesheet.hpp +57 -0
  136. data/ext/libsass/src/to_value.cpp +24 -22
  137. data/ext/libsass/src/to_value.hpp +18 -22
  138. data/ext/libsass/src/units.cpp +28 -22
  139. data/ext/libsass/src/units.hpp +9 -8
  140. data/ext/libsass/src/utf8/checked.h +12 -10
  141. data/ext/libsass/src/utf8/core.h +3 -0
  142. data/ext/libsass/src/utf8_string.cpp +12 -10
  143. data/ext/libsass/src/utf8_string.hpp +7 -6
  144. data/ext/libsass/src/util.cpp +97 -107
  145. data/ext/libsass/src/util.hpp +74 -30
  146. data/ext/libsass/src/util_string.cpp +125 -0
  147. data/ext/libsass/src/util_string.hpp +73 -0
  148. data/ext/libsass/src/values.cpp +33 -24
  149. data/ext/libsass/src/values.hpp +2 -2
  150. data/lib/sassc.rb +24 -0
  151. data/lib/sassc/engine.rb +7 -5
  152. data/lib/sassc/functions_handler.rb +11 -13
  153. data/lib/sassc/native.rb +10 -9
  154. data/lib/sassc/native/native_functions_api.rb +0 -5
  155. data/lib/sassc/script.rb +4 -6
  156. data/lib/sassc/version.rb +1 -1
  157. data/sassc.gemspec +32 -12
  158. data/test/engine_test.rb +32 -2
  159. data/test/functions_test.rb +38 -1
  160. data/test/native_test.rb +4 -4
  161. metadata +95 -109
  162. data/ext/Rakefile +0 -3
  163. data/ext/libsass/.editorconfig +0 -15
  164. data/ext/libsass/.gitattributes +0 -2
  165. data/ext/libsass/.github/CONTRIBUTING.md +0 -65
  166. data/ext/libsass/.github/ISSUE_TEMPLATE.md +0 -54
  167. data/ext/libsass/.gitignore +0 -85
  168. data/ext/libsass/.travis.yml +0 -64
  169. data/ext/libsass/COPYING +0 -25
  170. data/ext/libsass/GNUmakefile.am +0 -88
  171. data/ext/libsass/INSTALL +0 -1
  172. data/ext/libsass/LICENSE +0 -25
  173. data/ext/libsass/Makefile +0 -351
  174. data/ext/libsass/Makefile.conf +0 -55
  175. data/ext/libsass/Readme.md +0 -104
  176. data/ext/libsass/SECURITY.md +0 -10
  177. data/ext/libsass/appveyor.yml +0 -91
  178. data/ext/libsass/configure.ac +0 -138
  179. data/ext/libsass/contrib/libsass.spec +0 -66
  180. data/ext/libsass/docs/README.md +0 -20
  181. data/ext/libsass/docs/api-context-example.md +0 -45
  182. data/ext/libsass/docs/api-context-internal.md +0 -163
  183. data/ext/libsass/docs/api-context.md +0 -295
  184. data/ext/libsass/docs/api-doc.md +0 -215
  185. data/ext/libsass/docs/api-function-example.md +0 -67
  186. data/ext/libsass/docs/api-function-internal.md +0 -8
  187. data/ext/libsass/docs/api-function.md +0 -74
  188. data/ext/libsass/docs/api-importer-example.md +0 -112
  189. data/ext/libsass/docs/api-importer-internal.md +0 -20
  190. data/ext/libsass/docs/api-importer.md +0 -86
  191. data/ext/libsass/docs/api-value-example.md +0 -55
  192. data/ext/libsass/docs/api-value-internal.md +0 -76
  193. data/ext/libsass/docs/api-value.md +0 -154
  194. data/ext/libsass/docs/build-on-darwin.md +0 -27
  195. data/ext/libsass/docs/build-on-gentoo.md +0 -55
  196. data/ext/libsass/docs/build-on-windows.md +0 -139
  197. data/ext/libsass/docs/build-shared-library.md +0 -35
  198. data/ext/libsass/docs/build-with-autotools.md +0 -78
  199. data/ext/libsass/docs/build-with-makefiles.md +0 -68
  200. data/ext/libsass/docs/build-with-mingw.md +0 -107
  201. data/ext/libsass/docs/build-with-visual-studio.md +0 -90
  202. data/ext/libsass/docs/build.md +0 -97
  203. data/ext/libsass/docs/compatibility-plan.md +0 -48
  204. data/ext/libsass/docs/contributing.md +0 -17
  205. data/ext/libsass/docs/custom-functions-internal.md +0 -122
  206. data/ext/libsass/docs/dev-ast-memory.md +0 -223
  207. data/ext/libsass/docs/implementations.md +0 -56
  208. data/ext/libsass/docs/plugins.md +0 -47
  209. data/ext/libsass/docs/setup-environment.md +0 -68
  210. data/ext/libsass/docs/source-map-internals.md +0 -51
  211. data/ext/libsass/docs/trace.md +0 -26
  212. data/ext/libsass/docs/triage.md +0 -17
  213. data/ext/libsass/docs/unicode.md +0 -39
  214. data/ext/libsass/extconf.rb +0 -6
  215. data/ext/libsass/include/sass/version.h.in +0 -12
  216. data/ext/libsass/m4/.gitkeep +0 -0
  217. data/ext/libsass/m4/m4-ax_cxx_compile_stdcxx_11.m4 +0 -167
  218. data/ext/libsass/res/resource.rc +0 -35
  219. data/ext/libsass/script/bootstrap +0 -13
  220. data/ext/libsass/script/branding +0 -10
  221. data/ext/libsass/script/ci-build-libsass +0 -134
  222. data/ext/libsass/script/ci-build-plugin +0 -62
  223. data/ext/libsass/script/ci-install-compiler +0 -6
  224. data/ext/libsass/script/ci-install-deps +0 -20
  225. data/ext/libsass/script/ci-report-coverage +0 -42
  226. data/ext/libsass/script/spec +0 -5
  227. data/ext/libsass/script/tap-driver +0 -652
  228. data/ext/libsass/script/tap-runner +0 -1
  229. data/ext/libsass/script/test-leaks.pl +0 -103
  230. data/ext/libsass/src/GNUmakefile.am +0 -54
  231. data/ext/libsass/src/extend.cpp +0 -2130
  232. data/ext/libsass/src/extend.hpp +0 -86
  233. data/ext/libsass/src/functions.cpp +0 -2234
  234. data/ext/libsass/src/functions.hpp +0 -198
  235. data/ext/libsass/src/memory/SharedPtr.cpp +0 -114
  236. data/ext/libsass/src/memory/SharedPtr.hpp +0 -206
  237. data/ext/libsass/src/node.cpp +0 -319
  238. data/ext/libsass/src/node.hpp +0 -118
  239. data/ext/libsass/src/paths.hpp +0 -71
  240. data/ext/libsass/src/sass_util.cpp +0 -149
  241. data/ext/libsass/src/sass_util.hpp +0 -256
  242. data/ext/libsass/src/subset_map.cpp +0 -55
  243. data/ext/libsass/src/subset_map.hpp +0 -76
  244. data/ext/libsass/src/support/libsass.pc.in +0 -11
  245. data/ext/libsass/src/to_c.hpp +0 -39
  246. data/ext/libsass/test/test_node.cpp +0 -94
  247. data/ext/libsass/test/test_paths.cpp +0 -28
  248. data/ext/libsass/test/test_selector_difference.cpp +0 -25
  249. data/ext/libsass/test/test_specificity.cpp +0 -25
  250. data/ext/libsass/test/test_subset_map.cpp +0 -472
  251. data/ext/libsass/test/test_superselector.cpp +0 -69
  252. data/ext/libsass/test/test_unification.cpp +0 -31
  253. data/ext/libsass/version.sh +0 -10
  254. data/ext/libsass/win/libsass.sln +0 -39
  255. data/ext/libsass/win/libsass.sln.DotSettings +0 -9
  256. data/ext/libsass/win/libsass.targets +0 -118
  257. data/ext/libsass/win/libsass.vcxproj +0 -188
  258. data/ext/libsass/win/libsass.vcxproj.filters +0 -357
  259. data/lib/sassc/native/lib_c.rb +0 -21
  260. data/lib/tasks/libsass.rb +0 -33
@@ -55,8 +55,8 @@ namespace Sass {
55
55
 
56
56
  class Units {
57
57
  public:
58
- std::vector<std::string> numerators;
59
- std::vector<std::string> denominators;
58
+ sass::vector<sass::string> numerators;
59
+ sass::vector<sass::string> denominators;
60
60
  public:
61
61
  // default constructor
62
62
  Units() :
@@ -69,7 +69,7 @@ namespace Sass {
69
69
  denominators(ptr->denominators)
70
70
  { }
71
71
  // convert to string
72
- std::string unit() const;
72
+ sass::string unit() const;
73
73
  // get if units are empty
74
74
  bool is_unitless() const;
75
75
  // return if valid for css
@@ -83,6 +83,7 @@ namespace Sass {
83
83
  // compare operations
84
84
  bool operator< (const Units& rhs) const;
85
85
  bool operator== (const Units& rhs) const;
86
+ bool operator!= (const Units& rhs) const;
86
87
  // factor to convert into given units
87
88
  double convert_factor(const Units&) const;
88
89
  };
@@ -94,15 +95,15 @@ namespace Sass {
94
95
  extern const double resolution_conversion_factors[3][3];
95
96
 
96
97
  UnitType get_main_unit(const UnitClass unit);
97
- enum Sass::UnitType string_to_unit(const std::string&);
98
+ enum Sass::UnitType string_to_unit(const sass::string&);
98
99
  const char* unit_to_string(Sass::UnitType unit);
99
100
  enum Sass::UnitClass get_unit_type(Sass::UnitType unit);
100
- std::string get_unit_class(Sass::UnitType unit);
101
- std::string unit_to_class(const std::string&);
101
+ sass::string get_unit_class(Sass::UnitType unit);
102
+ sass::string unit_to_class(const sass::string&);
102
103
  // throws incompatibleUnits exceptions
103
- double conversion_factor(const std::string&, const std::string&);
104
+ double conversion_factor(const sass::string&, const sass::string&);
104
105
  double conversion_factor(UnitType, UnitType, UnitClass, UnitClass);
105
- double convert_units(const std::string&, const std::string&, int&, int&);
106
+ double convert_units(const sass::string&, const sass::string&, int&, int&);
106
107
 
107
108
  }
108
109
 
@@ -1,4 +1,4 @@
1
- // Copyright 2006 Nemanja Trifunovic
1
+ // Copyright 2006-2016 Nemanja Trifunovic
2
2
 
3
3
  /*
4
4
  Permission is hereby granted, free of charge, to any person or organization
@@ -41,7 +41,7 @@ namespace utf8
41
41
  class invalid_code_point : public exception {
42
42
  uint32_t cp;
43
43
  public:
44
- invalid_code_point(uint32_t cp) : cp(cp) {}
44
+ invalid_code_point(uint32_t codepoint) : cp(codepoint) {}
45
45
  virtual const char* what() const throw() { return "Invalid code point"; }
46
46
  uint32_t code_point() const {return cp;}
47
47
  };
@@ -107,7 +107,9 @@ namespace utf8
107
107
  *out++ = *it;
108
108
  break;
109
109
  case internal::NOT_ENOUGH_ROOM:
110
- throw not_enough_room();
110
+ out = utf8::append (replacement, out);
111
+ start = end;
112
+ break;
111
113
  case internal::INVALID_LEAD:
112
114
  out = utf8::append (replacement, out);
113
115
  ++start;
@@ -194,10 +196,10 @@ namespace utf8
194
196
  }
195
197
 
196
198
  template <typename octet_iterator, typename distance_type>
197
- void retreat (octet_iterator& it, distance_type n, octet_iterator start)
199
+ void retreat (octet_iterator& it, distance_type n, octet_iterator end)
198
200
  {
199
201
  for (distance_type i = 0; i < n; ++i)
200
- utf8::prior(it, start);
202
+ utf8::prior(it, end);
201
203
  }
202
204
 
203
205
  template <typename octet_iterator>
@@ -240,7 +242,7 @@ namespace utf8
240
242
  template <typename u16bit_iterator, typename octet_iterator>
241
243
  u16bit_iterator utf8to16 (octet_iterator start, octet_iterator end, u16bit_iterator result)
242
244
  {
243
- while (start != end) {
245
+ while (start < end) {
244
246
  uint32_t cp = utf8::next(start, end);
245
247
  if (cp > 0xffff) { //make a surrogate pair
246
248
  *result++ = static_cast<uint16_t>((cp >> 10) + internal::LEAD_OFFSET);
@@ -264,7 +266,7 @@ namespace utf8
264
266
  template <typename octet_iterator, typename u32bit_iterator>
265
267
  u32bit_iterator utf8to32 (octet_iterator start, octet_iterator end, u32bit_iterator result)
266
268
  {
267
- while (start != end)
269
+ while (start < end)
268
270
  (*result++) = utf8::next(start, end);
269
271
 
270
272
  return result;
@@ -279,9 +281,9 @@ namespace utf8
279
281
  public:
280
282
  iterator () {}
281
283
  explicit iterator (const octet_iterator& octet_it,
282
- const octet_iterator& range_start,
283
- const octet_iterator& range_end) :
284
- it(octet_it), range_start(range_start), range_end(range_end)
284
+ const octet_iterator& rangestart,
285
+ const octet_iterator& rangeend) :
286
+ it(octet_it), range_start(rangestart), range_end(rangeend)
285
287
  {
286
288
  if (it < range_start || it > range_end)
287
289
  throw std::out_of_range("Invalid utf-8 iterator position");
@@ -222,6 +222,9 @@ namespace internal
222
222
  template <typename octet_iterator>
223
223
  utf_error validate_next(octet_iterator& it, octet_iterator end, uint32_t& code_point)
224
224
  {
225
+ if (it == end)
226
+ return NOT_ENOUGH_ROOM;
227
+
225
228
  // Save the original value of it so we can go back in case of failure
226
229
  // Of course, it does not make much sense with i.e. stream iterators
227
230
  octet_iterator original_it = it;
@@ -1,4 +1,7 @@
1
+ // sass.hpp must go before all system headers to get the
2
+ // __EXTENSIONS__ fix on Solaris.
1
3
  #include "sass.hpp"
4
+
2
5
  #include <string>
3
6
  #include <vector>
4
7
  #include <cstdlib>
@@ -8,7 +11,6 @@
8
11
 
9
12
  namespace Sass {
10
13
  namespace UTF_8 {
11
- using std::string;
12
14
 
13
15
  // naming conventions:
14
16
  // offset: raw byte offset (0 based)
@@ -16,25 +18,25 @@ namespace Sass {
16
18
  // index: code point offset (1 based or negative)
17
19
 
18
20
  // function that will count the number of code points (utf-8 characters) from the given beginning to the given end
19
- size_t code_point_count(const string& str, size_t start, size_t end) {
21
+ size_t code_point_count(const sass::string& str, size_t start, size_t end) {
20
22
  return utf8::distance(str.begin() + start, str.begin() + end);
21
23
  }
22
24
 
23
- size_t code_point_count(const string& str) {
25
+ size_t code_point_count(const sass::string& str) {
24
26
  return utf8::distance(str.begin(), str.end());
25
27
  }
26
28
 
27
29
  // function that will return the byte offset at a code point position
28
- size_t offset_at_position(const string& str, size_t position) {
29
- string::const_iterator it = str.begin();
30
+ size_t offset_at_position(const sass::string& str, size_t position) {
31
+ sass::string::const_iterator it = str.begin();
30
32
  utf8::advance(it, position, str.end());
31
33
  return std::distance(str.begin(), it);
32
34
  }
33
35
 
34
36
  // function that returns number of bytes in a character at offset
35
- size_t code_point_size_at_offset(const string& str, size_t offset) {
37
+ size_t code_point_size_at_offset(const sass::string& str, size_t offset) {
36
38
  // get iterator from string and forward by offset
37
- string::const_iterator stop = str.begin() + offset;
39
+ sass::string::const_iterator stop = str.begin() + offset;
38
40
  // check if beyond boundary
39
41
  if (stop == str.end()) return 0;
40
42
  // advance by one code point
@@ -75,9 +77,9 @@ namespace Sass {
75
77
  using std::wstring;
76
78
 
77
79
  // convert from utf16/wide string to utf8 string
78
- string convert_from_utf16(const wstring& utf16)
80
+ sass::string convert_from_utf16(const wstring& utf16)
79
81
  {
80
- string utf8;
82
+ sass::string utf8;
81
83
  // pre-allocate expected memory
82
84
  utf8.reserve(sizeof(utf16)/2);
83
85
  utf8::utf16to8(utf16.begin(), utf16.end(),
@@ -86,7 +88,7 @@ namespace Sass {
86
88
  }
87
89
 
88
90
  // convert from utf8 string to utf16/wide string
89
- wstring convert_to_utf16(const string& utf8)
91
+ wstring convert_to_utf16(const sass::string& utf8)
90
92
  {
91
93
  wstring utf16;
92
94
  // pre-allocate expected memory
@@ -3,6 +3,7 @@
3
3
 
4
4
  #include <string>
5
5
  #include "utf8.h"
6
+ #include "memory.hpp"
6
7
 
7
8
  namespace Sass {
8
9
  namespace UTF_8 {
@@ -13,22 +14,22 @@ namespace Sass {
13
14
  // index: code point offset (1 based or negative)
14
15
 
15
16
  // function that will count the number of code points (utf-8 characters) from the beginning to the given end
16
- size_t code_point_count(const std::string& str, size_t start, size_t end);
17
- size_t code_point_count(const std::string& str);
17
+ size_t code_point_count(const sass::string& str, size_t start, size_t end);
18
+ size_t code_point_count(const sass::string& str);
18
19
 
19
20
  // function that will return the byte offset of a code point in a
20
- size_t offset_at_position(const std::string& str, size_t position);
21
+ size_t offset_at_position(const sass::string& str, size_t position);
21
22
 
22
23
  // function that returns number of bytes in a character in a string
23
- size_t code_point_size_at_offset(const std::string& str, size_t offset);
24
+ size_t code_point_size_at_offset(const sass::string& str, size_t offset);
24
25
 
25
26
  // function that will return a normalized index, given a crazy one
26
27
  size_t normalize_index(int index, size_t len);
27
28
 
28
29
  #ifdef _WIN32
29
30
  // functions to handle unicode paths on windows
30
- std::string convert_from_utf16(const std::wstring& wstr);
31
- std::wstring convert_to_utf16(const std::string& str);
31
+ sass::string convert_from_utf16(const std::wstring& wstr);
32
+ std::wstring convert_to_utf16(const sass::string& str);
32
33
  #endif
33
34
 
34
35
  }
@@ -2,6 +2,7 @@
2
2
  #include "sass.h"
3
3
  #include "ast.hpp"
4
4
  #include "util.hpp"
5
+ #include "util_string.hpp"
5
6
  #include "lexer.hpp"
6
7
  #include "prelexer.hpp"
7
8
  #include "constants.hpp"
@@ -26,8 +27,8 @@ namespace Sass {
26
27
  #endif
27
28
 
28
29
  // https://github.com/sass/sass/commit/4e3e1d5684cc29073a507578fc977434ff488c93
29
- if (fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
30
- else if (fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
30
+ if (std::fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
31
+ else if (std::fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
31
32
  // work around some compiler issue
32
33
  // cygwin has it not defined in std
33
34
  using namespace std;
@@ -75,7 +76,7 @@ namespace Sass {
75
76
  free(arr);
76
77
  }
77
78
 
78
- char **copy_strings(const std::vector<std::string>& strings, char*** array, int skip) {
79
+ char **copy_strings(const sass::vector<sass::string>& strings, char*** array, int skip) {
79
80
  int num = static_cast<int>(strings.size()) - skip;
80
81
  char** arr = (char**) calloc(num + 1, sizeof(char*));
81
82
  if (arr == 0)
@@ -96,10 +97,10 @@ namespace Sass {
96
97
  }
97
98
 
98
99
  // read css string (handle multiline DELIM)
99
- std::string read_css_string(const std::string& str, bool css)
100
+ sass::string read_css_string(const sass::string& str, bool css)
100
101
  {
101
102
  if (!css) return str;
102
- std::string out("");
103
+ sass::string out("");
103
104
  bool esc = false;
104
105
  for (auto i : str) {
105
106
  if (i == '\\') {
@@ -124,9 +125,9 @@ namespace Sass {
124
125
 
125
126
  // double escape all escape sequences
126
127
  // keep unescaped quotes and backslashes
127
- std::string evacuate_escapes(const std::string& str)
128
+ sass::string evacuate_escapes(const sass::string& str)
128
129
  {
129
- std::string out("");
130
+ sass::string out("");
130
131
  bool esc = false;
131
132
  for (auto i : str) {
132
133
  if (i == '\\' && !esc) {
@@ -158,56 +159,77 @@ namespace Sass {
158
159
  }
159
160
 
160
161
  // bell characters are replaced with spaces
161
- void newline_to_space(std::string& str)
162
+ void newline_to_space(sass::string& str)
162
163
  {
163
164
  std::replace(str.begin(), str.end(), '\n', ' ');
164
165
  }
165
166
 
166
- // bell characters are replaced with spaces
167
- // also eats spaces after line-feeds (ltrim)
168
- std::string string_to_output(const std::string& str)
167
+ // 1. Removes whitespace after newlines.
168
+ // 2. Replaces newlines with spaces.
169
+ //
170
+ // This method only considers LF and CRLF as newlines.
171
+ sass::string string_to_output(const sass::string& str)
169
172
  {
170
- std::string out("");
171
- bool lf = false;
172
- for (auto i : str) {
173
- if (i == '\n') {
174
- out += ' ';
175
- lf = true;
176
- } else if (!(lf && isspace(i))) {
177
- out += i;
178
- lf = false;
173
+ sass::string result;
174
+ result.reserve(str.size());
175
+ std::size_t pos = 0;
176
+ while (true) {
177
+ const std::size_t newline = str.find_first_of("\n\r", pos);
178
+ if (newline == sass::string::npos) break;
179
+ result.append(str, pos, newline - pos);
180
+ if (str[newline] == '\r') {
181
+ if (str[newline + 1] == '\n') {
182
+ pos = newline + 2;
183
+ } else {
184
+ // CR without LF: append as-is and continue.
185
+ result += '\r';
186
+ pos = newline + 1;
187
+ continue;
188
+ }
189
+ } else {
190
+ pos = newline + 1;
191
+ }
192
+ result += ' ';
193
+ const std::size_t non_space = str.find_first_not_of(" \f\n\r\t\v", pos);
194
+ if (non_space != sass::string::npos) {
195
+ pos = non_space;
179
196
  }
180
197
  }
181
- return out;
198
+ result.append(str, pos, sass::string::npos);
199
+ return result;
182
200
  }
183
201
 
184
- std::string escape_string(const std::string& str)
202
+ sass::string escape_string(const sass::string& str)
185
203
  {
186
- std::string out("");
187
- for (auto i : str) {
188
- if (i == '\n') {
189
- out += "\\n";
190
- } else if (i == '\r') {
191
- out += "\\r";
192
- } else if (i == '\t') {
193
- out += "\\t";
194
- } else {
195
- out += i;
204
+ sass::string out;
205
+ out.reserve(str.size());
206
+ for (char c : str) {
207
+ switch (c) {
208
+ case '\n':
209
+ out.append("\\n");
210
+ break;
211
+ case '\r':
212
+ out.append("\\r");
213
+ break;
214
+ case '\f':
215
+ out.append("\\f");
216
+ break;
217
+ default:
218
+ out += c;
196
219
  }
197
220
  }
198
221
  return out;
199
222
  }
200
223
 
201
- std::string comment_to_string(const std::string& text)
224
+ sass::string comment_to_compact_string(const sass::string& text)
202
225
  {
203
- std::string str = "";
226
+ sass::string str = "";
204
227
  size_t has = 0;
205
228
  char prev = 0;
206
229
  bool clean = false;
207
230
  for (auto i : text) {
208
231
  if (clean) {
209
232
  if (i == '\n') { has = 0; }
210
- else if (i == '\r') { has = 0; }
211
233
  else if (i == '\t') { ++ has; }
212
234
  else if (i == ' ') { ++ has; }
213
235
  else if (i == '*') {}
@@ -219,8 +241,6 @@ namespace Sass {
219
241
  }
220
242
  } else if (i == '\n') {
221
243
  clean = true;
222
- } else if (i == '\r') {
223
- clean = true;
224
244
  } else {
225
245
  str += i;
226
246
  }
@@ -250,10 +270,10 @@ namespace Sass {
250
270
  return quote_mark;
251
271
  }
252
272
 
253
- std::string read_hex_escapes(const std::string& s)
273
+ sass::string read_hex_escapes(const sass::string& s)
254
274
  {
255
275
 
256
- std::string result;
276
+ sass::string result;
257
277
  bool skipped = false;
258
278
 
259
279
  for (size_t i = 0, L = s.length(); i < L; ++i) {
@@ -270,7 +290,7 @@ namespace Sass {
270
290
 
271
291
  // parse as many sequence chars as possible
272
292
  // ToDo: Check if ruby aborts after possible max
273
- while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
293
+ while (i + len < L && s[i + len] && Util::ascii_isxdigit(static_cast<unsigned char>(s[i + len]))) ++ len;
274
294
 
275
295
  if (len > 1) {
276
296
 
@@ -319,7 +339,7 @@ namespace Sass {
319
339
 
320
340
  }
321
341
 
322
- std::string unquote(const std::string& s, char* qd, bool keep_utf8_sequences, bool strict)
342
+ sass::string unquote(const sass::string& s, char* qd, bool keep_utf8_sequences, bool strict)
323
343
  {
324
344
 
325
345
  // not enough room for quotes
@@ -335,7 +355,7 @@ namespace Sass {
335
355
  else if (*s.begin() == '\'' && *s.rbegin() == '\'') q = '\'';
336
356
  else return s;
337
357
 
338
- std::string unq;
358
+ sass::string unq;
339
359
  unq.reserve(s.length()-2);
340
360
 
341
361
  for (size_t i = 1, L = s.length() - 1; i < L; ++i) {
@@ -356,7 +376,7 @@ namespace Sass {
356
376
 
357
377
  // parse as many sequence chars as possible
358
378
  // ToDo: Check if ruby aborts after possible max
359
- while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
379
+ while (i + len < L && s[i + len] && Util::ascii_isxdigit(static_cast<unsigned char>(s[i + len]))) ++ len;
360
380
 
361
381
  // hex string?
362
382
  if (keep_utf8_sequences) {
@@ -394,7 +414,7 @@ namespace Sass {
394
414
  // // don't be that strict
395
415
  // return s;
396
416
  // // this basically always means an internal error and not users fault
397
- // error("Unescaped delimiter in string to unquote found. [" + s + "]", ParserState("[UNQUOTE]"));
417
+ // error("Unescaped delimiter in string to unquote found. [" + s + "]", SourceSpan("[UNQUOTE]"));
398
418
  // }
399
419
  else {
400
420
  if (strict && !skipped) {
@@ -411,16 +431,16 @@ namespace Sass {
411
431
 
412
432
  }
413
433
 
414
- std::string quote(const std::string& s, char q)
434
+ sass::string quote(const sass::string& s, char q)
415
435
  {
416
436
 
417
437
  // autodetect with fallback to given quote
418
438
  q = detect_best_quotemark(s.c_str(), q);
419
439
 
420
440
  // return an empty quoted string
421
- if (s.empty()) return std::string(2, q ? q : '"');
441
+ if (s.empty()) return sass::string(2, q ? q : '"');
422
442
 
423
- std::string quoted;
443
+ sass::string quoted;
424
444
  quoted.reserve(s.length()+2);
425
445
  quoted.push_back(q);
426
446
 
@@ -508,42 +528,15 @@ namespace Sass {
508
528
  }
509
529
 
510
530
  namespace Util {
511
- using std::string;
512
-
513
- std::string rtrim(const std::string &str) {
514
- std::string trimmed = str;
515
- size_t pos_ws = trimmed.find_last_not_of(" \t\n\v\f\r");
516
- if (pos_ws != std::string::npos)
517
- { trimmed.erase(pos_ws + 1); }
518
- else { trimmed.clear(); }
519
- return trimmed;
520
- }
521
-
522
- std::string normalize_underscores(const std::string& str) {
523
- std::string normalized = str;
524
- for(size_t i = 0, L = normalized.length(); i < L; ++i) {
525
- if(normalized[i] == '_') {
526
- normalized[i] = '-';
527
- }
528
- }
529
- return normalized;
530
- }
531
531
 
532
- std::string normalize_decimals(const std::string& str) {
533
- std::string prefix = "0";
534
- std::string normalized = str;
535
-
536
- return normalized[0] == '.' ? normalized.insert(0, prefix) : normalized;
537
- }
538
-
539
- bool isPrintable(Ruleset_Ptr r, Sass_Output_Style style) {
532
+ bool isPrintable(StyleRule* r, Sass_Output_Style style) {
540
533
  if (r == NULL) {
541
534
  return false;
542
535
  }
543
536
 
544
537
  Block_Obj b = r->block();
545
538
 
546
- Selector_List_Ptr sl = Cast<Selector_List>(r->selector());
539
+ SelectorList* sl = r->selector();
547
540
  bool hasSelectors = sl ? sl->length() > 0 : false;
548
541
 
549
542
  if (!hasSelectors) {
@@ -554,16 +547,16 @@ namespace Sass {
554
547
  bool hasPrintableChildBlocks = false;
555
548
  for (size_t i = 0, L = b->length(); i < L; ++i) {
556
549
  Statement_Obj stm = b->at(i);
557
- if (Cast<Directive>(stm)) {
550
+ if (Cast<AtRule>(stm)) {
558
551
  return true;
559
- } else if (Declaration_Ptr d = Cast<Declaration>(stm)) {
552
+ } else if (Declaration* d = Cast<Declaration>(stm)) {
560
553
  return isPrintable(d, style);
561
- } else if (Has_Block_Ptr p = Cast<Has_Block>(stm)) {
554
+ } else if (ParentStatement* p = Cast<ParentStatement>(stm)) {
562
555
  Block_Obj pChildBlock = p->block();
563
556
  if (isPrintable(pChildBlock, style)) {
564
557
  hasPrintableChildBlocks = true;
565
558
  }
566
- } else if (Comment_Ptr c = Cast<Comment>(stm)) {
559
+ } else if (Comment* c = Cast<Comment>(stm)) {
567
560
  // keep for uncompressed
568
561
  if (style != COMPRESSED) {
569
562
  hasDeclarations = true;
@@ -584,25 +577,25 @@ namespace Sass {
584
577
  return false;
585
578
  }
586
579
 
587
- bool isPrintable(String_Constant_Ptr s, Sass_Output_Style style)
580
+ bool isPrintable(String_Constant* s, Sass_Output_Style style)
588
581
  {
589
582
  return ! s->value().empty();
590
583
  }
591
584
 
592
- bool isPrintable(String_Quoted_Ptr s, Sass_Output_Style style)
585
+ bool isPrintable(String_Quoted* s, Sass_Output_Style style)
593
586
  {
594
587
  return true;
595
588
  }
596
589
 
597
- bool isPrintable(Declaration_Ptr d, Sass_Output_Style style)
590
+ bool isPrintable(Declaration* d, Sass_Output_Style style)
598
591
  {
599
- Expression_Obj val = d->value();
592
+ ExpressionObj val = d->value();
600
593
  if (String_Quoted_Obj sq = Cast<String_Quoted>(val)) return isPrintable(sq.ptr(), style);
601
594
  if (String_Constant_Obj sc = Cast<String_Constant>(val)) return isPrintable(sc.ptr(), style);
602
595
  return true;
603
596
  }
604
597
 
605
- bool isPrintable(Supports_Block_Ptr f, Sass_Output_Style style) {
598
+ bool isPrintable(SupportsRule* f, Sass_Output_Style style) {
606
599
  if (f == NULL) {
607
600
  return false;
608
601
  }
@@ -613,10 +606,10 @@ namespace Sass {
613
606
  bool hasPrintableChildBlocks = false;
614
607
  for (size_t i = 0, L = b->length(); i < L; ++i) {
615
608
  Statement_Obj stm = b->at(i);
616
- if (Cast<Declaration>(stm) || Cast<Directive>(stm)) {
609
+ if (Cast<Declaration>(stm) || Cast<AtRule>(stm)) {
617
610
  hasDeclarations = true;
618
611
  }
619
- else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
612
+ else if (ParentStatement* b = Cast<ParentStatement>(stm)) {
620
613
  Block_Obj pChildBlock = b->block();
621
614
  if (!b->is_invisible()) {
622
615
  if (isPrintable(pChildBlock, style)) {
@@ -633,36 +626,37 @@ namespace Sass {
633
626
  return false;
634
627
  }
635
628
 
636
- bool isPrintable(Media_Block_Ptr m, Sass_Output_Style style)
629
+ bool isPrintable(CssMediaRule* m, Sass_Output_Style style)
637
630
  {
638
- if (m == 0) return false;
631
+ if (m == nullptr) return false;
639
632
  Block_Obj b = m->block();
640
- if (b == 0) return false;
633
+ if (b == nullptr) return false;
634
+ if (m->empty()) return false;
641
635
  for (size_t i = 0, L = b->length(); i < L; ++i) {
642
636
  Statement_Obj stm = b->at(i);
643
- if (Cast<Directive>(stm)) return true;
637
+ if (Cast<AtRule>(stm)) return true;
644
638
  else if (Cast<Declaration>(stm)) return true;
645
- else if (Comment_Ptr c = Cast<Comment>(stm)) {
639
+ else if (Comment* c = Cast<Comment>(stm)) {
646
640
  if (isPrintable(c, style)) {
647
641
  return true;
648
642
  }
649
643
  }
650
- else if (Ruleset_Ptr r = Cast<Ruleset>(stm)) {
644
+ else if (StyleRule* r = Cast<StyleRule>(stm)) {
651
645
  if (isPrintable(r, style)) {
652
646
  return true;
653
647
  }
654
648
  }
655
- else if (Supports_Block_Ptr f = Cast<Supports_Block>(stm)) {
649
+ else if (SupportsRule* f = Cast<SupportsRule>(stm)) {
656
650
  if (isPrintable(f, style)) {
657
651
  return true;
658
652
  }
659
653
  }
660
- else if (Media_Block_Ptr mb = Cast<Media_Block>(stm)) {
654
+ else if (CssMediaRule* mb = Cast<CssMediaRule>(stm)) {
661
655
  if (isPrintable(mb, style)) {
662
656
  return true;
663
657
  }
664
658
  }
665
- else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
659
+ else if (ParentStatement* b = Cast<ParentStatement>(stm)) {
666
660
  if (isPrintable(b->block(), style)) {
667
661
  return true;
668
662
  }
@@ -671,7 +665,7 @@ namespace Sass {
671
665
  return false;
672
666
  }
673
667
 
674
- bool isPrintable(Comment_Ptr c, Sass_Output_Style style)
668
+ bool isPrintable(Comment* c, Sass_Output_Style style)
675
669
  {
676
670
  // keep for uncompressed
677
671
  if (style != COMPRESSED) {
@@ -692,30 +686,30 @@ namespace Sass {
692
686
 
693
687
  for (size_t i = 0, L = b->length(); i < L; ++i) {
694
688
  Statement_Obj stm = b->at(i);
695
- if (Cast<Declaration>(stm) || Cast<Directive>(stm)) {
689
+ if (Cast<Declaration>(stm) || Cast<AtRule>(stm)) {
696
690
  return true;
697
691
  }
698
- else if (Comment_Ptr c = Cast<Comment>(stm)) {
692
+ else if (Comment* c = Cast<Comment>(stm)) {
699
693
  if (isPrintable(c, style)) {
700
694
  return true;
701
695
  }
702
696
  }
703
- else if (Ruleset_Ptr r = Cast<Ruleset>(stm)) {
697
+ else if (StyleRule* r = Cast<StyleRule>(stm)) {
704
698
  if (isPrintable(r, style)) {
705
699
  return true;
706
700
  }
707
701
  }
708
- else if (Supports_Block_Ptr f = Cast<Supports_Block>(stm)) {
702
+ else if (SupportsRule* f = Cast<SupportsRule>(stm)) {
709
703
  if (isPrintable(f, style)) {
710
704
  return true;
711
705
  }
712
706
  }
713
- else if (Media_Block_Ptr m = Cast<Media_Block>(stm)) {
707
+ else if (CssMediaRule * m = Cast<CssMediaRule>(stm)) {
714
708
  if (isPrintable(m, style)) {
715
709
  return true;
716
710
  }
717
711
  }
718
- else if (Has_Block_Ptr b = Cast<Has_Block>(stm)) {
712
+ else if (ParentStatement* b = Cast<ParentStatement>(stm)) {
719
713
  if (isPrintable(b->block(), style)) {
720
714
  return true;
721
715
  }
@@ -725,9 +719,5 @@ namespace Sass {
725
719
  return false;
726
720
  }
727
721
 
728
- bool isAscii(const char chr) {
729
- return unsigned(chr) < 128;
730
- }
731
-
732
722
  }
733
723
  }