6

Sass Engine を使用せずに、クラス内で 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

更新:上記を参照してください。インスタンスのコンテキスト内でレンダリングされた haml テンプレート内#renderから呼び出したいlighten(color)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 に答える