chriseppstein/compass

View on GitHub
core/lib/compass/core/sass_extensions/functions/constants.rb

Summary

Maintainability
A
3 hrs
Test Coverage
module Compass::Core::SassExtensions::Functions::Constants
  POSITIONS = /top|bottom|left|right|center/
  def is_position(position)
    bool(position.is_a?(Sass::Script::Value::String) && !!(position.value =~ POSITIONS))
  end
  def is_position_list(position_list)
    bool(position_list.is_a?(Sass::Script::Value::List) && position_list.value.all?{|p| is_position(p).to_bool})
  end
  # returns the opposite position of a side or corner.
  def opposite_position(position)
    position = unless position.is_a?(Sass::Script::Value::List)
      list(position, :space)
    else
      list(position.value.dup, position.separator)
    end
    position = list(position.value.map do |pos|
      if pos.is_a? Sass::Script::Value::String
        opposite = case pos.value
        when "top" then "bottom"
        when "bottom" then "top"
        when "left" then "right"
        when "right" then "left"
        when "center" then "center"
        else
          Compass::Util.compass_warn("Cannot determine the opposite position of: #{pos}")
          pos.value
        end
        identifier(opposite)
      elsif pos.is_a? Sass::Script::Value::Number
        if pos.numerator_units == ["%"] && pos.denominator_units == []
          number(100-pos.value, "%")
        else
          Compass::Util.compass_warn("Cannot determine the opposite position of: #{pos}")
          pos
        end
      else
        Compass::Util.compass_warn("Cannot determine the opposite position of: #{pos}")
        pos
      end
    end, position.separator)
    if position.value.size == 1
      position.value.first
    else
      position
    end
  end

  def is_url(string)
    if string.is_a?(Sass::Script::Value::String)
      is_url = !!(string.value =~ /^url\(.*\)$/)
      bool(is_url)
    else
      bool(false)
    end
  end
end