Class: MirrorMirror::Transformation::LinearGradient

Inherits:
PropertyTransformation show all
Defined in:
lib/mirror-mirror/transformation/linear_gradient.rb

Constant Summary collapse

IMAGE_PROPERTIES =
Set[
  'background',
  'background-image',
  'border-image',
  'list-style-image',
  'list-style',
  'content'
]
DIRECTIONAL_KEYWORDS =
Set.new(%w(to top left right bottom))
S360 =
Sass::Script::Number.new(360)

Instance Method Summary collapse

Methods inherited from PropertyTransformation

instances, #transform_name, #transform_name?, #transform_value, #transform_value?

Methods inherited from Base

inherited, instances

Instance Method Details

#color_stop?(e) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
59
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 56

def color_stop?(e)
  e.is_a?(Sass::Script::Color) ||
    (e.is_a?(Sass::Script::List) && e.value.first.is_a?(Sass::Script::Color))
end

#degree?(e) ⇒ Boolean

Returns:

  • (Boolean)


42
43
44
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 42

def degree?(e)
  e.is_a?(Sass::Script::Number) && e.numerator_units.first == "deg"
end

#direction?(e) ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 52

def direction?(e)
  degree?(e) || directional_keywords?(e)
end

#directional_keywords?(e) ⇒ Boolean

Returns:

  • (Boolean)


47
48
49
50
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 47

def directional_keywords?(e)
  (e.is_a?(Sass::Script::List) && e.value.first.is_a?(Sass::Script::String) && DIRECTIONAL_KEYWORDS.include?(e.value.first.value)) ||
    e.is_a?(Sass::Script::String) && DIRECTIONAL_KEYWORDS.include?(e.value)
end

#find_linear_gradient(expression) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 29

def find_linear_gradient(expression)
  case expression
  when Sass::Script::List
    expression.value.each do |v|
      grad = find_linear_gradient(v)
      return grad if grad
    end
    nil
  when Sass::Script::Funcall
    expression if expression.name =~ /^(-(moz|webkit|o|ms)-)?(repeating-)?linear-gradient$/
  end
end

#flip(direction) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 62

def flip(direction)
  if degree?(direction)
    opts(direction.options) { S360.minus(direction).mod(S360) }
  else
    case direction
    when Sass::Script::List
      direction.value.map!{|v| flip(v) }
      direction
    when Sass::Script::String
      if direction.value == "left"
        opts(direction.options) { Sass::Script::String.new("right") }
      elsif direction.value == "right"
        opts(direction.options) { Sass::Script::String.new("left") }
      else
        direction
      end
    else
      direction
    end
  end
end

#transform_expression(name, expression) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 16

def transform_expression(name, expression)
  for_each_value(expression) do |e|
    if grad = find_linear_gradient(e)
      if direction?(grad.args[0])
        grad.args[0] = flip(grad.args[0])
      end
      e
    else
      e
    end
  end
end

#transform_expression?(name) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/mirror-mirror/transformation/linear_gradient.rb', line 12

def transform_expression?(name)
  IMAGE_PROPERTIES.include?(name)
end