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