sassc 1.8.3 → 1.8.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -1
  3. data/ext/libsass/.editorconfig +1 -1
  4. data/ext/libsass/.gitignore +1 -0
  5. data/ext/libsass/LICENSE +1 -1
  6. data/ext/libsass/Makefile +20 -14
  7. data/ext/libsass/Makefile.conf +0 -1
  8. data/ext/libsass/Readme.md +3 -1
  9. data/ext/libsass/appveyor.yml +19 -11
  10. data/ext/libsass/docs/api-importer-example.md +2 -1235
  11. data/ext/libsass/docs/build-with-autotools.md +10 -0
  12. data/ext/libsass/docs/build-with-makefiles.md +18 -0
  13. data/ext/libsass/include/sass/base.h +4 -1
  14. data/ext/libsass/include/sass/values.h +2 -1
  15. data/ext/libsass/src/ast.cpp +279 -346
  16. data/ext/libsass/src/ast.hpp +234 -60
  17. data/ext/libsass/src/base64vlq.cpp +1 -0
  18. data/ext/libsass/src/bind.cpp +35 -45
  19. data/ext/libsass/src/bind.hpp +1 -0
  20. data/ext/libsass/src/color_maps.cpp +1 -0
  21. data/ext/libsass/src/constants.cpp +4 -1
  22. data/ext/libsass/src/constants.hpp +2 -1
  23. data/ext/libsass/src/context.cpp +41 -31
  24. data/ext/libsass/src/context.hpp +10 -10
  25. data/ext/libsass/src/cssize.cpp +7 -4
  26. data/ext/libsass/src/cssize.hpp +1 -3
  27. data/ext/libsass/src/debugger.hpp +73 -14
  28. data/ext/libsass/src/emitter.cpp +37 -25
  29. data/ext/libsass/src/emitter.hpp +10 -9
  30. data/ext/libsass/src/environment.cpp +16 -5
  31. data/ext/libsass/src/environment.hpp +5 -3
  32. data/ext/libsass/src/error_handling.cpp +91 -14
  33. data/ext/libsass/src/error_handling.hpp +105 -4
  34. data/ext/libsass/src/eval.cpp +519 -330
  35. data/ext/libsass/src/eval.hpp +12 -13
  36. data/ext/libsass/src/expand.cpp +92 -56
  37. data/ext/libsass/src/expand.hpp +5 -3
  38. data/ext/libsass/src/extend.cpp +60 -51
  39. data/ext/libsass/src/extend.hpp +1 -3
  40. data/ext/libsass/src/file.cpp +37 -27
  41. data/ext/libsass/src/functions.cpp +78 -62
  42. data/ext/libsass/src/functions.hpp +1 -0
  43. data/ext/libsass/src/inspect.cpp +293 -64
  44. data/ext/libsass/src/inspect.hpp +2 -0
  45. data/ext/libsass/src/lexer.cpp +1 -0
  46. data/ext/libsass/src/listize.cpp +14 -15
  47. data/ext/libsass/src/listize.hpp +3 -5
  48. data/ext/libsass/src/memory_manager.cpp +1 -0
  49. data/ext/libsass/src/node.cpp +2 -3
  50. data/ext/libsass/src/operation.hpp +70 -71
  51. data/ext/libsass/src/output.cpp +28 -32
  52. data/ext/libsass/src/output.hpp +1 -2
  53. data/ext/libsass/src/parser.cpp +402 -183
  54. data/ext/libsass/src/parser.hpp +19 -9
  55. data/ext/libsass/src/plugins.cpp +1 -0
  56. data/ext/libsass/src/position.cpp +1 -0
  57. data/ext/libsass/src/prelexer.cpp +134 -56
  58. data/ext/libsass/src/prelexer.hpp +51 -3
  59. data/ext/libsass/src/remove_placeholders.cpp +35 -9
  60. data/ext/libsass/src/remove_placeholders.hpp +4 -3
  61. data/ext/libsass/src/sass.cpp +1 -0
  62. data/ext/libsass/src/sass.hpp +129 -0
  63. data/ext/libsass/src/sass_context.cpp +31 -14
  64. data/ext/libsass/src/sass_context.hpp +2 -31
  65. data/ext/libsass/src/sass_functions.cpp +1 -0
  66. data/ext/libsass/src/sass_interface.cpp +5 -6
  67. data/ext/libsass/src/sass_util.cpp +1 -2
  68. data/ext/libsass/src/sass_util.hpp +5 -5
  69. data/ext/libsass/src/sass_values.cpp +13 -10
  70. data/ext/libsass/src/source_map.cpp +4 -3
  71. data/ext/libsass/src/source_map.hpp +2 -2
  72. data/ext/libsass/src/subset_map.hpp +0 -1
  73. data/ext/libsass/src/to_c.cpp +1 -0
  74. data/ext/libsass/src/to_c.hpp +1 -3
  75. data/ext/libsass/src/to_value.cpp +3 -5
  76. data/ext/libsass/src/to_value.hpp +1 -1
  77. data/ext/libsass/src/units.cpp +96 -59
  78. data/ext/libsass/src/units.hpp +10 -8
  79. data/ext/libsass/src/utf8_string.cpp +5 -0
  80. data/ext/libsass/src/util.cpp +23 -156
  81. data/ext/libsass/src/util.hpp +10 -14
  82. data/ext/libsass/src/values.cpp +1 -0
  83. data/ext/libsass/test/test_node.cpp +2 -6
  84. data/ext/libsass/test/test_selector_difference.cpp +1 -3
  85. data/ext/libsass/test/test_specificity.cpp +0 -2
  86. data/ext/libsass/test/test_superselector.cpp +0 -2
  87. data/ext/libsass/test/test_unification.cpp +1 -3
  88. data/ext/libsass/win/libsass.targets +18 -5
  89. data/ext/libsass/win/libsass.vcxproj +9 -7
  90. data/ext/libsass/win/libsass.vcxproj.filters +148 -106
  91. data/lib/sassc/version.rb +1 -1
  92. data/test/engine_test.rb +12 -0
  93. data/test/native_test.rb +1 -1
  94. metadata +3 -4
  95. data/ext/libsass/src/to_string.cpp +0 -48
  96. data/ext/libsass/src/to_string.hpp +0 -38
@@ -1,3 +1,4 @@
1
+ #include "sass.hpp"
1
2
  #include <string>
2
3
  #include <sstream>
3
4
  #include <iostream>
@@ -16,7 +17,7 @@ namespace Sass {
16
17
 
17
18
  std::string SourceMap::render_srcmap(Context &ctx) {
18
19
 
19
- const bool include_sources = ctx.c_options->source_map_contents;
20
+ const bool include_sources = ctx.c_options.source_map_contents;
20
21
  const std::vector<std::string> links = ctx.srcmap_links;
21
22
  const std::vector<Resource>& sources(ctx.resources);
22
23
 
@@ -159,12 +160,12 @@ namespace Sass {
159
160
  current_position += offset;
160
161
  }
161
162
 
162
- void SourceMap::add_open_mapping(AST_Node* node)
163
+ void SourceMap::add_open_mapping(const AST_Node* node)
163
164
  {
164
165
  mappings.push_back(Mapping(node->pstate(), current_position));
165
166
  }
166
167
 
167
- void SourceMap::add_close_mapping(AST_Node* node)
168
+ void SourceMap::add_close_mapping(const AST_Node* node)
168
169
  {
169
170
  mappings.push_back(Mapping(node->pstate() + node->pstate().offset, current_position));
170
171
  }
@@ -28,8 +28,8 @@ namespace Sass {
28
28
  void prepend(const Offset& offset);
29
29
  void append(const OutputBuffer& out);
30
30
  void prepend(const OutputBuffer& out);
31
- void add_open_mapping(AST_Node* node);
32
- void add_close_mapping(AST_Node* node);
31
+ void add_open_mapping(const AST_Node* node);
32
+ void add_close_mapping(const AST_Node* node);
33
33
 
34
34
  std::string render_srcmap(Context &ctx);
35
35
  ParserState remap(const ParserState& pstate);
@@ -94,7 +94,6 @@ namespace Sass {
94
94
  { ss.insert(s[i]); }
95
95
  for (size_t i = 0, S = s.size(); i < S; ++i)
96
96
  {
97
- hash_[s[i]];
98
97
  hash_[s[i]].push_back(make_triple(s, ss, index));
99
98
  }
100
99
  }
@@ -1,3 +1,4 @@
1
+ #include "sass.hpp"
1
2
  #include "to_c.hpp"
2
3
  #include "ast.hpp"
3
4
 
@@ -8,15 +8,13 @@
8
8
  namespace Sass {
9
9
 
10
10
  class To_C : public Operation_CRTP<union Sass_Value*, To_C> {
11
- // import all the class-specific methods and override as desired
12
- using Operation<union Sass_Value*>::operator();
13
11
  // override this to define a catch-all
14
12
  union Sass_Value* fallback_impl(AST_Node* n);
15
13
 
16
14
  public:
17
15
 
18
16
  To_C() { }
19
- virtual ~To_C() { }
17
+ ~To_C() { }
20
18
 
21
19
  union Sass_Value* operator()(Boolean*);
22
20
  union Sass_Value* operator()(Number*);
@@ -1,6 +1,6 @@
1
+ #include "sass.hpp"
1
2
  #include "ast.hpp"
2
3
  #include "to_value.hpp"
3
- #include "to_string.hpp"
4
4
 
5
5
  namespace Sass {
6
6
 
@@ -91,19 +91,17 @@ namespace Sass {
91
91
  // Selector_List is converted to a string
92
92
  Value* To_Value::operator()(Selector_List* s)
93
93
  {
94
- To_String to_string(&ctx);
95
94
  return SASS_MEMORY_NEW(mem, String_Quoted,
96
95
  s->pstate(),
97
- s->perform(&to_string));
96
+ s->to_string(ctx.c_options));
98
97
  }
99
98
 
100
99
  // Binary_Expression is converted to a string
101
100
  Value* To_Value::operator()(Binary_Expression* s)
102
101
  {
103
- To_String to_string(&ctx);
104
102
  return SASS_MEMORY_NEW(mem, String_Quoted,
105
103
  s->pstate(),
106
- s->perform(&to_string));
104
+ s->to_string(ctx.c_options));
107
105
  }
108
106
 
109
107
  };
@@ -21,7 +21,7 @@ namespace Sass {
21
21
  To_Value(Context& ctx, Memory_Manager& mem)
22
22
  : ctx(ctx), mem(mem)
23
23
  { }
24
- virtual ~To_Value() { }
24
+ ~To_Value() { }
25
25
  using Operation<Value*>::operator();
26
26
 
27
27
  Value* operator()(Argument*);
@@ -1,10 +1,7 @@
1
+ #include "sass.hpp"
1
2
  #include <stdexcept>
2
3
  #include "units.hpp"
3
4
 
4
- #ifdef IN
5
- #undef IN
6
- #endif
7
-
8
5
  namespace Sass {
9
6
 
10
7
  /* the conversion matrix can be readed the following way */
@@ -52,88 +49,128 @@ namespace Sass {
52
49
  /* dppx */ { 1/96.0, 2.54/96, 1 }
53
50
  };
54
51
 
55
- SassUnitType get_unit_type(SassUnit unit)
52
+ UnitClass get_unit_type(UnitType unit)
53
+ {
54
+ switch (unit & 0xFF00)
55
+ {
56
+ case UnitClass::LENGTH: return UnitClass::LENGTH; break;
57
+ case UnitClass::ANGLE: return UnitClass::ANGLE; break;
58
+ case UnitClass::TIME: return UnitClass::TIME; break;
59
+ case UnitClass::FREQUENCY: return UnitClass::FREQUENCY; break;
60
+ case UnitClass::RESOLUTION: return UnitClass::RESOLUTION; break;
61
+ default: return UnitClass::INCOMMENSURABLE; break;
62
+ }
63
+ };
64
+
65
+ std::string get_unit_class(UnitType unit)
56
66
  {
57
67
  switch (unit & 0xFF00)
58
68
  {
59
- case SassUnitType::LENGTH: return SassUnitType::LENGTH; break;
60
- case SassUnitType::ANGLE: return SassUnitType::ANGLE; break;
61
- case SassUnitType::TIME: return SassUnitType::TIME; break;
62
- case SassUnitType::FREQUENCY: return SassUnitType::FREQUENCY; break;
63
- case SassUnitType::RESOLUTION: return SassUnitType::RESOLUTION; break;
64
- default: return SassUnitType::INCOMMENSURABLE; break;
69
+ case UnitClass::LENGTH: return "LENGTH"; break;
70
+ case UnitClass::ANGLE: return "ANGLE"; break;
71
+ case UnitClass::TIME: return "TIME"; break;
72
+ case UnitClass::FREQUENCY: return "FREQUENCY"; break;
73
+ case UnitClass::RESOLUTION: return "RESOLUTION"; break;
74
+ default: return "INCOMMENSURABLE"; break;
65
75
  }
66
76
  };
67
77
 
68
- SassUnit string_to_unit(const std::string& s)
78
+ UnitType string_to_unit(const std::string& s)
69
79
  {
70
80
  // size units
71
- if (s == "px") return SassUnit::PX;
72
- else if (s == "pt") return SassUnit::PT;
73
- else if (s == "pc") return SassUnit::PC;
74
- else if (s == "mm") return SassUnit::MM;
75
- else if (s == "cm") return SassUnit::CM;
76
- else if (s == "in") return SassUnit::IN;
81
+ if (s == "px") return UnitType::PX;
82
+ else if (s == "pt") return UnitType::PT;
83
+ else if (s == "pc") return UnitType::PC;
84
+ else if (s == "mm") return UnitType::MM;
85
+ else if (s == "cm") return UnitType::CM;
86
+ else if (s == "in") return UnitType::IN;
77
87
  // angle units
78
- else if (s == "deg") return SassUnit::DEG;
79
- else if (s == "grad") return SassUnit::GRAD;
80
- else if (s == "rad") return SassUnit::RAD;
81
- else if (s == "turn") return SassUnit::TURN;
88
+ else if (s == "deg") return UnitType::DEG;
89
+ else if (s == "grad") return UnitType::GRAD;
90
+ else if (s == "rad") return UnitType::RAD;
91
+ else if (s == "turn") return UnitType::TURN;
82
92
  // time units
83
- else if (s == "s") return SassUnit::SEC;
84
- else if (s == "ms") return SassUnit::MSEC;
93
+ else if (s == "s") return UnitType::SEC;
94
+ else if (s == "ms") return UnitType::MSEC;
85
95
  // frequency units
86
- else if (s == "Hz") return SassUnit::HERTZ;
87
- else if (s == "kHz") return SassUnit::KHERTZ;
96
+ else if (s == "Hz") return UnitType::HERTZ;
97
+ else if (s == "kHz") return UnitType::KHERTZ;
88
98
  // resolutions units
89
- else if (s == "dpi") return SassUnit::DPI;
90
- else if (s == "dpcm") return SassUnit::DPCM;
91
- else if (s == "dppx") return SassUnit::DPPX;
99
+ else if (s == "dpi") return UnitType::DPI;
100
+ else if (s == "dpcm") return UnitType::DPCM;
101
+ else if (s == "dppx") return UnitType::DPPX;
92
102
  // for unknown units
93
- else return SassUnit::UNKNOWN;
103
+ else return UnitType::UNKNOWN;
94
104
  }
95
105
 
96
- const char* unit_to_string(SassUnit unit)
106
+ const char* unit_to_string(UnitType unit)
97
107
  {
98
108
  switch (unit) {
99
109
  // size units
100
- case SassUnit::PX: return "px"; break;
101
- case SassUnit::PT: return "pt"; break;
102
- case SassUnit::PC: return "pc"; break;
103
- case SassUnit::MM: return "mm"; break;
104
- case SassUnit::CM: return "cm"; break;
105
- case SassUnit::IN: return "in"; break;
110
+ case UnitType::PX: return "px"; break;
111
+ case UnitType::PT: return "pt"; break;
112
+ case UnitType::PC: return "pc"; break;
113
+ case UnitType::MM: return "mm"; break;
114
+ case UnitType::CM: return "cm"; break;
115
+ case UnitType::IN: return "in"; break;
106
116
  // angle units
107
- case SassUnit::DEG: return "deg"; break;
108
- case SassUnit::GRAD: return "grad"; break;
109
- case SassUnit::RAD: return "rad"; break;
110
- case SassUnit::TURN: return "turn"; break;
117
+ case UnitType::DEG: return "deg"; break;
118
+ case UnitType::GRAD: return "grad"; break;
119
+ case UnitType::RAD: return "rad"; break;
120
+ case UnitType::TURN: return "turn"; break;
111
121
  // time units
112
- case SassUnit::SEC: return "s"; break;
113
- case SassUnit::MSEC: return "ms"; break;
122
+ case UnitType::SEC: return "s"; break;
123
+ case UnitType::MSEC: return "ms"; break;
114
124
  // frequency units
115
- case SassUnit::HERTZ: return "Hz"; break;
116
- case SassUnit::KHERTZ: return "kHz"; break;
125
+ case UnitType::HERTZ: return "Hz"; break;
126
+ case UnitType::KHERTZ: return "kHz"; break;
117
127
  // resolutions units
118
- case SassUnit::DPI: return "dpi"; break;
119
- case SassUnit::DPCM: return "dpcm"; break;
120
- case SassUnit::DPPX: return "dppx"; break;
128
+ case UnitType::DPI: return "dpi"; break;
129
+ case UnitType::DPCM: return "dpcm"; break;
130
+ case UnitType::DPPX: return "dppx"; break;
121
131
  // for unknown units
122
132
  default: return ""; break;
123
133
  }
124
134
  }
125
135
 
136
+ std::string unit_to_class(const std::string& s)
137
+ {
138
+ if (s == "px") return "LENGTH";
139
+ else if (s == "pt") return "LENGTH";
140
+ else if (s == "pc") return "LENGTH";
141
+ else if (s == "mm") return "LENGTH";
142
+ else if (s == "cm") return "LENGTH";
143
+ else if (s == "in") return "LENGTH";
144
+ // angle units
145
+ else if (s == "deg") return "ANGLE";
146
+ else if (s == "grad") return "ANGLE";
147
+ else if (s == "rad") return "ANGLE";
148
+ else if (s == "turn") return "ANGLE";
149
+ // time units
150
+ else if (s == "s") return "TIME";
151
+ else if (s == "ms") return "TIME";
152
+ // frequency units
153
+ else if (s == "Hz") return "FREQUENCY";
154
+ else if (s == "kHz") return "FREQUENCY";
155
+ // resolutions units
156
+ else if (s == "dpi") return "RESOLUTION";
157
+ else if (s == "dpcm") return "RESOLUTION";
158
+ else if (s == "dppx") return "RESOLUTION";
159
+ // for unknown units
160
+ return "CUSTOM:" + s;
161
+ }
162
+
126
163
  // throws incompatibleUnits exceptions
127
164
  double conversion_factor(const std::string& s1, const std::string& s2, bool strict)
128
165
  {
129
166
  // assert for same units
130
167
  if (s1 == s2) return 1;
131
168
  // get unit enum from string
132
- SassUnit u1 = string_to_unit(s1);
133
- SassUnit u2 = string_to_unit(s2);
169
+ UnitType u1 = string_to_unit(s1);
170
+ UnitType u2 = string_to_unit(s2);
134
171
  // query unit group types
135
- SassUnitType t1 = get_unit_type(u1);
136
- SassUnitType t2 = get_unit_type(u2);
172
+ UnitClass t1 = get_unit_type(u1);
173
+ UnitClass t2 = get_unit_type(u2);
137
174
  // get absolute offset
138
175
  // used for array acces
139
176
  size_t i1 = u1 - t1;
@@ -144,17 +181,17 @@ namespace Sass {
144
181
  // only process known units
145
182
  if (u1 != UNKNOWN && u2 != UNKNOWN) {
146
183
  switch (t1) {
147
- case SassUnitType::LENGTH: return size_conversion_factors[i1][i2]; break;
148
- case SassUnitType::ANGLE: return angle_conversion_factors[i1][i2]; break;
149
- case SassUnitType::TIME: return time_conversion_factors[i1][i2]; break;
150
- case SassUnitType::FREQUENCY: return frequency_conversion_factors[i1][i2]; break;
151
- case SassUnitType::RESOLUTION: return resolution_conversion_factors[i1][i2]; break;
184
+ case UnitClass::LENGTH: return size_conversion_factors[i1][i2]; break;
185
+ case UnitClass::ANGLE: return angle_conversion_factors[i1][i2]; break;
186
+ case UnitClass::TIME: return time_conversion_factors[i1][i2]; break;
187
+ case UnitClass::FREQUENCY: return frequency_conversion_factors[i1][i2]; break;
188
+ case UnitClass::RESOLUTION: return resolution_conversion_factors[i1][i2]; break;
152
189
  // ToDo: should we throw error here?
153
- case SassUnitType::INCOMMENSURABLE: return 0; break;
190
+ case UnitClass::INCOMMENSURABLE: return 0; break;
154
191
  }
155
192
  }
156
193
  // fallback
157
- return 1;
194
+ return 0;
158
195
  }
159
196
 
160
197
  }
@@ -7,9 +7,9 @@
7
7
 
8
8
  namespace Sass {
9
9
 
10
- const double PI = acos(-1);
10
+ const double PI = std::acos(-1);
11
11
 
12
- enum SassUnitType {
12
+ enum UnitClass {
13
13
  LENGTH = 0x000,
14
14
  ANGLE = 0x100,
15
15
  TIME = 0x200,
@@ -18,10 +18,10 @@ namespace Sass {
18
18
  INCOMMENSURABLE = 0x500
19
19
  };
20
20
 
21
- enum SassUnit {
21
+ enum UnitType {
22
22
 
23
23
  // size units
24
- IN = SassUnitType::LENGTH,
24
+ IN = UnitClass::LENGTH,
25
25
  CM,
26
26
  PC,
27
27
  MM,
@@ -58,9 +58,11 @@ namespace Sass {
58
58
  extern const double frequency_conversion_factors[2][2];
59
59
  extern const double resolution_conversion_factors[3][3];
60
60
 
61
- enum SassUnit string_to_unit(const std::string&);
62
- const char* unit_to_string(SassUnit unit);
63
- enum SassUnitType get_unit_type(SassUnit unit);
61
+ enum Sass::UnitType string_to_unit(const std::string&);
62
+ const char* unit_to_string(Sass::UnitType unit);
63
+ enum Sass::UnitClass get_unit_type(Sass::UnitType unit);
64
+ std::string get_unit_class(Sass::UnitType unit);
65
+ std::string unit_to_class(const std::string&);
64
66
  // throws incompatibleUnits exceptions
65
67
  double conversion_factor(const std::string&, const std::string&, bool = true);
66
68
 
@@ -68,7 +70,7 @@ namespace Sass {
68
70
  {
69
71
  public:
70
72
  const char* msg;
71
- incompatibleUnits(SassUnit a, SassUnit b)
73
+ incompatibleUnits(Sass::UnitType a, Sass::UnitType b)
72
74
  : exception()
73
75
  {
74
76
  std::stringstream ss;
@@ -1,3 +1,4 @@
1
+ #include "sass.hpp"
1
2
  #include <string>
2
3
  #include <vector>
3
4
  #include <cstdlib>
@@ -68,6 +69,8 @@ namespace Sass {
68
69
  }
69
70
  }
70
71
 
72
+ #ifdef _WIN32
73
+
71
74
  // utf16 functions
72
75
  using std::wstring;
73
76
 
@@ -93,5 +96,7 @@ namespace Sass {
93
96
  return utf16;
94
97
  }
95
98
 
99
+ #endif
100
+
96
101
  }
97
102
  }
@@ -1,3 +1,4 @@
1
+ #include "sass.hpp"
1
2
  #include "sass.h"
2
3
  #include "ast.hpp"
3
4
  #include "util.hpp"
@@ -16,21 +17,15 @@ namespace Sass {
16
17
  exit(EXIT_FAILURE); \
17
18
  } while (0)
18
19
 
19
- double round(double val)
20
+ double round(double val, size_t precision)
20
21
  {
22
+ // https://github.com/sass/sass/commit/4e3e1d5684cc29073a507578fc977434ff488c93
23
+ if (fmod(val, 1) - 0.5 > - std::pow(0.1, precision + 1)) return std::ceil(val);
24
+ else if (fmod(val, 1) - 0.5 > std::pow(0.1, precision)) return std::floor(val);
21
25
  // work around some compiler issue
22
26
  // cygwin has it not defined in std
23
27
  using namespace std;
24
-
25
- // This was later repatched in 3.4.20
26
- // which is as yet unreleased.
27
- // https://github.com/sass/sass/commit/4e3e1d5684cc29073a507578fc977434ff488c93
28
- if (fmod(val, 1) - 0.5 > -0.00001) return std::ceil(val);
29
28
  return ::round(val);
30
-
31
- // Use this version once sass-spec is at 3.4.20
32
- // if (fmod(val, 1) - 0.5 > -0.00001) return ::round(val);
33
- // return value > 0 ? std::ceil(val) : std::floor(val);
34
29
  }
35
30
 
36
31
  /* Sadly, sass_strdup is not portable. */
@@ -104,94 +99,6 @@ namespace Sass {
104
99
  return *array = arr;
105
100
  }
106
101
 
107
- std::string string_eval_escapes(const std::string& s)
108
- {
109
-
110
- std::string out("");
111
- bool esc = false;
112
- for (size_t i = 0, L = s.length(); i < L; ++i) {
113
- if(s[i] == '\\' && esc == false) {
114
- esc = true;
115
-
116
- // escape length
117
- size_t len = 1;
118
-
119
- // parse as many sequence chars as possible
120
- // ToDo: Check if ruby aborts after possible max
121
- while (i + len < L && s[i + len] && isxdigit(s[i + len])) ++ len;
122
-
123
- // hex string?
124
- if (len > 1) {
125
-
126
- // convert the extracted hex string to code point value
127
- // ToDo: Maybe we could do this without creating a substring
128
- uint32_t cp = strtol(s.substr (i + 1, len - 1).c_str(), NULL, 16);
129
-
130
- if (cp == 0) cp = 0xFFFD;
131
-
132
- // assert invalid code points
133
- if (cp >= 1) {
134
-
135
- // use a very simple approach to convert via utf8 lib
136
- // maybe there is a more elegant way; maybe we shoud
137
- // convert the whole output from string to a stream!?
138
- // allocate memory for utf8 char and convert to utf8
139
- unsigned char u[5] = {0,0,0,0,0}; utf8::append(cp, u);
140
- for(size_t m = 0; u[m] && m < 5; m++) out.push_back(u[m]);
141
-
142
- // skip some more chars?
143
- i += len - 1; esc = false;
144
- if (cp == 10) out += ' ';
145
-
146
- }
147
-
148
- }
149
-
150
- }
151
- else {
152
- out += s[i];
153
- esc = false;
154
- }
155
- }
156
- return out;
157
-
158
- }
159
-
160
- // double escape every escape sequences
161
- // escape unescaped quotes and backslashes
162
- std::string string_escape(const std::string& str)
163
- {
164
- std::string out("");
165
- for (auto i : str) {
166
- // escape some characters
167
- if (i == '"') out += '\\';
168
- if (i == '\'') out += '\\';
169
- if (i == '\\') out += '\\';
170
- out += i;
171
- }
172
- return out;
173
- }
174
-
175
- // unescape every escape sequence
176
- // only removes unescaped backslashes
177
- std::string string_unescape(const std::string& str)
178
- {
179
- std::string out("");
180
- bool esc = false;
181
- for (auto i : str) {
182
- if (esc || i != '\\') {
183
- esc = false;
184
- out += i;
185
- } else {
186
- esc = true;
187
- }
188
- }
189
- // open escape sequence at end
190
- // maybe it should thow an error
191
- if (esc) { out += '\\'; }
192
- return out;
193
- }
194
-
195
102
  // read css string (handle multiline DELIM)
196
103
  std::string read_css_string(const std::string& str)
197
104
  {
@@ -215,28 +122,6 @@ namespace Sass {
215
122
  return out;
216
123
  }
217
124
 
218
- // evacuate unescaped quoted
219
- // leave everything else untouched
220
- std::string evacuate_quotes(const std::string& str)
221
- {
222
- std::string out("");
223
- bool esc = false;
224
- for (auto i : str) {
225
- if (!esc) {
226
- // ignore next character
227
- if (i == '\\') esc = true;
228
- // evacuate unescaped quotes
229
- else if (i == '"') out += '\\';
230
- else if (i == '\'') out += '\\';
231
- }
232
- // get escaped char now
233
- else { esc = false; }
234
- // remove nothing
235
- out += i;
236
- }
237
- return out;
238
- }
239
-
240
125
  // double escape all escape sequences
241
126
  // keep unescaped quotes and backslashes
242
127
  std::string evacuate_escapes(const std::string& str)
@@ -321,38 +206,6 @@ namespace Sass {
321
206
  else return text;
322
207
  }
323
208
 
324
- std::string normalize_wspace(const std::string& str)
325
- {
326
- bool ws = false;
327
- bool esc = false;
328
- std::string text = "";
329
- for(const char& i : str) {
330
- if (!esc && i == '\\') {
331
- esc = true;
332
- ws = false;
333
- text += i;
334
- } else if (esc) {
335
- esc = false;
336
- ws = false;
337
- text += i;
338
- } else if (
339
- i == ' ' ||
340
- i == '\r' ||
341
- i == '\n' ||
342
- i == ' '
343
- ) {
344
- // only add one space
345
- if (!ws) text += ' ';
346
- ws = true;
347
- } else {
348
- ws = false;
349
- text += i;
350
- }
351
- }
352
- if (esc) text += '\\';
353
- return text;
354
- }
355
-
356
209
  // find best quote_mark by detecting if the string contains any single
357
210
  // or double quotes. When a single quote is found, we not we want a double
358
211
  // quote as quote_mark. Otherwise we check if the string cotains any double
@@ -462,7 +315,7 @@ namespace Sass {
462
315
 
463
316
  }
464
317
 
465
- std::string quote(const std::string& s, char q, bool keep_linefeed_whitespace)
318
+ std::string quote(const std::string& s, char q)
466
319
  {
467
320
 
468
321
  // autodetect with fallback to given quote
@@ -488,13 +341,27 @@ namespace Sass {
488
341
 
489
342
  int cp = utf8::next(it, end);
490
343
 
344
+ // in case of \r, check if the next in sequence
345
+ // is \n and then advance the iterator.
346
+ if (cp == '\r' && it < end && utf8::peek_next(it, end) == '\n') {
347
+ cp = utf8::next(it, end);
348
+ }
349
+
491
350
  if (cp == '\n') {
492
351
  quoted.push_back('\\');
493
352
  quoted.push_back('a');
494
353
  // we hope we can remove this flag once we figure out
495
354
  // why ruby sass has these different output behaviors
496
- if (keep_linefeed_whitespace)
355
+ // gsub(/\n(?![a-fA-F0-9\s])/, "\\a").gsub("\n", "\\a ")
356
+ using namespace Prelexer;
357
+ if (alternatives <
358
+ Prelexer::char_range<'a', 'f'>,
359
+ Prelexer::char_range<'A', 'F'>,
360
+ Prelexer::char_range<'0', '9'>,
361
+ space
362
+ >(it) != NULL) {
497
363
  quoted.push_back(' ');
364
+ }
498
365
  } else if (cp < 127) {
499
366
  quoted.push_back((char) cp);
500
367
  } else {
@@ -615,7 +482,7 @@ namespace Sass {
615
482
  }
616
483
  } else if (Comment* c = dynamic_cast<Comment*>(stm)) {
617
484
  // keep for uncompressed
618
- if (style != SASS_STYLE_COMPRESSED) {
485
+ if (style != COMPRESSED) {
619
486
  hasDeclarations = true;
620
487
  }
621
488
  // output style compressed
@@ -720,7 +587,7 @@ namespace Sass {
720
587
  else if (typeid(*stm) == typeid(Comment)) {
721
588
  Comment* c = (Comment*) stm;
722
589
  // keep for uncompressed
723
- if (style != SASS_STYLE_COMPRESSED) {
590
+ if (style != COMPRESSED) {
724
591
  return true;
725
592
  }
726
593
  // output style compressed