class SassC::ImportHandler::ImportCache
def canonicalize(url, context)
def canonicalize(url, context) return if context.containing_url.nil? containing_url = if context.containing_url.start_with?(Protocol::GLOB) URL.unescape(URL.parse(context.containing_url).fragment) else context.containing_url end return unless containing_url.start_with?(Protocol::FILE) path = URL.unescape(url) parent_path = URL.file_url_to_path(containing_url) parent_dir = File.dirname(parent_path) if containing_url == context.containing_url imports = @importer.imports(path, parent_path) imports = [SassC::Importer::Import.new(path)] if imports.nil? imports = [imports] unless imports.is_a?(Array) canonical_url = imports_to_native(imports, parent_dir, context.from_import, url, context.containing_url) if @importer_results.key?(canonical_url) canonical_url else @file_url = canonical_url nil end else canonical_url = URL.path_to_file_url(File.absolute_path(path, parent_dir)) if @importer_results.key?(canonical_url) canonical_url else @file_url = resolve_file_url(path, parent_dir, context.from_import) nil end end end
def find_file_url(_url, context)
def find_file_url(_url, context) return if context.containing_url.nil? || @file_url.nil? canonical_url = @file_url @file_url = nil canonical_url end
def import_to_native(import, parent_dir, from_import, canonicalize)
def import_to_native(import, parent_dir, from_import, canonicalize) if import.source canonical_url = URL.path_to_file_url(File.absolute_path(import.path, parent_dir)) @importer_results[canonical_url] = if import.source.is_a?(Hash) { contents: import.source[:contents], syntax: import.source[:syntax], source_map_url: canonical_url } else { contents: import.source, syntax: syntax(import.path), source_map_url: canonical_url } end return canonical_url if canonicalize elsif canonicalize return resolve_file_url(import.path, parent_dir, from_import) end URL.escape(import.path) end
def imports_to_native(imports, parent_dir, from_import, url, containing_url)
def imports_to_native(imports, parent_dir, from_import, url, containing_url) return import_to_native(imports.first, parent_dir, from_import, true) if imports.one? canonical_url = "#{Protocol::GLOB}?#{URL.escape(url)}##{URL.escape(containing_url)}" @importer_results[canonical_url] = { contents: imports.flat_map do |import| at_rule = from_import ? '@import' : '@forward' url = import_to_native(import, parent_dir, from_import, false) "#{at_rule} #{Script::Value::String.quote(url)};" end.join("\n"), syntax: :scss } canonical_url end
def initialize(importer)
def initialize(importer) @importer = importer @importer_results = {} @file_url = nil @load_paths = (@importer.options[:load_paths] || []) + SassC.load_paths end
def load(canonical_url)
def load(canonical_url) @importer_results.delete(canonical_url) end
def resolve_file_url(path, parent_dir, from_import)
def resolve_file_url(path, parent_dir, from_import) [parent_dir].concat(@load_paths).each do |load_path| resolved = FileSystemImporter.resolve_path(File.absolute_path(path, load_path), from_import) return URL.path_to_file_url(resolved) unless resolved.nil? end nil end
def syntax(path)
def syntax(path) case File.extname(path) when '.sass' :indented when '.css' :css else :scss end end