| Index: third_party/pyscss/scss/function.py
|
| diff --git a/third_party/pyscss/scss/function.py b/third_party/pyscss/scss/function.py
|
| deleted file mode 100644
|
| index 2b3f7b9c29739ae3790f6e14c59ddc41ac54f52e..0000000000000000000000000000000000000000
|
| --- a/third_party/pyscss/scss/function.py
|
| +++ /dev/null
|
| @@ -1,527 +0,0 @@
|
| -import base64
|
| -import colorsys
|
| -import math
|
| -import mimetypes
|
| -import os.path
|
| -import sys
|
| -from itertools import product
|
| -
|
| -from scss import OPRT, CONV_TYPE, ELEMENTS_OF_TYPE
|
| -from scss.value import NumberValue, StringValue, QuotedStringValue, ColorValue, BooleanValue, hsl_op, rgba_op
|
| -
|
| -
|
| -try:
|
| - from PIL import Image
|
| -except ImportError:
|
| - Image = None
|
| -
|
| -IMAGES = dict()
|
| -
|
| -
|
| -def warn(warning):
|
| - """ Write warning messages in stderr.
|
| - """
|
| - print >> sys.stderr, "\nWarning: %s" % str( warning )
|
| -
|
| -
|
| -def unknown(*args, **kwargs):
|
| - """ Unknow scss function handler.
|
| - Simple return 'funcname(args)'
|
| - """
|
| - name = kwargs.get('name', '')
|
| - return "%s(%s)" % ( name, ', '.join(str(a) for a in args) )
|
| -
|
| -
|
| -def check_pil(func):
|
| - """ PIL module checking decorator.
|
| - """
|
| - def __wrapper(*args, **kwargs):
|
| - root = kwargs.get('root')
|
| - if not Image:
|
| - if root and root.get_opt('warn'):
|
| - warn("Images manipulation require PIL")
|
| - return 'none'
|
| - return func(*args, **kwargs)
|
| - return __wrapper
|
| -
|
| -
|
| -# RGB functions
|
| -# =============
|
| -
|
| -def _rgb(r, g, b, **kwargs):
|
| - """ Converts an rgb(red, green, blue) triplet into a color.
|
| - """
|
| - return _rgba(r, g, b, 1.0)
|
| -
|
| -def _rgba(r, g, b, a, **kwargs):
|
| - """ Converts an rgba(red, green, blue, alpha) quadruplet into a color.
|
| - """
|
| - return ColorValue((float(r), float(g), float(b), float(a)))
|
| -
|
| -def _red(color, **kwargs):
|
| - """ Gets the red component of a color.
|
| - """
|
| - return NumberValue(color.value[0])
|
| -
|
| -def _green(color, **kwargs):
|
| - """ Gets the green component of a color.
|
| - """
|
| - return NumberValue(color.value[1])
|
| -
|
| -def _blue(color, **kwargs):
|
| - """ Gets the blue component of a color.
|
| - """
|
| - return NumberValue(color.value[2])
|
| -
|
| -def _mix(color1, color2, weight=0.5, **kwargs):
|
| - """ Mixes two colors together.
|
| - """
|
| - weight = float(weight)
|
| - c1 = color1.value
|
| - c2 = color2.value
|
| - p = 0.0 if weight < 0 else 1.0 if weight > 1 else weight
|
| - w = p * 2 - 1
|
| - a = c1[3] - c2[3]
|
| -
|
| - w1 = ((w if (w * a == -1) else (w + a) / (1 + w * a)) + 1) / 2.0
|
| - w2 = 1 - w1
|
| - q = [ w1, w1, w1, p ]
|
| - r = [ w2, w2, w2, 1 - p ]
|
| - return ColorValue([c1[i] * q[i] + c2[i] * r[i] for i in range(4) ])
|
| -
|
| -
|
| -# HSL functions
|
| -# =============
|
| -
|
| -def _hsl(h, s, l, **kwargs):
|
| - """ HSL color value.
|
| - """
|
| - return _hsla(h, s, l, 1.0)
|
| -
|
| -def _hsla(h, s, l, a, **kwargs):
|
| - """ HSL with alpha channel color value.
|
| - """
|
| - res = colorsys.hls_to_rgb(float(h), float(l), float(s))
|
| - return ColorValue(map(lambda x: x * 255.0, res) + [float(a)])
|
| -
|
| -def _hue(color, **kwargs):
|
| - """ Get hue value of HSL color.
|
| - """
|
| - h = colorsys.rgb_to_hls(*map(lambda x: x / 255.0, color.value[:3]))[0]
|
| - return NumberValue(h * 360.0)
|
| -
|
| -def _lightness(color, **kwargs):
|
| - """ Get lightness value of HSL color.
|
| - """
|
| - l = colorsys.rgb_to_hls( *map(lambda x: x / 255.0, color.value[:3]) )[1]
|
| - return NumberValue(( l * 100, '%' ))
|
| -
|
| -def _saturation(color, **kwargs):
|
| - """ Get saturation value of HSL color.
|
| - """
|
| - s = colorsys.rgb_to_hls( *map(lambda x: x / 255.0, color.value[:3]) )[2]
|
| - return NumberValue(( s * 100, '%' ))
|
| -
|
| -def _adjust_hue(color, degrees, **kwargs):
|
| - return hsl_op(OPRT['+'], color, degrees, 0, 0)
|
| -
|
| -def _lighten(color, amount, **kwargs):
|
| - return hsl_op(OPRT['+'], color, 0, 0, amount)
|
| -
|
| -def _darken(color, amount, **kwargs):
|
| - return hsl_op(OPRT['-'], color, 0, 0, amount)
|
| -
|
| -def _saturate(color, amount, **kwargs):
|
| - return hsl_op(OPRT['+'], color, 0, amount, 0)
|
| -
|
| -def _desaturate(color, amount, **kwargs):
|
| - return hsl_op(OPRT['-'], color, 0, amount, 0)
|
| -
|
| -def _grayscale(color, **kwargs):
|
| - return hsl_op(OPRT['-'], color, 0, 100, 0)
|
| -
|
| -def _complement(color, **kwargs):
|
| - return hsl_op(OPRT['+'], color, 180.0, 0, 0)
|
| -
|
| -
|
| -# Opacity functions
|
| -# =================
|
| -
|
| -def _alpha(color, **kwargs):
|
| - c = ColorValue(color).value
|
| - return NumberValue(c[3])
|
| -
|
| -def _opacify(color, amount, **kwargs):
|
| - return rgba_op(OPRT['+'], color, 0, 0, 0, amount)
|
| -
|
| -def _transparentize(color, amount, **kwargs):
|
| - return rgba_op(OPRT['-'], color, 0, 0, 0, amount)
|
| -
|
| -
|
| -# String functions
|
| -# =================
|
| -
|
| -def _unquote(*args, **kwargs):
|
| - return StringValue(' '.join(str(s).strip("\"'") for s in args))
|
| -
|
| -def _quote(*args, **kwargs):
|
| - return QuotedStringValue(' '.join(str(s) for s in args))
|
| -
|
| -
|
| -# Number functions
|
| -# =================
|
| -
|
| -def _percentage(value, **kwargs):
|
| - value = NumberValue(value)
|
| - if not value.units == '%':
|
| - value.value *= 100
|
| - value.units = '%'
|
| - return value
|
| -
|
| -def _abs(value, **kwargs):
|
| - return abs(float(value))
|
| -
|
| -def _pi(**kwargs):
|
| - return NumberValue(math.pi)
|
| -
|
| -def _sin(value, **kwargs):
|
| - return math.sin(value)
|
| -
|
| -def _cos(value, **kwargs):
|
| - return math.cos(value)
|
| -
|
| -def _tan(value, **kwargs):
|
| - return math.tan(value)
|
| -
|
| -def _round(value, **kwargs):
|
| - return round(value)
|
| -
|
| -def _ceil(value, **kwargs):
|
| - return math.ceil(value)
|
| -
|
| -def _floor(value, **kwargs):
|
| - return math.floor(value)
|
| -
|
| -
|
| -# Introspection functions
|
| -# =======================
|
| -
|
| -def _type_of(obj, **kwargs):
|
| - if isinstance(obj, BooleanValue):
|
| - return StringValue('bool')
|
| - if isinstance(obj, NumberValue):
|
| - return StringValue('number')
|
| - if isinstance(obj, QuotedStringValue):
|
| - return StringValue('string')
|
| - if isinstance(obj, ColorValue):
|
| - return StringValue('color')
|
| - if isinstance(obj, dict):
|
| - return StringValue('list')
|
| - return 'unknown'
|
| -
|
| -def _unit(value, **kwargs):
|
| - return NumberValue(value).units
|
| -
|
| -def _unitless(value, **kwargs):
|
| - if NumberValue(value).units:
|
| - return BooleanValue(False)
|
| - return BooleanValue(True)
|
| -
|
| -def _comparable(n1, n2, **kwargs):
|
| - n1, n2 = NumberValue(n1), NumberValue(n2)
|
| - type1 = CONV_TYPE.get(n1.units)
|
| - type2 = CONV_TYPE.get(n2.units)
|
| - return BooleanValue(type1 == type2)
|
| -
|
| -
|
| -# Color functions
|
| -# ================
|
| -
|
| -def _adjust_color(color, saturation=0.0, lightness=0.0, red=0.0, green=0.0, blue=0.0, alpha=0.0, **kwargs):
|
| - return __asc_color(OPRT['+'], color, saturation, lightness, red, green, blue, alpha)
|
| -
|
| -def _scale_color(color, saturation=1.0, lightness=1.0, red=1.0, green=1.0, blue=1.0, alpha=1.0, **kwargs):
|
| - return __asc_color(OPRT['*'], color, saturation, lightness, red, green, blue, alpha)
|
| -
|
| -def _change_color(color, saturation=None, lightness=None, red=None, green=None, blue=None, alpha=None, **kwargs):
|
| - return __asc_color(None, color, saturation, lightness, red, green, blue, alpha)
|
| -
|
| -def _invert(color, **kwargs):
|
| - """ Returns the inverse (negative) of a color.
|
| - The red, green, and blue values are inverted, while the opacity is left alone.
|
| - """
|
| - col = ColorValue(color)
|
| - c = col.value
|
| - c[0] = 255.0 - c[0]
|
| - c[1] = 255.0 - c[1]
|
| - c[2] = 255.0 - c[2]
|
| - return col
|
| -
|
| -def _adjust_lightness(color, amount, **kwargs):
|
| - return hsl_op(OPRT['+'], color, 0, 0, amount)
|
| -
|
| -def _adjust_saturation(color, amount, **kwargs):
|
| - return hsl_op(OPRT['+'], color, 0, amount, 0)
|
| -
|
| -def _scale_lightness(color, amount, **kwargs):
|
| - return hsl_op(OPRT['*'], color, 0, 0, amount)
|
| -
|
| -def _scale_saturation(color, amount, **kwargs):
|
| - return hsl_op(OPRT['*'], color, 0, amount, 0)
|
| -
|
| -
|
| -# Compass helpers
|
| -# ================
|
| -
|
| -def _color_stops(*args, **kwargs):
|
| - raise NotImplementedError
|
| -
|
| -def _elements_of_type(display, **kwargs):
|
| - return StringValue(ELEMENTS_OF_TYPE.get(StringValue(display).value, ''))
|
| -
|
| -def _enumerate(s, b, e, **kwargs):
|
| - return ', '.join(
|
| - "%s%d" % (StringValue(s).value, x) for x in xrange(int(b.value), int(e.value+1))
|
| - )
|
| -
|
| -def _font_files(*args, **kwargs):
|
| - raise NotImplementedError
|
| -
|
| -def _headings(a=None, b=None, **kwargs):
|
| - h = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']
|
| - if not a or StringValue(a).value == 'all':
|
| - a, b = 1, 6
|
| - elif b is None:
|
| - b, a = a.value + 1, 1
|
| - return ', '.join(h[int(float(a)-1):int(float(b))])
|
| -
|
| -def _nest(*args, **kwargs):
|
| - return ', '.join(
|
| - ' '.join(s.strip() for s in p)
|
| - if not '&' in p[1] else p[1].replace('&', p[0].strip())
|
| - for p in product(
|
| - *(StringValue(sel).value.split(',') for sel in args)
|
| - )
|
| - )
|
| -
|
| -@check_pil
|
| -def _image_width(image, **kwargs):
|
| - root = kwargs.get('root')
|
| - path = os.path.abspath(os.path.join(root.get_opt('path'), StringValue(image).value))
|
| - size = __get_size(path, root=root)
|
| - return NumberValue([size[0], 'px'])
|
| -
|
| -@check_pil
|
| -def _image_height(image, **kwargs):
|
| - root = kwargs.get('root')
|
| - path = os.path.abspath(os.path.join(root.get_opt('path'), StringValue(image).value))
|
| - size = __get_size(path, root=root)
|
| - return NumberValue([size[1], 'px'])
|
| -
|
| -def _image_url(image, **kwargs):
|
| - return QuotedStringValue(image).value
|
| -
|
| -def _url(image, **kwargs):
|
| - return 'url({0})'.format(QuotedStringValue(image).value)
|
| -
|
| -def _inline_image(image, mimetype=None, **kwargs):
|
| - root = kwargs.get('root')
|
| - path = os.path.abspath(os.path.join(root.get_opt('path'), StringValue(image).value))
|
| - if os.path.exists(path):
|
| - mimetype = StringValue(mimetype).value or mimetypes.guess_type(path)[0]
|
| - f = open(path, 'rb')
|
| - url = 'data:' + mimetype + ';base64,' + base64.b64encode(f.read())
|
| - else:
|
| - if root and root.get_opt('warn'):
|
| - warn("Not found image: %s" % path)
|
| - url = '%s?_=NA' % QuotedStringValue(image).value
|
| - inline = 'url("%s")' % url
|
| - return StringValue(inline)
|
| -
|
| -
|
| -# Misc
|
| -# ====
|
| -
|
| -def _if(cond, body, els, **kwargs):
|
| - if BooleanValue( cond ).value:
|
| - return body
|
| - return els
|
| -
|
| -
|
| -def _sprite_position(*args):
|
| - pass
|
| -
|
| -def _sprite_file(*args):
|
| - pass
|
| -
|
| -def _sprite(*args):
|
| - pass
|
| -
|
| -def _sprite_map(*args):
|
| - pass
|
| -
|
| -def _sprite_map_name(*args):
|
| - pass
|
| -
|
| -def _sprite_url(*args):
|
| - pass
|
| -
|
| -def _opposite_position(*args):
|
| - pass
|
| -
|
| -def _grad_point(*args):
|
| - pass
|
| -
|
| -def _grad_color_stops(*args):
|
| - pass
|
| -
|
| -def _nth(*args):
|
| - pass
|
| -
|
| -def _join(*args):
|
| - pass
|
| -
|
| -def _append(*args):
|
| - pass
|
| -
|
| -# Layout minmax
|
| -def _minmax(n1, n2, **kwargs):
|
| - return StringValue('minmax({0},{1})'.format(n1, n2))
|
| -
|
| -
|
| -FUNCTION_LIST = {
|
| -
|
| - # RGB functions
|
| - 'rgb:3': _rgb,
|
| - 'rgba:4': _rgba,
|
| - 'red:1': _red,
|
| - 'green:1': _green,
|
| - 'blue:1': _blue,
|
| - 'mix:2': _mix,
|
| - 'mix:3': _mix,
|
| -
|
| - # HSL functions
|
| - 'hsl:3': _hsl,
|
| - 'hsla:4': _hsla,
|
| - 'hue:1': _hue,
|
| - 'saturation:1': _saturation,
|
| - 'lightness:1': _lightness,
|
| - 'adjust-hue:2': _adjust_hue,
|
| - 'spin:2': _adjust_hue,
|
| - 'lighten:2': _lighten,
|
| - 'darken:2': _darken,
|
| - 'saturate:2': _saturate,
|
| - 'desaturate:2': _desaturate,
|
| - 'grayscale:1': _grayscale,
|
| - 'complement:1': _complement,
|
| -
|
| - # Opacity functions
|
| - 'alpha:1': _alpha,
|
| - 'opacity:1': _alpha,
|
| - 'opacify:2': _opacify,
|
| - 'fadein:2': _opacify,
|
| - 'fade-in:2': _opacify,
|
| - 'transparentize:2': _transparentize,
|
| - 'fadeout:2': _transparentize,
|
| - 'fade-out:2': _transparentize,
|
| -
|
| - # String functions
|
| - 'quote:n': _quote,
|
| - 'unquote:n': _unquote,
|
| -
|
| - # Number functions
|
| - 'percentage:1': _percentage,
|
| - 'sin:1': _sin,
|
| - 'cos:1': _cos,
|
| - 'tan:1': _tan,
|
| - 'abs:1': _abs,
|
| - 'round:1': _round,
|
| - 'ceil:1': _ceil,
|
| - 'floor:1': _floor,
|
| - 'pi:0': _pi,
|
| -
|
| - # Introspection functions
|
| - 'type-of:1': _type_of,
|
| - 'unit:1': _unit,
|
| - 'unitless:1': _unitless,
|
| - 'comparable:2': _comparable,
|
| -
|
| - # Color functions
|
| - 'adjust-color:n': _adjust_color,
|
| - 'scale-color:n': _scale_color,
|
| - 'change-color:n': _change_color,
|
| - 'adjust-lightness:2': _adjust_lightness,
|
| - 'adjust-saturation:2': _adjust_saturation,
|
| - 'scale-lightness:2': _scale_lightness,
|
| - 'scale-saturation:2': _scale_saturation,
|
| - 'invert:1': _invert,
|
| -
|
| - # Compass helpers
|
| - 'append-selector:2': _nest,
|
| - 'color-stops:n': _color_stops,
|
| - 'enumerate:3': _enumerate,
|
| - 'elements-of-type:1': _elements_of_type,
|
| - 'font-files:n': _font_files,
|
| - 'headings:n': _headings,
|
| - 'nest:n': _nest,
|
| -
|
| - # Images functions
|
| - 'url:1': _url,
|
| - 'image-url:1': _image_url,
|
| - 'image-width:1': _image_width,
|
| - 'image-height:1': _image_height,
|
| - 'inline-image:1': _inline_image,
|
| - 'inline-image:2': _inline_image,
|
| -
|
| - # Not implemented
|
| - 'sprite-map:1': _sprite_map,
|
| - 'sprite:2': _sprite,
|
| - 'sprite:3': _sprite,
|
| - 'sprite:4': _sprite,
|
| - 'sprite-map-name:1': _sprite_map_name,
|
| - 'sprite-file:2': _sprite_file,
|
| - 'sprite-url:1': _sprite_url,
|
| - 'sprite-position:2': _sprite_position,
|
| - 'sprite-position:3': _sprite_position,
|
| - 'sprite-position:4': _sprite_position,
|
| -
|
| - 'opposite-position:n': _opposite_position,
|
| - 'grad-point:n': _grad_point,
|
| - 'grad-color-stops:n': _grad_color_stops,
|
| -
|
| - 'nth:2': _nth,
|
| - 'first-value-of:1': _nth,
|
| - 'join:2': _join,
|
| - 'join:3': _join,
|
| - 'append:2': _append,
|
| - 'append:3': _append,
|
| -
|
| - 'if:3': _if,
|
| - 'escape:1': _unquote,
|
| - 'e:1': _unquote,
|
| -
|
| - #layout metrics functions
|
| - 'minmax:2': _minmax,
|
| -}
|
| -
|
| -def __asc_color(op, color, saturation, lightness, red, green, blue, alpha):
|
| - if lightness or saturation:
|
| - color = hsl_op(op, color, 0, saturation, lightness)
|
| - if red or green or blue or alpha:
|
| - color = rgba_op(op, color, red, green, blue, alpha)
|
| - return color
|
| -
|
| -def __get_size(path, **kwargs):
|
| - root = kwargs.get('root')
|
| - if not IMAGES.has_key(path):
|
| -
|
| - if not os.path.exists(path):
|
| -
|
| - if root and root.get_opt('warn'):
|
| - warn("Not found image: %s" % path)
|
| -
|
| - return 0, 0
|
| -
|
| - image = Image.open(path)
|
| - IMAGES[path] = image.size
|
| - return IMAGES[path]
|
|
|