Skip to content

Commit 25e6e28

Browse files
committed
perf: search map and key
1 parent e41bec8 commit 25e6e28

File tree

4 files changed

+68
-21
lines changed

4 files changed

+68
-21
lines changed

src/constant.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export const METHOD = 'map-get((';
2+
export const DIVIDER = '),';
3+
export const CLOSING_PARENTHESIS = ')';

src/index.js

+51-21
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,74 @@
11
import postcss from 'postcss';
2+
import strNormalize from './str-normalize';
3+
import strGetContent from './str-get-content';
4+
import {METHOD, DIVIDER} from './constant';
25

3-
const METHOD = 'map-get';
6+
// const valResolve = value => {
7+
// const map = value.substring(
8+
// value.indexOf('((') + 2,
9+
// value.indexOf('),')
10+
// )
11+
// .split(',')
12+
// .reduce((map, string) => {
13+
// const [key, value] = string.split(':');
14+
// return Object.assign(map, {[key]: value});
15+
// }, {});
416

5-
const valResolve = value => {
6-
const map = value.substring(
7-
value.indexOf('((') + 2,
8-
value.indexOf('),')
9-
)
10-
.split(',')
11-
.reduce((map, string) => {
12-
const [key, value] = string.split(':');
13-
return Object.assign(map, {[key]: value});
14-
}, {});
17+
// const key = value.substring(
18+
// value.indexOf('),') + 2,
19+
// value.lastIndexOf(')')
20+
// );
1521

16-
const key = value.substring(
17-
value.indexOf('),') + 2,
18-
value.lastIndexOf(')')
19-
);
22+
// return map[key];
23+
// };
24+
25+
// const replace = value => {
26+
// console.log(value);
27+
28+
// //console.log(value.substr(0, start),value.substr(start, end),value.substr(end));
29+
// return `${value.substr(0, start)}${valResolve(value.substr(start, end))}${value.substr(end)}`;
30+
// }
31+
const mapGet = val => {
32+
let [map, key] = val
33+
.split(DIVIDER)
34+
.map(value => {
35+
if (value.includes(':')) {
36+
return value.split(',')
37+
.reduce((map, string) => {
38+
const [key, value] = string.split(':');
39+
return Object.assign(map, {[key]: value});
40+
}, {});
41+
}
42+
43+
return value;
44+
});
2045

2146
return map[key];
2247
};
2348

24-
const normalize = value => value.replace(/(\s|!default)/g, '');
49+
const valResolve = val => {
50+
const value = strNormalize(val);
51+
const {start, content, end} = strGetContent(value);
52+
53+
return `${start}${mapGet(content)}${end}`;
54+
};
2555

2656
export default postcss.plugin('postcss-map-get', () => {
2757
return nodes => {
2858
nodes.walkDecls(decl => {
2959
let {value} = decl;
3060

31-
if (value.startsWith(METHOD)) {
32-
decl.value = valResolve(normalize(decl.value));
61+
if (value.includes(METHOD)) {
62+
decl.value = valResolve(decl.value);
3363
}
3464
});
3565

3666
nodes.walkAtRules(rules => {
3767
const {params} = rules;
3868

39-
const start = params.indexOf(METHOD);
40-
const end = params.lastIndexOf(')');
41-
rules.params = `${params.substr(0, start)}${valResolve(normalize(params.substring(start, end)))}${params.substr(end)}`;
69+
if (params.includes(METHOD)) {
70+
rules.params = valResolve(params);
71+
}
4272
});
4373
};
4474
});

src/str-get-content.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import {METHOD, DIVIDER, CLOSING_PARENTHESIS} from './constant';
2+
3+
export default value => {
4+
const start = value.indexOf(METHOD);
5+
const divider = value.indexOf(DIVIDER);
6+
const end = value.indexOf(CLOSING_PARENTHESIS, divider + DIVIDER.length);
7+
8+
return {
9+
start: value.substr(0, start),
10+
content: value.substring(start + METHOD.length, end),
11+
end: value.substr(end + CLOSING_PARENTHESIS.length)
12+
};
13+
};

src/str-normalize.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default value => value.replace(/(\s|!default)/g, '');

0 commit comments

Comments
 (0)