代码块
文档中的代码块功能超级强大 💪。
代码块标题
你可以在语言声明之后添加一个 title 键,为代码块添加标题(请在它们之间留一个空格)。
```jsx title="/src/components/HelloCodeTitle.js"
function HelloCodeTitle(props) {
return <h1>你好, {props.name}</h1>;
}
```
function HelloCodeTitle(props) {
return <h1>你好, {props.name}</h1>;
}
语法高亮
代码块是由三反引号字符串包裹的文本块。你可以查阅这份 MDX 规范来了解更多细节。
```js
console.log('每个代码仓库都应该有一个吉祥物。');
```
为你的代码块使用匹配的语言元字符串,道格龙(Docusaurus)将自动应用语法高亮,这由 Prism React Renderer 提供支持。
console.log('每个代码仓库都应该有一个吉祥物。');
主题化
默认情况下,我们使用的 Prism 语法高亮主题是 Palenight。你可以通过在 docusaurus.config.js 的 themeConfig 中,为 prism 字段传递 theme 来更换主题。
例如,如果你更喜欢使用 dracula 高亮主题:
import {themes as prismThemes} from 'prism-react-renderer';
export default {
themeConfig: {
prism: {
theme: prismThemes.dracula,
},
},
};
因为 Prism 主题只是一个 JS 对象,如果你对默认主题不满意,也可以编写自己的主题。道格龙(Docusaurus)增强了 github 和 vsDark 主题以提供更丰富的高亮效果,你可以查看我们为亮色和暗色代码块主题的实现。
支持的语言
默认情况下,道格龙(Docusaurus)仅捆绑了常用语言的一个子集。
一些流行语言,如 Java、C# 或 PHP,默认并未启用。
要为其他任何 Prism 支持的语言添加语法高亮,请在 additionalLanguages 数组中定义它。
每个附加语言都必须是一个有效的 Prism 组件名称。例如,Prism 会将语言 cs 映射到 csharp,但只有 prism-csharp.js 作为组件存在,所以你需要使用 additionalLanguages: ['csharp']。你可以查看 node_modules/prismjs/components 目录来找到所有可用的组件(语言)。
例如,如果你想为 PowerShell 语言添加高亮:
export default {
// ...
themeConfig: {
prism: {
additionalLanguages: ['powershell'],
},
// ...
},
};
添加 additionalLanguages 后,请重启道格龙(Docusaurus)服务。
如果你想为 Prism 尚不支持的语言添加高亮,你可以 swizzle prism-include-languages:
- npm
- Yarn
- pnpm
- Bun
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
bun run swizzle @docusaurus/theme-classic prism-include-languages
这将在你的 src/theme 文件夹中生成 prism-include-languages.js 文件。你可以通过编辑 prism-include-languages.js 来为自定义语言添加高亮支持:
const prismIncludeLanguages = (Prism) => {
// ...
additionalLanguages.forEach((lang) => {
require(`prismjs/components/prism-${lang}`);
});
require('/path/to/your/prism-language-definition');
// ...
};
在编写自己的语言定义时,你可以参考 Prism 的官方语言定义。
添加自定义语言定义时,你不需要将该语言添加到 additionalLanguages 配置数组中,因为道格龙(Docusaurus)只在 Prism 提供的语言中查找 additionalLanguages 字符串。在 prism-include-languages.js 中添加语言导入就足够了。
段落高亮
使用注释进行高亮
你可以使用带有 highlight-next-line、highlight-start 和 highlight-end 的注释来选择需要高亮的行。
```js
function HighlightSomeText(highlight) {
if (highlight) {
// highlight-next-line
return '这行文本被高亮了!';
}
return '没有内容被高亮';
}
function HighlightMoreText(highlight) {
// highlight-start
if (highlight) {
return '这个范围内的文本被高亮了!';
}
// highlight-end
return '没有内容被高亮';
}
```
function HighlightSomeText(highlight) {
if (highlight) {
return '这行文本被高亮了!';
}
return '没有内容被高亮';
}
function HighlightMoreText(highlight) {
if (highlight) {
return '这个范围内的文本被高亮了!';
}
return '没有内容被高亮';
}
支持的注释语法:
| 风格 | 语法 |
|---|---|
| C 风格 | /* ... */ 和 // ... |
| JSX 风格 | {/* ... */} |
| Bash 风格 | # ... |
| HTML 风格 | <!-- ... --> |
我们会尽力根据语言推断使用哪种注释风格,并默认允许所有注释风格。如果当前有不支持的注释风格,我们乐于添加它们!欢迎提交 Pull Request。请注意,不同的注释风格没有语义上的区别,只有它们的内容有 。
你可以在你的 src/css/custom.css 文件中为你高亮的代码行设置自定义的背景色,以便更好地适应你选择的语法高亮主题。下面给出的颜色适用于默认的高亮主题(Palenight),所以如果你使用其他主题,你需要相应地调整颜色。
:root {
--docusaurus-highlighted-code-line-bg: rgb(72, 77, 91);
}
/* 如果你的暗黑模式有不同的语法高亮主题 */
[data-theme='dark'] {
/* 适用于暗黑模式语法高亮主题的颜色 */
--docusaurus-highlighted-code-line-bg: rgb(100, 100, 100);
}
如果你还需要以其他方式为高亮的代码行设置样式,你可以针对 theme-code-block-highlighted-line 这个 CSS 类进行设置。
使用元数据字符串进行高亮
你也可以在语言元字符串中指定高亮的行范围(在语言后留一个空格)。要高亮多行,可以用逗号分隔行号,或使用范围语法来选择一个行块。此功能使用了 parse-number-range 库,你可以在他们的项目详情中找到更多语法。
```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;
在可能的情况下,优先使用注释进行高亮。通过在代码中内联高亮,当你的代码块变长时,你就不必手动计算行数。如果你添加或删除行,你也不必调整你的行范围。
- ```jsx {3}
+ ```jsx {4}
function HighlightSomeText(highlight) {
if (highlight) {
+ console.log('找到高亮文本');
return '这行文本被高亮了!';
}
return '没有内容被高亮';
}
```
下面,我们将介绍如何扩展魔法注释系统来定义自定义指令及其功能。只有在没有高亮元字符串存在时,魔法注释才会被解析。
自定义魔法注释
// highlight-next-line 和 // highlight-start 等被称为"魔法注释",因为它们会被解析和移除,它们的目的是为下一行或由开始和结束注释对包围的区域添加元数据。
你可以通过主题配置声明自定义的魔法注释。例如,你可以注册另一个魔法注释,它会添加一个 code-block-error-line 类名:
- docusaurus.config.js
- src/css/custom.css
- myDoc.md
export default {
themeConfig: {
prism: {
magicComments: [
// 别忘了也要扩展默认的高亮类名!
{
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;
}
在 JavaScript 中,尝试访问 `null` 的属性会报错。
```js
const name = null;
// This will error
console.log(name.toUpperCase());
// Uncaught TypeError: Cannot read properties of null (reading 'toUpperCase')
```
在 JavaScript 中,尝试访问 null 的属性会报错。
const name = null;
// This will error
console.log(name.toUpperCase());
// Uncaught TypeError: Cannot read properties of null (reading 'toUpperCase')
如果你在元字符串中使用 数字范围(即 {1,3-4} 语法),道格龙(Docusaurus)将应用第一个 magicComments 条目的类名。默认情况下,这个类名是 theme-code-block-highlighted-line,但如果你更改了 magicComments 配置并使用了不同的条目作为第一个,元字符串范围的含义也会随之改变。
你可以使用 magicComments: [] 来禁用默认的行高亮注释。如果没有魔法注释配置,但道格龙(Docusaurus)遇到了一个包含元字符串范围的代码块,它将会报错,因为没有类名可以应用——毕竟,高亮类名本身就是一个魔法注释条目。
每个魔法注释条目将包含三个键:className(必需),line(应用于紧接着的下一行),或 block(包含 start 和 end,应用于由两个注释包围的整个块)。
使用 CSS 来定位类已经可以做很多事情了,但你可以通过 swizzling 来释放这个功能的全部潜力。
- npm
- Yarn
- pnpm
- Bun
npm run swizzle @docusaurus/theme-classic CodeBlock/Line
yarn swizzle @docusaurus/theme-classic CodeBlock/Line
pnpm run swizzle @docusaurus/theme-classic CodeBlock/Line
bun run swizzle @docusaurus/theme-classic CodeBlock/Line
Line 组件将接收类名列表,基于这些类名,你可以有条件地渲染不同的标记。