Example #1
0
        /// <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);
                    }
                }
            }
        }
Example #2
0
        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);
        }