Skip to content

Commit 1c01788

Browse files
committed
Handle comments within namespaces, attribute names and values.
1 parent f667189 commit 1c01788

File tree

2 files changed

+27
-12
lines changed

2 files changed

+27
-12
lines changed

src/__tests__/attributes.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,15 +314,18 @@ test('comments within attribute selectors (3)', '[href=test/* wow */i]', (t, tre
314314
t.falsy(tree.nodes[0].nodes[0].insensitive);
315315
});
316316

317-
test('comments within attribute selectors (4)', '[href=test/* wow */ /*omg*/i/*bbq*/ /*whodoesthis*/]', (t, tree) => {
317+
test('comments within attribute selectors (4)', '[ /*before*/ href /* after-attr */ = /* after-operator */ te/*inside-value*/st/* wow */ /*omg*/i/*bbq*/ /*whodoesthis*/]', (t, tree) => {
318318
let attr = tree.nodes[0].nodes[0];
319+
console.log(attr.spaces);
320+
console.log(attr.raws);
319321
t.deepEqual(attr.attribute, 'href');
320322
t.deepEqual(attr.value, 'test');
323+
t.deepEqual(attr.raws.unquoted, 'test');
321324
t.deepEqual(attr.raws.spaces.value.after, '/* wow */ /*omg*/');
322325
t.truthy(attr.insensitive);
323-
t.deepEqual(attr.offsetOf("attribute"), 1);
324-
t.deepEqual(attr.offsetOf("operator"), 5);
325-
t.deepEqual(attr.offsetOf("insensitive"), 27);
326+
t.deepEqual(attr.offsetOf("attribute"), 13);
327+
t.deepEqual(attr.offsetOf("operator"), 35);
328+
t.deepEqual(attr.offsetOf("insensitive"), 95);
326329
t.deepEqual(attr.raws.spaces.insensitive.after, '/*bbq*/ /*whodoesthis*/');
327330
});
328331

src/parser.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ export default class Parser {
140140
if (next[0] === tokens.equals) {
141141
node.operator = content;
142142
lastAdded = 'operator';
143-
} else if (!node.namespace && next) {
143+
} else if ((!node.namespace || (lastAdded === "namespace" && !spaceAfterMeaningfulToken)) && next) {
144144
if (spaceBefore) {
145145
dotProp.set(node, 'spaces.attribute.before', spaceBefore);
146146
spaceBefore = '';
@@ -149,7 +149,11 @@ export default class Parser {
149149
dotProp.set(node, 'raws.spaces.attribute.before', spaceBefore);
150150
commentBefore = '';
151151
}
152-
node.namespace = content;
152+
node.namespace = (node.namespace || "") + content;
153+
let rawValue = dotProp.get(node, "raws.namespace");
154+
if (rawValue) {
155+
node.raws.namespace += content;
156+
}
153157
lastAdded = 'namespace';
154158
}
155159
spaceAfterMeaningfulToken = false;
@@ -183,13 +187,13 @@ export default class Parser {
183187
if (
184188
next &&
185189
this.content(next) === '|' &&
186-
(attr[pos + 2] && attr[pos + 2][0] !== tokens.equals) &&
190+
(attr[pos + 2] && attr[pos + 2][0] !== tokens.equals) && // this look-ahead probably fails with comment nodes involved.
187191
!node.operator &&
188192
!node.namespace
189193
) {
190194
node.namespace = content;
191195
lastAdded = 'namespace';
192-
} else if (!node.attribute) {
196+
} else if (!node.attribute || (lastAdded === "attribute" && !spaceAfterMeaningfulToken)) {
193197
if (spaceBefore) {
194198
dotProp.set(node, 'spaces.attribute.before', spaceBefore);
195199
spaceBefore = '';
@@ -198,12 +202,20 @@ export default class Parser {
198202
dotProp.set(node, 'raws.spaces.attribute.before', commentBefore);
199203
commentBefore = '';
200204
}
201-
node.attribute = content;
205+
node.attribute = (node.attribute || "") + content;
206+
let rawValue = dotProp.get(node, "raws.attribute");
207+
if (rawValue) {
208+
node.raws.attribute += content;
209+
}
202210
lastAdded = 'attribute';
203-
} else if (!node.value) {
204-
node.value = content;
211+
} else if (!node.value || (lastAdded === "value" && !spaceAfterMeaningfulToken)) {
212+
node.value = (node.value || "") + content;
213+
let rawValue = dotProp.get(node, "raws.value");
214+
if (rawValue) {
215+
node.raws.value += content;
216+
}
205217
lastAdded = 'value';
206-
dotProp.set(node, 'raws.unquoted', content);
218+
dotProp.set(node, 'raws.unquoted', dotProp.get(node, 'raws.unquoted', '') + content);
207219
} else if (content === 'i') {
208220
if (node.value && (node.quoted || spaceAfterMeaningfulToken)) {
209221
node.insensitive = true;

0 commit comments

Comments
 (0)