跳到主要内容

代码块(CodeBlock)显示语言名称

Docusaurus自带的CodeBlock在右上角并不显示代码语言的名称,如果想要显示语言名称则需要使用Swizzling对代码块组件进行修改。

修改的组件为 CodeBlock/Content/String。在WordWrapButton左侧,显示代码语言的名称。

生成Swizzling

本功能需要使用 eject 模式。

npm run swizzle @docusaurus/theme-classic CodeBlock/Content/String -- --eject
shell

Note

注意:以上命令只会生成 CodeBlock/Content/String,并不会附带 CodeBlock/Content/styles.module.css。需要单独添加 styles.module.css

src/theme/CodeBlock/Content/styles.module.css
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

.codeBlockContent {
position: relative;
/* rtl:ignore */
direction: ltr;
border-radius: inherit;
}

.codeBlockTitle {
border-bottom: 1px solid var(--ifm-color-emphasis-300);
font-size: var(--ifm-code-font-size);
font-weight: 500;
padding: 0.75rem var(--ifm-pre-padding);
border-top-left-radius: inherit;
border-top-right-radius: inherit;
}

.codeBlock {
--ifm-pre-background: var(--prism-background-color);
margin: 0;
padding: 0;
}

.codeBlockTitle + .codeBlockContent .codeBlock {
border-top-left-radius: 0;
border-top-right-radius: 0;
}

.codeBlockStandalone {
padding: 0;
}

.codeBlockLines {
font: inherit;
/* rtl:ignore */
float: left;
min-width: 100%;
padding: var(--ifm-pre-padding);
}

.codeBlockLinesWithNumbering {
display: table;
padding: var(--ifm-pre-padding) 0;
}

@media print {
.codeBlockLines {
white-space: pre-wrap;
}
}

.buttonGroup {
display: flex;
column-gap: 0.2rem;
position: absolute;
/* rtl:ignore */
right: calc(var(--ifm-pre-padding) / 2);
top: calc(var(--ifm-pre-padding) / 2);
}

.buttonGroup button {
display: flex;
align-items: center;
background: var(--prism-background-color);
color: var(--prism-color);
border: 1px solid var(--ifm-color-emphasis-300);
border-radius: var(--ifm-global-radius);
padding: 0.4rem;
line-height: 0;
transition: opacity var(--ifm-transition-fast) ease-in-out;
opacity: 0;
}

.buttonGroup button:focus-visible,
.buttonGroup button:hover {
opacity: 1 !important;
}

:global(.theme-code-block:hover) .buttonGroup button {
opacity: 0.4;
}
css

也可以选择直接生成 CodeBlock/Content,然后修改 CodeBlock/Content/String

npm run swizzle @docusaurus/theme-classic CodeBlock/Content -- --eject
shell

最终代码结构如下:

src/theme/CodeBlock/Content
|-- String.tsx
|-- styles.module.css

添加显示语言名称的内容

src/theme/CodeBlock/Content/String.tsx
...
<div className={styles.buttonGroup}>
{language && <span className={styles.languageName}>{language}</span>}
{(wordWrap.isEnabled || wordWrap.isCodeScrollable) && (
<WordWrapButton
className={styles.codeButton}
onClick={() => wordWrap.toggle()}
isEnabled={wordWrap.isEnabled}
/>
)}
<CopyButton className={styles.codeButton} code={code}/>
</div>
...
tsx

添加样式

src/theme/CodeBlock/Content/styles.module.css 中增加样式

src/theme/CodeBlock/Content/styles.module.css
.languageName {
font-size: 0.9rem;
color: rgb(153, 153, 136);
text-transform: uppercase;
line-height: 34px;
font-family: var(--ifm-font-family-monospace);
}
css

效果