6

我想在一个类中使用 Sass 颜色函数,而不使用 Sass 引擎。我已经在项目中使用了 sass gem,所以我认为捎带会很简单:

class Rectangle
  include Sass::Script::Functions
  def color
    Sass::Script::Color.new([0x82, 0x39, 0x06])
  end
  def render
    #haml engine executed with context of self
    #so that within temlate i could call
    #  %stop{offset: '0%', stop: {color: lighten(color)}}
  end
end

更新:#render上文,我想从实例lighten(color)上下文中呈现的 haml 模板中调用Rectangle

但我得到一个未定义的方法assert_type错误。该assert_type方法在Sass::Script::Functions::EvaluationContext类中定义。(github文件

在 中玩耍irb,只是为了得到接近我想要的东西,如下所示:

require 'sass'
eval_context = Sass::Script::Functions::EvaluationContext.new({})
#yes the Sass::Script::Number.new(10) is requried, a simple 10 will not work
color = eval_context.rgb(Sass::Script::Number.new(10), Sass::Script::Number.new(10), Sass::Script::Number.new(10))
eval_context.lighten(color, Sass::Script::Number.new(10))

这太疯狂了——我错过了什么吗?

4

2 回答 2

5

Sass::Script::Parser.parse('lighten(#333, 10)', 0, 0).perform(Sass::Environment.new)

于 2014-09-18T09:30:08.333 回答
3

更新

既然我更好地理解了您的问题,为什么不直接重写功能。

require 'sass'

class Rectangle
  include Sass::Script

  def color
    @color ||= Sass::Script::Color.new([0x82, 0x39, 0x06])
  end

  def lighten(ammount)
    hsl = color.hsl.dup
    hsl[2] += ammount
    @color = Sass::Script::Color.new(hue: hsl[0], saturation: hsl[1], lightness: [2])
  end
end

rec = Rectangle.new
rec.lighten(20)

旧答案

你没有疯,你只是包含了错误的部分。

此代码按您的预期运行。请注意,我::Functions从包含中删除了。

require 'sass'

class Rectangle
  include Sass::Script

  def color
    color = Sass::Script::Color.new([0x82, 0x39, 0x06])
    puts color.class
  end
end

rec = Rectangle.new
rec.color
于 2013-07-16T17:49:06.163 回答