Blocs de code
Les blocs de code dans la documentation sont super-puissants 💪.
Titre du code
Vous pouvez ajouter un titre au bloc de code en ajoutant une clé title
après le language (laisser un espace entre les deux).
```jsx title="/src/components/HelloCodeTitle.js"
function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}
```
function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}
Coloration syntaxique
Les blocs de code sont des blocs de texte enveloppés par des chaînes de 3 backticks. Vous pouvez consulter cette référence pour les spécifications du MDX.
```js
console.log('Chaque dépôt doit être accompagné d\'une mascotte.');
```
Utilisez la méta-chaîne du langage correspondant pour votre bloc de code et Docusaurus récupérera automatiquement la coloration syntaxique, alimentée par Prism React Renderer.
console.log('Chaque dépôt doit être accompagné d'une mascotte.');
Thème
Par défaut, le thème de coloration syntaxique de Prism que nous utilisons est Palenight. Vous pouvez changer cela pour un autre thème en passant le champ theme
dans prism
en tant que themeConfig
dans votre docusaurus.config.js.
Par exemple, si vous préférez utiliser le thème de coloration dracula
:
module.exports = {
themeConfig: {
prism: {
theme: require('prism-react-renderer/themes/dracula'),
},
},
};
Comme un thème Prism n'est qu'un objet JS, vous pouvez également écrire votre propre thème si vous n'êtes pas satisfait du thème par défaut. Docusaurus améliore les thèmes github
et vsDark
pour fournir une mise en évidence plus riche, et vous pouvez vérifier nos implémentations pour les thèmes de blocs de code clair et sombre.
Langages pris en charge
Par défaut, Docusaurus est fourni avec un sous-ensemble de langages couramment utilisés.
Certains langages populaires comme Java, C# ou PHP ne sont pas activés par défaut.
Pour ajouter la coloration syntaxique pour n'importe lequel des autres langages pris en charge par Prism, définissez-la dans un tableau de langages supplémentaires.
Chaque langage supplémentaire doit être un nom de composant Prism valide. Par exemple, Prism mettrait en correspondance le langage cs
avec csharp
, mais seul prism-csharp.js
existe en tant que composant, vous devez donc utiliser additionalLanguages : ['csharp']
. Vous pouvez consulter node_modules/prismjs/components
pour trouver tous les composants (langages) disponibles.
Par exemple, si vous voulez ajouter une coloration pour le langage PowerShell :
module.exports = {
// ...
themeConfig: {
prism: {
additionalLanguages: ['powershell'],
},
// ...
},
};
Après avoir ajouté additionalLanguages
, redémarrez Docusaurus.
Si vous souhaitez ajouter la coloration pour des langages qui ne sont pas encore pris en charge par Prism, vous pouvez « swizzler » le prism-include-languages
:
- npm
- Yarn
- pnpm
npm run swizzle @docusaurus/theme-classic prism-include-languages
yarn swizzle @docusaurus/theme-classic prism-include-languages
pnpm run swizzle @docusaurus/theme-classic prism-include-languages
Il génèrera prism-include-languages.js
dans votre dossier src/theme
. Vous pouvez ajouter le support de mise en évidence pour les langages personnalisés en éditant prism-include-languages.js
:
const prismIncludeLanguages = (Prism) => {
// ...
additionalLanguages.forEach((lang) => {
require(`prismjs/components/prism-${lang}`);
});
require('/path/to/your/prism-language-definition');
// ...
};
Vous pouvez vous référer aux définitions officielles des langages de Prism lorsque vous rédigez vos propres définitions de langage.
Surlignage de la ligne
Surlignage avec des commentaires
Vous pouvez utiliser des commentaires avec highlight-next-line
, highlight-start
, et highlight-end
pour sélectionner quelles lignes sont surlignées.
```js
function HighlightSomeText(highlight) {
if (highlight) {
// highlight-next-line
return 'Ce texte est surligné !';
}
return 'Rien de surligné';
}
function HighlightMoreText(highlight) {
// highlight-start
if (highlight) {
return 'Cette plage est surlignée !';
}
// highlight-end
return 'Rien de surligné';
}
```
function HighlightSomeText(highlight) {
if (highlight) {
return 'Ce texte est surligné !';
}
return 'Rien de surligné';
}
function HighlightMoreText(highlight) {
if (highlight) {
return 'Cette plage est surlignée !';
}
return 'Rien de surligné';
}
Syntaxe de commentaire supportée :
Style | Syntaxe |
---|---|
Style C | /* ... */ et // ... |
Style JSX | {/* ... */} |
Style Bash | # ... |
Style HTML | <!-- ... --> |
Nous ferons de notre mieux pour déduire quel ensemble de styles de commentaires utiliser en fonction du langage, et autoriser par défaut tous les styles de commentaires. S'il y a une style de commentaire qui n'est pas actuellement supportée, nous sommes ouverts à les ajouter ! Les pull requests sont les bienvenues. Notez que les différents styles de commentaires ne présentent aucune différence sémantique, seul leur contenu en présente une.
Vous pouvez définir votre propre couleur d'arrière-plan pour la ligne du code surlignée dans votre src/css/custom.css
qui s'adaptera mieux au thème de coloration syntaxique que vous avez choisi. La couleur indiquée ci-dessous fonctionne pour le thème de surbrillance par défaut (Palenight), donc si vous utilisez un autre thème, vous devrez modifier la couleur en conséquence.
:root {
--docusaurus-highlighted-code-line-bg: rgb(72, 77, 91);
}
/* Si vous avez un thème de surbrillance syntaxique différent pour le mode sombre. */
[data-theme='dark'] {
/* Couleur qui convient au thème en mode sombre pour la coloration syntaxique */
--docusaurus-highlighted-code-line-bg: rgb(100, 100, 100);
}
Si vous avez également besoin de styliser la ligne de code surlignée d'une autre manière, vous pouvez vous appuyer sur la classe CSS theme-code-block-highlighted-line
.
Surlignage avec une chaîne de métadonnées
Vous pouvez également spécifier des plages de lignes en surbrillance dans la méta-chaîne du langage (laisser un espace après le langage). Pour surligner plusieurs lignes, séparez les numéros de lignes par des virgules ou utilisez la syntaxe de l'intervalle pour sélectionner un morceau de lignes. Cette fonctionnalité utilise la bibliothèque parse-number-range
et vous pouvez trouver plus de syntaxe dans les détails de leur projet.
```jsx {1,4-6,11}
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
```
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
Préférez la mise en surbrillance avec des commentaires lorsque vous le pouvez. En mettant en surbrillance le code, vous ne devez pas compter manuellement les lignes si votre bloc de code devient long. Si vous ajoutez/supprimez des lignes, vous n'avez pas non plus à décaler vos plages de lignes.
- ```jsx {3}
+ ```jsx {4}
function HighlightSomeText(highlight) {
if (highlight) {
+ console.log('Texte surligné trouvé');
return 'Ce texte est surligné !';
}
return 'Rien de surligné';
}
```
Ci-dessous, nous allons présenter comment le système de commentaire magique peut être étendu pour définir des directives personnalisées et leurs fonctionnalités. Les commentaires magiques ne seront analysés que si une mise en surbrillance n'est pas présente.
Commentaires magiques personnalisés
// highlight-next-line
, // highlight-start
, etc ..., sont appelés « commentaires magiques », parce qu'ils seront analysés et supprimés, et leur but est d'ajouter des métadonnées à la ligne suivante, ou à la section que la paire de commentaires de début et de fin enveloppe.
Vous pouvez déclarer des commentaires magiques personnalisés à travers la configuration du thème. Par exemple, vous pouvez enregistrer un autre commentaire magique qui ajoute une classe code-block-error-line
:
- docusaurus.config.js
- src/css/custom.css
- myDoc.md
module.exports = {
themeConfig: {
prism: {
magicComments: [
// N'oubliez pas d'étendre également le nom de la classe de mise en évidence par défaut !
{
className: 'theme-code-block-highlighted-line',
line: 'highlight-next-line',
block: {start: 'highlight-start', end: 'highlight-end'},
},
{
className: 'code-block-error-line',
line: 'This will error',
},
],
},
},
};
.code-block-error-line {
background-color: #ff000020;
display: block;
margin: 0 calc(-1 * var(--ifm-pre-padding));
padding: 0 var(--ifm-pre-padding);
border-left: 3px solid #ff000080;
}
En JavaScript, toute tentative d'accès aux propriétés de `null` entraînera une erreur.
```js
const name = null;
// This will error
console.log(name.toUpperCase());
// Uncaught TypeError: Cannot read properties of null (reading 'toUpperCase')
```
En JavaScript, toute tentative d'accès aux propriétés de null
entraînera une erreur.
const name = null;
console.log(name.toUpperCase());
// Uncaught TypeError: Cannot read properties of null (reading 'toUpperCase')
Si vous utilisez des plages de nombres dans la métastring (la syntaxe {1,3-4}
), Docusaurus appliquera le nom de classe de la première entrée `magicComments`
. Par défaut, il s'agit de theme-code-block-highlighted-line
, mais si vous modifiez la configuration de magicComments
et que vous utilisez une autre entrée en premier, la signification de la plage de métastring changera également.
Vous pouvez désactiver la ligne par défaut en surlignant les commentaires avec magicComments: []
. S'il n'y a pas de configuration de commentaire magique, mais que Docusaurus rencontre un bloc de code contenant une plage de métastring, il commettra une erreur parce qu'il n'y aura pas de nom de classe à appliquer - le nom de classe de métastring, finalement, n'est qu'une entrée de commentaire magique.
Chaque entrée de commentaire magique contiendra trois clés : className
(obligatoire), line
, qui s'applique à la ligne suivante, ou block
(contenant start
et end
), qui s'applique à tout le bloc entouré par les deux commentaires.
L'utilisation de CSS pour cibler la classe peut déjà faire beaucoup, mais vous pouvez débloquer tout le potentiel de cette fonctionnalité via le swizzling.
- npm
- Yarn
- pnpm
npm run swizzle @docusaurus/theme-classic CodeBlock/Line
yarn swizzle @docusaurus/theme-classic CodeBlock/Line
pnpm run swizzle @docusaurus/theme-classic CodeBlock/Line
Le composant Line
recevra la liste des noms de classe, à partir de laquelle vous pouvez rendre conditionnellement différentes balises.
Numérotation des lignes
Vous pouvez activer la numérotation de ligne pour votre bloc de code en utilisant la clé showLineNumbers
dans la méta chaîne du langage (n'oubliez pas d'ajouter un espace juste avant la clé).
```jsx {1,4-6,11} showLineNumbers
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
```
import React from 'react';
function MyComponent(props) {
if (props.isBar) {
return <div>Bar</div>;
}
return <div>Foo</div>;
}
export default MyComponent;
Éditeur de code interactif
(Propulsé par React Live)
Vous pouvez créer un éditeur de code interactif avec le plugin @docusaurus/theme-live-codeblock
. Tout d'abord, ajoutez le plugin à votre package.
- npm
- Yarn
- pnpm
npm install --save @docusaurus/theme-live-codeblock
yarn add @docusaurus/theme-live-codeblock
pnpm add @docusaurus/theme-live-codeblock
Vous devez également ajouter le plugin à votre docusaurus.config.js
.
module.exports = {
// ...
themes: ['@docusaurus/theme-live-codeblock'],
// ...
};
Pour utiliser le plugin, créez un bloc de code avec live
attaché à la méta chaîne de langage.
```jsx live
function Clock(props) {
const [date, setDate] = useState(new Date());
useEffect(() => {
const timerID = setInterval(() => tick(), 1000);
return function cleanup() {
clearInterval(timerID);
};
});
function tick() {
setDate(new Date());
}
return (
<div>
<h2>Il est {date.toLocaleTimeString()}.</h2>
</div>
);
}
```
Le bloc de code sera rendu en tant qu'éditeur interactif. Les modifications apportées au code se répercuteront en temps réel sur le panneau des résultats.
function Clock(props) { const [date, setDate] = useState(new Date()); useEffect(() => { const timerID = setInterval(() => tick(), 1000); return function cleanup() { clearInterval(timerID); }; }); function tick() { setDate(new Date()); } return ( <div> <h2>Il est {date.toLocaleTimeString()}.</h2> </div> ); }
Imports
Il n'est pas possible d'importer des composants directement depuis l'éditeur de code de react-live, vous devez définir les importations nécessaires au préalable.
Par défaut, toutes les importations de React sont disponibles. Si vous avez besoin d'un plus grand nombre d'importations à disposition, swizzlez la portée de react-live :
- npm
- Yarn
- pnpm
npm run swizzle @docusaurus/theme-live-codeblock ReactLiveScope -- --eject
yarn swizzle @docusaurus/theme-live-codeblock ReactLiveScope --eject
pnpm run swizzle @docusaurus/theme-live-codeblock ReactLiveScope -- --eject
import React from 'react';
const ButtonExample = (props) => (
<button
{...props}
style={{
backgroundColor: 'white',
color: 'black',
border: 'solid red',
borderRadius: 20,
padding: 10,
cursor: 'pointer',
...props.style,
}}
/>
);
// Ajoutez les importations react-live dont vous avez besoin ici
const ReactLiveScope = {
React,
...React,
ButtonExample,
};
export default ReactLiveScope;
Le composant ButtonExample
est maintenant disponible pour être utilisé :
function MyPlayground(props) { return ( <div> <ButtonExample onClick={() => alert('hey!')}>Cliquez moi</ButtonExample> </div> ); }
Rendu impératif (noInline)
L'option noInline
doit être utilisée pour éviter les erreurs lorsque votre code s'étend sur plusieurs composants ou variables.
```jsx live noInline
const project = 'Docusaurus';
const Greeting = () => <p>Hello {project}!</p>;
render(<Greeting />);
```
Contrairement à un bloc de code interactif ordinaire, lors de l'utilisation de noInline
, React Live n'enveloppera pas votre code dans une fonction en ligne pour le rendre.
Vous devrez explicitement appeler render()
à la fin de votre code pour afficher la sortie.
const project = "Docusaurus"; const Greeting = () => ( <p>Hello {project}!</p> ); render( <Greeting /> );
Utiliser le balisage JSX dans les blocs de code
Le bloc de code dans Markdown conserve toujours son contenu en texte brut, ce qui signifie que vous ne pouvez pas faire quelque chose comme :
type EditUrlFunction = (params: {
// Cela ne se transforme pas en un lien (pour une bonne raison !)
version: <a href="/docs/versioning">Version</a>;
versionDocsDirPath: string;
docPath: string;
permalink: string;
locale: string;
}) => string | undefined;
Si vous voulez intégrer le balisage HTML comme les liens d'ancrage ou le type gras, vous pouvez utiliser la balise <pre>
, <code>
ou le composant <CodeBlock>
.
<pre>
<b>Entrée: </b>1 2 3 4{'\n'}
<b>Sortie: </b>"366300745"{'\n'}
</pre>
Entrée: 1 2 3 4 Sortie: "366300745"
MDX est conforme au comportement JSX : les caractères de saut de ligne, même à l'intérieur de <pre>
, sont transformés en espaces. Vous devez écrire explicitement le caractère saut de ligne pour qu'il soit imprimé.
La coloration syntaxique ne fonctionne que sur des chaînes de caractères simples. Docusaurus ne tentera pas d'analyser le contenu du bloc de code contenant des fils JSX.
Blocs de code multi-langages
Avec MDX, vous pouvez facilement créer des composants interactifs dans votre documentation, par exemple, pour afficher du code dans plusieurs langages de programmation et basculer entre eux en utilisant un composant d'onglets.
Au lieu de mettre en place un composant dédié aux blocs de code pour la prise en charge de multi-langage, nous avons implémenté un composant <Tabs>
pour un usage général dans le thème classic afin que vous puissiez l'utiliser également pour d'autres scénarios sans code.
L'exemple suivant montre comment vous pouvez avoir des onglets de code multi-language dans vos documents. Notez que les lignes vides au-dessus et au-dessous de chaque bloc de langage sont intentionnelles. Ceci est une limitation actuelle de MDX : vous devez laisser des lignes vides autour de la syntaxe Markdown pour que l'analyseur MDX sache que c'est la syntaxe Markdown et non le JSX.
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs>
<TabItem value="js" label="JavaScript">
```js
function helloWorld() {
console.log('Hello, world!');
}
```
</TabItem>
<TabItem value="py" label="Python">
```py
def hello_world():
print("Hello, world!")
```
</TabItem>
<TabItem value="java" label="Java">
```java
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello, World");
}
}
```
</TabItem>
</Tabs>
Et vous obtiendrez les éléments suivants :
- JavaScript
- Python
- Java
function helloWorld() {
console.log('Hello, world!');
}
def hello_world():
print("Hello, world!")
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello, World");
}
}
Si vous avez plusieurs de ces onglets de code multi-langages, et que vous voulez synchroniser la sélection entre les instances de l'onglet, reportez-vous à la section Synchronisation des choix d'onglets.
Plugin remark npm2yarn de Docusaurus
L'affichage des commandes CLI à la fois pour npm et Yarn est un besoin très courant, par exemple :
- npm
- Yarn
- pnpm
npm install @docusaurus/remark-plugin-npm2yarn
yarn add @docusaurus/remark-plugin-npm2yarn
pnpm add @docusaurus/remark-plugin-npm2yarn
Docusaurus fournit un tel utilitaire dès le départ, vous évitant d'utiliser le composant Tabs
à chaque fois. Pour activer cette fonctionnalité, installez d'abord le paquet @docusaurus/remark-plugin-npm2yarn
comme ci-dessus, puis dans docusaurus.config.js
, pour les plugins où vous avez besoin de cette fonctionnalité (doc, blog, pages, etc.), enregistrez-la dans l'option remarkPlugins
. (Consultez la documentation de configuration pour plus de détails sur le format de configuration)
module.exports = {
// ...
presets: [
[
'@docusaurus/preset-classic',
{
docs: {
remarkPlugins: [
[require('@docusaurus/remark-plugin-npm2yarn'), {sync: true}],
],
},
pages: {
remarkPlugins: [require('@docusaurus/remark-plugin-npm2yarn')],
},
blog: {
// ...
},
},
],
],
};
Et puis utilisez-le en ajoutant la clé npm2yarn
au bloc de code :
```bash npm2yarn
npm install @docusaurus/remark-plugin-npm2yarn
```
L'utilisation de l'option {sync: true}
permet de synchroniser tous les choix d'onglets. Comme le choix est stocké sous le même espace de nom npm2yarn
, les différentes instances du plugin npm2yarn
synchronisent également leurs choix.
Utilisation dans JSX
En dehors de Markdown, vous pouvez utiliser le composant @theme/CodeBlock
pour obtenir le même résultat.
import CodeBlock from '@theme/CodeBlock';
export default function MyReactPage() {
return (
<div>
<CodeBlock
language="jsx"
title="/src/components/HelloCodeTitle.js"
showLineNumbers>
{`function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}`}
</CodeBlock>
</div>
);
}
function HelloCodeTitle(props) {
return <h1>Hello, {props.name}</h1>;
}
Les props acceptés sont language
, title
et showLineNumbers
, de la même manière que vous écrivez des blocs de code Markdown.
Bien que déconseillé, vous pouvez également passer dans une prop metastring
avec metastring='{1-2} title="/src/components/HelloCodeTitle.js"' showLineNumbers'
, qui est la façon dont les blocs de code Markdown sont gérés sous le capot. Cependant, nous vous recommandons d'utiliser des commentaires pour mettre en surbrillance les lignes.
Comme indiqué précédemment, la coloration syntaxique n'est appliquée que lorsque les enfants sont une chaîne de caractères simple.