-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_values.combine.function.scss
131 lines (112 loc) · 7.44 KB
/
_values.combine.function.scss
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// Sass.
@use 'sass:list';
@use 'sass:meta';
// Functions.
@use '../list/list.append.function' as *;
@use '../list/list.has.function' as *;
@use '../list/list.join.function' as *;
// Modules.
@use '../map';
// Status: TODO: join on if
// The `values.combine()` function combines multiple `$values` into the list. By default, the function use append method
// to combine `$values`. The parameters of the list (bracketed, delimiter, method, null, separator) can be changed by
// providing map value eg. (method: join).
// @arbitrary `$values...` Arbitrary values to combine into the returned list.
// @return The return value is the list combined by the specified method, with a separator, and/or delimiter.
@function combine($values...) {
$allowed-parameters: (
bracketed: (auto, bool),
delimiter: (string, number),
method: (append, join),
null: bool,
separator: (auto, comma, space, slash)
);
$parameters: map.merge-allowed((
bracketed: auto,
delimiter: null,
method: append,
null: false,
separator: auto
),
list.nth($values, 1),
$allowed-parameters
);
$result: list.join((), (), map.pick($parameters, separator, bracketed)...);
@each $value in $values {
$allow: true;
$method: map.get($parameters, method);
@if type-of($value) == map and list.length(map.keys(map.remove($value, append, join, map.keys($parameters)...))) == 0 {
$parameters: map.merge-allowed($parameters, map.remove($value, append, join), $allowed-parameters);
@if has(map.keys($value), any, '==', append, join) { // Append/Join the value.
@each $use-method, $use-value in map.pick($value, append, join) {
@if $use-value {
$method: $use-method;
$value: $use-value;
}
}
} @else {
$allow: false;
}
}
@if not map.get($parameters, null) and not $value {
$allow: false;
}
@if $allow {
$result: meta.call(
meta.get-function($method),
$result,
$value,
map.pick($parameters, if($method == join, (separator, bracketed), separator)...)...
);
}
}
@if map.get($parameters, delimiter) {
$result: join((), $result, map.pick($parameters, separator, delimiter)...);
}
@return $result;
}
// Examples.
// The default append method + separator auto.
// @debug combine('&', layout sidebar, primary dark, extra small); // "&" (layout sidebar) (primary dark) (extra small)
// @debug combine(('&', dark), layout sidebar, primary dark, extra small); // ("&", dark) (layout sidebar) (primary dark) (extra small)
// Join method + separator auto.
// @debug combine((method: join), '&', layout sidebar, primary dark, extra small); // "&" layout sidebar primary dark extra small
// @debug combine((method: join), ('&', dark), layout sidebar, primary dark, extra small); // "&", dark, layout, sidebar, primary, dark, extra, small
// @debug combine((method: join), '&' dark, layout sidebar, primary dark, extra small); // "&" dark layout sidebar primary dark extra small
// Append method + separator space and comma.
// @debug combine((separator: space), '&', layout sidebar, primary dark, extra small); // "&" (layout sidebar) (primary dark) (extra small)
// @debug combine((separator: comma), '&', layout sidebar, primary dark, extra small); // "&", layout sidebar, primary dark, extra small
// Join method + separator space and comma.
// @debug combine((separator: space, method: join), '&', layout sidebar, primary dark, extra small); // "&" layout sidebar primary dark extra small
// @debug combine((separator: comma, method: join), '&', layout sidebar, primary dark, extra small); // "&", layout, sidebar, primary, dark, extra, small
// Combine with `append` or `join` key.
// @debug combine((append: first append), '&', layout sidebar, primary dark, extra small); // (first append) "&" (layout sidebar) (primary dark) (extra small)
// @debug combine((append: (first, append)), '&', layout sidebar, primary dark, extra small); // (first, append) "&" (layout sidebar) (primary dark) (extra small)
// @debug combine((join: first append), '&', layout sidebar, primary dark, extra small); // first append "&" layout sidebar primary dark extra small
// @debug combine((join: (first, append)), '&', layout sidebar, primary dark, extra small); // first, append, "&", layout, sidebar, primary, dark, extra, small
// @debug combine((method: join), '&', layout sidebar, (append: first append), primary dark, extra small); // "&" layout sidebar (first append) primary dark extra small
// @debug combine('&', layout sidebar, (join: first join), primary dark, extra small); // "&" (layout sidebar) first join (primary dark) (extra small)
// @debug combine((method: join, separator: comma), '&', layout sidebar, (append: first append), primary dark, extra small); // "&", layout, sidebar, first append, primary, dark, extra, small
// @debug combine((separator: comma), '&', layout sidebar, (join: first join), primary dark, extra small); // "&", layout sidebar, first, join, primary dark, extra small
// Bracketed.
// @debug combine((bracketed: true), '&', layout sidebar, primary dark, extra small); // ["&" (layout sidebar) (primary dark) (extra small)]
// Bracketed + separator.
// @debug combine((bracketed: true, separator: comma), '&', layout sidebar, primary dark, extra small); // ["&", layout sidebar, primary dark, extra small]
// Bracketed + join method.
// @debug combine((bracketed: true, method: join), '&', layout sidebar, primary dark, extra small); // ["&" layout sidebar primary dark extra small]
// Bracketed + separator + join method
// @debug combine((method: join, separator: comma, bracketed: true), '&', layout sidebar, primary dark, extra small); // ["&", layout, sidebar, primary, dark, extra, small]
// Change method.
// @debug combine((one, two), three, (four, five), (six seven), primary dark, extra small); // (one, two) three (four, five) (six seven) (primary dark) (extra small)
// @debug combine((one, two), three, (method: join), (four, five), (six seven), primary dark, extra small); // (one, two) three four five six seven primary dark extra small
// @debug combine((one, two), three, (method: join), (four, five), (six seven), (method: append), primary dark, extra small); // (one, two) three four five six seven (primary dark) (extra small)
// method (join: value) (append: value)
// @debug combine((join: (one, two)), (join: three), (four, five), (six seven), primary dark, extra small); // one two three (four, five) (six seven) (primary dark) (extra small)
// @debug combine((join: one two), three, (four, five), (six seven), (append: (primary dark extra small))); // one two three (four, five) (six seven) (primary dark extra small)
// Add delimiter + add null values.
// @debug combine(['a' 1], 'b' 2, ['c' 3], null, (separator: comma, null: true, delimiter: '-'), null, null, (append: 1 2 3), age 32, first name ); // ["a" 1], "-", "b" 2, "-", ["c" 3], "-", null, "-", null, "-", 1 2 3, "-", age 32, "-", first name
// @debug combine((method: join, delimiter: separator), 'a' 1 , 'b' 2, 'c' 3); // "a" separator 1 separator "b" separator 2 separator "c" separator 3
// @debug combine((method: join, separator: comma, delimiter: separator basic), 'a' 1 , 'b' 2, 'c' 3); // "a", separator basic, 1, separator basic, "b", separator basic, 2, separator basic, "c", separator basic, 3
// Provide separator
// @debug combine(1, 2, (delimiter: '-', separator: space), 3, 4);
// @debug combine(1, 2, (separator: comma), (prefix: spectre, separator: '-', suffix: end), 4, 5);