视频加载失败

Firefly 代码块示例

1759 字
9 分钟
Firefly 代码块示例
Firefly 代码块示例

在这里,我们将探索如何使用 Expressive Code 展示代码块。提供的示例基于官方文档,您可以参考以获取更多详细信息。

表达性代码#

语法高亮#

语法高亮

常规语法高亮#

console.log('此代码有语法高亮!')

渲染 ANSI 转义序列#

Terminal window
Standard ANSI colors:
- Dimmed: Black Red Green Yellow Blue Magenta Cyan White
- Foreground: Black Red Green Yellow Blue Magenta Cyan White
- Background: Black Red Green Yellow Blue Magenta Cyan White
- Reversed: Black Red Green Yellow Blue Magenta Cyan White
8-bit colors (showing colors 160-171 as an example):
- Dimmed: 160 161 162 163 164 165 166 167 168 169 170 171
- Foreground: 160 161 162 163 164 165 166 167 168 169 170 171
- Background: 160 161 162 163 164 165 166 167 168 169 170 171
- Reversed: 160 161 162 163 164 165 166 167 168 169 170 171
24-bit colors (full RGB):
- Dimmed: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153)
- Foreground: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153)
- Background: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153)
- Reversed: ForestGreen - RGB(34,139,34) RebeccaPurple - RGB(102,51,153)
Font styles:
- Default
- Bold
- Dimmed
- Italic
- Underline
- Reversed
- Strikethrough

编辑器和终端框架#

编辑器和终端框架

代码编辑器框架#

my-test-file.js
console.log('标题属性示例')

src/content/index.html
<div>文件名注释示例</div>

终端框架#

Terminal window
echo "此终端框架没有标题"

PowerShell 终端示例
Write-Output "这个有标题!"

覆盖框架类型#

echo "看,没有框架!"

PowerShell Profile.ps1
# 如果不覆盖,这将是一个终端框架
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail

文本和行标记#

文本和行标记

标记整行和行范围#

// 第1行 - 通过行号定位
// 第2行
// 第3行
// 第4行 - 通过行号定位
// 第5行
// 第6行
// 第7行 - 通过范围 "7-8" 定位
// 第8行 - 通过范围 "7-8" 定位

选择行标记类型 (mark, ins, del)#

line-markers.js
function demo() {
console.log('此行标记为已删除')
// 此行和下一行标记为已插入
console.log('这是第二个插入行')
return '此行使用中性默认标记类型'
}

为行标记添加标签#

labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === 'string' ? <span>{children}</span> : children)}
</button>

在单独行上添加长标签#

labeled-line-markers.jsx
<button
role="button"
{...props}
value={value}
className={buttonClassName}
disabled={disabled}
active={active}
>
{children &&
!active &&
(typeof children === 'string' ? <span>{children}</span> : children)}
</button>

使用类似 diff 的语法#

此行将标记为已插入
此行将标记为已删除
这是常规行

--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
no whitespace will be removed either

结合语法高亮和类似 diff 的语法#

function thisIsJavaScript() {
// 整个块都会以 JavaScript 高亮显示,
// 并且我们仍然可以为其添加 diff 标记!
console.log('要删除的旧代码')
console.log('新的闪亮代码!')
}

标记行内的单独文本#

function demo() {
// 标记行内的任何给定文本
return '支持给定文本的多个匹配项';
}

正则表达式#

console.log('单词 yesyep 将被标记。')

转义正斜杠#

Terminal window
echo "Test" > /home/test.txt

选择内联标记类型 (mark, ins, del)#

function demo() {
console.log('这些是插入和删除的标记类型');
// return 语句使用默认标记类型
return true;
}

自动换行#

自动换行

为每个块配置自动换行#

// 启用换行的示例
function getLongString() {
return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'
}

// wrap=false 的示例
function getLongString() {
return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'
}

配置换行的缩进#

// preserveIndent 示例(默认启用)
function getLongString() {
return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'
}

// preserveIndent=false 的示例
function getLongString() {
return '这是一个非常长的字符串,除非容器极宽,否则很可能无法适应可用空间'
}

可折叠部分#

可折叠部分

5 collapsed lines
// 所有这些样板设置代码将被折叠
import { someBoilerplateEngine } from '@example/some-boilerplate'
import { evenMoreBoilerplate } from '@example/even-more-boilerplate'
const engine = someBoilerplateEngine(evenMoreBoilerplate())
// 这部分代码默认可见
engine.doSomething(1, 2, 3, calcFn)
function calcFn() {
// 您可以有多个折叠部分
3 collapsed lines
const a = 1
const b = 2
const c = a + b
// 这将保持可见
console.log(`计算结果: ${a} + ${b} = ${c}`)
return c
}
4 collapsed lines
// 直到块末尾的所有代码将再次被折叠
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: '示例样板代码结束' })

行号#

行号

为每个块显示行号#

// 此代码块将显示行号
console.log('来自第2行的问候!')
console.log('我在第3行')

// 此块禁用行号
console.log('你好?')
console.log('抱歉,你知道我在第几行吗?')

更改起始行号#

console.log('来自第5行的问候!')
console.log('我在第6行')

Tab 代码块#

rehype-code-group 提供,语法与 VitePress 代码组 一致:用 ::: code-group labels=[...] 包裹多个代码块,即可合并成一组标签页。

Note

labels=[...] 中的标签按顺序对应组内的代码块,用英文逗号分隔;:::code-group 之间的空格不能省略。

基本用法#

::: code-group labels=[code.js, code.py, code.html]
```js
export function greet(name) {
return `Hello, ${name}!`;
}
```
```py
def greet(name):
return f"Hello, {name}!"
```
```html
<p>Hello, world!</p>
```
:::

渲染效果:

export function greet(name) {
return `Hello, ${name}!`;
}

标签中使用 Emoji#

标签支持 emoji 短代码,构建时会自动转换成 emoji:

::: code-group labels=[:package: npm, :package: pnpm, :yarn: yarn]
Terminal window
npm create astro@latest

与其他代码块特性组合#

组内仍是普通的 Expressive Code 代码块,标题、行号、行标记、折叠、终端框架等特性都可以照常使用。

astro.config.mjs
export default {
theme: "firefly",
codeGroup: true,
};

不止是代码块#

标签页内可以放任意内容,例如文字、列表或图片:

这是一段普通的段落内容。

Tip

标签栏在构建期生成,默认展开第一项;支持鼠标点击与键盘 / / Home / End 切换。

在提醒框内使用(MDX 组件)#

::: code-group::: tip 等 Docusaurus 风格提醒框都使用 ::: 容器语法,而 micromark-directive 规定父子容器的冒号数必须不同,因此 ::: code-group 无法嵌套在 ::: tip 等提醒框内(整块会失效)。

这种情况改用 MDX 组件 TabGroup:MDX 组件不经过 ::: 指令解析,在提醒框内外都能正常使用,也方便日后扩展更多 UI 组件。把文章后缀改为 .mdx,从统一入口 @/components/firefly-mdx 引入(可一次引入多个组件):

import { TabGroup } from "@/components/firefly-mdx";
:::tip
<TabGroup labels={["test.js", "test.py"]} client:load>
```js
console.log(1)
```
```py
print("hello world")
```
</TabGroup>
:::
Tip
  • labels 数组给每个代码块声明标签,顺序一一对应
  • 组件用 client:load 激活标签切换

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
Firefly 代码块示例
https://firefly.cuteleaf.cn/posts/code-examples/
作者
phyy
发布于
1970-01-03
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
phyy
Born in 2006, graduated from Hengshui High School and is currently pursuing a bachelor’s degree in Software Engineering at Hebei Normal University, conducting research on view clustering.
WELCOME TO MY PAGE
This is my first announcement, hope you like it
分类
标签
最新动态
站点统计
文章
13
分类
2
标签
19
总字数
16,246
运行时长
0
最后活动
0 天前
站点信息
构建平台
Vercel
博客版本
Firefly v6.16.8
文章许可
CC BY-NC-SA 4.0
文章目录