MCPcopy Index your code
hub / github.com/darkreader/darkreader / parseCSS

Function parseCSS

src/utils/css-text/parse-css.ts:25–63  ·  view source on GitHub ↗
(cssText: string)

Source from the content-addressed store, hash-verified

23export type ParsedCSS = Array<ParsedAtRule | ParsedStyleRule>;
24
25export function parseCSS(cssText: string): ParsedCSS {
26 cssText = removeCSSComments(cssText);
27 cssText = cssText.trim();
28 if (!cssText) {
29 return [];
30 }
31
32 const rules: ParsedCSS = [];
33
34 // Find {...} ranges excluding inside of "...", [...] etc.
35 const excludeRanges = getTokenExclusionRanges(cssText);
36 const bracketRanges = getAllOpenCloseRanges(cssText, '{', '}', excludeRanges);
37
38 let ruleStart = 0;
39 bracketRanges.forEach((brackets) => {
40 const key = cssText.substring(ruleStart, brackets.start).trim();
41 const content = cssText.substring(brackets.start + 1, brackets.end - 1);
42
43 if (key.startsWith('@')) {
44 const typeEndIndex = key.search(/[\s\(]/);
45 const rule: ParsedAtRule = {
46 type: typeEndIndex < 0 ? key : key.substring(0, typeEndIndex),
47 query: typeEndIndex < 0 ? '' : key.substring(typeEndIndex).trim(),
48 rules: parseCSS(content),
49 };
50 rules.push(rule);
51 } else {
52 const rule: ParsedStyleRule = {
53 selectors: parseSelectors(key),
54 declarations: parseDeclarations(content),
55 };
56 rules.push(rule);
57 }
58
59 ruleStart = brackets.end;
60 });
61
62 return rules;
63}
64
65function getAllOpenCloseRanges(
66 input: string,

Callers 2

formatCSSFunction · 0.90
parsing.tests.tsFile · 0.90

Calls 5

removeCSSCommentsFunction · 0.90
getTokenExclusionRangesFunction · 0.85
getAllOpenCloseRangesFunction · 0.85
parseSelectorsFunction · 0.85
parseDeclarationsFunction · 0.85

Tested by

no test coverage detected