mirror of https://github.com/sveltejs/svelte
				
				
				
			
							parent
							
								
									0cbd201200
								
							
						
					
					
						commit
						fae9036ce6
					
				@ -0,0 +1,64 @@
 | 
				
			||||
import { Node } from '../interfaces';
 | 
				
			||||
 | 
				
			||||
export default function extractSelectors(css: Node) :Node[] {
 | 
				
			||||
	if (!css) return [];
 | 
				
			||||
 | 
				
			||||
	const selectors = [];
 | 
				
			||||
 | 
				
			||||
	function processRule(rule: Node) {
 | 
				
			||||
		if (rule.type !== 'Rule') {
 | 
				
			||||
			// TODO @media etc
 | 
				
			||||
			throw new Error(`not supported: ${rule.type}`);
 | 
				
			||||
		}
 | 
				
			||||
 | 
				
			||||
		const selectors = rule.selector.children;
 | 
				
			||||
		selectors.forEach(processSelector);
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	function processSelector(selector: Node) {
 | 
				
			||||
		selectors.push({
 | 
				
			||||
			used: false,
 | 
				
			||||
			appliesTo: (node: Node, stack: Node[]) => {
 | 
				
			||||
				let i = selector.children.length;
 | 
				
			||||
				let j = stack.length;
 | 
				
			||||
 | 
				
			||||
				while (i--) {
 | 
				
			||||
					if (!node) return false;
 | 
				
			||||
 | 
				
			||||
					const part = selector.children[i];
 | 
				
			||||
 | 
				
			||||
					if (part.type === 'ClassSelector') {
 | 
				
			||||
						if (!classMatches(node, part.name)) return false;
 | 
				
			||||
					}
 | 
				
			||||
 | 
				
			||||
					else if (part.type === 'TypeSelector') {
 | 
				
			||||
						if (node.name !== part.name) return false;
 | 
				
			||||
					}
 | 
				
			||||
 | 
				
			||||
					else if (part.type === 'WhiteSpace') {
 | 
				
			||||
						node = stack[--j];
 | 
				
			||||
					}
 | 
				
			||||
 | 
				
			||||
					else {
 | 
				
			||||
						throw new Error(`TODO ${part.type}`);
 | 
				
			||||
					}
 | 
				
			||||
				}
 | 
				
			||||
 | 
				
			||||
				return true;
 | 
				
			||||
			}
 | 
				
			||||
		});
 | 
				
			||||
	}
 | 
				
			||||
 | 
				
			||||
	css.children.forEach(processRule);
 | 
				
			||||
 | 
				
			||||
	return selectors;
 | 
				
			||||
}
 | 
				
			||||
 | 
				
			||||
function classMatches(node: Node, className: string) {
 | 
				
			||||
	const attr = node.attributes.find((attr: Node) => attr.name === 'class');
 | 
				
			||||
	if (!attr) return false;
 | 
				
			||||
	if (attr.value.length > 1) return true;
 | 
				
			||||
	if (attr.value[0].type !== 'Text') return true;
 | 
				
			||||
 | 
				
			||||
	return attr.value[0].data.split(' ').indexOf(className) !== -1;
 | 
				
			||||
}
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
export default {
 | 
				
			||||
	cascade: false
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
 | 
				
			||||
	.foo[svelte-2643270928] {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
@ -0,0 +1,2 @@
 | 
				
			||||
<p svelte-2643270928="" class="whatever">this is styled</p>
 | 
				
			||||
<p class="bar">this is unstyled</p>
 | 
				
			||||
@ -0,0 +1,18 @@
 | 
				
			||||
<p class='{{unknown}}'>this is styled</p>
 | 
				
			||||
<p class='bar'>this is unstyled</p>
 | 
				
			||||
 | 
				
			||||
<style>
 | 
				
			||||
	.foo {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
</style>
 | 
				
			||||
 | 
				
			||||
<script>
 | 
				
			||||
	export default {
 | 
				
			||||
		data () {
 | 
				
			||||
			return {
 | 
				
			||||
				unknown: 'whatever'
 | 
				
			||||
			};
 | 
				
			||||
		}
 | 
				
			||||
	};
 | 
				
			||||
</script>
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
export default {
 | 
				
			||||
	cascade: false
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
 | 
				
			||||
	.foo[svelte-633959357] {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
@ -0,0 +1,2 @@
 | 
				
			||||
<p svelte-633959357="" class="foo">this is styled</p>
 | 
				
			||||
<p class="bar">this is unstyled</p>
 | 
				
			||||
@ -0,0 +1,8 @@
 | 
				
			||||
<p class='foo'>this is styled</p>
 | 
				
			||||
<p class='bar'>this is unstyled</p>
 | 
				
			||||
 | 
				
			||||
<style>
 | 
				
			||||
	.foo {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
</style>
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
export default {
 | 
				
			||||
	cascade: false
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
 | 
				
			||||
	div[svelte-1941127328] p[svelte-1941127328] {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
@ -0,0 +1 @@
 | 
				
			||||
<div svelte-1941127328=""><p svelte-1941127328="">this is styled</p></div>
 | 
				
			||||
@ -0,0 +1,9 @@
 | 
				
			||||
<div>
 | 
				
			||||
	<p>this is styled</p>
 | 
				
			||||
</div>
 | 
				
			||||
 | 
				
			||||
<style>
 | 
				
			||||
	div p {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
</style>
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
export default {
 | 
				
			||||
	cascade: false
 | 
				
			||||
};
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
 | 
				
			||||
	p[svelte-1997768937] {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
@ -0,0 +1 @@
 | 
				
			||||
<div><p svelte-1997768937="">this is styled</p></div>
 | 
				
			||||
@ -0,0 +1,9 @@
 | 
				
			||||
<div>
 | 
				
			||||
	<p>this is styled</p>
 | 
				
			||||
</div>
 | 
				
			||||
 | 
				
			||||
<style>
 | 
				
			||||
	p {
 | 
				
			||||
		color: red;
 | 
				
			||||
	}
 | 
				
			||||
</style>
 | 
				
			||||
					Loading…
					
					
				
		Reference in new issue