4/8/2022 ∙ 4 minuty czytania
Podświetlanie składni 💡
Posty są zdecydowanie bardziej czytelne od kiedy został do nich dodany plugin do Tailwind'a odpowiadający za typografie.
Jednak kod, który jest w tych postach wyświetlany mógłby wyglądać zdecydowanie lepiej. Programista, który czyta kod w swoim edytorze, jest przyzwyczajony do możliwości podświetlania składni. W dzisiejszym poście ten problem zostanie rozwiązany.
Jak Remix renderuje pliki w formacie Markdown?
Remix ma wbudowane wsparcie dla plików w formacie .md oraz .mdx. Jeżeli
umieścimy je w odpowiedniej hierarchii w katalogu app/routes to Remix rozpozna
je i przetworzy w taki sposób, żeby zostały wyświetlone w postaci HTML'a.
Remix używa do tego paczek remark oraz rehype. Parserów, które zostały zbudowane w oparciu o interfejs unified.
Czym jest Unified?
Jest to przede wszystkim biblioteka, która jest interfejsem służącym do procesowania tekstu używając drzewa składniowego (ang. syntax tree). Jest to potężna paczka, za pomocą której możemy zamieniać jedna forme tekstu na inna. Przykładowo możemy zamienic Markdown na HTML, co dzieje sie właśnie za kulisami Remix'a.
Czym jest Remark?
Odpowiada za procesowanie formatu Markdown. Remark ma system wtyczek, dzięki
którym możemy dorzucić do markdown'a ekstra funkcjonalności. Przykładowo, możemy
dorzucić wsparcie dla GFM (GitHub Flavored Markdown), albo zrozumienie składni,
która pozwoli stworzyć rozwijana sekcje w postach, albo skompiluje markdown na
dokument w formacie .docx, albo przekształci Markdown na HTML.
Czym jest Rehype?
Odpowiada za procesowanie formatu HTML. Podobnie jak Remark, Rehype również
posiada rozbudowany system wtyczek, dzięki którym możemy dorzucić do HTMLa
ekstra funkcjonalności, których potrzebujemy. Np możemy dorzucać atrybuty do
wybranych elementów HTML takie jak class czy id. Możemy zamienic HTML na
inny format np Markdown, albo React. Możemy dokonać odkażania (ang. sanitize)
elementu HTML albo dorzucić do niego obsługę podświetlania składni kodu.
Podświetlanie składni
https://rehype-pretty-code.netlify.app/
Co dzieje się za kulisami Remixa?
Remix korzysta z gotowej paczki, która kompiluje kod markdown'a na HTML. W tym celu używam wyżej wymienionych paczek Remark oraz Rehype. Możemy sobie ten proces wyobrazić w następujący sposób:
markdown |> remark |> remark-rehype |> rehype |> html- na wejściu
unifiedjest tekst w formacie markdown - markdown jest wzbogacany za pomocą wtyczek
remarka - remark kompiluje markdowna na HTML za pomocą
remark-rehype rehypedorzuca do HTMLa ekstra funkcjonalności za pomocą wtyczek- na wyjściu
unifiedjest tekst w formacie HTML
Remix udostępnia bardzo prosty interfejs, który pozwala na dorzucenie do systemu kompilacji naszego artykułu napisanego w markdown'ie na kod w formacie HTML.
remix.config.js
module.exports = {
// ...
mdx: {
rehypePlugins: [
// pluginy transformujące HTML
],
remarkPlugins: [
// pluginy transformujące Markdown
],
},
}Jak upiększyć kod?
Przede wszystkim musimy wybrać odpowiedni moment w całym procesie przetwarzania naszego kodu z postaci Markdown na HTML.
Najbardziej odpowiednim, będzie moment, w którym juz wykonała sie kompilacja
markdown'a na HTML. Kod ten należy po prostu wzbogacić o css'y oraz skrypty,
dzięki którym możliwe będzie podświetlanie składni, wiec na pewno będziemy
szukać wtyczki do rehype. Do tego należy wybrać odpowiednie narzędzie do
podświetlania składni. Na tej stronie skorzystam z Shiki.
W tym celu skorzystam z wtyczki rehype-pretty-code.
npm install rehype-pretty-code shikiImportujemy i konfigurujemy plugin do rehype:
const rehypePrettyCode = require('rehype-pretty-code')
const options = {
theme: 'one-dark-pro',
}
module.exports = {
// ...
mdx: {
rehypePlugins: [[rehypePrettyCode, options]],
remarkPlugins: [],
},
}Każdorazowa zamiana w pliku remix.config.js wymaga restartu serwera
deweloperskiego strony.
Dark / light mode
Jeżeli chcemy, żeby nasz kod byl jeszcze bardziej czytelny w zależności od
wybranego schematu, to możemy skorzystać z rozbicia opcji theme dla
rehype-pretty-code na dwie opcje:
const options = {
theme: {
dark: 'github-dark',
light: 'github-light',
},
}Nie jest to jedyna modyfikacja, która należy wykonać, bo od tej pory nasz kod
będzie posiadał duplikowane elementy HTML zawierające fragment kodu. Musimy w
związku z tym w CSS ukryć element, którego nie używamy. W tym celu w pliku
app/styles/code.css dodamy następujący fragment:
@media (prefers-color-scheme: dark) {
pre code[data-theme='light'] {
display: none;
}
}
@media (prefers-color-scheme: light), (prefers-color-scheme: no-preference) {
pre code[data-theme='dark'] {
display: none;
}
}a następnie załadujemy do naszego szablonu posta (app/routes/blog.tsx):
import { Outlet } from '@remix-run/react'
import codeStyles from '~/styles/code.css'
export function links() {
return [{ rel: 'stylesheet', href: codeStyles }]
}
const Blog = () => {
return (
<article className="prose dark:prose-invert lg:prose-xl mx-4 my-16 sm:mx-auto">
<Outlet />
</article>
)
}
export default BlogOd tej pory nasz kod jest zdecydowanie bardziej czytelny. Więcej w tym temacie można przeczytać na oficjalnej dokumentacji Remix'a w sekcji poświęconej renderowaniu MDX.
exitPoniżej znajdziesz więcej postów, które mogą Cię zainteresować.