sassc4 2.4.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.
Files changed (216) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.gitmodules +3 -0
  4. data/.travis.yml +16 -0
  5. data/CHANGELOG.md +97 -0
  6. data/CODE_OF_CONDUCT.md +10 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +80 -0
  10. data/Rakefile +51 -0
  11. data/ext/depend +4 -0
  12. data/ext/extconf.rb +92 -0
  13. data/ext/libsass/VERSION +1 -0
  14. data/ext/libsass/contrib/plugin.cpp +60 -0
  15. data/ext/libsass/include/sass/base.h +97 -0
  16. data/ext/libsass/include/sass/context.h +174 -0
  17. data/ext/libsass/include/sass/functions.h +139 -0
  18. data/ext/libsass/include/sass/values.h +145 -0
  19. data/ext/libsass/include/sass/version.h +12 -0
  20. data/ext/libsass/include/sass.h +15 -0
  21. data/ext/libsass/include/sass2scss.h +120 -0
  22. data/ext/libsass/src/MurmurHash2.hpp +91 -0
  23. data/ext/libsass/src/ast.cpp +953 -0
  24. data/ext/libsass/src/ast.hpp +1064 -0
  25. data/ext/libsass/src/ast2c.cpp +80 -0
  26. data/ext/libsass/src/ast2c.hpp +39 -0
  27. data/ext/libsass/src/ast_def_macros.hpp +140 -0
  28. data/ext/libsass/src/ast_fwd_decl.cpp +31 -0
  29. data/ext/libsass/src/ast_fwd_decl.hpp +274 -0
  30. data/ext/libsass/src/ast_helpers.hpp +316 -0
  31. data/ext/libsass/src/ast_sel_cmp.cpp +396 -0
  32. data/ext/libsass/src/ast_sel_super.cpp +539 -0
  33. data/ext/libsass/src/ast_sel_unify.cpp +275 -0
  34. data/ext/libsass/src/ast_sel_weave.cpp +616 -0
  35. data/ext/libsass/src/ast_selectors.cpp +1070 -0
  36. data/ext/libsass/src/ast_selectors.hpp +523 -0
  37. data/ext/libsass/src/ast_supports.cpp +114 -0
  38. data/ext/libsass/src/ast_supports.hpp +121 -0
  39. data/ext/libsass/src/ast_values.cpp +1154 -0
  40. data/ext/libsass/src/ast_values.hpp +498 -0
  41. data/ext/libsass/src/b64/cencode.h +32 -0
  42. data/ext/libsass/src/b64/encode.h +79 -0
  43. data/ext/libsass/src/backtrace.cpp +50 -0
  44. data/ext/libsass/src/backtrace.hpp +29 -0
  45. data/ext/libsass/src/base64vlq.cpp +47 -0
  46. data/ext/libsass/src/base64vlq.hpp +30 -0
  47. data/ext/libsass/src/bind.cpp +312 -0
  48. data/ext/libsass/src/bind.hpp +15 -0
  49. data/ext/libsass/src/c2ast.cpp +64 -0
  50. data/ext/libsass/src/c2ast.hpp +14 -0
  51. data/ext/libsass/src/c99func.c +54 -0
  52. data/ext/libsass/src/cencode.c +106 -0
  53. data/ext/libsass/src/check_nesting.cpp +393 -0
  54. data/ext/libsass/src/check_nesting.hpp +70 -0
  55. data/ext/libsass/src/color_maps.cpp +652 -0
  56. data/ext/libsass/src/color_maps.hpp +323 -0
  57. data/ext/libsass/src/color_spaces.cpp +241 -0
  58. data/ext/libsass/src/color_spaces.hpp +227 -0
  59. data/ext/libsass/src/constants.cpp +199 -0
  60. data/ext/libsass/src/constants.hpp +200 -0
  61. data/ext/libsass/src/context.cpp +870 -0
  62. data/ext/libsass/src/context.hpp +140 -0
  63. data/ext/libsass/src/cssize.cpp +521 -0
  64. data/ext/libsass/src/cssize.hpp +71 -0
  65. data/ext/libsass/src/dart_helpers.hpp +199 -0
  66. data/ext/libsass/src/debug.hpp +43 -0
  67. data/ext/libsass/src/debugger.hpp +964 -0
  68. data/ext/libsass/src/emitter.cpp +297 -0
  69. data/ext/libsass/src/emitter.hpp +101 -0
  70. data/ext/libsass/src/environment.cpp +260 -0
  71. data/ext/libsass/src/environment.hpp +124 -0
  72. data/ext/libsass/src/error_handling.cpp +239 -0
  73. data/ext/libsass/src/error_handling.hpp +248 -0
  74. data/ext/libsass/src/eval.cpp +1543 -0
  75. data/ext/libsass/src/eval.hpp +110 -0
  76. data/ext/libsass/src/eval_selectors.cpp +75 -0
  77. data/ext/libsass/src/expand.cpp +875 -0
  78. data/ext/libsass/src/expand.hpp +98 -0
  79. data/ext/libsass/src/extender.cpp +1226 -0
  80. data/ext/libsass/src/extender.hpp +399 -0
  81. data/ext/libsass/src/extension.cpp +43 -0
  82. data/ext/libsass/src/extension.hpp +89 -0
  83. data/ext/libsass/src/file.cpp +531 -0
  84. data/ext/libsass/src/file.hpp +124 -0
  85. data/ext/libsass/src/fn_colors.cpp +836 -0
  86. data/ext/libsass/src/fn_colors.hpp +99 -0
  87. data/ext/libsass/src/fn_lists.cpp +285 -0
  88. data/ext/libsass/src/fn_lists.hpp +34 -0
  89. data/ext/libsass/src/fn_maps.cpp +94 -0
  90. data/ext/libsass/src/fn_maps.hpp +30 -0
  91. data/ext/libsass/src/fn_miscs.cpp +248 -0
  92. data/ext/libsass/src/fn_miscs.hpp +40 -0
  93. data/ext/libsass/src/fn_numbers.cpp +246 -0
  94. data/ext/libsass/src/fn_numbers.hpp +45 -0
  95. data/ext/libsass/src/fn_selectors.cpp +205 -0
  96. data/ext/libsass/src/fn_selectors.hpp +35 -0
  97. data/ext/libsass/src/fn_strings.cpp +268 -0
  98. data/ext/libsass/src/fn_strings.hpp +34 -0
  99. data/ext/libsass/src/fn_utils.cpp +159 -0
  100. data/ext/libsass/src/fn_utils.hpp +62 -0
  101. data/ext/libsass/src/inspect.cpp +1126 -0
  102. data/ext/libsass/src/inspect.hpp +101 -0
  103. data/ext/libsass/src/json.cpp +1436 -0
  104. data/ext/libsass/src/json.hpp +117 -0
  105. data/ext/libsass/src/kwd_arg_macros.hpp +28 -0
  106. data/ext/libsass/src/lexer.cpp +122 -0
  107. data/ext/libsass/src/lexer.hpp +304 -0
  108. data/ext/libsass/src/listize.cpp +70 -0
  109. data/ext/libsass/src/listize.hpp +37 -0
  110. data/ext/libsass/src/mapping.hpp +19 -0
  111. data/ext/libsass/src/memory/allocator.cpp +48 -0
  112. data/ext/libsass/src/memory/allocator.hpp +138 -0
  113. data/ext/libsass/src/memory/config.hpp +20 -0
  114. data/ext/libsass/src/memory/memory_pool.hpp +186 -0
  115. data/ext/libsass/src/memory/shared_ptr.cpp +33 -0
  116. data/ext/libsass/src/memory/shared_ptr.hpp +332 -0
  117. data/ext/libsass/src/memory.hpp +12 -0
  118. data/ext/libsass/src/operation.hpp +223 -0
  119. data/ext/libsass/src/operators.cpp +267 -0
  120. data/ext/libsass/src/operators.hpp +30 -0
  121. data/ext/libsass/src/ordered_map.hpp +112 -0
  122. data/ext/libsass/src/output.cpp +320 -0
  123. data/ext/libsass/src/output.hpp +47 -0
  124. data/ext/libsass/src/parser.cpp +3059 -0
  125. data/ext/libsass/src/parser.hpp +395 -0
  126. data/ext/libsass/src/parser_selectors.cpp +189 -0
  127. data/ext/libsass/src/permutate.hpp +164 -0
  128. data/ext/libsass/src/plugins.cpp +188 -0
  129. data/ext/libsass/src/plugins.hpp +57 -0
  130. data/ext/libsass/src/position.cpp +163 -0
  131. data/ext/libsass/src/position.hpp +147 -0
  132. data/ext/libsass/src/prelexer.cpp +1780 -0
  133. data/ext/libsass/src/prelexer.hpp +484 -0
  134. data/ext/libsass/src/remove_placeholders.cpp +86 -0
  135. data/ext/libsass/src/remove_placeholders.hpp +37 -0
  136. data/ext/libsass/src/sass.cpp +156 -0
  137. data/ext/libsass/src/sass.hpp +147 -0
  138. data/ext/libsass/src/sass2scss.cpp +895 -0
  139. data/ext/libsass/src/sass_context.cpp +742 -0
  140. data/ext/libsass/src/sass_context.hpp +129 -0
  141. data/ext/libsass/src/sass_functions.cpp +210 -0
  142. data/ext/libsass/src/sass_functions.hpp +50 -0
  143. data/ext/libsass/src/sass_values.cpp +362 -0
  144. data/ext/libsass/src/sass_values.hpp +82 -0
  145. data/ext/libsass/src/settings.hpp +19 -0
  146. data/ext/libsass/src/source.cpp +69 -0
  147. data/ext/libsass/src/source.hpp +95 -0
  148. data/ext/libsass/src/source_data.hpp +32 -0
  149. data/ext/libsass/src/source_map.cpp +202 -0
  150. data/ext/libsass/src/source_map.hpp +65 -0
  151. data/ext/libsass/src/stylesheet.cpp +22 -0
  152. data/ext/libsass/src/stylesheet.hpp +57 -0
  153. data/ext/libsass/src/to_value.cpp +114 -0
  154. data/ext/libsass/src/to_value.hpp +46 -0
  155. data/ext/libsass/src/units.cpp +507 -0
  156. data/ext/libsass/src/units.hpp +110 -0
  157. data/ext/libsass/src/utf8/checked.h +336 -0
  158. data/ext/libsass/src/utf8/core.h +332 -0
  159. data/ext/libsass/src/utf8/unchecked.h +235 -0
  160. data/ext/libsass/src/utf8.h +34 -0
  161. data/ext/libsass/src/utf8_string.cpp +104 -0
  162. data/ext/libsass/src/utf8_string.hpp +38 -0
  163. data/ext/libsass/src/util.cpp +723 -0
  164. data/ext/libsass/src/util.hpp +105 -0
  165. data/ext/libsass/src/util_string.cpp +125 -0
  166. data/ext/libsass/src/util_string.hpp +73 -0
  167. data/ext/libsass/src/values.cpp +140 -0
  168. data/ext/libsass/src/values.hpp +12 -0
  169. data/lib/sassc/dependency.rb +17 -0
  170. data/lib/sassc/engine.rb +141 -0
  171. data/lib/sassc/error.rb +37 -0
  172. data/lib/sassc/functions_handler.rb +73 -0
  173. data/lib/sassc/import_handler.rb +50 -0
  174. data/lib/sassc/importer.rb +31 -0
  175. data/lib/sassc/native/native_context_api.rb +147 -0
  176. data/lib/sassc/native/native_functions_api.rb +159 -0
  177. data/lib/sassc/native/sass2scss_api.rb +10 -0
  178. data/lib/sassc/native/sass_input_style.rb +13 -0
  179. data/lib/sassc/native/sass_output_style.rb +12 -0
  180. data/lib/sassc/native/sass_value.rb +97 -0
  181. data/lib/sassc/native/string_list.rb +10 -0
  182. data/lib/sassc/native.rb +64 -0
  183. data/lib/sassc/sass_2_scss.rb +9 -0
  184. data/lib/sassc/script/functions.rb +8 -0
  185. data/lib/sassc/script/value/bool.rb +32 -0
  186. data/lib/sassc/script/value/color.rb +95 -0
  187. data/lib/sassc/script/value/list.rb +136 -0
  188. data/lib/sassc/script/value/map.rb +69 -0
  189. data/lib/sassc/script/value/number.rb +389 -0
  190. data/lib/sassc/script/value/string.rb +96 -0
  191. data/lib/sassc/script/value.rb +137 -0
  192. data/lib/sassc/script/value_conversion/base.rb +13 -0
  193. data/lib/sassc/script/value_conversion/bool.rb +13 -0
  194. data/lib/sassc/script/value_conversion/color.rb +18 -0
  195. data/lib/sassc/script/value_conversion/list.rb +25 -0
  196. data/lib/sassc/script/value_conversion/map.rb +21 -0
  197. data/lib/sassc/script/value_conversion/number.rb +13 -0
  198. data/lib/sassc/script/value_conversion/string.rb +17 -0
  199. data/lib/sassc/script/value_conversion.rb +69 -0
  200. data/lib/sassc/script.rb +17 -0
  201. data/lib/sassc/util/normalized_map.rb +117 -0
  202. data/lib/sassc/util.rb +231 -0
  203. data/lib/sassc/version.rb +5 -0
  204. data/lib/sassc.rb +57 -0
  205. data/sassc.gemspec +69 -0
  206. data/test/css_color_level4_test.rb +168 -0
  207. data/test/custom_importer_test.rb +127 -0
  208. data/test/engine_test.rb +314 -0
  209. data/test/error_test.rb +29 -0
  210. data/test/fixtures/paths.scss +10 -0
  211. data/test/functions_test.rb +340 -0
  212. data/test/native_test.rb +213 -0
  213. data/test/output_style_test.rb +107 -0
  214. data/test/sass_2_scss_test.rb +14 -0
  215. data/test/test_helper.rb +45 -0
  216. metadata +396 -0
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ class FunctionsHandler
5
+ def initialize(options)
6
+ @options = options
7
+ end
8
+
9
+ def setup(native_options, functions: Script::Functions)
10
+ @callbacks = {}
11
+ @function_names = {}
12
+
13
+ list = Native.make_function_list(Script.custom_functions(functions: functions).count)
14
+
15
+ # use an anonymous class wrapper to avoid mutations in a threaded environment
16
+ functions_wrapper = Class.new do
17
+ attr_accessor :options
18
+ include functions
19
+ end.new
20
+ functions_wrapper.options = @options
21
+
22
+ Script.custom_functions(functions: functions).each_with_index do |custom_function, i|
23
+ @callbacks[custom_function] = FFI::Function.new(:pointer, [:pointer, :pointer]) do |native_argument_list, cookie|
24
+ begin
25
+ function_arguments = arguments_from_native_list(native_argument_list)
26
+ result = functions_wrapper.send(custom_function, *function_arguments)
27
+ to_native_value(result)
28
+ rescue StandardError => exception
29
+ # This rescues any exceptions that occur either in value conversion
30
+ # or during the execution of a custom function.
31
+ error(exception.message)
32
+ end
33
+ end
34
+
35
+ @function_names[custom_function] = Script.formatted_function_name(custom_function, functions: functions)
36
+
37
+ callback = Native.make_function(
38
+ @function_names[custom_function],
39
+ @callbacks[custom_function],
40
+ nil
41
+ )
42
+
43
+ Native::function_set_list_entry(list, i, callback)
44
+ end
45
+
46
+ Native::option_set_c_functions(native_options, list)
47
+ end
48
+
49
+ private
50
+
51
+ def arguments_from_native_list(native_argument_list)
52
+ native_argument_list_length = Native.list_get_length(native_argument_list)
53
+
54
+ (0...native_argument_list_length).map do |i|
55
+ native_value = Native.list_get_value(native_argument_list, i)
56
+ Script::ValueConversion.from_native(native_value, @options)
57
+ end.compact
58
+ end
59
+
60
+ def to_native_value(sass_value)
61
+ # if the custom function returns nil, we provide a "default" return
62
+ # value of an empty string
63
+ sass_value ||= SassC::Script::Value::String.new("")
64
+ sass_value.options = @options
65
+ Script::ValueConversion.to_native(sass_value)
66
+ end
67
+
68
+ def error(message)
69
+ $stderr.puts "[SassC::FunctionsHandler] #{message}"
70
+ Native.make_error(message)
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ class ImportHandler
5
+ def initialize(options)
6
+ @importer = if options[:importer]
7
+ options[:importer].new(options)
8
+ else
9
+ nil
10
+ end
11
+ end
12
+
13
+ def setup(native_options)
14
+ return unless @importer
15
+
16
+ importer_callback = Native.make_importer(import_function, nil)
17
+
18
+ list = Native.make_function_list(1)
19
+ Native::function_set_list_entry(list, 0, importer_callback)
20
+
21
+ Native.option_set_c_importers(native_options, list)
22
+ end
23
+
24
+ private
25
+
26
+ def import_function
27
+ @import_function ||= FFI::Function.new(:pointer, [:string, :pointer, :pointer]) do |path, importer_entry, compiler|
28
+ last_import = Native::compiler_get_last_import(compiler)
29
+ parent_path = Native::import_get_abs_path(last_import)
30
+
31
+ imports = [*@importer.imports(path, parent_path)]
32
+ imports_to_native(imports)
33
+ end
34
+ end
35
+
36
+ def imports_to_native(imports)
37
+ import_list = Native.make_import_list(imports.size)
38
+
39
+ imports.each_with_index do |import, i|
40
+ source = import.source ? Native.native_string(import.source) : nil
41
+ source_map_path = nil
42
+
43
+ entry = Native.make_import_entry(import.path, source, source_map_path)
44
+ Native.import_set_list_entry(import_list, i, entry)
45
+ end
46
+
47
+ import_list
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ class Importer
5
+ attr_reader :options
6
+
7
+ def initialize(options)
8
+ @options = options
9
+ end
10
+
11
+ def imports(path, parent_path)
12
+ # A custom importer must override this method.
13
+ # Custom importer may return an Import, or an array of Imports.
14
+ raise NotImplementedError
15
+ end
16
+
17
+ class Import
18
+ attr_accessor :path, :source, :source_map_path
19
+
20
+ def initialize(path, source: nil, source_map_path: nil)
21
+ @path = path
22
+ @source = source
23
+ @source_map_path = source_map_path
24
+ end
25
+
26
+ def to_s
27
+ "Import: #{path} #{source} #{source_map_path}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,147 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ attach_function :version, :libsass_version, [], :string
6
+
7
+ # Create and initialize an option struct
8
+ # ADDAPI struct Sass_Options* ADDCALL sass_make_options (void);
9
+ attach_function :sass_make_options, [], :sass_options_ptr
10
+
11
+ # Create and initialize a specific context
12
+ # ADDAPI struct Sass_File_Context* ADDCALL sass_make_file_context (const char* input_path);
13
+ # ADDAPI struct Sass_Data_Context* ADDCALL sass_make_data_context (char* source_string);
14
+ attach_function :sass_make_file_context, [:string], :sass_file_context_ptr
15
+ attach_function :_make_data_context, :sass_make_data_context, [:pointer], :sass_data_context_ptr
16
+
17
+ def self.make_data_context(data)
18
+ _make_data_context(Native.native_string(data))
19
+ end
20
+
21
+ # Call the compilation step for the specific context
22
+ # ADDAPI int ADDCALL sass_compile_file_context (struct Sass_File_Context* ctx);
23
+ # ADDAPI int ADDCALL sass_compile_data_context (struct Sass_Data_Context* ctx);
24
+ attach_function :sass_compile_file_context, [:sass_file_context_ptr], :int
25
+ attach_function :sass_compile_data_context, [:sass_data_context_ptr], :int
26
+
27
+ # Create a sass compiler instance for more control
28
+ # ADDAPI struct Sass_Compiler* ADDCALL sass_make_file_compiler (struct Sass_File_Context* file_ctx);
29
+ # ADDAPI struct Sass_Compiler* ADDCALL sass_make_data_compiler (struct Sass_Data_Context* data_ctx);
30
+
31
+ # Execute the different compilation steps individually
32
+ # Usefull if you only want to query the included files
33
+ # ADDAPI int ADDCALL sass_compiler_parse(struct Sass_Compiler* compiler);
34
+ # ADDAPI int ADDCALL sass_compiler_execute(struct Sass_Compiler* compiler);
35
+
36
+ # Release all memory allocated with the compiler
37
+ # This does _not_ include any contexts or options
38
+ # ADDAPI void ADDCALL sass_delete_compiler(struct Sass_Compiler* compiler);
39
+
40
+ # Release all memory allocated and also ourself
41
+ # ADDAPI void ADDCALL sass_delete_file_context (struct Sass_File_Context* ctx);
42
+ # ADDAPI void ADDCALL sass_delete_data_context (struct Sass_Data_Context* ctx);
43
+ attach_function :sass_delete_file_context, [:sass_file_context_ptr], :void
44
+ attach_function :sass_delete_data_context, [:sass_data_context_ptr], :void
45
+
46
+ # Getters for context from specific implementation
47
+ # ADDAPI struct Sass_Context* ADDCALL sass_file_context_get_context (struct Sass_File_Context* file_ctx);
48
+ # ADDAPI struct Sass_Context* ADDCALL sass_data_context_get_context (struct Sass_Data_Context* data_ctx);
49
+ attach_function :sass_file_context_get_context, [:sass_file_context_ptr], :sass_context_ptr
50
+ attach_function :sass_data_context_get_context, [:sass_data_context_ptr], :sass_context_ptr
51
+
52
+ # Getters for context options from Sass_Context
53
+ # ADDAPI struct Sass_Options* ADDCALL sass_context_get_options (struct Sass_Context* ctx);
54
+ # ADDAPI struct Sass_Options* ADDCALL sass_file_context_get_options (struct Sass_File_Context* file_ctx);
55
+ # ADDAPI struct Sass_Options* ADDCALL sass_data_context_get_options (struct Sass_Data_Context* data_ctx);
56
+ # ADDAPI void ADDCALL sass_file_context_set_options (struct Sass_File_Context* file_ctx, struct Sass_Options* opt);
57
+ # ADDAPI void ADDCALL sass_data_context_set_options (struct Sass_Data_Context* data_ctx, struct Sass_Options* opt);
58
+ attach_function :sass_context_get_options, [:sass_context_ptr], :sass_options_ptr
59
+ attach_function :sass_file_context_get_options, [:sass_file_context_ptr], :sass_options_ptr
60
+ attach_function :sass_data_context_get_options, [:sass_data_context_ptr], :sass_options_ptr
61
+ attach_function :sass_file_context_set_options, [:sass_file_context_ptr, :sass_options_ptr], :void
62
+ attach_function :sass_data_context_set_options, [:sass_data_context_ptr, :sass_options_ptr], :void
63
+
64
+ # Getters for options
65
+ # ADDAPI int ADDCALL sass_option_get_precision (struct Sass_Options* options);
66
+ # ADDAPI enum Sass_Output_Style ADDCALL sass_option_get_output_style (struct Sass_Options* options);
67
+ # ADDAPI bool ADDCALL sass_option_get_source_comments (struct Sass_Options* options);
68
+ # ADDAPI bool ADDCALL sass_option_get_source_map_embed (struct Sass_Options* options);
69
+ # ADDAPI bool ADDCALL sass_option_get_source_map_contents (struct Sass_Options* options);
70
+ # ADDAPI bool ADDCALL sass_option_get_omit_source_map_url (struct Sass_Options* options);
71
+ # ADDAPI bool ADDCALL sass_option_get_is_indented_syntax_src (struct Sass_Options* options);
72
+ # ADDAPI const char* ADDCALL sass_option_get_input_path (struct Sass_Options* options);
73
+ # ADDAPI const char* ADDCALL sass_option_get_output_path (struct Sass_Options* options);
74
+ # ADDAPI const char* ADDCALL sass_option_get_include_path (struct Sass_Options* options);
75
+ # ADDAPI const char* ADDCALL sass_option_get_source_map_file (struct Sass_Options* options);
76
+ # ADDAPI Sass_C_Function_List ADDCALL sass_option_get_c_functions (struct Sass_Options* options);
77
+ attach_function :sass_option_get_precision, [:sass_options_ptr], :int
78
+ attach_function :sass_option_get_output_style, [:sass_options_ptr], SassOutputStyle
79
+ attach_function :sass_option_get_source_comments, [:sass_options_ptr], :bool
80
+ attach_function :sass_option_get_source_map_embed, [:sass_options_ptr], :bool
81
+ attach_function :sass_option_get_source_map_contents, [:sass_options_ptr], :bool
82
+ attach_function :sass_option_get_omit_source_map_url, [:sass_options_ptr], :bool
83
+ attach_function :sass_option_get_is_indented_syntax_src, [:sass_options_ptr], :bool
84
+ attach_function :sass_option_get_input_path, [:sass_options_ptr], :string
85
+ attach_function :sass_option_get_output_path, [:sass_options_ptr], :string
86
+ attach_function :sass_option_get_include_path, [:sass_options_ptr], :string
87
+ attach_function :sass_option_get_source_map_file, [:sass_options_ptr], :string
88
+ attach_function :sass_option_get_c_functions, [:sass_options_ptr], :sass_c_function_list_ptr
89
+ # ADDAPI Sass_C_Import_Callback ADDCALL sass_option_get_importer (struct Sass_Options* options);
90
+
91
+ # Setters for options
92
+ # ADDAPI void ADDCALL sass_option_set_precision (struct Sass_Options* options, int precision);
93
+ # ADDAPI void ADDCALL sass_option_set_output_style (struct Sass_Options* options, enum Sass_Output_Style output_style);
94
+ # ADDAPI void ADDCALL sass_option_set_source_comments (struct Sass_Options* options, bool source_comments);
95
+ # ADDAPI void ADDCALL sass_option_set_source_map_embed (struct Sass_Options* options, bool source_map_embed);
96
+ # ADDAPI void ADDCALL sass_option_set_source_map_contents (struct Sass_Options* options, bool source_map_contents);
97
+ # ADDAPI void ADDCALL sass_option_set_omit_source_map_url (struct Sass_Options* options, bool omit_source_map_url);
98
+ # ADDAPI void ADDCALL sass_option_set_is_indented_syntax_src (struct Sass_Options* options, bool is_indented_syntax_src);
99
+ # ADDAPI void ADDCALL sass_option_set_input_path (struct Sass_Options* options, const char* input_path);
100
+ # ADDAPI void ADDCALL sass_option_set_output_path (struct Sass_Options* options, const char* output_path);
101
+ # ADDAPI void ADDCALL sass_option_set_include_path (struct Sass_Options* options, const char* include_path);
102
+ # ADDAPI void ADDCALL sass_option_set_source_map_file (struct Sass_Options* options, const char* source_map_file);
103
+ # ADDAPI void ADDCALL sass_option_set_c_functions (struct Sass_Options* options, Sass_C_Function_List c_functions);
104
+ # ADDAPI void ADDCALL sass_option_set_c_importers (struct Sass_Options* options, Sass_Importer_List c_importers);
105
+ attach_function :sass_option_set_precision, [:sass_options_ptr, :int], :void
106
+ attach_function :sass_option_set_output_style, [:sass_options_ptr, SassOutputStyle], :void
107
+ attach_function :sass_option_set_source_comments, [:sass_options_ptr, :bool], :void
108
+ attach_function :sass_option_set_source_map_embed, [:sass_options_ptr, :bool], :void
109
+ attach_function :sass_option_set_source_map_contents, [:sass_options_ptr, :bool], :void
110
+ attach_function :sass_option_set_omit_source_map_url, [:sass_options_ptr, :bool], :void
111
+ attach_function :sass_option_set_is_indented_syntax_src, [:sass_options_ptr, :bool], :void
112
+ attach_function :sass_option_set_input_path, [:sass_options_ptr, :string], :void
113
+ attach_function :sass_option_set_output_path, [:sass_options_ptr, :string], :void
114
+ attach_function :sass_option_set_include_path, [:sass_options_ptr, :string], :void
115
+ attach_function :sass_option_set_source_map_file, [:sass_options_ptr, :string], :void
116
+ attach_function :sass_option_set_c_functions, [:sass_options_ptr, :pointer], :void
117
+ attach_function :sass_option_set_c_importers, [:sass_options_ptr, :pointer], :void
118
+ #attach_function :sass_option_set_c_importers, [:sass_options_ptr, :sass_importer], :void
119
+
120
+ # Getter for context
121
+ # ADDAPI const char* ADDCALL sass_context_get_output_string (struct Sass_Context* ctx);
122
+ # ADDAPI int ADDCALL sass_context_get_error_status (struct Sass_Context* ctx);
123
+ # ADDAPI const char* ADDCALL sass_context_get_error_json (struct Sass_Context* ctx);
124
+ # ADDAPI const char* ADDCALL sass_context_get_error_message (struct Sass_Context* ctx);
125
+ # ADDAPI const char* ADDCALL sass_context_get_error_file (struct Sass_Context* ctx);
126
+ # ADDAPI size_t ADDCALL sass_context_get_error_line (struct Sass_Context* ctx);
127
+ # ADDAPI size_t ADDCALL sass_context_get_error_column (struct Sass_Context* ctx);
128
+ # ADDAPI const char* ADDCALL sass_context_get_source_map_string (struct Sass_Context* ctx);
129
+ # ADDAPI char** ADDCALL sass_context_get_included_files (struct Sass_Context* ctx);
130
+ attach_function :sass_context_get_output_string, [:sass_context_ptr], :string
131
+ attach_function :sass_context_get_error_status, [:sass_context_ptr], :int
132
+ attach_function :sass_context_get_error_json, [:sass_context_ptr], :string
133
+ attach_function :sass_context_get_error_message, [:sass_context_ptr], :string
134
+ attach_function :sass_context_get_error_file, [:sass_context_ptr], :string
135
+ attach_function :sass_context_get_error_line, [:sass_context_ptr], :size_t
136
+ attach_function :sass_context_get_error_column, [:sass_context_ptr], :size_t
137
+ attach_function :sass_context_get_source_map_string, [:sass_context_ptr], :string
138
+ attach_function :_context_get_included_files, :sass_context_get_included_files, [:sass_context_ptr], :pointer
139
+
140
+ def self.context_get_included_files(*args)
141
+ return_string_array _context_get_included_files(*args)
142
+ end
143
+
144
+ # ADDAPI Sass_Import_Entry ADDCALL sass_compiler_get_last_import(struct Sass_Compiler* compiler);
145
+ attach_function :sass_compiler_get_last_import, [:pointer], :pointer
146
+ end
147
+ end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ # Creators for sass function list and function descriptors
6
+ # ADDAPI Sass_C_Function_List ADDCALL sass_make_function_list (size_t length);
7
+ # ADDAPI Sass_C_Function_Callback ADDCALL sass_make_function (const char* signature, Sass_C_Function fn, void* cookie);
8
+ attach_function :sass_make_function_list, [:size_t], :sass_c_function_list_ptr
9
+ attach_function :sass_make_function, [:string, :sass_c_function, :pointer], :sass_c_function_callback_ptr
10
+
11
+ # Setters and getters for callbacks on function lists
12
+ # ADDAPI Sass_C_Function_Callback ADDCALL sass_function_get_list_entry(Sass_C_Function_List list, size_t pos);
13
+ # ADDAPI void ADDCALL sass_function_set_list_entry(Sass_C_Function_List list, size_t pos, Sass_C_Function_Callback cb);
14
+ attach_function :sass_function_get_list_entry, [:sass_c_function_list_ptr, :size_t], :sass_c_function_callback_ptr
15
+ attach_function :sass_function_set_list_entry, [:sass_c_function_list_ptr, :size_t, :sass_c_function_callback_ptr], :void
16
+
17
+ # ADDAPI union Sass_Value* ADDCALL sass_make_number (double val, const char* unit);
18
+ attach_function :sass_make_number, [:double, :string], :sass_value_ptr
19
+
20
+ # ADDAPI union Sass_Value* ADDCALL sass_make_string (const char* val);
21
+ attach_function :sass_make_string, [:string], :sass_value_ptr
22
+
23
+ # ADDAPI union Sass_Value* ADDCALL sass_make_qstring (const char* val);
24
+ attach_function :sass_make_qstring, [:string], :sass_value_ptr
25
+
26
+ # ADDAPI union Sass_Value* ADDCALL sass_make_color (double r, double g, double b, double a);
27
+ attach_function :sass_make_color, [:double, :double, :double, :double], :sass_value_ptr
28
+
29
+ # ADDAPI union Sass_Value* ADDCALL sass_make_map (size_t len);
30
+ attach_function :sass_make_map, [:size_t], :sass_value_ptr
31
+
32
+ # ADDAPI union Sass_Value* ADDCALL sass_make_list (size_t len, enum Sass_Separator sep)
33
+ attach_function :sass_make_list, [:size_t, SassSeparator], :sass_value_ptr
34
+
35
+ # ADDAPI union Sass_Value* ADDCALL sass_make_boolean (boolean val);
36
+ attach_function :sass_make_boolean, [:bool], :sass_value_ptr
37
+
38
+ # ADDAPI void ADDCALL sass_map_set_key (union Sass_Value* v, size_t i, union Sass_Value*);
39
+ attach_function :sass_map_set_key, [:sass_value_ptr, :size_t, :sass_value_ptr], :void
40
+
41
+ # ADDAPI union Sass_Value* ADDCALL sass_map_get_key (const union Sass_Value* v, size_t i);
42
+ attach_function :sass_map_get_key, [:sass_value_ptr, :size_t], :sass_value_ptr
43
+
44
+ # ADDAPI void ADDCALL sass_map_set_value (union Sass_Value* v, size_t i, union Sass_Value*);
45
+ attach_function :sass_map_set_value, [:sass_value_ptr, :size_t, :sass_value_ptr], :void
46
+
47
+ # ADDAPI union Sass_Value* ADDCALL sass_map_get_value (const union Sass_Value* v, size_t i);
48
+ attach_function :sass_map_get_value, [:sass_value_ptr, :size_t], :sass_value_ptr
49
+
50
+ # ADDAPI size_t ADDCALL sass_map_get_length (const union Sass_Value* v);
51
+ attach_function :sass_map_get_length, [:sass_value_ptr], :size_t
52
+
53
+ # ADDAPI union Sass_Value* ADDCALL sass_list_get_value (const union Sass_Value* v, size_t i);
54
+ attach_function :sass_list_get_value, [:sass_value_ptr, :size_t], :sass_value_ptr
55
+
56
+ # ADDAPI void ADDCALL sass_list_set_value (union Sass_Value* v, size_t i, union Sass_Value* value);
57
+ attach_function :sass_list_set_value, [:sass_value_ptr, :size_t, :sass_value_ptr], :void
58
+
59
+ # ADDAPI size_t ADDCALL sass_list_get_length (const union Sass_Value* v);
60
+ attach_function :sass_list_get_length, [:sass_value_ptr], :size_t
61
+
62
+ # ADDAPI union Sass_Value* ADDCALL sass_make_error (const char* msg);
63
+ attach_function :sass_make_error, [:string], :sass_value_ptr
64
+
65
+ # ADDAPI enum Sass_Tag ADDCALL sass_value_get_tag (const union Sass_Value* v);
66
+ attach_function :sass_value_get_tag, [:sass_value_ptr], SassTag
67
+ attach_function :sass_value_is_null, [:sass_value_ptr], :bool
68
+
69
+ # ADDAPI const char* ADDCALL sass_string_get_value (const union Sass_Value* v);
70
+ attach_function :sass_string_get_value, [:sass_value_ptr], :string
71
+
72
+ # ADDAPI bool ADDCALL sass_string_is_quoted(const union Sass_Value* v);
73
+ attach_function :sass_string_is_quoted, [:sass_value_ptr], :bool
74
+
75
+ # ADDAPI const char* ADDCALL sass_number_get_value (const union Sass_Value* v);
76
+ attach_function :sass_number_get_value, [:sass_value_ptr], :double
77
+
78
+ # ADDAPI const char* ADDCALL sass_number_get_unit (const union Sass_Value* v);
79
+ attach_function :sass_number_get_unit, [:sass_value_ptr], :string
80
+
81
+ # ADDAPI const char* ADDCALL sass_boolean_get_value (const union Sass_Value* v);
82
+ attach_function :sass_boolean_get_value, [:sass_value_ptr], :bool
83
+
84
+ def self.string_get_type(native_value)
85
+ string_is_quoted(native_value) ? :string : :identifier
86
+ end
87
+
88
+ # ADDAPI double ADDCALL sass_color_get_r (const union Sass_Value* v);
89
+ # ADDAPI void ADDCALL sass_color_set_r (union Sass_Value* v, double r);
90
+ # ADDAPI double ADDCALL sass_color_get_g (const union Sass_Value* v);
91
+ # ADDAPI void ADDCALL sass_color_set_g (union Sass_Value* v, double g);
92
+ # ADDAPI double ADDCALL sass_color_get_b (const union Sass_Value* v);
93
+ # ADDAPI void ADDCALL sass_color_set_b (union Sass_Value* v, double b);
94
+ # ADDAPI double ADDCALL sass_color_get_a (const union Sass_Value* v);
95
+ # ADDAPI void ADDCALL sass_color_set_a (union Sass_Value* v, double a);
96
+ ['r', 'g', 'b', 'a'].each do |color_channel|
97
+ attach_function "sass_color_get_#{color_channel}".to_sym, [:sass_value_ptr], :double
98
+ attach_function "sass_color_set_#{color_channel}".to_sym, [:sass_value_ptr, :double], :void
99
+ end
100
+
101
+ # ADDAPI char* ADDCALL sass_error_get_message (const union Sass_Value* v);
102
+ # ADDAPI void ADDCALL sass_error_set_message (union Sass_Value* v, char* msg);
103
+ attach_function :sass_error_get_message, [:sass_value_ptr], :string
104
+ attach_function :sass_error_set_message, [:sass_value_ptr, :pointer], :void
105
+
106
+ # Getters for custom function descriptors
107
+ # ADDAPI const char* ADDCALL sass_function_get_signature (Sass_C_Function_Callback fn);
108
+ # ADDAPI Sass_C_Function ADDCALL sass_function_get_function (Sass_C_Function_Callback fn);
109
+ # ADDAPI void* ADDCALL sass_function_get_cookie (Sass_C_Function_Callback fn);
110
+ attach_function :sass_function_get_signature, [:sass_c_function_callback_ptr], :string
111
+ attach_function :sass_function_get_function, [:sass_c_function_callback_ptr], :sass_c_function
112
+ attach_function :sass_function_get_cookie, [:sass_c_function_callback_ptr], :pointer
113
+
114
+ # Creators for custom importer callback (with some additional pointer)
115
+ # The pointer is mostly used to store the callback into the actual binding
116
+ # ADDAPI Sass_C_Import_Callback ADDCALL sass_make_importer (Sass_C_Import_Fn, void* cookie);
117
+ attach_function :sass_make_importer, [:sass_c_import_function, :pointer], :sass_importer
118
+
119
+ # Getters for import function descriptors
120
+ # ADDAPI Sass_C_Import_Fn ADDCALL sass_import_get_function (Sass_C_Import_Callback fn);
121
+ # ADDAPI void* ADDCALL sass_import_get_cookie (Sass_C_Import_Callback fn);
122
+
123
+ # Deallocator for associated memory
124
+ # ADDAPI void ADDCALL sass_delete_importer (Sass_C_Import_Callback fn);
125
+
126
+ # Creator for sass custom importer return argument list
127
+ # ADDAPI struct Sass_Import** ADDCALL sass_make_import_list (size_t length);
128
+ attach_function :sass_make_import_list, [:size_t], :sass_import_list_ptr
129
+
130
+ # Creator for a single import entry returned by the custom importer inside the list
131
+ # ADDAPI struct Sass_Import* ADDCALL sass_make_import_entry (const char* path, char* source, char* srcmap);
132
+ # ADDAPI struct Sass_Import* ADDCALL sass_make_import (const char* path, const char* base, char* source, char* srcmap);
133
+ attach_function :sass_make_import_entry, [:string, :pointer, :pointer], :sass_import_ptr
134
+
135
+ # Setters to insert an entry into the import list (you may also use [] access directly)
136
+ # Since we are dealing with pointers they should have a guaranteed and fixed size
137
+ # ADDAPI void ADDCALL sass_import_set_list_entry (struct Sass_Import** list, size_t idx, struct Sass_Import* entry);
138
+ attach_function :sass_import_set_list_entry, [:sass_import_list_ptr, :size_t, :sass_import_ptr], :void
139
+ # ADDAPI struct Sass_Import* ADDCALL sass_import_get_list_entry (struct Sass_Import** list, size_t idx);
140
+
141
+ # Getters for import entry
142
+ # ADDAPI const char* ADDCALL sass_import_get_imp_path (struct Sass_Import*);
143
+ attach_function :sass_import_get_imp_path, [:sass_import_ptr], :string
144
+ # ADDAPI const char* ADDCALL sass_import_get_abs_path (struct Sass_Import*);
145
+ attach_function :sass_import_get_abs_path, [:sass_import_ptr], :string
146
+ # ADDAPI const char* ADDCALL sass_import_get_source (struct Sass_Import*);
147
+ attach_function :sass_import_get_source, [:sass_import_ptr], :string
148
+ # ADDAPI const char* ADDCALL sass_import_get_srcmap (struct Sass_Import*);
149
+ # Explicit functions to take ownership of these items
150
+ # The property on our struct will be reset to NULL
151
+ # ADDAPI char* ADDCALL sass_import_take_source (struct Sass_Import*);
152
+ # ADDAPI char* ADDCALL sass_import_take_srcmap (struct Sass_Import*);
153
+
154
+ # Deallocator for associated memory (incl. entries)
155
+ # ADDAPI void ADDCALL sass_delete_import_list (struct Sass_Import**);
156
+ # Just in case we have some stray import structs
157
+ # ADDAPI void ADDCALL sass_delete_import (struct Sass_Import*);
158
+ end
159
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ # ADDAPI char* ADDCALL sass2scss (const char* sass, const int options);
6
+ attach_function :sass2scss, [:string, :int], :string
7
+
8
+ # ADDAPI const char* ADDCALL sass2scss_version(void);
9
+ end
10
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ SassInputStyle = enum(
6
+ :sass_context_null,
7
+ :sass_context_file,
8
+ :sass_context_data,
9
+ :sass_context_folder
10
+ )
11
+ end
12
+ end
13
+
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ SassOutputStyle = enum(
6
+ :sass_style_nested,
7
+ :sass_style_expanded,
8
+ :sass_style_compact,
9
+ :sass_style_compressed
10
+ )
11
+ end
12
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ class SassValue < FFI::Union; end
6
+
7
+ SassTag = enum(
8
+ :sass_boolean,
9
+ :sass_number,
10
+ :sass_color,
11
+ :sass_string,
12
+ :sass_list,
13
+ :sass_map,
14
+ :sass_null,
15
+ :sass_error,
16
+ :sass_warning
17
+ )
18
+
19
+ SassSeparator = enum(
20
+ :sass_comma,
21
+ :sass_space
22
+ )
23
+
24
+ class SassUnknown < FFI::Struct
25
+ layout :tag, SassTag
26
+ end
27
+
28
+ class SassBoolean < FFI::Struct
29
+ layout :tag, SassTag,
30
+ :value, :bool
31
+ end
32
+
33
+ class SassNumber < FFI::Struct
34
+ layout :tag, SassTag,
35
+ :value, :double,
36
+ :unit, :string
37
+ end
38
+
39
+ class SassColor < FFI::Struct
40
+ layout :tag, SassTag,
41
+ :r, :double,
42
+ :g, :double,
43
+ :b, :double,
44
+ :a, :double
45
+ end
46
+
47
+ class SassString < FFI::Struct
48
+ layout :tag, SassTag,
49
+ :value, :string
50
+ end
51
+
52
+ class SassList < FFI::Struct
53
+ layout :tag, SassTag,
54
+ :separator, SassSeparator,
55
+ :length, :size_t,
56
+ :values, :pointer
57
+ end
58
+
59
+ class SassMapPair < FFI::Struct
60
+ layout :key, SassValue.ptr,
61
+ :value, SassValue.ptr
62
+ end
63
+
64
+ class SassMap < FFI::Struct
65
+ layout :tag, SassTag,
66
+ :length, :size_t,
67
+ :pairs, SassMapPair.ptr
68
+ end
69
+
70
+ class SassNull < FFI::Struct
71
+ layout :tag, SassTag
72
+ end
73
+
74
+ class SassError < FFI::Struct
75
+ layout :tag, SassTag,
76
+ :message, :string
77
+ end
78
+
79
+ class SassWarning < FFI::Struct
80
+ layout :tag, SassTag,
81
+ :message, :string
82
+ end
83
+
84
+ class SassValue # < FFI::Union
85
+ layout :unknown, SassUnknown,
86
+ :boolean, SassBoolean,
87
+ :number, SassNumber,
88
+ :color, SassColor,
89
+ :string, SassString,
90
+ :list, SassList,
91
+ :map, SassMap,
92
+ :null, SassNull,
93
+ :error, SassError,
94
+ :warning, SassWarning
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module SassC
4
+ module Native
5
+ class StringList < FFI::Struct
6
+ layout :string_list, StringList.ptr,
7
+ :string, :string
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ffi"
4
+
5
+ module SassC
6
+ module Native
7
+ extend FFI::Library
8
+
9
+ dl_ext = RbConfig::MAKEFILE_CONFIG['DLEXT']
10
+ begin
11
+ ffi_lib File.expand_path("libsass.#{dl_ext}", __dir__)
12
+ rescue LoadError # Some non-rvm environments don't copy a shared object over to lib/sassc
13
+ ffi_lib File.expand_path("libsass.#{dl_ext}", "#{__dir__}/../../ext")
14
+ end
15
+
16
+ require_relative "native/sass_value"
17
+
18
+ typedef :pointer, :sass_options_ptr
19
+ typedef :pointer, :sass_context_ptr
20
+ typedef :pointer, :sass_file_context_ptr
21
+ typedef :pointer, :sass_data_context_ptr
22
+
23
+ typedef :pointer, :sass_c_function_list_ptr
24
+ typedef :pointer, :sass_c_function_callback_ptr
25
+ typedef :pointer, :sass_value_ptr
26
+
27
+ typedef :pointer, :sass_import_list_ptr
28
+ typedef :pointer, :sass_importer
29
+ typedef :pointer, :sass_import_ptr
30
+
31
+ callback :sass_c_function, [:pointer, :pointer], :pointer
32
+ callback :sass_c_import_function, [:pointer, :pointer, :pointer], :pointer
33
+
34
+ require_relative "native/sass_input_style"
35
+ require_relative "native/sass_output_style"
36
+ require_relative "native/string_list"
37
+
38
+ # Remove the redundant "sass_" from the beginning of every method name
39
+ def self.attach_function(*args)
40
+ return super if args.size != 3
41
+
42
+ if args[0] =~ /^sass_/
43
+ args.unshift args[0].to_s.sub(/^sass_/, "")
44
+ end
45
+
46
+ super(*args)
47
+ end
48
+
49
+ # https://github.com/ffi/ffi/wiki/Examples#array-of-strings
50
+ def self.return_string_array(ptr)
51
+ ptr.null? ? [] : ptr.get_array_of_string(0).compact
52
+ end
53
+
54
+ def self.native_string(string)
55
+ m = FFI::MemoryPointer.from_string(string)
56
+ m.autorelease = false
57
+ m
58
+ end
59
+
60
+ require_relative "native/native_context_api"
61
+ require_relative "native/native_functions_api"
62
+ require_relative "native/sass2scss_api"
63
+ end
64
+ end