class SassC::Engine
def dependencies
def dependencies raise NotRenderedError unless @loaded_urls Dependency.from_filenames(@loaded_urls.filter_map do |url| Uri.file_url_to_path(url) if url.start_with?('file:') && !url.include?('?') && url != file_url end) end
def file_url
def file_url @file_url ||= Uri.path_to_file_url(File.absolute_path(filename || 'stdin')) end
def load_paths
def load_paths @load_paths ||= (@options[:load_paths] || []) + SassC.load_paths end
def output_style
def output_style @output_style ||= begin style = @options.fetch(:style, :sass_style_nested).to_s.delete_prefix('sass_style_').to_sym case style when :nested, :compact, :expanded :expanded when :compressed :compressed else raise InvalidStyleError end end end
def render
def render return @template.dup if @template.empty? result = ::Sass.compile_string( @template, importer: (NoopImporter unless @options[:importer].nil?), load_paths:, syntax:, url: file_url, charset: @options.fetch(:charset, true), source_map: source_map_embed? || !source_map_file.nil?, source_map_include_sources: source_map_contents?, style: output_style, functions: functions_handler.setup(nil, functions: @functions), importers: import_handler.setup(nil).concat(@options.fetch(:importers, [])), alert_ascii: @options.fetch(:alert_ascii, false), alert_color: @options.fetch(:alert_color, nil), fatal_deprecations: @options.fetch(:fatal_deprecations, []), future_deprecations: @options.fetch(:future_deprecations, []), logger: @options.fetch(:logger, nil), quiet_deps: @options.fetch(:quiet_deps, false), silence_deprecations: @options.fetch(:silence_deprecations, []), verbose: @options.fetch(:verbose, false) ) @loaded_urls = result.loaded_urls @source_map = result.source_map return if quiet? css = result.css css += "\n" unless css.empty? unless @source_map.nil? || omit_source_map_url? source_mapping_url = if source_map_embed? "data:application/json;base64,#{[@source_map].pack('m0')}" else Uri.file_urls_to_relative_url(source_map_file_url, file_url) end css += "\n/*# sourceMappingURL=#{source_mapping_url} */" end css rescue ::Sass::CompileError => e @loaded_urls = e.loaded_urls line = e.span&.start&.line line += 1 unless line.nil? url = e.span&.url path = (Uri.file_urls_to_relative_path(url, Uri.path_to_file_url("#{Dir.pwd}/")) if url&.start_with?('file:')) raise SyntaxError.new(e.full_message, filename: path, line:) end
def source_map
def source_map raise NotRenderedError unless @source_map url = Uri.parse(source_map_file_url || file_url) data = JSON.parse(@source_map) data['sources'].map! do |source| if source.start_with?('file:') Uri.file_urls_to_relative_url(source, url) else source end end JSON.generate(data) end
def source_map_file_url
def source_map_file_url @source_map_file_url ||= if source_map_file Uri.path_to_file_url(File.absolute_path(source_map_file)) .gsub('%3F', '?') # https://github.com/sass-contrib/sassc-embedded-shim-ruby/pull/69 end end
def syntax
def syntax syntax = @options.fetch(:syntax, :scss) syntax = :indented if syntax.to_sym == :sass syntax end