diff options
Diffstat (limited to 'scss/functions/core.py')
-rw-r--r-- | scss/functions/core.py | 68 |
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))) |