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