
RedNotebook 的本地日记文件实际采用 YAML 格式(虽含单引号转义和整数键等非典型写法),可直接使用标准 YAML 解析器(如 Node.js 的 js-yaml 或 Go 的 gopkg.in/yaml.v3)安全读取,无需自定义解析逻辑。
rednotebook 的本地日记文件实际采用 yaml 格式(虽含单引号转义和整数键等非典型写法),可直接使用标准 yaml 解析器(如 node.js 的 `js-yaml` 或 go 的 `gopkg.in/yaml.v3`)安全读取,无需自定义解析逻辑。
RedNotebook 将每月日记保存为纯文本文件(如 2016-01.txt),其内容看似类 JSON,实则严格遵循 YAML 1.1 规范:支持整数作为映射键(如 10:、11: 表示日期)、允许单引号包裹字符串('плов')、并使用单引号对内部特殊字符进行转义(如 '#переход\n\nЛегли...' 中的换行符被保留,'\' 表示字面单引号)。这种写法虽不常见于通用 YAML 示例,但完全合法——YAML 明确支持单引号风格字符串(single-quoted scalars),其中反斜杠仅用于转义单引号本身('' 表示一个 '),其余字符(包括换行、花括号、反斜杠)均按字面量处理。
✅ 正确解析方式如下:
Node.js 示例(使用 js-yaml):
npm install js-yaml
const fs = require('fs');
const yaml = require('js-yaml');
try {
const content = fs.readFileSync('/home/user/.rednotebook/data/2016-01.txt', 'utf8');
const data = yaml.load(content); // 自动处理单引号、整数键、多行字符串
console.log(data[11].text); // 输出: "#переход\n\nЛегли около часа\n\nВстали около 12 часов"
} catch (e) {
console.error('YAML parse error:', e.message);
}
Go 示例(使用 gopkg.in/yaml.v3):
package main
import (
"fmt"
"os"
"gopkg.in/yaml.v3"
)
func main() {
data, _ := os.ReadFile("/home/user/.rednotebook/data/2016-01.txt")
var entries map[interface{}]map[string]string
if err := yaml.Unmarshal(data, &entries); err != nil {
panic(err)
}
if entry, ok := entries[11]; ok {
fmt.Println(entry["text"]) // 输出同上,保留原始换行与格式
}
}
⚠️ 注意事项:
- 不要尝试用
JSON.parse()或正则替换单引号为双引号后解析——YAML 的语义(如隐式类型推断、锚点、折叠块等)远超 JSON 范围,强行转 JSON 会导致数据损坏或解析失败; - RedNotebook 官方明确声明其使用 YAML(见 Launchpad 讨论),且在文件损坏时会主动报 YAML 解析警告,印证其底层格式一致性;
- 若需编辑后重新写入,务必使用支持 YAML 输出的库(如
js-yaml.dump()或yaml.Marshal()),避免手动拼接破坏格式兼容性。
总结:该格式即标准 YAML,无需“逆向工程”或专用解析器。选用成熟 YAML 库即可稳健、准确地导入 RedNotebook 数据,为跨平台迁移、备份分析或 Web 前端集成提供可靠基础。










