sassc 1.8.3 → 1.8.4

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.
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