/// <summary> /// Shared conversion method. /// </summary> /// <param name="fromStringOrFile">From string or file.</param> /// <param name="fromFile">if set to <c>true</c> <paramref name="fromStringOrFile"/> is a scss file; otherwise it is a scss content.</param> /// <param name="options">The options.</param> /// <returns>The result of the conversion</returns> private static ScssResult FromCore(string fromStringOrFile, bool fromFile, ScssOptions options = null) { var compiler = new LibSass.Sass_Compiler(); GCHandle?tryImportHandle = null; var context = new LibSass.Sass_Context(); try { options = options ?? DefaultOptions; if (fromFile) { var fileContext = LibSass.sass_make_file_context(fromStringOrFile); context = fileContext; if (options.InputFile == null) { options.InputFile = fromStringOrFile; } tryImportHandle = MarshalOptions(fileContext, options); compiler = LibSass.sass_make_file_compiler(fileContext); } else { var dataContext = LibSass.sass_make_data_context(fromStringOrFile); context = dataContext; tryImportHandle = MarshalOptions(dataContext, options); compiler = LibSass.sass_make_data_compiler(dataContext); } LibSass.sass_compiler_parse(compiler); CheckStatus(context); LibSass.sass_compiler_execute(compiler); CheckStatus(context); // Gets the result of the conversion var css = LibSass.sass_context_get_output_string(context); // Gets the map if it was enabled string map = null; if (options != null && options.GenerateSourceMap) { map = LibSass.sass_context_get_source_map_string(context); } // Gets the list of included files var includedFiles = GetIncludedFiles(context); // Returns the result return(new ScssResult(css, map, includedFiles)); } finally { // Release the cookie handle if any if (tryImportHandle.HasValue && tryImportHandle.Value.IsAllocated) { tryImportHandle.Value.Free(); } if (compiler.Pointer != IntPtr.Zero) { LibSass.sass_delete_compiler(compiler); } if (context.Pointer != IntPtr.Zero) { if (fromFile) { LibSass.sass_delete_file_context((LibSass.Sass_File_Context)context); } else { LibSass.sass_delete_data_context((LibSass.Sass_Data_Context)context); } } } }
private static unsafe LibSass.Sass_Import_List CustomScssImporter(LibSass.StringUtf8 currentPath, LibSass.Sass_Importer_Entry cb, LibSass.Sass_Compiler compiler) { var cookie = LibSass.sass_importer_get_cookie(cb); var previous = LibSass.sass_compiler_get_last_import(compiler); string previousPath = LibSass.sass_import_get_abs_path(previous); var cookieHandle = GCHandle.FromIntPtr(new IntPtr(cookie)); var tryImport = (ScssOptions.TryImportDelegate)cookieHandle.Target; var file = (string)currentPath; var importList = LibSass.sass_make_import_list(1); uint line = 0; uint column = 0; string errorMessage = null; if (tryImport != null) { try { string scss; string map; if (tryImport(file, previousPath, out scss, out map)) { var entry = LibSass.sass_make_import_entry(file, scss, map); *(LibSass.Sass_Import_Entry *)importList.Pointer = entry; return(importList); } } catch (ScssException ex) { errorMessage = ex.Message; line = (uint)ex.Line; column = (uint)ex.Column; } catch (Exception ex) { errorMessage = ex.ToString(); } } if (errorMessage == null) { errorMessage = $"Unable to find include file for @import \"{file}\" with dynamic import"; } { var entry = LibSass.sass_make_import_entry(file, null, null); *(LibSass.Sass_Import_Entry *)importList.Pointer = entry; LibSass.sass_import_set_error(entry, errorMessage, line, column); } return(importList); }