in src/services/selectorPrinting.ts [227:316]
export function toElement(node: nodes.SimpleSelector, parentElement?: Element | null): Element {
let result = new Element();
for (const child of node.getChildren()) {
switch (child.type) {
case nodes.NodeType.SelectorCombinator:
if (parentElement) {
const segments = child.getText().split('&');
if (segments.length === 1) {
// should not happen
result.addAttr('name', segments[0]);
break;
}
result = parentElement.cloneWithParent();
if (segments[0]) {
const root = result.findRoot();
root.prepend(segments[0]);
}
for (let i = 1; i < segments.length; i++) {
if (i > 1) {
const clone = parentElement.cloneWithParent();
result.addChild(clone.findRoot());
result = clone;
}
result.append(segments[i]);
}
}
break;
case nodes.NodeType.SelectorPlaceholder:
if (child.matches('@at-root')) {
return result;
}
// fall through
case nodes.NodeType.ElementNameSelector:
const text = child.getText();
result.addAttr('name', text === '*' ? 'element' : unescape(text));
break;
case nodes.NodeType.ClassSelector:
result.addAttr('class', unescape(child.getText().substring(1)));
break;
case nodes.NodeType.IdentifierSelector:
result.addAttr('id', unescape(child.getText().substring(1)));
break;
case nodes.NodeType.MixinDeclaration:
result.addAttr('class', (<nodes.MixinDeclaration>child).getName());
break;
case nodes.NodeType.PseudoSelector:
result.addAttr(unescape(child.getText()), '');
break;
case nodes.NodeType.AttributeSelector:
const selector = <nodes.AttributeSelector>child;
const identifier = selector.getIdentifier();
if (identifier) {
const expression = selector.getValue();
const operator = selector.getOperator();
let value: string;
if (expression && operator) {
switch (unescape(operator.getText())) {
case '|=':
// excatly or followed by -words
value = `${quotes.remove(unescape(expression.getText()))}-\u2026`;
break;
case '^=':
// prefix
value = `${quotes.remove(unescape(expression.getText()))}\u2026`;
break;
case '$=':
// suffix
value = `\u2026${quotes.remove(unescape(expression.getText()))}`;
break;
case '~=':
// one of a list of words
value = ` \u2026 ${quotes.remove(unescape(expression.getText()))} \u2026 `;
break;
case '*=':
// substring
value = `\u2026${quotes.remove(unescape(expression.getText()))}\u2026`;
break;
default:
value = quotes.remove(unescape(expression.getText()));
break;
}
}
result.addAttr(unescape(identifier.getText()), value!);
}
break;
}
}
return result;
}