Snippet System 是 30 seconds of code 仓库的核心内容框架。本文档描述了代码片段的结构、存储、处理和在网站上的显示方式。代码片段是主要的内容单元,包含按编程语言和主题组织的示例代码、解释和其他信息。
有关代码片段如何分组到集合中的信息,请参阅 集合。有关内容准备和处理方式的详细信息,请参阅 内容准备流程。
Snippet 数据模型实现为 Snippet 类,它继承自 ContentModel 基类。该模型充当应用程序中代码片段内容的主要表示。
来源: src/models/snippet.js1-242 src/models/contentModel.js1-172
Snippet 模型包含几个重要属性
| 属性 | 描述 |
|---|---|
id | 唯一标识符,从文件路径派生 |
title | 代码片段的完整标题 |
shortTitle | 缩写标题(可选) |
content | 代码片段的 HTML 内容 |
listed | 布尔值,指示代码片段是否应公开列出 |
cover | 代码片段封面图片的标识符 |
tags | 用于分类的标签字符串数组 |
dateModified | 代码片段上次修改的日期 |
languageId | 编程语言的标识符 |
journeyId | 学习旅程的可选标识符 |
来源: src/models/snippet.js18-35
Snippet 模型提供了几种与状态相关的方法
isScheduled:如果 dateModified 是未来的日期,则返回 trueisPublished:如果 dateModified 是过去的日期,则返回 trueisListed:如果代码片段已发布且 listed: true,则返回 true来源: src/models/snippet.js47-55 src/models/snippet.js182-190
Snippet 模型维护与其他关键模型的关联
来源: src/models/snippet.js85-118
代码片段以 Markdown 文件形式存储,带有 YAML frontmatter。每个代码片段文件都遵循一致的结构。
来源: content/snippets/demo/s/test-snippet.md1-546 content/snippets/js/s/distance-of-two-lat-lng-coordinates.md1-85
每个代码片段文件都以 YAML frontmatter 开始,用于定义其元数据
来源: content/snippets/js/s/convert-degrees-radians.md1-10 content/snippets/js/s/euclidean-distance.md1-9
代码片段的内容以 Markdown 格式编写,支持
<latex-expression> 组件)来源: content/snippets/demo/s/test-snippet.md11-546 content/snippets/js/s/distance-of-two-lat-lng-coordinates.md11-85
代码片段处理流水线负责将代码片段内容文件转换为应用程序可用的结构化数据。
来源: src/lib/contentUtils/modelWorkers/snippet.js1-120 src/lib/contentUtils/contentUtils.js1-12
过程从读取文件系统中的代码片段文件开始
来源: src/lib/contentUtils/modelWorkers/snippet.js8-26
内容转换过程
MarkdownParser 解析 markdown 内容来源: src/lib/contentUtils/modelWorkers/snippet.js31-76
处理后,代码片段被转换为 Snippet 模型实例
来源: src/lib/contentUtils/modelWorkers/snippet.js98-119
代码片段最重要的方面之一是正确显示带有语法高亮的代码。代码高亮系统会处理代码片段中的代码块并应用适当的样式。
来源: src/lib/contentUtils/markdownParser/plugins/ast/highlightCode.js1-127 src/lib/contentUtils/markdownParser/codeHighlighters/utils/metaParser.js1-343 src/lib/contentUtils/markdownParser/codeHighlighters/transformers/lineHighlights.js1-61
元解析器从代码块的元数据字符串中提取信息
来源: src/lib/contentUtils/markdownParser/plugins/ast/highlightCode.js15-47 src/lib/contentUtils/markdownParser/codeHighlighters/utils/metaParser.js305-342
代码块可以使用特殊语法包含高亮行
```js {1} {3-4}
// Highlights line 1 and lines 3-4
```js {"A":1} {"B":3-4}
// Highlights line 1 with label "A" and lines 3-4 with label "B"
```js ins={2} del={1}
// Shows line 1 as deleted and line 2 as inserted
来源: content/snippets/demo/s/test-snippet.md125-167 src/lib/contentUtils/markdownParser/codeHighlighters/transformers/lineHighlights.js1-60
代码块的样式包含
来源: src/astro/styles/_code.scss1-233 content/components/styles/prism-code-highlights.scss1-259 src/astro/styles/pages/snippet.scss1-72
片段可以包含增强内容的特殊组件
可以使用 <latex-expression> 组件包含数学公式
```
来源: content/snippets/js/s/convert-degrees-radians.md16-22 content/components/scripts/latex-expression.mjs1-49 content/components/styles/latex-expression.scss1-20
可以使用提示语法添加特殊提示
> [!NOTE]
>
> Important information users should know.
来源: content/snippets/demo/s/test-snippet.md231-261 content/snippets/js/s/distance-of-two-lat-lng-coordinates.md37-40
可以使用以下方式创建交互式代码标签页
来源: content/snippets/demo/s/test-snippet.md312-484
片段显示具有一致的布局,包括
来源: src/serializers/snippetContextSerializer.js1-19 src/presenters/breadcrumbPresenter.js1-16
每个片段都包含在 frontmatter 中指定的封面图片
系统会根据显示上下文自动格式化和加载合适的图片尺寸。
来源: src/config/settings.js84-99 src/models/contentModel.js92-116
系统根据以下条件提供片段推荐
这有助于发现和导航相关内容。
来源: src/models/snippet.js227-231 src/config/settings.js100-121
片段系统构成了 30 秒代码仓库的骨干,为存储、处理和显示代码示例和解释提供了一种结构化的方式。通过使用带有 frontmatter 的 Markdown,该系统提供了一种灵活而强大的内容模型,支持各种编程语言、丰富的格式和交互式元素。