summaryrefslogtreecommitdiff
path: root/scss/functions/core.py
diff options
context:
space:
mode:
Diffstat (limited to 'scss/functions/core.py')
-rw-r--r--scss/functions/core.py68
1 files changed, 30 insertions, 38 deletions
diff --git a/scss/functions/core.py b/scss/functions/core.py
index 7a99b12..b1fb6a0 100644
--- a/scss/functions/core.py
+++ b/scss/functions/core.py
@@ -568,13 +568,21 @@ def _length(*lst):
return Number(len(lst))
+@register('set-nth', 3)
+def set_nth(list, n, value):
+ expect_type(n, Number, unit=None)
+
+ py_n = n.to_python_index(len(list))
+ return List(
+ tuple(list[:py_n]) + (value,) + tuple(list[py_n + 1:]),
+ use_comma=list.use_comma)
+
+
# TODO get the compass bit outta here
@register('-compass-nth', 2)
@register('nth', 2)
def nth(lst, n):
- """
- Return the Nth item in the string
- """
+ """Return the nth item in the list."""
expect_type(n, (String, Number), unit=None)
if isinstance(n, String):
@@ -585,7 +593,7 @@ def nth(lst, n):
else:
raise ValueError("Invalid index %r" % (n,))
else:
- i = (int(n.value) - 1) % len(lst)
+ i = n.to_python_index(len(lst))
return lst[i]
@@ -650,76 +658,60 @@ def list_separator(list):
return String.unquoted('space')
-@register('set-nth', 3)
-def set_nth(list, n, value):
- expect_type(n, Number, unit=None)
-
- py_n = n.to_python_index(len(list))
- return List(
- tuple(list[:py_n]) + (value,) + tuple(list[py_n + 1:]),
- use_comma=list.use_comma)
-
-
# ------------------------------------------------------------------------------
# Map functions
@register('map-get', 2)
def map_get(map, key):
- return map.get_by_key(key)
+ return map.to_dict().get(key, Null())
@register('map-merge', 2)
def map_merge(*maps):
- pairs = []
+ key_order = []
index = {}
for map in maps:
- for key, value in map.pairs:
- if key in index:
- continue
+ for key, value in map.to_pairs():
+ if key not in index:
+ key_order.append(key)
- pairs.append((key, value))
index[key] = value
- return Map(pairs)
+
+ pairs = [(key, index[key]) for key in key_order]
+ return Map(pairs, index=index)
@register('map-keys', 1)
def map_keys(map):
return List(
- [k for (k, v) in map.pairs],
- comma=True)
+ [k for (k, v) in map.to_pairs()],
+ use_comma=True)
@register('map-values', 1)
def map_values(map):
return List(
- [v for (k, v) in map.pairs],
- comma=True)
+ [v for (k, v) in map.to_pairs()],
+ use_comma=True)
@register('map-has-key', 2)
def map_has_key(map, key):
- return Boolean(key in map.index)
+ return Boolean(key in map.to_dict())
# DEVIATIONS: these do not exist in ruby sass
@register('map-get', 3)
def map_get3(map, key, default):
- return map.get_by_key(key, default)
+ return map.to_dict().get(key, default)
@register('map-get-nested', 2)
-def map_get_nested(map, keys):
- for key in keys:
- map = map.get_by_key(key)
-
- return map
-
-
@register('map-get-nested', 3)
-def map_get_nested3(map, keys, default):
+def map_get_nested3(map, keys, default=Null()):
for key in keys:
- map = map.get_by_key(key, None)
+ map = map.to_dict().get(key, None)
if map is None:
return default
@@ -731,11 +723,11 @@ def map_merge_deep(*maps):
pairs = []
keys = set()
for map in maps:
- for key, value in map.pairs:
+ for key, value in map.to_pairs():
keys.add(key)
for key in keys:
- values = [map.get_by_key(key, None) for map in maps]
+ values = [map.to_dict().get(key, None) for map in maps]
values = [v for v in values if v is not None]
if all(isinstance(v, Map) for v in values):
pairs.append((key, map_merge_deep(*values)))