Formatting code for blog posts
I'm writing a lot of code on this website, especially for my
Advent of Code solutions, and thought it would be helpful to write down something simple that's saved me a lot of headache.
In particular, we want articles which contain source code to have that source code be legible on all devices (I tweet out a lot of my articles, and people frequently read twitter on their phones).
🔗 Disable text wrap
Things can quickly go awry when your code is substantially indented. Replace it with a horizontal scrollbar so it doesn't wrap.
pre code {
padding: 1em 0 !important;
overflow: auto;
display: block;
}
🔗 Leveraging Prettier
Scrollbars are good, but they're a crutch. When possible, we should keep line lengths to a minimum. For my blog I've noticed that anything over 45 characters creates a scrollbar at my font size and my screen dimensions.
For instance, the following code block has a fair bit of necessary scrolling to see it all on a mobile device.
async function getChildren(notion, id) {
const req = await notion.blocks.children.list({ block_id: id });
const blocks = req.results;
return Promise.all(
blocks.map(async (block) => {
if (block.has_children) {
block.children = await getChildren(notion, block.id);
} else {
block.children = [];
}
return block;
})
);
}
Thanks to Prettier, this is trivial. (Make sure you install it and the corresponding VSCode extension). Then we create a
.prettierrc.json
in project's directory with these rules:
{
"printWidth": 45,
"tabWidth": 2
}
Upon formatting (or saving with
"editor.formatOnSave": true
), our code transforms to the following:
async function getChildren(notion, id) {
const req =
await notion.blocks.children.list({
block_id: id,
});
const blocks = req.results;
return Promise.all(
blocks.map(async (block) => {
if (block.has_children) {
block.children = await getChildren(
notion,
block.id
);
} else {
block.children = [];
}
return block;
})
);
}
Which comfortably fits on the screen Maybe we could even render both the before and after and display the right with a @media query.