sassc 2.1.0.pre1-x86-linux
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.gitmodules +3 -0
- data/.travis.yml +11 -0
- data/CHANGELOG.md +66 -0
- data/CODE_OF_CONDUCT.md +10 -0
- data/Gemfile +2 -0
- data/LICENSE.txt +22 -0
- data/README.md +68 -0
- data/Rakefile +30 -0
- data/lib/sassc.rb +57 -0
- data/lib/sassc/dependency.rb +17 -0
- data/lib/sassc/engine.rb +139 -0
- data/lib/sassc/error.rb +37 -0
- data/lib/sassc/functions_handler.rb +75 -0
- data/lib/sassc/import_handler.rb +50 -0
- data/lib/sassc/importer.rb +31 -0
- data/lib/sassc/native.rb +70 -0
- data/lib/sassc/native/lib_c.rb +21 -0
- data/lib/sassc/native/native_context_api.rb +147 -0
- data/lib/sassc/native/native_functions_api.rb +164 -0
- data/lib/sassc/native/sass2scss_api.rb +10 -0
- data/lib/sassc/native/sass_input_style.rb +13 -0
- data/lib/sassc/native/sass_output_style.rb +12 -0
- data/lib/sassc/native/sass_value.rb +97 -0
- data/lib/sassc/native/string_list.rb +10 -0
- data/lib/sassc/sass_2_scss.rb +9 -0
- data/lib/sassc/script.rb +19 -0
- data/lib/sassc/script/functions.rb +8 -0
- data/lib/sassc/script/value.rb +137 -0
- data/lib/sassc/script/value/bool.rb +32 -0
- data/lib/sassc/script/value/color.rb +95 -0
- data/lib/sassc/script/value/list.rb +136 -0
- data/lib/sassc/script/value/map.rb +69 -0
- data/lib/sassc/script/value/number.rb +389 -0
- data/lib/sassc/script/value/string.rb +96 -0
- data/lib/sassc/script/value_conversion.rb +69 -0
- data/lib/sassc/script/value_conversion/base.rb +13 -0
- data/lib/sassc/script/value_conversion/bool.rb +13 -0
- data/lib/sassc/script/value_conversion/color.rb +18 -0
- data/lib/sassc/script/value_conversion/list.rb +25 -0
- data/lib/sassc/script/value_conversion/map.rb +21 -0
- data/lib/sassc/script/value_conversion/number.rb +13 -0
- data/lib/sassc/script/value_conversion/string.rb +17 -0
- data/lib/sassc/util.rb +231 -0
- data/lib/sassc/util/normalized_map.rb +117 -0
- data/lib/sassc/version.rb +5 -0
- data/sassc.gemspec +57 -0
- data/test/custom_importer_test.rb +127 -0
- data/test/engine_test.rb +314 -0
- data/test/error_test.rb +29 -0
- data/test/fixtures/paths.scss +10 -0
- data/test/functions_test.rb +303 -0
- data/test/native_test.rb +213 -0
- data/test/output_style_test.rb +107 -0
- data/test/sass_2_scss_test.rb +14 -0
- data/test/test_helper.rb +45 -0
- metadata +242 -0
data/lib/sassc/error.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "pathname"
|
4
|
+
|
5
|
+
module SassC
|
6
|
+
|
7
|
+
class BaseError < StandardError; end
|
8
|
+
class NotRenderedError < BaseError; end
|
9
|
+
class InvalidStyleError < BaseError; end
|
10
|
+
class UnsupportedValue < BaseError; end
|
11
|
+
|
12
|
+
# When dealing with SyntaxErrors,
|
13
|
+
# it's important to provide filename and line number information.
|
14
|
+
# This will be used in various error reports to users, including backtraces.
|
15
|
+
|
16
|
+
class SyntaxError < BaseError
|
17
|
+
|
18
|
+
def initialize(message, filename: nil, line: nil)
|
19
|
+
@filename = filename
|
20
|
+
@line = line
|
21
|
+
super(message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def backtrace
|
25
|
+
return nil if super.nil?
|
26
|
+
sass_backtrace + super
|
27
|
+
end
|
28
|
+
|
29
|
+
# The backtrace of the error within Sass files.
|
30
|
+
def sass_backtrace
|
31
|
+
return [] unless @filename && @line
|
32
|
+
["#{@filename}:#{@line}"]
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,75 @@
|
|
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)
|
10
|
+
@callbacks = {}
|
11
|
+
@function_names = {}
|
12
|
+
|
13
|
+
list = Native.make_function_list(Script.custom_functions.count)
|
14
|
+
|
15
|
+
functions = FunctionWrapper.extend(Script::Functions)
|
16
|
+
functions.options = @options
|
17
|
+
|
18
|
+
Script.custom_functions.each_with_index do |custom_function, i|
|
19
|
+
@callbacks[custom_function] = FFI::Function.new(:pointer, [:pointer, :pointer]) do |native_argument_list, cookie|
|
20
|
+
begin
|
21
|
+
function_arguments = arguments_from_native_list(native_argument_list)
|
22
|
+
result = functions.send(custom_function, *function_arguments)
|
23
|
+
to_native_value(result)
|
24
|
+
rescue StandardError => exception
|
25
|
+
# This rescues any exceptions that occur either in value conversion
|
26
|
+
# or during the execution of a custom function.
|
27
|
+
error(exception.message)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
@function_names[custom_function] = Script.formatted_function_name(custom_function)
|
32
|
+
|
33
|
+
callback = Native.make_function(
|
34
|
+
@function_names[custom_function],
|
35
|
+
@callbacks[custom_function],
|
36
|
+
nil
|
37
|
+
)
|
38
|
+
|
39
|
+
Native::function_set_list_entry(list, i, callback)
|
40
|
+
end
|
41
|
+
|
42
|
+
Native::option_set_c_functions(native_options, list)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def arguments_from_native_list(native_argument_list)
|
48
|
+
native_argument_list_length = Native.list_get_length(native_argument_list)
|
49
|
+
|
50
|
+
(0...native_argument_list_length).map do |i|
|
51
|
+
native_value = Native.list_get_value(native_argument_list, i)
|
52
|
+
Script::ValueConversion.from_native(native_value, @options)
|
53
|
+
end.compact
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_native_value(sass_value)
|
57
|
+
# if the custom function returns nil, we provide a "default" return
|
58
|
+
# value of an empty string
|
59
|
+
sass_value ||= SassC::Script::Value::String.new("")
|
60
|
+
sass_value.options = @options
|
61
|
+
Script::ValueConversion.to_native(sass_value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def error(message)
|
65
|
+
$stderr.puts "[SassC::FunctionsHandler] #{message}"
|
66
|
+
Native.make_error(message)
|
67
|
+
end
|
68
|
+
|
69
|
+
class FunctionWrapper
|
70
|
+
class << self
|
71
|
+
attr_accessor :options
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
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
|
data/lib/sassc/native.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "ffi"
|
4
|
+
|
5
|
+
module SassC
|
6
|
+
module Native
|
7
|
+
extend FFI::Library
|
8
|
+
|
9
|
+
spec = Gem.loaded_specs["sassc"]
|
10
|
+
gem_root = spec.gem_dir
|
11
|
+
|
12
|
+
dl_ext = (RUBY_PLATFORM =~ /darwin/ ? 'bundle' : 'so')
|
13
|
+
ruby_version_so_path = "#{gem_root}/lib/sassc/#{RUBY_VERSION[/\d+.\d+/]}/libsass.#{dl_ext}"
|
14
|
+
if File.exist?(ruby_version_so_path)
|
15
|
+
ffi_lib ruby_version_so_path
|
16
|
+
else
|
17
|
+
ffi_lib "#{gem_root}/lib/sassc/libsass.#{dl_ext}"
|
18
|
+
end
|
19
|
+
|
20
|
+
require_relative "native/sass_value"
|
21
|
+
|
22
|
+
typedef :pointer, :sass_options_ptr
|
23
|
+
typedef :pointer, :sass_context_ptr
|
24
|
+
typedef :pointer, :sass_file_context_ptr
|
25
|
+
typedef :pointer, :sass_data_context_ptr
|
26
|
+
|
27
|
+
typedef :pointer, :sass_c_function_list_ptr
|
28
|
+
typedef :pointer, :sass_c_function_callback_ptr
|
29
|
+
typedef :pointer, :sass_value_ptr
|
30
|
+
|
31
|
+
typedef :pointer, :sass_import_list_ptr
|
32
|
+
typedef :pointer, :sass_importer
|
33
|
+
typedef :pointer, :sass_import_ptr
|
34
|
+
|
35
|
+
callback :sass_c_function, [:pointer, :pointer], :pointer
|
36
|
+
callback :sass_c_import_function, [:pointer, :pointer, :pointer], :pointer
|
37
|
+
|
38
|
+
require_relative "native/sass_input_style"
|
39
|
+
require_relative "native/sass_output_style"
|
40
|
+
require_relative "native/string_list"
|
41
|
+
require_relative "native/lib_c"
|
42
|
+
|
43
|
+
# Remove the redundant "sass_" from the beginning of every method name
|
44
|
+
def self.attach_function(*args)
|
45
|
+
super if args.size != 3
|
46
|
+
|
47
|
+
if args[0] =~ /^sass_/
|
48
|
+
args.unshift args[0].to_s.sub(/^sass_/, "")
|
49
|
+
end
|
50
|
+
|
51
|
+
super(*args)
|
52
|
+
end
|
53
|
+
|
54
|
+
# https://github.com/ffi/ffi/wiki/Examples#array-of-strings
|
55
|
+
def self.return_string_array(ptr)
|
56
|
+
ptr.null? ? [] : ptr.get_array_of_string(0).compact
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.native_string(string)
|
60
|
+
string = "#{string}\0"
|
61
|
+
data = Native::LibC.malloc(string.bytesize)
|
62
|
+
data.write_string(string)
|
63
|
+
data
|
64
|
+
end
|
65
|
+
|
66
|
+
require_relative "native/native_context_api"
|
67
|
+
require_relative "native/native_functions_api"
|
68
|
+
require_relative "native/sass2scss_api"
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SassC
|
4
|
+
module Native
|
5
|
+
module LibC
|
6
|
+
extend FFI::Library
|
7
|
+
ffi_lib FFI::Library::LIBC
|
8
|
+
|
9
|
+
# memory allocators
|
10
|
+
attach_function :malloc, [:size_t], :pointer
|
11
|
+
# attach_function :calloc, [:size_t], :pointer
|
12
|
+
# attach_function :valloc, [:size_t], :pointer
|
13
|
+
# attach_function :realloc, [:pointer, :size_t], :pointer
|
14
|
+
# attach_function :free, [:pointer], :void
|
15
|
+
|
16
|
+
# memory movers
|
17
|
+
# attach_function :memcpy, [:pointer, :pointer, :size_t], :pointer
|
18
|
+
# attach_function :bcopy, [:pointer, :pointer, :size_t], :void
|
19
|
+
end
|
20
|
+
end
|
21
|
+
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,164 @@
|
|
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 size_t ADDCALL sass_list_get_length(const union Sass_Value* v)
|
102
|
+
# ADDAPI union Sass_Value* ADDCALL sass_list_get_value (const union Sass_Value* v, size_t i);
|
103
|
+
attach_function :sass_list_get_length, [:sass_value_ptr], :size_t
|
104
|
+
attach_function :sass_list_get_value, [:sass_value_ptr, :size_t], :sass_value_ptr
|
105
|
+
|
106
|
+
# ADDAPI char* ADDCALL sass_error_get_message (const union Sass_Value* v);
|
107
|
+
# ADDAPI void ADDCALL sass_error_set_message (union Sass_Value* v, char* msg);
|
108
|
+
attach_function :sass_error_get_message, [:sass_value_ptr], :string
|
109
|
+
attach_function :sass_error_set_message, [:sass_value_ptr, :pointer], :void
|
110
|
+
|
111
|
+
# Getters for custom function descriptors
|
112
|
+
# ADDAPI const char* ADDCALL sass_function_get_signature (Sass_C_Function_Callback fn);
|
113
|
+
# ADDAPI Sass_C_Function ADDCALL sass_function_get_function (Sass_C_Function_Callback fn);
|
114
|
+
# ADDAPI void* ADDCALL sass_function_get_cookie (Sass_C_Function_Callback fn);
|
115
|
+
attach_function :sass_function_get_signature, [:sass_c_function_callback_ptr], :string
|
116
|
+
attach_function :sass_function_get_function, [:sass_c_function_callback_ptr], :sass_c_function
|
117
|
+
attach_function :sass_function_get_cookie, [:sass_c_function_callback_ptr], :pointer
|
118
|
+
|
119
|
+
# Creators for custom importer callback (with some additional pointer)
|
120
|
+
# The pointer is mostly used to store the callback into the actual binding
|
121
|
+
# ADDAPI Sass_C_Import_Callback ADDCALL sass_make_importer (Sass_C_Import_Fn, void* cookie);
|
122
|
+
attach_function :sass_make_importer, [:sass_c_import_function, :pointer], :sass_importer
|
123
|
+
|
124
|
+
# Getters for import function descriptors
|
125
|
+
# ADDAPI Sass_C_Import_Fn ADDCALL sass_import_get_function (Sass_C_Import_Callback fn);
|
126
|
+
# ADDAPI void* ADDCALL sass_import_get_cookie (Sass_C_Import_Callback fn);
|
127
|
+
|
128
|
+
# Deallocator for associated memory
|
129
|
+
# ADDAPI void ADDCALL sass_delete_importer (Sass_C_Import_Callback fn);
|
130
|
+
|
131
|
+
# Creator for sass custom importer return argument list
|
132
|
+
# ADDAPI struct Sass_Import** ADDCALL sass_make_import_list (size_t length);
|
133
|
+
attach_function :sass_make_import_list, [:size_t], :sass_import_list_ptr
|
134
|
+
|
135
|
+
# Creator for a single import entry returned by the custom importer inside the list
|
136
|
+
# ADDAPI struct Sass_Import* ADDCALL sass_make_import_entry (const char* path, char* source, char* srcmap);
|
137
|
+
# ADDAPI struct Sass_Import* ADDCALL sass_make_import (const char* path, const char* base, char* source, char* srcmap);
|
138
|
+
attach_function :sass_make_import_entry, [:string, :pointer, :pointer], :sass_import_ptr
|
139
|
+
|
140
|
+
# Setters to insert an entry into the import list (you may also use [] access directly)
|
141
|
+
# Since we are dealing with pointers they should have a guaranteed and fixed size
|
142
|
+
# ADDAPI void ADDCALL sass_import_set_list_entry (struct Sass_Import** list, size_t idx, struct Sass_Import* entry);
|
143
|
+
attach_function :sass_import_set_list_entry, [:sass_import_list_ptr, :size_t, :sass_import_ptr], :void
|
144
|
+
# ADDAPI struct Sass_Import* ADDCALL sass_import_get_list_entry (struct Sass_Import** list, size_t idx);
|
145
|
+
|
146
|
+
# Getters for import entry
|
147
|
+
# ADDAPI const char* ADDCALL sass_import_get_imp_path (struct Sass_Import*);
|
148
|
+
attach_function :sass_import_get_imp_path, [:sass_import_ptr], :string
|
149
|
+
# ADDAPI const char* ADDCALL sass_import_get_abs_path (struct Sass_Import*);
|
150
|
+
attach_function :sass_import_get_abs_path, [:sass_import_ptr], :string
|
151
|
+
# ADDAPI const char* ADDCALL sass_import_get_source (struct Sass_Import*);
|
152
|
+
attach_function :sass_import_get_source, [:sass_import_ptr], :string
|
153
|
+
# ADDAPI const char* ADDCALL sass_import_get_srcmap (struct Sass_Import*);
|
154
|
+
# Explicit functions to take ownership of these items
|
155
|
+
# The property on our struct will be reset to NULL
|
156
|
+
# ADDAPI char* ADDCALL sass_import_take_source (struct Sass_Import*);
|
157
|
+
# ADDAPI char* ADDCALL sass_import_take_srcmap (struct Sass_Import*);
|
158
|
+
|
159
|
+
# Deallocator for associated memory (incl. entries)
|
160
|
+
# ADDAPI void ADDCALL sass_delete_import_list (struct Sass_Import**);
|
161
|
+
# Just in case we have some stray import structs
|
162
|
+
# ADDAPI void ADDCALL sass_delete_import (struct Sass_Import*);
|
163
|
+
end
|
164
|
+
end
|