Skip to content

Commit 73bb29f

Browse files
Provide complete CSS by leveraging fixture classes (#39)
Co-authored-by: hyrious <hyrious@outlook.com>
1 parent 6b67a6e commit 73bb29f

File tree

3 files changed

+38
-9
lines changed

3 files changed

+38
-9
lines changed

cli.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const cli = meow(
2424
--only-style Only output the styles, forces --preserve-variables on
2525
--only-variables Only output the variables for the specified themes
2626
--root-selector Specify the root selector when outputting styles, default '.markdown-body'
27+
--no-use-fixture Exclude generated classes that come from GitHub Markdown API rendered fixture.md
2728
2829
Examples
2930
$ github-markdown-css --list
@@ -74,6 +75,10 @@ const cli = meow(
7475
rootSelector: {
7576
type: 'string',
7677
},
78+
useFixture: {
79+
type: 'boolean',
80+
default: true,
81+
},
7782
},
7883
},
7984
);
@@ -85,6 +90,7 @@ const {
8590
onlyStyle,
8691
onlyVariables,
8792
rootSelector,
93+
useFixture,
8894
} = cli.flags;
8995

9096
let {light, dark} = cli.flags;
@@ -140,5 +146,6 @@ console.log(
140146
onlyStyles: onlyStyle,
141147
onlyVariables,
142148
rootSelector,
149+
useFixture,
143150
}),
144151
);

index.js

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import postcss from 'postcss';
2-
import {cachedFetch, reverseUnique, unique, zip} from './utilities.js';
2+
import {cachedFetch, getUniqueClasses, renderMarkdown, reverseUnique, unique, zip} from './utilities.js';
33
import {ALLOW_CLASS, ALLOW_TAGS, manuallyAddedStyle} from './constants.js';
44

5-
function extractStyles(rules, cssText) {
5+
function extractStyles(rules, cssText, {extraAllowableClasses = []} = {}) {
6+
const allowableClassList = new Set([...ALLOW_CLASS, ...extraAllowableClasses]);
7+
68
function select(selector) {
79
if (selector.startsWith('.markdown-body')) {
810
return true;
@@ -23,7 +25,7 @@ function extractStyles(rules, cssText) {
2325
}
2426

2527
const klass = selector.match(/\.[-\w]+/);
26-
if (klass && !ALLOW_CLASS.has(klass[0])) {
28+
if (klass && !allowableClassList.has(klass[0])) {
2729
return false;
2830
}
2931

@@ -32,7 +34,7 @@ function extractStyles(rules, cssText) {
3234

3335
const klass = selector.match(/^\.[-\w]+/);
3436
if (klass) {
35-
return ALLOW_CLASS.has(klass[0]);
37+
return allowableClassList.has(klass[0]);
3638
}
3739

3840
return false;
@@ -79,7 +81,7 @@ function extractStyles(rules, cssText) {
7981
return;
8082
}
8183

82-
if (rule.some(decl => decl.value.includes('prettylights'))) {
84+
if (rule.some(node => node.type === 'decl' && node.value.includes('prettylights'))) {
8385
if (!rule.selector.includes('.QueryBuilder')) {
8486
rules.push(rule);
8587
}
@@ -135,6 +137,10 @@ function classifyRules(rules) {
135137
return undefined;
136138
}
137139

140+
function isEmpty(rule) {
141+
return !rule.first;
142+
}
143+
138144
function mergeRules(rules) {
139145
const result = [];
140146
const selectorIndexMap = {};
@@ -163,7 +169,7 @@ function classifyRules(rules) {
163169
});
164170
}
165171

166-
return result;
172+
return result.filter(rule => !isEmpty(rule));
167173
}
168174

169175
const result = {rules: [], light: [], dark: []};
@@ -233,6 +239,7 @@ export default async function getCSS({
233239
onlyVariables = false,
234240
onlyStyles = false,
235241
rootSelector = '.markdown-body',
242+
useFixture = true,
236243
} = {}) {
237244
if (onlyVariables && onlyStyles) {
238245
// Would result in an empty output
@@ -250,7 +257,12 @@ export default async function getCSS({
250257
const body = await cachedFetch('https://github.com');
251258
// Get a list of all css links on the page
252259
const links = unique(body.match(/(?<=href=").+?\.css/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);
254266

255267
let rules = [];
256268
const colors = [];
@@ -277,7 +289,7 @@ export default async function getCSS({
277289
extractVariables(colors, 'shared', cssText);
278290
}
279291

280-
extractStyles(rules, cssText);
292+
extractStyles(rules, cssText, {extraAllowableClasses: fixtureClasses});
281293
}
282294
}
283295

utilities.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,11 @@ export async function renderMarkdown() {
7575

7676
const response = await fetch('https://api.github.com/markdown', {
7777
method: 'POST',
78-
body: JSON.stringify({text}),
78+
body: JSON.stringify({
79+
text,
80+
mode: 'gfm',
81+
context: 'sindresorhus/generate-github-markdown-css',
82+
}),
7983
headers: {
8084
Accept: 'application/vnd.github.v3+json',
8185
'User-Agent': 'Node.js',
@@ -91,3 +95,9 @@ export async function renderMarkdown() {
9195

9296
throw new Error(`Failed to render markdown: ${body}`);
9397
}
98+
99+
export function getUniqueClasses(html = '') {
100+
const classNames = [...html.matchAll(/class\s*=\s*["']([^"']+)["']/g)]
101+
.flatMap(match => match[1].split(/\s+/).map(c => `.${c}`));
102+
return new Set(classNames);
103+
}

0 commit comments

Comments
 (0)