#Cinderfolio-Shiki
Shiki 是基于 TextMate 语法的代码高亮器,在渲染时生成带有语法颜色与字形的 HTML。
深色
g0#121212浅色
g16bg#fafaf8品牌色
brand#f97316通用编程
网页与组件
数据与配置
脚本与构建
文档与文本
C
C++
Python
JS
TS
C#
Rust
Go
Java
tasks.c · C11
#include <stdbool.h>
#include <stdio.h>
#define MAX_SHOWN 2
typedef struct { const char *title; bool done; } Task;
typedef bool (*Predicate)(const Task *);
static bool is_pending(const Task *task) {
return !task->done;
}
// 回调决定筛选条件,指针访问原数据,达到上限后提前结束。
static size_t visit(const Task tasks[], size_t count, Predicate accept) {
size_t shown = 0;
for (size_t i = 0; i < count; ++i) {
const Task *task = &tasks[i];
if (!accept(task)) continue;
printf("%zu. %s\n", shown + 1, task->title);
if (++shown == MAX_SHOWN) break;
}
return shown;
}
int main(void) {
const Task tasks[] = {
{.title = "调整配色", .done = true},
{.title = "导出主题", .done = false},
{.title = "检查示例", .done = false},
};
#if defined(DEBUG)
fprintf(stderr, "开始筛选待办任务\n");
#endif
size_t count = sizeof tasks / sizeof tasks[0];
size_t shown = visit(tasks, count, is_pending);
return shown > 0 ? 0 : 1;
}vector.cpp · C++20
#include <concepts>
#include <iostream>
#include <span>
#include <stdexcept>
using Scalar = double;
// 视图不复制数据;长度不匹配时停止计算。
template <std::floating_point T>
class Vec {
public:
explicit Vec(std::span<const T> data) : data_(data) {}
[[nodiscard]] T dot(const Vec& rhs) const {
if (data_.size() != rhs.data_.size())
throw std::invalid_argument("向量长度不一致");
T total{};
for (std::size_t i = 0; i < data_.size(); ++i)
total += data_[i] * rhs.data_[i];
return total;
}
private:
std::span<const T> data_;
};
int main() {
constexpr Scalar x[]{1.0, 2.0, 3.0}, y[]{4.0, 5.0, 6.0};
const Vec<Scalar> a{x}, b{y};
const auto score = [&a, scale = 0.5](const auto& v) {
return scale * a.dot(v);
};
try {
std::cout << "加权点积 = " << score(b) << '\n';
} catch (const std::invalid_argument& error) {
std::cerr << error.what() << '\n';
return 1;
}
}tasks.py · Python 3.10+
import json
from dataclasses import dataclass
from pathlib import Path
@dataclass(frozen=True)
class Task:
id: int
title: str
done: bool = False
owner: str | None = None
def load_tasks(path: Path) -> list[Task]:
"""读取任务;文件关闭由上下文管理器负责。"""
with path.open(encoding="utf-8") as stream:
data = json.load(stream)
return [Task(**item) for item in data["tasks"]]
def summarize(tasks: list[Task]) -> dict[str, int]:
counts: dict[str, int] = {}
for task in tasks:
if task.done:
continue
owner = task.owner or "未分配"
counts[owner] = counts.get(owner, 0) + 1
return counts
if __name__ == "__main__":
try:
tasks = load_tasks(Path("tasks.json"))
for owner, count in summarize(tasks).items():
print(f"{owner}: {count:02d} 项待办")
except (OSError, ValueError) as error:
print(f"读取失败:{error}")tasks.js · JavaScript
async function loadTasks(url, { limit = 3 } = {}) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const { tasks = [] } = await response.json();
// 先筛选,再排序;返回适合展示的数据。
return tasks
.filter(task => !task.done)
.sort((a, b) => a.title.localeCompare(b.title))
.slice(0, limit)
.map(({ id, title, owner }) => ({
id, title: title.trim(), owner: owner ?? "未分配",
}));
}
async function main() {
try {
const pending = await loadTasks("/tasks.json", {
limit: 5,
});
if (pending.length === 0) {
console.log("全部完成");
return;
}
for (const { title, owner } of pending) {
console.log(`${owner}: ${title}`);
}
} catch (error) {
console.error("读取失败:", error.message);
}
}
main();tasks.ts · TypeScript 4.9+
interface Task {
readonly id: number;
title: string;
done: boolean;
owner?: string | null;
}
type State<T> =
| { status: "ready"; data: T }
| { status: "error"; message: string };
function pending<T extends Task>(items: readonly T[]): T[] {
return items.filter(({ done }) => !done);
}
function summarize(state: State<readonly Task[]>): string {
// 判别字段决定后续流程,也缩小可访问的类型。
switch (state.status) {
case "error":
return `读取失败:${state.message}`;
case "ready": {
const names = pending(state.data).map(task => {
const owner = task.owner?.trim() || "未分配";
return `${owner}: ${task.title}`;
});
return names.join("\n") || "全部完成";
}
}
}
const state = {
status: "ready",
data: [{
id: 1, title: "导出主题", done: false, owner: null,
}],
} satisfies State<Task[]>;
console.log(summarize(state));Program.cs · C# 10 / .NET 6+
using System;
using System.Linq;
using System.Threading.Tasks;
record TaskItem(int Id, string Title, bool Done);
class Program {
static async Task<TaskItem[]> LoadAsync() {
await Task.Yield();
return new[] {
new TaskItem(1, "调整配色", true),
new TaskItem(2, "导出主题", false),
};
}
static string Describe(TaskItem task) => task switch {
{ Done: true } => "已完成",
{ Title.Length: 0 } => throw new ArgumentException("标题为空"),
_ => $"{task.Id}: {task.Title}",
};
static async Task Main() {
try {
var tasks = await LoadAsync();
// LINQ 按顺序筛选和排序,模式匹配决定输出内容。
var pending = tasks.Where(task => !task.Done)
.OrderBy(task => task.Id).ToArray();
if (pending.Length == 0) {
Console.WriteLine("全部完成");
return;
}
foreach (var task in pending)
Console.WriteLine(Describe(task));
} catch (ArgumentException error) {
Console.Error.WriteLine(error.Message);
}
}
}tasks.rs · Rust 2021
#[derive(Debug)]
struct Task<'a> {
title: &'a str,
done: bool,
}
fn parse_task(line: &str) -> Result<Task<'_>, String> {
let (title, state) = line
.split_once(',')
.ok_or("缺少状态")?;
let done = match state.trim() {
"done" => true,
"todo" => false,
other => return Err(format!("未知状态:{other}")),
};
Ok(Task { title: title.trim(), done })
}
fn main() -> Result<(), String> {
// 任意一行失败就返回错误;成功时保留借用的标题。
let tasks = ["调整配色,done", "导出主题,todo"]
.into_iter()
.map(parse_task)
.collect::<Result<Vec<_>, _>>()?;
let pending: Vec<_> = tasks.iter()
.filter(|task| !task.done)
.map(|task| task.title)
.collect();
if let Some(first) = pending.first() {
println!("下一项:{first}");
} else {
println!("全部完成");
}
println!("{} 项:{}", pending.len(), pending.join(", "));
Ok(())
}tasks.go · Go
package main
import (
"encoding/json"
"fmt"
"os"
)
type Task struct {
Title string `json:"title"`
Done bool `json:"done"`
}
func loadTasks(path string) ([]Task, error) {
file, err := os.Open(path)
if err != nil {
return nil, err
}
defer file.Close()
var data struct { Tasks []Task `json:"tasks"` }
if err := json.NewDecoder(file).Decode(&data); err != nil {
return nil, fmt.Errorf("解析任务:%w", err)
}
return data.Tasks, nil
}
func main() {
tasks, err := loadTasks("tasks.json")
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
// 已完成的任务直接跳过;只输出待办。
for index, task := range tasks {
if task.Done { continue }
fmt.Printf("%d. %s\n", index + 1, task.Title)
}
}Tasks.java · Java 17+
import java.util.List;
public class Tasks {
enum State { TODO, DONE }
record Task(String title, State state) {
Task {
if (title.isBlank()) {
throw new IllegalArgumentException("标题为空");
}
}
}
static String label(Task task) {
return switch (task.state()) {
case TODO -> "待办:" + task.title();
case DONE -> "完成:" + task.title();
};
}
public static void main(String[] args) {
try {
var tasks = List.of(
new Task("调整配色", State.DONE),
new Task("导出主题", State.TODO)
);
// 流操作按顺序表达筛选和转换。
var pending = tasks.stream()
.filter(task -> task.state() == State.TODO)
.map(Tasks::label)
.toList();
for (var line : pending) {
System.out.println(line);
}
} catch (IllegalArgumentException error) {
System.err.println(error.getMessage());
}
}
}HTML
CSS
SCSS
JSX
TSX
Vue
Svelte
tasks.html · HTML
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8" />
<meta name="viewport"
content="width=device-width, initial-scale=1" />
<title>待办任务</title>
</head>
<body>
<main class="tasks" aria-labelledby="title">
<h1 id="title">Cinderfolio & Shiki</h1>
<!-- 标签呈现结构;属性表达交互与关联。 -->
<form action="/tasks" method="get">
<label for="query">筛选任务</label>
<input id="query" name="q" type="search"
placeholder="输入标题" />
<button type="submit">搜索</button>
</form>
<ul>
<li data-id="1"><a href="/tasks/1">导出主题</a></li>
<li>
<button type="button" disabled>全部完成</button>
</li>
</ul>
<details>
<summary>下载说明</summary>
<p>主题以 <code>JSON</code> 格式保存。</p>
</details>
</main>
</body>
</html>tasks.css · CSS
/* 同一布局通过变量、状态和断点调整。 */
.tasks {
--gap: 1rem;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--gap);
padding: calc(var(--gap) * 1.5);
color: var(--cf-foreground);
background: var(--cf-background);
border: 1px solid var(--cf-border);
}
.tasks > :first-child { grid-column: 1 / -1; }
.tasks [data-done="true"] { opacity: 0.6; }
.tasks button:is(:hover, :focus-visible) {
border-color: var(--cf-accent-brand);
transform: translateY(-1px);
}
.tasks button:disabled { cursor: default; }
@media (max-width: 640px) {
.tasks { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: no-preference) {
.tasks button { transition: transform 150ms ease; }
}tasks.scss · SCSS
$gap: 1rem;
$densities: (compact: 0.5rem, relaxed: 1.5rem);
@mixin panel($padding: $gap, $bordered: true) {
display: grid;
gap: $gap;
padding: $padding;
@if $bordered {
border: 1px solid var(--cf-border);
}
}
.tasks {
@include panel($gap * 1.5);
color: var(--cf-foreground);
&__title { margin-block: 0 $gap; }
&:hover { border-color: var(--cf-accent-brand); }
// 数据生成变体,插值连接选择器名称。
@each $name, $spacing in $densities {
&--#{$name} { gap: $spacing; }
}
}TaskList.jsx · React JSX
import { useState } from "react";
export default function TaskList({ initialTasks = [] }) {
const [tasks, setTasks] = useState(initialTasks);
const pending = tasks.filter(task => !task.done);
function toggle(id) {
// 返回新对象,让状态更新与事件的关系更清楚。
setTasks(current => current.map(task =>
task.id === id ? { ...task, done: !task.done } : task
));
}
return (
<section aria-label="待办任务">
<h2>待办 {pending.length} 项</h2>
{tasks.length === 0 ? <p>暂无任务</p> : (
<ul>
{tasks.map(({ id, title, done }) => (
<li key={id}>
<button
aria-pressed={done}
onClick={() => toggle(id)}
>
{done ? "✓ " : "○ "}{title}
</button>
</li>
))}
</ul>
)}
</section>
);
}TaskList.tsx · React TSX
interface Task {
readonly id: number;
title: string;
done: boolean;
}
type Props = {
tasks: readonly Task[];
loading?: boolean;
onToggle: (id: Task["id"]) => void;
};
export function TaskList({
tasks, loading = false, onToggle,
}: Props) {
if (loading) return <p role="status">正在读取…</p>;
const pending = tasks.filter(task => !task.done);
// 类型约束输入,事件和条件渲染描述交互流程。
return (
<section aria-label="待办任务">
<h2>待办 {pending.length} 项</h2>
{pending.length > 0 ? pending.map(task => (
<button key={task.id} onClick={() => onToggle(task.id)}>
{task.title}
</button>
)) : <p>全部完成</p>}
</section>
);
}TaskList.vue · Vue 3.3+
<script setup lang="ts">
import { computed, ref } from "vue";
type Task = { id: number; title: string; done: boolean };
const props = defineProps<{ title: string }>();
const emit = defineEmits<{ complete: [id: number] }>();
const tasks = ref<Task[]>([
{ id: 1, title: "调整配色", done: true },
{ id: 2, title: "导出主题", done: false },
]);
const pending = computed(() =>
tasks.value.filter(task => !task.done)
);
function complete(task: Task) {
task.done = true;
emit("complete", task.id);
}
</script>
<template>
<section class="tasks">
<h2>{{ props.title }} · {{ pending.length }}</h2>
<ul v-if="pending.length">
<li v-for="task in pending" :key="task.id">
<button @click="complete(task)">
{{ task.title }}
</button>
</li>
</ul>
<p v-else>全部完成</p>
</section>
</template>
<style scoped>
.tasks { display: grid; gap: 0.75rem; }
</style>TaskList.svelte · Svelte 5
<script>
let { title = "待办任务" } = $props();
let tasks = $state([
{ id: 1, title: "调整配色", done: true },
{ id: 2, title: "导出主题", done: false },
]);
let pending = $derived(tasks.filter(task => !task.done));
function toggle(task) {
task.done = !task.done;
}
</script>
<section>
<h2>{title} · {pending.length}</h2>
{#each tasks as task (task.id)}
<button class:done={task.done} onclick={() => toggle(task)}>
{task.title}
</button>
{:else}
<p>暂无任务</p>
{/each}
{#if pending.length === 0 && tasks.length > 0}
<p>全部完成</p>
{/if}
</section>
<style>
.done { text-decoration: line-through; }
</style>JSON
YAML
TOML
SQL
tasks.json · JSON
{
"name": "Cinderfolio",
"version": 1,
"enabled": true,
"retryDelay": 1.5e2,
"colors": {
"g0": "#121212", "g16": "#fafaf8", "brand": "#f97316"
},
"targets": ["Rspress", "Pele", "Shiki"],
"tasks": [
{
"id": 1, "title": "调整配色",
"done": true, "owner": "Lin"
},
{
"id": 2, "title": "导出主题",
"done": false, "owner": null
}
],
"message": "保存为 \"JSON\"\n支持亮暗主题"
}theme.yaml · YAML
# 锚点共享默认值,局部配置覆盖其中的字段。
defaults: &defaults
enabled: true
retries: 3
timeout: 10
preview:
<<: *defaults
retries: 1
brand: "#f97316"
outputs: [cf-rspress.css, cf-pele.css]
tasks:
- title: 调整配色
done: true
- title: 导出主题
done: false
owner: null
description: |
一套颜色适配网页、图表与代码。
换行保留在字符串中。
summary: >-
多行文字合并为一段,
不保留结尾换行。theme.toml · TOML
name = "Cinderfolio"
enabled = true
updated = 2026-10-24T09:00:00+08:00
limits = { retries = 3, timeout = 10.0 }
[colors]
ink = "#121212"
paper = "#fafaf8"
brand = "#f97316"
# 数组表描述多个导出目标。
[[exports]]
target = "Rspress"
files = ["cf-rspress.css"]
[[exports]]
target = "Shiki"
files = [
"cf-shiki-light.json",
"cf-shiki-dark.json",
]
description = """
一份配置,
同时生成亮暗主题。
"""tasks.sql · SQL
WITH projects(id, name) AS (
VALUES (1, 'Cinderfolio'), (2, 'Pele')
), tasks(project_id, title, done, priority) AS (
VALUES
(1, '调整配色', TRUE, 2),
(1, '导出主题', FALSE, 3),
(2, '检查图表', FALSE, 1)
)
-- 先关联并筛选,再按项目汇总未完成的任务。
SELECT
p.name,
COUNT(*) AS pending,
SUM(CASE WHEN t.priority >= 3 THEN 1 ELSE 0 END) AS urgent,
CASE WHEN COUNT(*) > 1 THEN '多项待办'
ELSE '即将完成' END AS status
FROM projects AS p
JOIN tasks AS t ON t.project_id = p.id
WHERE t.done = FALSE
GROUP BY p.id, p.name
HAVING COUNT(*) > 0
ORDER BY urgent DESC, pending DESC;Bash
PS
Lua
Docker
Make
CMake
themes.sh · Bash
#!/usr/bin/env bash
set -euo pipefail
root="${1:-cinderfolio/dist}"
files=("cf-rspress.css" "cf-pele.css" "cf-shiki-light.json")
report() {
local path="$1"
if [[ ! -f "$path" ]]; then
printf '缺少文件:%s\n' "$path" >&2
return 1
fi
case "$path" in
*.json) printf '主题:%s\n' "${path##*/}" ;;
*.css) printf '样式:%s\n' "${path##*/}" ;;
esac
}
# 函数的退出状态决定分支;缺少文件时继续检查下一项。
count=0
for file in "${files[@]}"; do
if report "$root/$file"; then
count=$((count + 1))
else
continue
fi
done
printf '找到 %d / %d 个文件\n' "$count" "${#files[@]}"
printf '%s\n' "${files[@]}" | sortthemes.ps1 · PowerShell
param(
[string]$ThemePath = "./cinderfolio/dist",
[switch]$DarkOnly
)
$files = Get-ChildItem $ThemePath -Filter "cf-shiki-*.json" |
Sort-Object Name
foreach ($file in $files) {
try {
$raw = Get-Content $file.FullName -Raw -ErrorAction Stop
$theme = $raw | ConvertFrom-Json -ErrorAction Stop
if ($DarkOnly -and $theme.type -ne "dark") {
continue
}
# 管道输出对象,后续仍可按属性筛选和格式化。
[PSCustomObject]@{
Name = $theme.name
Type = $theme.type
Background = $theme.colors.'editor.background'
}
} catch {
Write-Warning "$($file.Name): $($_.Exception.Message)"
}
}tasks.lua · Lua 5.4
local tasks = {
{ id = 1, title = "调整配色", done = true },
{ id = 2, title = "导出主题", done = false },
}
local function pending(items)
local result = {}
for _, task in ipairs(items) do
if not task.done then
table.insert(result, task)
end
end
table.sort(result, function(a, b) return a.id < b.id end)
return result
end
local function describe(task)
assert(task.title ~= "", "标题为空")
return string.format("%d: %s", task.id, task.title)
end
-- pcall 将错误转换为状态值,单项失败不阻止后续处理。
for _, task in ipairs(pending(tasks)) do
local ok, label = pcall(describe, task)
if ok then
print(label)
else
io.stderr:write(label, "\n")
end
end
return { pending = pending, describe = describe }Dockerfile · Docker
ARG NODE_VERSION=22
FROM node:${NODE_VERSION}-alpine AS build
WORKDIR /app
COPY cinderfolio/ ./cinderfolio/
# 同一层生成并检查产物;反斜杠延续命令。
RUN node cinderfolio/build.mjs --out-dir /export \
&& test -s /export/cf-shiki-dark.json
FROM nginx:alpine
COPY --from=build /export/ /usr/share/nginx/html/
EXPOSE 80
HEALTHCHECK --interval=30s \
CMD wget -q --spider http://127.0.0.1/ || exit 1Makefile · Make
CXX ?= c++
CXXFLAGS := -std=c++20 -O2 -Wall
TARGET := vector
SOURCES := vector.cpp
OBJECTS := $(SOURCES:.cpp=.o)
ifeq ($(DEBUG),1)
CXXFLAGS += -g -DDEBUG
endif
.PHONY: all clean
all: $(TARGET)
# 模式规则编译每个源文件,自动变量连接目标与依赖。
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
$(TARGET): $(OBJECTS)
$(CXX) $(OBJECTS) -o $@
clean:
$(RM) $(TARGET) $(OBJECTS)CMakeLists.txt · CMake
cmake_minimum_required(VERSION 3.20)
project(VectorDemo VERSION 1.0 LANGUAGES CXX)
option(VECTOR_WARNINGS "Enable compiler warnings" ON)
add_executable(vector vector.cpp)
target_compile_features(vector PRIVATE cxx_std_20)
# 生成器表达式在对应构建配置下生效。
target_compile_definitions(vector PRIVATE
$<$<CONFIG:Debug>:DEBUG>
)
if(VECTOR_WARNINGS)
if(MSVC)
target_compile_options(vector PRIVATE /W4)
else()
target_compile_options(vector PRIVATE
-Wall -Wextra -Wpedantic
)
endif()
endif()
message(STATUS "Building ${PROJECT_NAME} ${PROJECT_VERSION}")纯文本
MD
LaTeX
Mermaid
正则
Diff
任务处理流程 · 纯文本伪代码
输入:任务集合 tasks,最多展示 limit = 5 项
输出:按负责人分组的待办列表
try:
records ← 读取并解析 tasks
catch 读取错误:
输出错误并结束
groups ← 空映射
for each task in records:
if task.done:
continue
owner ← task.owner ?? "未分配"
groups[owner] ← groups[owner] ∪ {task.title}
for each (owner, titles) in groups:
输出 owner, titles[0:limit]
return groupsREADME.md · Markdown
# Cinderfolio
先看 **流程与调用**,再读 *注释与说明*。
## 使用方法
1. 选择亮暗主题。
2. 调整颜色并下载 JSON。
- [x] 网页预览
- [ ] 检查其他语言
> 配色与字形共同决定信息层级。
> 字面量中的 `<>` 不表示比较运算。
~~~python
for task in tasks:
if not task.done:
print(task.title)
~~~
| 内容 | 字形 |
| :--- | ---: |
| 流程 | 粗体 |
| 注释 | 斜体 |
[Shiki 主题][theme] · 
[theme]: https://shiki.style/guide/load-theme "自定义主题"vector.tex · TeX / LaTeX
\documentclass{article}
\usepackage{amsmath,amssymb}
\newcommand{\vect}[1]{\mathbf{#1}}
\begin{document}
\section{Vector score}
% A weighted score with a threshold.
For $\vect{x}, \vect{y} \in \mathbb{R}^n$, define
\begin{align}
s &= \alpha \sum_{i=1}^{n} x_i y_i, & \alpha &= 0.5,
\label{eq:score} \\
f(s) &= \begin{cases}
s, & s > 0, \\
0, & s \leq 0.
\end{cases}
\end{align}
See Equation~\eqref{eq:score} for the score.
\begin{itemize}
\item \textbf{Read the flow}:
compute $s$, then choose a branch.
\item \emph{Check the details}:
indices, constants and references.
\end{itemize}
\end{document}pipeline.mmd · Mermaid 源码
flowchart TD
%% 实线描述主流程,虚线补充失败路径。
A([开始]) --> B[读取任务]
B --> C{读取成功?}
C -->|否| X[输出错误]
C -->|是| D
subgraph processing [处理任务]
D{还有任务?} -->|是| E[取下一项]
E --> F{已完成?}
F -->|是| D
F -->|否| G[按负责人分组]
G --> D
end
D -->|否| H[(待办结果)]
H --> Z([结束])
X -.-> Zsettings.regex · 正则表达式(Python)
(?mx)
^
(?P<key>[A-Za-z_]\w*) (?# 配置项名称)
[ \t]* = [ \t]*
(?P<value>
"(?: \\. | [^"\\] )*" (?# 带转义的引号字符串)
| [^\#\r\n]+? (?# 或不带引号的值)
)
[ \t]* (?: \# [^\r\n]* )? (?# 可选的行尾注释)
$tasks.py · Diff
diff --git a/tasks.py b/tasks.py
--- a/tasks.py
+++ b/tasks.py
@@ -1,3 +1,6 @@
def pending(tasks, limit=5):
- names = [task.title for task in tasks]
+ names = [task.title for task in tasks if not task.done]
+ if not names:
+ return "全部完成"
return ", ".join(names[:limit])
@@ -5 +8,2 @@
-print(pending(tasks))
+for owner, tasks in groups.items():
+ print(f"{owner}: {pending(tasks)}")显示职责
- 流程导航
#d65b06darker· 粗体分支、循环、声明、指令与提前返回
- 阅读主体
#121212g0· 粗体函数、变量、属性、名称标签与表达式
- 注释说明
#121212g0· 斜体注释、文档说明与斜体文本
- 数据正文
#121212g0· 常规默认代码、字面量、标签与普通正文
- 辅助信息
#3e3e3dg3· 常规类型及其边界、修饰符、声明附注与参数标签
- 结构细节
#696968g6· 常规分隔符、字符串引号、排版边界与引用
底色
g16bg#fafaf8Diff上下文+ 新增− 删除! 修改