Skip to content

Commit 6aefdcb

Browse files
authored
feat: Format code blocks at build time (#9373)
1 parent dc9a64e commit 6aefdcb

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
"@mdx-js/react": "^3.0.0",
4141
"@next/mdx": "^14.0.1",
4242
"@popperjs/core": "^2.11.8",
43+
"@prettier/plugin-xml": "^3.3.1",
4344
"@prisma/client": "^5.8.1",
4445
"@radix-ui/colors": "^3.0.0",
4546
"@radix-ui/react-collapsible": "^1.0.3",

src/mdx.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import remarkCodeTabs from './remark-code-tabs';
2121
import remarkCodeTitles from './remark-code-title';
2222
import remarkComponentSpacing from './remark-component-spacing';
2323
import remarkExtractFrontmatter from './remark-extract-frontmatter';
24+
import remarkFormatCodeBlocks from './remark-format-code';
2425
import remarkImageSize from './remark-image-size';
2526
import remarkTocHeadings, {TocNode} from './remark-toc-headings';
2627
import remarkVariables from './remark-variables';
@@ -282,6 +283,7 @@ export async function getFileBySlug(slug: string) {
282283
remarkExtractFrontmatter,
283284
[remarkTocHeadings, {exportRef: toc}],
284285
remarkGfm,
286+
remarkFormatCodeBlocks,
285287
[remarkImageSize, {sourceFolder: cwd, publicFolder: path.join(root, 'public')}],
286288
remarkMdxImages,
287289
remarkCodeTitles,

src/remark-format-code.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import {format} from 'prettier';
2+
import {visit} from 'unist-util-visit';
3+
4+
import * as prettierConfig from '../prettier.config.js';
5+
6+
export default function remarkFormatCodeBlocks() {
7+
return async tree => {
8+
const codeNodes = [];
9+
visit(tree, 'code', node => {
10+
codeNodes.push(node);
11+
});
12+
const formattingWork = codeNodes
13+
// skip code blocks with diff meta as they might have
14+
// broken syntax due to + and - characters
15+
.filter(node => !node.meta?.includes('diff'))
16+
.map(node => formatCode(node));
17+
18+
await Promise.all(formattingWork);
19+
};
20+
}
21+
22+
async function formatCode(node) {
23+
const lang = node.lang;
24+
const parsersConfigs = {
25+
javascript: {parser: 'babel'},
26+
jsx: {parser: 'babel'},
27+
typescript: {parser: 'babel-ts'},
28+
tsx: {parser: 'babel-ts'},
29+
html: {parser: 'html'},
30+
css: {parser: 'css'},
31+
json: {parser: 'json'},
32+
markdown: {parser: 'markdown'},
33+
yaml: {parser: 'yaml'},
34+
yml: {parser: 'yaml'},
35+
xml: {parser: 'xml', plugins: ['@prettier/plugin-xml']},
36+
};
37+
const parserConfig = parsersConfigs[lang];
38+
if (!parserConfig) {
39+
return;
40+
}
41+
42+
try {
43+
const formattedCode = await format(node.value, {...prettierConfig, ...parserConfig});
44+
// get rid of the trailing newline
45+
node.value = formattedCode.trimEnd();
46+
} catch (e) {
47+
// eslint-disable-next-line no-console
48+
console.log(`⚠️ Error formatting code block\n${e.message}`);
49+
}
50+
}

yarn.lock

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1744,6 +1744,13 @@
17441744
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f"
17451745
integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==
17461746

1747+
"@prettier/plugin-xml@^3.3.1":
1748+
version "3.3.1"
1749+
resolved "https://registry.yarnpkg.com/@prettier/plugin-xml/-/plugin-xml-3.3.1.tgz#b89fcc95b909128fa2e0691f68b34ad25052971b"
1750+
integrity sha512-kllNJk6n2pXJjGWdj+HAr1GhOoOTrlmeWkDYCGBzkyZS2l0K6h2gsUQcVif2cNqAE1MNC+nUrzN6QwEsCukPnQ==
1751+
dependencies:
1752+
"@xml-tools/parser" "^1.0.11"
1753+
17471754
"@prisma/client@^5.8.1":
17481755
version "5.12.1"
17491756
resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.12.1.tgz#c26a674fea76754b3a9e8b90a11e617f90212f76"
@@ -3460,6 +3467,13 @@
34603467
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406"
34613468
integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==
34623469

3470+
"@xml-tools/parser@^1.0.11":
3471+
version "1.0.11"
3472+
resolved "https://registry.yarnpkg.com/@xml-tools/parser/-/parser-1.0.11.tgz#a118a14099ea5c3c537e4781fad2fc195b57f8ff"
3473+
integrity sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==
3474+
dependencies:
3475+
chevrotain "7.1.1"
3476+
34633477
abab@^2.0.3, abab@^2.0.5, abab@^2.0.6:
34643478
version "2.0.6"
34653479
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
@@ -4099,6 +4113,13 @@ character-reference-invalid@^2.0.0:
40994113
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz#85c66b041e43b47210faf401278abf808ac45cb9"
41004114
integrity sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==
41014115

4116+
4117+
version "7.1.1"
4118+
resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-7.1.1.tgz#5122814eafd1585a9601f9180a7be9c42d5699c6"
4119+
integrity sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==
4120+
dependencies:
4121+
regexp-to-ast "0.5.0"
4122+
41024123
"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3, chokidar@^3.6.0:
41034124
version "3.6.0"
41044125
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
@@ -9524,6 +9545,11 @@ regenerator-runtime@^0.14.0:
95249545
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f"
95259546
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
95269547

9548+
9549+
version "0.5.0"
9550+
resolved "https://registry.yarnpkg.com/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz#56c73856bee5e1fef7f73a00f1473452ab712a24"
9551+
integrity sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==
9552+
95279553
regexp.prototype.flags@^1.5.2:
95289554
version "1.5.2"
95299555
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"

0 commit comments

Comments
 (0)