class MirrorMirror::Transformation::BackgroundPosition

Constants

ONE_HUNDRED_PERCENT
POSITION_KEYWORDS

Public Instance Methods

flip_it(e, position) click to toggle source
# File lib/mirror-mirror/transformation/background_position.rb, line 71
def flip_it(e, position)
  return e unless e.respond_to?(:value)
  case e
  when Sass::Script::Number
    if position == 0 && e.value == 0
      opts(e.options) { ONE_HUNDRED_PERCENT.dup }
    elsif position == 0 && e.numerator_units.first == "%"
      opts(e.options) { ONE_HUNDRED_PERCENT.minus(e) }
    elsif position == 0
      Sass.logger.warn("Line #{e.line}: Cannot flip background position: #{e}")
      e
    else
      e
    end
  when Sass::Script::String
    case e.value
    when "right"
      e.value.replace("left")
    when "left"
      e.value.replace("right")
    end
    e
  else
    e
  end
end
transform_background(expression) click to toggle source
# File lib/mirror-mirror/transformation/background_position.rb, line 17
def transform_background(expression)
  unless expression.is_a?(Sass::Script::List)
    expression = opts(expression.options) do
      Sass::Script::List.new([expression], :space)
    end
  end
  positions = []
  position_indices = []
  expression.value.each_with_index do |v, i|
    if legal_as_background_position?(v)
      positions << v
      position_indices << i
    else
      break if positions.any?
      next
    end
    positions
  end
  return expression unless positions.any?
  if positions.size > 2
    Sass.logger.warn("Line #{expression.line}: malformed background: #{expression.to_sass}")
    return expression
  end
  # tranform the background position elements and replace the position
  # section of the shorthand with it
  transformed = transform_background_position(Sass::Script::List.new(positions, :space))
  position_indices << position_indices.first if position_indices.size < 2
  expression.value[Range.new(*position_indices)] = transformed.value
  expression
end
transform_background_position(expression) click to toggle source
# File lib/mirror-mirror/transformation/background_position.rb, line 48
def transform_background_position(expression)
  unless expression.is_a?(Sass::Script::List)
    expression = opts(expression.options) do
      Sass::Script::List.new([expression], :space)
    end
  end
  if expression.value.size > 2
    # positions with offsets
    expression.value.each_with_index do |e, i|
      next if i % 2 == 1
      expression.value[i] = flip_it(e, i / 2)
    end
  else
    # positions
    expression.value.each_with_index do |e, i|
      expression.value[i] = flip_it(e, i)
    end
  end
  expression
end
transform_expression(name, expression) click to toggle source
# File lib/mirror-mirror/transformation/background_position.rb, line 7
def transform_expression(name, expression)
  for_each_value(expression) do |e|
    if name == "background"
      transform_background(e)
    else
      transform_background_position(e)
    end
  end
end
transform_expression?(name) click to toggle source
# File lib/mirror-mirror/transformation/background_position.rb, line 3
def transform_expression?(name)
  name == "background" || name == "background-position" || name == "background-position-x"
end