通过ruby将yaml文件内容解析为scss

时间:2017-08-16 22:30:41

标签: ruby sass yaml

我试图在我的scss中获取yaml(.yml)文件的内容。目的是使yaml文件的内容可用作SCSS映射,因此可以读取和迭代这些值。

到目前为止,我有这个:

SCSS文件:

$ranges: yaml_load('path/to/file');

Ruby文件(this gem的黑客版本):

require 'yaml'

module Sass::Script::Functions
  def yaml_load(file_name)
    # Required because the filename is escaped: "\"path/to/file.yml\""
    file_name = file_name.to_s[1..-2]
    if (File.file?(file_name))
      file_content = YAML::load_file(file_name)

      if (file_content.is_a?(Hash))
        p 'is indeed a hash'
        return Sass::Script::Value::Map.new(file_content)
      end

      p 'Parse error'
    else
      p 'The requested file could not be found'
    end
  end
end

据我了解,YAML::load_file返回一个哈希值,Sass::Script::Value::Map将哈希值作为输入。但我得到以下错误,我不明白:

  

C:/Ruby23-x64/lib/ruby/gems/2.3.0/gems/sass-3.5.1/lib/sass/script/value/map.rb:22:在   `block in options =':undefined method`options ='for   “first.value.in.yaml.file”:String(NoMethodError)

使用这样的yaml文件:

first.value.in.yaml.file:
  name: MyName
  color: red

这个选项方法是什么,以及如何将yaml文件的内容转换为SASS地图?

(如果您知道如何正确使用文件名而不进行转义,请分享:))

1 个答案:

答案 0 :(得分:1)

地图中的所有值都应该是Sass::Script::Value::Base的实例,以便sass可以使用它们。 但Sass::Script::Value::Map.new方法不会根据sass源代码为我们进行转换:thisthis

因此需要转换方法。

# @param [Hash]  value
# @return [Sass::Script::Value::Map or Sass::Script::Value::List] 
  def convert_to_base(value) # part of this function is copied from https://github.com/fabiofabbrucci/sass-yaml/blob/master/lib/sass-yaml.rb
    if value.is_a?(String) 
      return Sass::Script::Value::String.new(value.to_s)
    elsif value.is_a?(Array)
      value.each_with_index do |elem, i|
        value[i]= Sass::Script::Value::String.new(elem.to_s)
      end
      return Sass::Script::Value::List.new(value, ",")
    end
    result = Hash.new
    value.each {|the_key, the_value|
      result[convert_to_base(the_key)]=convert_to_base(the_value)
    }
    Sass::Script::Value::Map.new(result)
  end

同时将return Sass::Script::Value::Map.new(file_content)更改为return convert_to_base(file_content)