1
1
import postcss from 'postcss' ;
2
- import { cachedFetch , reverseUnique , unique , zip } from './utilities.js' ;
2
+ import { cachedFetch , getUniqueClasses , renderMarkdown , reverseUnique , unique , zip } from './utilities.js' ;
3
3
import { ALLOW_CLASS , ALLOW_TAGS , manuallyAddedStyle } from './constants.js' ;
4
4
5
- function extractStyles ( rules , cssText ) {
5
+ function extractStyles ( rules , cssText , { extraAllowableClasses = [ ] } = { } ) {
6
+ const allowableClassList = new Set ( [ ...ALLOW_CLASS , ...extraAllowableClasses ] ) ;
7
+
6
8
function select ( selector ) {
7
9
if ( selector . startsWith ( '.markdown-body' ) ) {
8
10
return true ;
@@ -23,7 +25,7 @@ function extractStyles(rules, cssText) {
23
25
}
24
26
25
27
const klass = selector . match ( / \. [ - \w ] + / ) ;
26
- if ( klass && ! ALLOW_CLASS . has ( klass [ 0 ] ) ) {
28
+ if ( klass && ! allowableClassList . has ( klass [ 0 ] ) ) {
27
29
return false ;
28
30
}
29
31
@@ -32,7 +34,7 @@ function extractStyles(rules, cssText) {
32
34
33
35
const klass = selector . match ( / ^ \. [ - \w ] + / ) ;
34
36
if ( klass ) {
35
- return ALLOW_CLASS . has ( klass [ 0 ] ) ;
37
+ return allowableClassList . has ( klass [ 0 ] ) ;
36
38
}
37
39
38
40
return false ;
@@ -79,7 +81,7 @@ function extractStyles(rules, cssText) {
79
81
return ;
80
82
}
81
83
82
- if ( rule . some ( decl => decl . value . includes ( 'prettylights' ) ) ) {
84
+ if ( rule . some ( node => node . type === ' decl' && node . value . includes ( 'prettylights' ) ) ) {
83
85
if ( ! rule . selector . includes ( '.QueryBuilder' ) ) {
84
86
rules . push ( rule ) ;
85
87
}
@@ -135,6 +137,10 @@ function classifyRules(rules) {
135
137
return undefined ;
136
138
}
137
139
140
+ function isEmpty ( rule ) {
141
+ return ! rule . first ;
142
+ }
143
+
138
144
function mergeRules ( rules ) {
139
145
const result = [ ] ;
140
146
const selectorIndexMap = { } ;
@@ -163,7 +169,7 @@ function classifyRules(rules) {
163
169
} ) ;
164
170
}
165
171
166
- return result ;
172
+ return result . filter ( rule => ! isEmpty ( rule ) ) ;
167
173
}
168
174
169
175
const result = { rules : [ ] , light : [ ] , dark : [ ] } ;
@@ -233,6 +239,7 @@ export default async function getCSS({
233
239
onlyVariables = false ,
234
240
onlyStyles = false ,
235
241
rootSelector = '.markdown-body' ,
242
+ useFixture = true ,
236
243
} = { } ) {
237
244
if ( onlyVariables && onlyStyles ) {
238
245
// Would result in an empty output
@@ -250,7 +257,12 @@ export default async function getCSS({
250
257
const body = await cachedFetch ( 'https://github.com' ) ;
251
258
// Get a list of all css links on the page
252
259
const links = unique ( body . match ( / (?< = h r e f = " ) .+ ?\. c s s / g) ) ;
253
- const contents = await Promise . all ( links . map ( url => cachedFetch ( url ) ) ) ;
260
+ const renderMarkdownPromise = useFixture ? renderMarkdown ( ) : Promise . resolve ( ) ;
261
+ const [ fixtureHtml , ...contents ] = await Promise . all ( [
262
+ renderMarkdownPromise ,
263
+ ...links . map ( url => cachedFetch ( url ) ) ,
264
+ ] ) ;
265
+ const fixtureClasses = getUniqueClasses ( fixtureHtml ) ;
254
266
255
267
let rules = [ ] ;
256
268
const colors = [ ] ;
@@ -277,7 +289,7 @@ export default async function getCSS({
277
289
extractVariables ( colors , 'shared' , cssText ) ;
278
290
}
279
291
280
- extractStyles ( rules , cssText ) ;
292
+ extractStyles ( rules , cssText , { extraAllowableClasses : fixtureClasses } ) ;
281
293
}
282
294
}
283
295
0 commit comments