Skip to content

Commit 50f86ab

Browse files
DEfusioncivan
authored andcommitted
Allow function support in map values
#47
1 parent d8aa1d4 commit 50f86ab

4 files changed

Lines changed: 65 additions & 1 deletion

File tree

src/app/converter/converter.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,27 @@ describe('Converter class', () => {
194194
expect(map[1].value).to.be.equal('map-get($icons, music)');
195195
expect(map[1].compiledValue).to.be.equal('value');
196196
});
197+
198+
it('should allow function calls with multiple arguments in values', () => {
199+
let result = structured['funcs'][0];
200+
expect(result).to.have.property('mapValue');
201+
let map = result.mapValue;
202+
203+
let expected = [
204+
{ name: 'max', value: 'max(1px, 4px)', compiled: '4px' },
205+
{ name: 'min', value: 'min(1px, 4px)', compiled: '1px' },
206+
{ name: 'str-index', value: 'str-index("Helvetica Neue", "Neue")', compiled: '11' },
207+
{ name: 'adjust-color', value: 'adjust-color(#d2e1dd, $red: -10, $blue: 10)', compiled: '#c8e1e7' },
208+
{ name: 'rgba', value: 'rgba(255, 0, 0, .5)', compiled: 'rgba(255, 0, 0, 0.5)' },
209+
{ name: 'darken', value: 'darken(#b37399, 20%)', compiled: '#7c4465' }
210+
];
211+
212+
expected.forEach(({name, value, compiled}, ix) => {
213+
expect(map[ix].name).to.be.equal(name);
214+
expect(map[ix].value).to.be.equal(value);
215+
expect(map[ix].compiledValue).to.be.equal(compiled);
216+
});
217+
});
197218
});
198219

199220
describe('mixins support', () => {

src/app/parser/parser.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,5 +256,38 @@ describe('Parser class', () => {
256256
expect(map[0].name).be.equal('two');
257257
expect(map[0].value).be.equal('map-get($source, one)');
258258
});
259+
260+
it('should allow function calls with multiple arguments in values', () => {
261+
let content = `$funcs: (
262+
max: max(1px, 4px), // 4px
263+
min: min(1px, 4px), // 1px
264+
str-index: str-index("Helvetica Neue", "Neue"), // 11
265+
adjust-color: adjust-color(#d2e1dd, $red: -10, $blue: 10), // #c8e1e7
266+
rgba: rgba(255, 0, 0, .5), // rgba(255, 0, 0, 0.5)
267+
darken: darken(#b37399, 20%), // #7c4465
268+
);`;
269+
270+
let parser = new Parser(content);
271+
let structured = parser.parseStructured();
272+
let map = structured.variables[0].mapValue;
273+
274+
expect(map[0].name).be.equal('max');
275+
expect(map[0].value).be.equal('max(1px, 4px)');
276+
277+
expect(map[1].name).be.equal('min');
278+
expect(map[1].value).be.equal('min(1px, 4px)');
279+
280+
expect(map[2].name).be.equal('str-index');
281+
expect(map[2].value).be.equal('str-index("Helvetica Neue", "Neue")');
282+
283+
expect(map[3].name).be.equal('adjust-color');
284+
expect(map[3].value).be.equal('adjust-color(#d2e1dd, $red: -10, $blue: 10)');
285+
286+
expect(map[4].name).be.equal('rgba');
287+
expect(map[4].value).be.equal('rgba(255, 0, 0, .5)');
288+
289+
expect(map[5].name).be.equal('darken');
290+
expect(map[5].value).be.equal('darken(#b37399, 20%)');
291+
});
259292
});
260293
});

src/app/parser/parser.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const VALUE_PATERN = '[^;]+|"(?:[^"]+|(?:\\\\"|[^"])*)"';
33
const DECLARATION_PATTERN =
44
`\\$['"]?(${VARIABLE_PATERN})['"]?\\s*:\\s*(${VALUE_PATERN})(?:\\s*!(global|default)\\s*;|\\s*;(?![^\\{]*\\}))`;
55

6-
const MAP_DECLARATIOM_REGEX = /['"]?((?!\d)[\w_-][\w\d_-]*)['"]?\s*:\s*(map-get\([^\)]+\)|[^\),\/]+)/gi;
6+
const MAP_DECLARATIOM_REGEX = /['"]?((?!\d)[\w_-][\w\d_-]*)['"]?\s*:\s*([a-z\-]+\([^\)]+\)|[^\),\/]+)/gi;
77

88
const QUOTES_PATTERN = /^(['"]).*\1$/;
99
const QUOTES_REPLACE = /^(['"])|(['"])$/g;

test/scss/_maps.scss

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,13 @@ $map-get: (
2727
breakpoint: map-get($bps, 'mobile'),
2828
icon: map-get($icons, music)
2929
);
30+
31+
// @sass-export-section="funcs"
32+
$funcs: (
33+
max: max(1px, 4px),
34+
min: min(1px, 4px),
35+
str-index: str-index("Helvetica Neue", "Neue"),
36+
adjust-color: adjust-color(#d2e1dd, $red: -10, $blue: 10),
37+
rgba: rgba(255, 0, 0, .5),
38+
darken: darken(#b37399, 20%)
39+
);

0 commit comments

Comments
 (0)