Skip to content

Commit 174b77b

Browse files
committed
Merge pull request #2664 from nazar-pc/fix-for-unicode-escape-sequences-in-css-selectors
Added support for short unicode escape sequences, fixes #2650
2 parents a975c46 + 2c87145 commit 174b77b

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

src/lib/css-parse.html

+13
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
if (node.parent) {
6161
var ss = node.previous ? node.previous.end : node.parent.start;
6262
t = text.substring(ss, node.start-1);
63+
t = this._expandUnicodeEscapes(t);
6364
// TODO(sorvell): ad hoc; make selector include only after last ;
6465
// helps with mixin syntax
6566
t = t.substring(t.lastIndexOf(';')+1);
@@ -89,6 +90,18 @@
8990
return node;
9091
},
9192

93+
// conversion of sort unicode escapes with spaces like `\33 ` (and longer) into
94+
// expanded form that doesn't require trailing space `\000033`
95+
_expandUnicodeEscapes : function(s) {
96+
return s.replace(/\\([0-9a-f]{1,6})\s/gi, function() {
97+
var code = arguments[1], repeat = 6 - code.length;
98+
while (repeat--) {
99+
code = '0' + code;
100+
}
101+
return '\\' + code;
102+
});
103+
},
104+
92105
// stringify parsed css.
93106
stringify: function(node, preserveProperties, text) {
94107
text = text || '';

test/unit/css-parse.html

+32
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,27 @@
6868
someProperty: thatMustNotShowUp
6969
}*/
7070
</style>
71+
72+
<style id="short-escape-sequence">
73+
.\33 d-model {
74+
border-top: 3px solid red;
75+
}
76+
.\a33 d-model {
77+
border-top: 3px solid red;
78+
}
79+
.\b333 d-model {
80+
border-top: 3px solid red;
81+
}
82+
.\c3333 d-model {
83+
border-top: 3px solid red;
84+
}
85+
.\d33333 d-model {
86+
border-top: 3px solid red;
87+
}
88+
.\e33333d-model {
89+
border-top: 3px solid red;
90+
}
91+
</style>
7192
<script>
7293

7394
function sanitizeCss(text) {
@@ -127,6 +148,17 @@
127148
assert.equal(result, '.stuff { background: red; }', 'unexpected stringified output');
128149
});
129150

151+
test('short escape sequences', function() {
152+
var s3 = document.querySelector('#short-escape-sequence');
153+
var t = css.parse(s3.textContent);
154+
assert.equal(t.rules[0].selector, '.\\000033d-model');
155+
assert.equal(t.rules[1].selector, '.\\000a33d-model');
156+
assert.equal(t.rules[2].selector, '.\\00b333d-model');
157+
assert.equal(t.rules[3].selector, '.\\0c3333d-model');
158+
assert.equal(t.rules[4].selector, '.\\d33333d-model');
159+
assert.equal(t.rules[5].selector, '.\\e33333d-model');
160+
});
161+
130162
});
131163
</script>
132164

0 commit comments

Comments
 (0)