2017-08-16 55 views
1

我想在我的scss中获取yaml(.yml)文件的内容。目的是使yaml文件的内容可作为SCSS映射使用,以便读取和迭代值。通过ruby解析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:在选项= `块 ':未定义的方法`选项=' 为 “first.value.in.yaml.file”:字符串(NoMethodError)

使用YAML文件是这样的:

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

什么是这个选项的方法,我应该如何转换yaml文件的内容我nto SASS地图?

(如果你知道如何正确地使用一个文件名没有它得到逃脱,请分享:))

+0

你如何使用'$ ranges'变量? – aristotll

+0

@aristotll,目前我没有使用它。只是任务已经给出了一个错误。虽然我认为它可以取代'$ map:(foo:bar);'定义,然后我可以使用map-get来获取值。 – Neograph734

回答

1

在地图中的所有值应该是Sass::Script::Value::Base一个实例,这样青菜可以使用它们。 但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)

+0

谢谢,这有点合理。我会在几个小时内尝试一下。看起来最后一行遗漏了回报? – Neograph734

+0

@ Neograph734 Ruby隐式地返回方法中最后评估的表达式的值。 – aristotll

+0

好的谢谢。我会让你知道它是怎么回事:) – Neograph734