vigetlabs/sass-json-vars

View on GitHub
lib/sass-json-vars/importer.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'sass'
require 'json'

module SassJSONVars
  class Importer < Sass::Importers::Filesystem

    def watched_file?(uri)
      !!(uri =~ /\.json$/ &&
        uri.start_with?(root + File::SEPARATOR))
    end

    protected

    def extensions
      {'json' => :scss}
    end

    def json?(name)
      File.extname(name) == '.json'
    end

    private

    def _find(dir, name, options)
      return unless json? name

      full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
      return unless full_filename && File.readable?(full_filename)

      json      = JSON.parse(IO.read(full_filename))
      variables = json.map { |key, value| "$#{key}: #{_convert_to_sass(value)};" }.join("\n")

      Sass::Engine.new(variables, options.merge(
          :filename => full_filename,
          :importer => self,
          :syntax   => :scss
      ))
    end

    def _convert_to_sass(item)
      if item.is_a? Array
        _make_list(item)
      elsif item.is_a? Hash
        _make_map(item)
      else
        item.to_s
      end
    end

    def _make_list(item)
      '(' + item.map { |i| _convert_to_sass(i) }.join(',') + ')'
    end

    def _make_map(item)
      '(' + item.map {|key, value| key.to_s + ':' + _convert_to_sass(value) }.join(',') + ')'
    end
  end

end