Skip to content

Commit f8c482f

Browse files
committed
fix: parseSel using splitSelector func
1 parent 4542f14 commit f8c482f

8 files changed

+134
-185
lines changed

.commithash

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
709f4e303a40d3682c9d541c0e3a103936846ad7
1+
4542f1481fdba8963a47278c58884c17d8c85f48

dist/cssobj-plugin-localize.amd.js

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -46,49 +46,32 @@ function arrayKV (obj, k, v, reverse, unique) {
4646
// get parents array from node (when it's passed the test)
4747

4848

49-
// split selector etc. aware of css attributes
49+
// split selector with comma, aware of css attributes
5050

5151

52-
// split char aware of syntax
53-
function syntaxSplit (str, splitter, keepSplitter, test, final) {
54-
var isString, isFeature, isSplitter, feature = [], segment = [], result = [], ast = [], len = str.length;
55-
for (var c, i = 0, lastAst, prev = 0; i <= len; i++) {
56-
c = str.charAt(i);
57-
lastAst = ast[0];
58-
isString = lastAst == '\'' || lastAst == '"';
59-
if (!isString) {
60-
if ('[(\'"'.indexOf(c) >= 0) ast.unshift(c);
61-
if ('])'.indexOf(c) >= 0) ast.shift();
62-
} else {
63-
if (c == lastAst) ast.shift();
64-
}
65-
if (lastAst) {
66-
segment.push(c);
67-
} else {
68-
isFeature = test && c && test(c, i, segment, result);
69-
isSplitter = c == splitter || !c;
70-
if (isSplitter && !keepSplitter) c = '';
71-
if (isFeature) feature.push(c);
72-
if (!isFeature || isSplitter) segment.push(feature.length ? final(feature.join('')) : '', c), feature = [];
73-
if (isSplitter) result.push(segment.join('')), segment = [];
52+
// split selector with splitter, aware of css attributes
53+
function splitSelector (sel, splitter) {
54+
for (var c, i = 0, n = 0, instr = '', prev = 0, d = []; c = sel.charAt(i); i++) {
55+
if (instr) {
56+
if (c == instr) instr = '';
57+
continue
7458
}
59+
if (c == '"' || c == '\'') instr = c;
60+
if (c == '(' || c == '[') n++;
61+
if (c == ')' || c == ']') n--;
62+
if (!n && c == splitter) d.push(sel.substring(prev, i)), prev = i + 1;
7563
}
76-
return result
64+
return d.concat(sel.substring(prev))
7765
}
7866

67+
// split char aware of syntax
68+
69+
7970
// checking for valid css value
8071

8172
// cssobj plugin
8273

83-
function isClassName (char, i, segment) {
84-
return i>0 && !segment.length && (char == '!'
85-
|| char >= '0' && char <= '9'
86-
|| char >= 'a' && char <= 'z'
87-
|| char >= 'A' && char <= 'Z'
88-
|| char == '-'
89-
|| char == '_'
90-
|| char >= '\u00a0')
91-
}
74+
var classNameRe = /[ \~\\@$%^&\*\(\)\+\=,/';\:"?><[\]\\{}|`]/;
9275

9376
function cssobj_plugin_selector_localize(option) {
9477

@@ -102,20 +85,25 @@ function cssobj_plugin_selector_localize(option) {
10285

10386
var localize = function(name) {
10487
return name[0]=='!'
105-
? name.slice(1)
88+
? name.substr(1)
10689
: (name in localNames
10790
? localNames[name]
10891
: name + space)
10992
};
11093

11194
var parseSel = function(str) {
112-
return syntaxSplit(
113-
str,
114-
'.',
115-
true,
116-
isClassName,
117-
localize
118-
).join('')
95+
var part = splitSelector(str, '.');
96+
var sel=part[0];
97+
for(var i = 1, p, pos, len = part.length; i < len; i++) {
98+
p = part[i];
99+
if(!p) {
100+
sel += '.';
101+
continue
102+
}
103+
pos = p.search(classNameRe);
104+
sel += '.' + (pos<0 ? localize(p) : localize(p.substr(0,pos)) + p.substr(pos));
105+
}
106+
return sel
119107
};
120108

121109
var mapClass = function(str) {

dist/cssobj-plugin-localize.cjs.js

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -46,49 +46,32 @@ function arrayKV (obj, k, v, reverse, unique) {
4646
// get parents array from node (when it's passed the test)
4747

4848

49-
// split selector etc. aware of css attributes
49+
// split selector with comma, aware of css attributes
5050

5151

52-
// split char aware of syntax
53-
function syntaxSplit (str, splitter, keepSplitter, test, final) {
54-
var isString, isFeature, isSplitter, feature = [], segment = [], result = [], ast = [], len = str.length;
55-
for (var c, i = 0, lastAst, prev = 0; i <= len; i++) {
56-
c = str.charAt(i);
57-
lastAst = ast[0];
58-
isString = lastAst == '\'' || lastAst == '"';
59-
if (!isString) {
60-
if ('[(\'"'.indexOf(c) >= 0) ast.unshift(c);
61-
if ('])'.indexOf(c) >= 0) ast.shift();
62-
} else {
63-
if (c == lastAst) ast.shift();
64-
}
65-
if (lastAst) {
66-
segment.push(c);
67-
} else {
68-
isFeature = test && c && test(c, i, segment, result);
69-
isSplitter = c == splitter || !c;
70-
if (isSplitter && !keepSplitter) c = '';
71-
if (isFeature) feature.push(c);
72-
if (!isFeature || isSplitter) segment.push(feature.length ? final(feature.join('')) : '', c), feature = [];
73-
if (isSplitter) result.push(segment.join('')), segment = [];
52+
// split selector with splitter, aware of css attributes
53+
function splitSelector (sel, splitter) {
54+
for (var c, i = 0, n = 0, instr = '', prev = 0, d = []; c = sel.charAt(i); i++) {
55+
if (instr) {
56+
if (c == instr) instr = '';
57+
continue
7458
}
59+
if (c == '"' || c == '\'') instr = c;
60+
if (c == '(' || c == '[') n++;
61+
if (c == ')' || c == ']') n--;
62+
if (!n && c == splitter) d.push(sel.substring(prev, i)), prev = i + 1;
7563
}
76-
return result
64+
return d.concat(sel.substring(prev))
7765
}
7866

67+
// split char aware of syntax
68+
69+
7970
// checking for valid css value
8071

8172
// cssobj plugin
8273

83-
function isClassName (char, i, segment) {
84-
return i>0 && !segment.length && (char == '!'
85-
|| char >= '0' && char <= '9'
86-
|| char >= 'a' && char <= 'z'
87-
|| char >= 'A' && char <= 'Z'
88-
|| char == '-'
89-
|| char == '_'
90-
|| char >= '\u00a0')
91-
}
74+
var classNameRe = /[ \~\\@$%^&\*\(\)\+\=,/';\:"?><[\]\\{}|`]/;
9275

9376
function cssobj_plugin_selector_localize(option) {
9477

@@ -102,20 +85,25 @@ function cssobj_plugin_selector_localize(option) {
10285

10386
var localize = function(name) {
10487
return name[0]=='!'
105-
? name.slice(1)
88+
? name.substr(1)
10689
: (name in localNames
10790
? localNames[name]
10891
: name + space)
10992
};
11093

11194
var parseSel = function(str) {
112-
return syntaxSplit(
113-
str,
114-
'.',
115-
true,
116-
isClassName,
117-
localize
118-
).join('')
95+
var part = splitSelector(str, '.');
96+
var sel=part[0];
97+
for(var i = 1, p, pos, len = part.length; i < len; i++) {
98+
p = part[i];
99+
if(!p) {
100+
sel += '.';
101+
continue
102+
}
103+
pos = p.search(classNameRe);
104+
sel += '.' + (pos<0 ? localize(p) : localize(p.substr(0,pos)) + p.substr(pos));
105+
}
106+
return sel
119107
};
120108

121109
var mapClass = function(str) {

dist/cssobj-plugin-localize.es.js

Lines changed: 29 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -44,49 +44,32 @@ function arrayKV (obj, k, v, reverse, unique) {
4444
// get parents array from node (when it's passed the test)
4545

4646

47-
// split selector etc. aware of css attributes
47+
// split selector with comma, aware of css attributes
4848

4949

50-
// split char aware of syntax
51-
function syntaxSplit (str, splitter, keepSplitter, test, final) {
52-
var isString, isFeature, isSplitter, feature = [], segment = [], result = [], ast = [], len = str.length;
53-
for (var c, i = 0, lastAst, prev = 0; i <= len; i++) {
54-
c = str.charAt(i);
55-
lastAst = ast[0];
56-
isString = lastAst == '\'' || lastAst == '"';
57-
if (!isString) {
58-
if ('[(\'"'.indexOf(c) >= 0) ast.unshift(c);
59-
if ('])'.indexOf(c) >= 0) ast.shift();
60-
} else {
61-
if (c == lastAst) ast.shift();
62-
}
63-
if (lastAst) {
64-
segment.push(c);
65-
} else {
66-
isFeature = test && c && test(c, i, segment, result);
67-
isSplitter = c == splitter || !c;
68-
if (isSplitter && !keepSplitter) c = '';
69-
if (isFeature) feature.push(c);
70-
if (!isFeature || isSplitter) segment.push(feature.length ? final(feature.join('')) : '', c), feature = [];
71-
if (isSplitter) result.push(segment.join('')), segment = [];
50+
// split selector with splitter, aware of css attributes
51+
function splitSelector (sel, splitter) {
52+
for (var c, i = 0, n = 0, instr = '', prev = 0, d = []; c = sel.charAt(i); i++) {
53+
if (instr) {
54+
if (c == instr) instr = '';
55+
continue
7256
}
57+
if (c == '"' || c == '\'') instr = c;
58+
if (c == '(' || c == '[') n++;
59+
if (c == ')' || c == ']') n--;
60+
if (!n && c == splitter) d.push(sel.substring(prev, i)), prev = i + 1;
7361
}
74-
return result
62+
return d.concat(sel.substring(prev))
7563
}
7664

65+
// split char aware of syntax
66+
67+
7768
// checking for valid css value
7869

7970
// cssobj plugin
8071

81-
function isClassName (char, i, segment) {
82-
return i>0 && !segment.length && (char == '!'
83-
|| char >= '0' && char <= '9'
84-
|| char >= 'a' && char <= 'z'
85-
|| char >= 'A' && char <= 'Z'
86-
|| char == '-'
87-
|| char == '_'
88-
|| char >= '\u00a0')
89-
}
72+
var classNameRe = /[ \~\\@$%^&\*\(\)\+\=,/';\:"?><[\]\\{}|`]/;
9073

9174
function cssobj_plugin_selector_localize(option) {
9275

@@ -100,20 +83,25 @@ function cssobj_plugin_selector_localize(option) {
10083

10184
var localize = function(name) {
10285
return name[0]=='!'
103-
? name.slice(1)
86+
? name.substr(1)
10487
: (name in localNames
10588
? localNames[name]
10689
: name + space)
10790
};
10891

10992
var parseSel = function(str) {
110-
return syntaxSplit(
111-
str,
112-
'.',
113-
true,
114-
isClassName,
115-
localize
116-
).join('')
93+
var part = splitSelector(str, '.');
94+
var sel=part[0];
95+
for(var i = 1, p, pos, len = part.length; i < len; i++) {
96+
p = part[i];
97+
if(!p) {
98+
sel += '.';
99+
continue
100+
}
101+
pos = p.search(classNameRe);
102+
sel += '.' + (pos<0 ? localize(p) : localize(p.substr(0,pos)) + p.substr(pos));
103+
}
104+
return sel
117105
};
118106

119107
var mapClass = function(str) {

0 commit comments

Comments
 (0)