module Nanoc::Filters::SassCommon

Constants

REQUIRES

Public Instance Methods

css(filter, rep, content, params) click to toggle source
# File lib/nanoc/filters/sass.rb, line 7
def css(filter, rep, content, params)
  css, = render(filter, rep, content, params)
  css
end
sourcemap(filter, rep, content, params) click to toggle source
# File lib/nanoc/filters/sass.rb, line 12
def sourcemap(filter, rep, content, params)
  _, sourcemap = render(filter, rep, content, params)
  sourcemap
end

Private Instance Methods

render(filter, rep, content, params = {}) click to toggle source
# File lib/nanoc/filters/sass.rb, line 19
def render(filter, rep, content, params = {})
  importer = Nanoc::Filters::SassCommon::Importer.new(filter)

  options = params.merge(
    load_paths: [importer, *params[:load_paths]&.reject { |p| p.is_a?(String) && %r{^content/} =~ p }],
    importer:,
    filename: rep.item.identifier.to_s,
    cache: false,
  )
  css_path = options.delete(:css_path) || filter.object_id.to_s
  sourcemap_path = options.delete(:sourcemap_path)
  if sourcemap_path == :inline
    sourcemap_path = Nanoc::Core::TempFilenameFactory.instance.create('sass_sourcemap')
    inline = true
  end

  engine = ::Sass::Engine.new(content, options)
  css, sourcemap = sourcemap_path ? engine.render_with_sourcemap(sourcemap_path) : engine.render

  if inline
    sourcemap = sourcemap&.to_json(css_uri: css_path)
    encoded = "data:application/json;base64,#{Base64.urlsafe_encode64(sourcemap)}"
    [css.gsub(%r{^/\*#\s+sourceMappingURL=\s*#{sourcemap_path}\s*\*/$}, "/*# sourceMappingURL=#{encoded} */")]
  else
    sourcemap = sourcemap&.to_json(css_path:, sourcemap_path:, type: params[:sources_content] ? :inline : :auto)
    sourcemap = sourcemap&.split("\n")&.reject { |l| l =~ /^\s*"file":\s*"#{filter.object_id}"\s*$/ }&.join("\n")
    [css, sourcemap]
  end
end