添加新作品指南

无论你是谁,都能为 Sparkle 的璀璨星空增添一颗星星!

本文档详细介绍了如何为 Sparkle 项目添加新的文学作品数据。

📖 目录

  1. 对于非程序员
  2. 基本流程
  3. 数据结构详解
  4. 目录结构
  5. 数据文件格式
  6. 示例
  7. 数据准备工具
  8. 常见问题
  9. 总结

👥 对于非程序员

如果你不熟悉 Git、GitHub 或编程,但希望为 Sparkle 添加新的文学作品数据,你可以通过以下方式:

GitHub Issues 提需求

  1. 访问 GitHub Issues 页面
  2. 点击 "New Issue" 按钮创建新 Issue
  3. 在标题中明确说明你想要添加的作品名称
  4. 在描述中提供详细信息
  5. 记得添加book-wanted 标签

Gitee Issues(国内用户)

  1. 访问 Gitee Issues 页面
  2. 创建新的 Issue
  3. 提供与 GitHub Issues 相同的信息
  4. 记得添加book-wanted 标签
  5. 注意:请在 GitHub 提交 Pull Request。

你可以提供的数据形式

📋 基本流程

  1. 创建书籍目录:在 data/ 目录下创建新的书籍目录
  2. 创建版本索引:在书籍目录下创建 index-zh.js 文件
  3. 创建人物数据:在书籍目录下创建版本数据文件(如 default.js
  4. 更新作者索引:在 data/index-zh.js 中添加或更新作者和作品信息
  5. 测试验证:在本地运行项目,验证数据是否正确加载
  6. 提交贡献:通过 Pull Request 提交你的贡献

🏗️ 数据结构详解

Sparkle 使用三层数据结构来组织作品数据:

第一层:作者索引

data/index-zh.js
  • 包含所有作者的基本信息
  • 每个作者可以有多部作品
  • 用于生成页面的作者和作品下拉菜单

第二层:版本索引

data/[book-id]/index-zh.js
  • 包含特定作品的所有可用版本
  • 每个版本可以有多个翻译或改编
  • 用于生成版本选择菜单

第三层:人物关系数据

data/[book-id]/[version].js
  • 包含具体的人物节点和关系边
  • 使用 Cytoscape.js 的图数据结构
  • 直接用于可视化渲染

📁 目录结构

data/
├── index-zh.js                    # 作者和作品索引
└── [book-id]/                     # 书籍目录(使用唯一ID)
    ├── index-zh.js                # 版本索引
    └── [version].js               # 人物关系数据(如 default.js)

命名规范

📄 数据文件格式

1. 作者索引文件格式 (data/index-zh.js)

export default [
  {
    id: "202603262231",                    // 作者唯一ID
    name: "费奥多尔·米哈伊洛维奇·陀思妥耶夫斯基", // 作者姓名
    biography: "1821年11月11日—1881年2月9日", // 作者生平
    description: "到后来,他竟作为罪孽深重的罪人,同时也是残酷的拷问官而出现了...", // 作者介绍
    books: [                               // 作品列表
      {
        id: "202603262212",                // 作品唯一ID
        name: "卡拉马佐夫兄弟",             // 作品名称
      },
      {
        id: "202603262213",
        name: "群魔",
      }
    ]
  }
];

2. 版本索引文件格式 (data/[book-id]/index-zh.js)

export default [
  {
    version: "default",                    // 版本标识符
    name: "荣如德-上海译文-2012",           // 版本显示名称
    description: "不错~不错~",              // 版本描述(可选)
  }
  // 可以添加更多版本
];

3. 人物关系数据格式 (data/[book-id]/[version].js)

export default [
  // 节点(人物)
  {
    data: {
      id: "a1",                            // 人物唯一ID
      name: "费奥多尔·巴甫洛维奇·卡拉马佐夫", // 人物姓名
      gender: "男",                         // 性别(男/女)
      nickname: ["老卡拉马佐夫"],           // 别名列表(可选)
      // 其他自定义字段...
    }
  },

  // 边(关系)
  {
    data: {
      id: "e1",                            // 关系唯一ID
      source: "a1",                        // 源节点ID
      target: "a2",                        // 目标节点ID
      name: "父子关系",                     // 关系描述
      // 其他自定义字段...
    }
  }
];

📚 示例:为《红楼梦》添加数据

1. 创建书籍目录

data/
└── 202501010001/          # 《红楼梦》目录

2. 创建版本索引

export default [
  {
    version: "default",
    name: "人民文学出版社-2008",
    description: "经典版本",
  }
];

3. 创建人物数据

export default [
  // 人物节点
  {
    data: {
      id: "h1",
      name: "贾宝玉",
      gender: "男",
      nickname: ["宝玉", "怡红公子"],
    }
  },
  // ... 更多人物
];

4. 更新作者索引

export default [
  // 原有作者...
  {
    id: "202501010000",
    name: "曹雪芹",
    biography: "约1715年—约1763年",
    description: "清代小说家,《红楼梦》的作者...",
    books: [
      {
        id: "202501010001",
        name: "红楼梦",
      }
    ]
  }
];

🛠️ 数据准备工具

手动准备

对于小型作品,可以直接编辑 JSON 文件创建数据。

推荐工具

数据转换示例(Python)

import json

# 示例:从CSV转换
characters = [
    {"id": "c1", "name": "张三", "gender": "男"},
    {"id": "c2", "name": "李四", "gender": "女"}
]

relationships = [
    {"id": "r1", "source": "c1", "target": "c2", "name": "夫妻"}
]

# 组合数据
elements = []
for char in characters:
    elements.append({"data": char})
for rel in relationships:
    elements.append({"data": rel})

# 保存为JS文件
with open("default.js", "w", encoding="utf-8") as f:
    f.write("export default ")
    json.dump(elements, f, ensure_ascii=False, indent=2)

❓ 常见问题

Q1: ID 命名有什么要求?

ID 应该:

  • 在文件中保持唯一性
  • 使用字母数字组合
  • 避免特殊字符
  • 建议使用有意义的缩写(如 jby 代表贾宝玉)
Q2: 可以添加自定义字段吗?

是的,你可以在 data 对象中添加任意字段,例如:

{
  data: {
    id: "c1",
    name: "角色名",
    custom_field: "自定义值",  // 自定义字段
    age: 25,                   // 自定义字段
    role: "主角"               // 自定义字段
  }
}
Q3: 如何处理复杂的人物关系?

对于复杂关系:

  1. 使用多种关系类型(父子、夫妻、师徒等)
  2. 可以在关系名称中详细描述
  3. 考虑添加关系强度属性
  4. 使用 group 字段区分节点和边
Q4: 如何测试添加的数据?

测试步骤:

  1. 启动本地服务器
  2. 访问项目页面
  3. 选择添加的作者和作品
  4. 验证图谱是否正确显示
  5. 点击节点查看详细信息
Q5: 数据量很大怎么办?

对于大型作品:

  1. 分版本处理不同章节或部分
  2. 使用脚本批量处理数据
  3. 考虑数据分片加载
  4. 确保性能优化

✨ 总结

贡献方式对比

用户类型 推荐方式 技术要求 处理速度
程序员 Pull Request 较高 快(直接添加)
非程序员 Issues 提需求 中(等待他人实现)
国内用户 Gitee Issues 中(需要同步到 GitHub)

核心要点

愿景

我们希望 Sparkle 成为一个真正社区驱动的项目,让每个人都能参与进来:

无论你是谁,都能为 Sparkle 的璀璨星空增添一颗星星!