export function toElement()

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;
}