我试图在我的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地图?
(如果您知道如何正确使用文件名而不进行转义,请分享:))
答案 0 :(得分:1)
地图中的所有值都应该是Sass::Script::Value::Base
的实例,以便sass可以使用它们。
但Sass::Script::Value::Map.new
方法不会根据sass
源代码为我们进行转换:this和this。
因此需要转换方法。
# @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)