feat(halo-plugin): 新增文章导入、删除和标签分类管理功能

添加从本地 Markdown 文件导入创建文章的功能,支持文件预览和自动发布选项
新增文章删除命令,支持选择性删除 Halo 文章或本地文件
添加标签和分类管理功能,支持创建、编辑和删除操作
更新国际化文案,支持新功能的多种语言界面
扩展服务层以支持文章导入、删除和标签分类管理 API 调用
更新插件版本至 2.1.1 并更新作者信息
This commit is contained in:
2026-04-26 17:23:35 +08:00
parent 8ccc32be0b
commit 5c4a16dc3a
28 changed files with 2161 additions and 99 deletions
@@ -0,0 +1,211 @@
# Obsidian Halo 插件功能增强计划
## 一、功能对比分析
### Halo CLI 已有功能
| 分类 | 功能 | CLI 支持 |
|------|------|---------|
| **文章管理** | 发布文章 | ✅ 完整 |
| | 更新文章 | ✅ 完整 |
| | 删除文章 | ✅ 完整 |
| | 列出文章列表 | ✅ 完整 |
| | 查看文章详情 | ✅ 完整 |
| | 批量操作 | ✅ PowerShell 脚本 |
| **导出/导入** | 导出为 JSON | ✅ 完整 |
| | 导出为 Markdown | ✅ 完整 |
| | 从 JSON 导入 | ✅ 完整 |
| | 从 Markdown 导入 | ✅ 完整 |
| **标签管理** | 列出标签 | ✅ 完整 |
| | 创建标签 | ✅ 完整 |
| | 更新标签 | ✅ 完整 |
| | 删除标签 | ✅ 完整 |
| | 为文章设置标签 | ✅ 完整 |
| **分类管理** | 列出分类 | ✅ 完整 |
| | 创建分类 | ✅ 完整 |
| | 更新分类 | ✅ 完整 |
| | 删除分类 | ✅ 完整 |
| | 设置优先级 | ✅ 完整 |
| **其他内容** | 单页管理 | ✅ 完整 |
| | 搜索内容 | ✅ 完整 |
| **系统管理** | 附件管理 | ✅ 完整 |
| | 备份管理 | ✅ 完整 |
| | 动态管理 | ✅ 完整 |
| | 评论管理 | ✅ 完整 |
| | 插件管理 | ✅ 完整 |
| | 主题管理 | ✅ 完整 |
---
## 二、Obsidian 插件当前功能
| 分类 | 功能 | 状态 |
|------|------|------|
| **文章管理** | 发布文章 | ✅ 已实现 |
| | 更新文章(同步 Halo 到本地) | ✅ 已实现 |
| | 列出文章列表 | ❌ 缺失 |
| | 查看文章详情 | ❌ 缺失 |
| | 删除文章 | ❌ 缺失 |
| | 批量发布 | ❌ 缺失 |
| **图片上传** | 自动上传图片 | ✅ 已实现(新增) |
| **标签/分类** | 为文章设置标签 | ✅ 已实现 |
| | 为文章设置分类 | ✅ 已实现 |
| | 创建标签 | ❌ 缺失 |
| | 创建分类 | ❌ 缺失 |
| | 管理标签/分类 | ❌ 缺失 |
| **导出/导入** | 从 Markdown 导入 | ❌ 缺失 |
| | 导出为 Markdown | ❌ 缺失 |
| | 导出为 JSON | ❌ 缺失 |
| **其他** | 单页管理 | ❌ 缺失 |
| | 搜索 | ❌ 缺失 |
---
## 三、功能优先级建议
### 高优先级(核心功能)
1. **文章列表查看**
- 在命令面板中显示 Halo 文章列表
- 支持分页、筛选(草稿/已发布)
- 快速预览文章信息
2. **导入功能增强**
- 支持从本地 Markdown 文件导入创建文章
- 智能解析文件路径和文件名
3. **文章删除功能**
- 添加删除命令(需二次确认)
- 支持删除本地文件或仅删除 Halo 文章
### 中优先级(常用功能)
4. **批量操作**
- 批量发布多篇文章
- 批量同步已发布文章
- 批量管理(删除、更新标签等)
5. **标签/分类管理**
- 创建新标签/分类
- 查看现有标签/分类列表
- 更新/删除标签/分类
6. **导出功能**
- 导出文章为 Markdown
- 导出文章为 JSON(备份用)
### 低优先级(增强功能)
7. **搜索功能**
- 搜索 Halo 文章
- 快速定位文章
8. **单页管理**
- 发布/管理独立页面
- 与文章类似的工作流
---
## 四、实施步骤
### 第一阶段:核心补充(1-2 周)
#### 任务 1:文章列表功能
- [ ] 创建文章列表 Modal
- [ ] 实现分页、筛选功能
- [ ] 添加快速操作按钮(查看、编辑、删除)
- [ ] 集成到命令面板
#### 任务 2:导入功能
- [ ] 实现从文件导入创建文章
- [ ] 智能解析 Markdown 文件
- [ ] 支持选择文件对话框
#### 任务 3:删除功能
- [ ] 添加删除命令
- [ ] 二次确认机制
- [ ] 删除选项(仅 Halo / 仅本地 / 全部)
### 第二阶段:常用功能(2-4 周)
#### 任务 4:批量操作
- [ ] 批量选择界面
- [ ] 批量发布队列
- [ ] 进度显示和错误处理
#### 任务 5:标签/分类管理
- [ ] 标签管理 Modal
- [ ] 分类管理 Modal
- [ ] 创建/编辑/删除功能
#### 任务 6:导出功能
- [ ] 导出为 Markdown
- [ ] 导出为 JSON(备份)
- [ ] 选择保存路径
### 第三阶段:增强功能(4+ 周)
#### 任务 7:搜索功能
- [ ] 文章搜索 Modal
- [ ] 快速筛选和定位
#### 任务 8:单页管理
- [ ] 单页发布命令
- [ ] 单页列表查看
- [ ] 单页导入/导出
---
## 五、技术实现建议
### API 端点
| 功能 | API 端点 |
|------|----------|
| 列出文章 | `GET /apis/uc.api.content.halo.run/v1alpha1/posts` |
| 获取文章 | `GET /apis/uc.api.content.halo.run/v1alpha1/posts/{name}` |
| 删除文章 | `DELETE /apis/uc.api.content.halo.run/v1alpha1/posts/{name}` |
| 列出标签 | `GET /apis/content.halo.run/v1alpha1/tags` |
| 创建标签 | `POST /apis/content.halo.run/v1alpha1/tags` |
| 列出分类 | `GET /apis/content.halo.run/v1alpha1/categories` |
| 创建分类 | `POST /apis/content.halo.run/v1alpha1/categories` |
### 文件结构建议
```
src/
├── commands/ # 命令相关
│ ├── publish.ts
│ ├── delete.ts
│ ├── list.ts
│ ├── import.ts
│ └── export.ts
├── modals/ # 弹窗相关
│ ├── post-list-modal.ts
│ ├── tag-manager-modal.ts
│ ├── category-manager-modal.ts
│ └── search-modal.ts
├── service/ # 服务层
│ ├── index.ts # 现有
│ └── image-uploader.ts # 现有
└── utils/ # 工具层
├── image.ts # 现有
└── ...
```
---
## 六、建议实施顺序
1. **先实现文章列表**(最常用)
2. **再实现导入功能**(补全工作流)
3. **实现删除功能**(完整性)
4. **实现批量操作**(效率提升)
5. **实现标签/分类管理**(内容组织)
6. **实现导出功能**(备份需求)
7. **实现搜索功能**(快速定位)
8. **实现单页管理**(可选)
---
请确认需要实现哪些功能,我将制定详细的技术方案。
+33
View File
@@ -0,0 +1,33 @@
# Markdown 文件导入功能检查清单
## 代码实现检查
- [ ] `src/commands/import-markdown.ts` 文件创建完成
- [ ] 文件选择器正确实现(仅显示 .md 文件)
- [ ] 文件读取和解析逻辑正确
- [ ] 文章创建逻辑正确调用 Halo API
- [ ] `src/modals/file-preview-modal.ts` 文件创建完成
- [ ] 文件内容预览正确显示
- [ ] frontmatter 信息正确显示
- [ ] 导入/取消按钮功能正常
- [ ] "导入后发布"选项功能正常
## 集成检查
- [ ] `src/main.ts` 中命令注册完成
- [ ] 命令名称符合国际化规范
- [ ] 命令在命令面板中可见
## 国际化检查
- [ ] 英文文案添加完成
- [ ] 简体中文文案添加完成
- [ ] 繁体中文文案添加完成
## 测试检查
- [ ] 编译通过无错误
- [ ] 插件文件正确复制到 Obsidian 插件目录
- [ ] 文件选择器测试通过
- [ ] 导入功能测试通过(创建草稿)
- [ ] 导入功能测试通过(导入并发布)
+96
View File
@@ -0,0 +1,96 @@
# Markdown 文件导入功能规格说明
## Why
当前 Obsidian Halo 插件只支持从 Obsidian 发布文章到 Halo,但没有提供从本地 Markdown 文件导入创建文章的功能。用户可能希望:
1. 直接从文件系统导入已存在的 Markdown 文件
2. 从其他平台迁移文章时批量导入
3. 快速创建新文章时选择本地文件而非在编辑器中编写
## What Changes
- 新增命令:直接从 Markdown 文件导入创建 Halo 文章
- 新增文件选择器:支持选择本地 .md 文件
- 新增预览功能:导入前预览文件内容和 frontmatter
- 新增选项:导入时是否立即发布
## Impact
- Affected specs:
- 文章发布功能:提供新的文章创建入口
- 设置功能:可能需要添加导入相关配置
- Affected code:
- 新增 `src/commands/import-markdown.ts`:导入命令
- 新增 `src/modals/file-preview-modal.ts`:文件预览弹窗
- 修改 `src/main.ts`:注册新命令
- 修改 `src/i18n/locales/*.json`:国际化文案
## ADDED Requirements
### Requirement: 从 Markdown 文件导入
系统 SHALL 提供从本地 Markdown 文件导入创建 Halo 文章的功能。
#### Scenario: 选择文件导入
- **WHEN** 用户执行"从 Markdown 文件导入"命令
- **THEN** 系统显示文件选择器,允许用户选择 .md 文件
#### Scenario: 预览和确认
- **WHEN** 用户选择了一个 Markdown 文件
- **THEN** 系统显示文件内容预览(标题、内容摘要、frontmatter
- **AND** 显示"导入"和"取消"按钮
#### Scenario: 导入成功
- **WHEN** 用户点击"导入"按钮
- **THEN** 系统读取文件内容
- **AND** 解析 frontmatter 和正文
- **AND** 调用 Halo API 创建文章
- **AND** 显示导入成功通知
#### Scenario: 导入选项
- **WHEN** 用户可以勾选"导入后立即发布"选项
- **THEN** 文章创建后自动发布
## MODIFIED Requirements
### Requirement: 命令面板扩展
现有命令列表扩展,新增:
- `Halo: 从 Markdown 文件导入` - 打开文件选择器进行导入
## REMOVED Requirements
---
## 技术实现细节
### Obsidian 文件选择器 API
```typescript
const filePicker = app.createFilePicker();
filePicker.setFilter(file => file.extension === 'md');
filePicker.onChange = async (files) => {
// 处理选中的文件
};
filePicker.open();
```
### 文件读取
```typescript
const content = await app.vault.read(file);
```
### Frontmatter 解析
参考现有的 `src/utils/yaml.ts` 实现,或使用 gray-matter 库。
### API 端点
```
POST /apis/uc.api.content.halo.run/v1alpha1/posts
```
请求体格式与发布功能相同。
+47
View File
@@ -0,0 +1,47 @@
# Markdown 文件导入功能任务清单
## 任务列表
- [ ] 任务 1:创建导入命令模块 `src/commands/import-markdown.ts`
- [ ] 子任务 1.1:实现 Obsidian 文件选择器调用
- [ ] 子任务 1.2:实现文件读取和解析
- [ ] 子任务 1.3:实现文章创建逻辑
- [ ] 任务 2:创建文件预览弹窗 `src/modals/file-preview-modal.ts`
- [ ] 子任务 2.1:显示文件内容预览
- [ ] 子任务 2.2:显示 frontmatter 信息
- [ ] 子任务 2.3:添加导入/取消按钮
- [ ] 子任务 2.4:添加"导入后发布"选项
- [ ] 任务 3:更新主程序注册命令 `src/main.ts`
- [ ] 子任务 3.1:导入新命令模块
- [ ] 子任务 3.2:注册"从 Markdown 文件导入"命令
- [ ] 任务 4:添加国际化文案
- [ ] 子任务 4.1:更新英文文案 `src/i18n/locales/en.json`
- [ ] 子任务 4.2:更新简体中文文案 `src/i18n/locales/zh-cn.json`
- [ ] 子任务 4.3:更新繁体中文文案 `src/i18n/locales/zh-tw.json`
- [ ] 任务 5:编译和测试
- [ ] 子任务 5.1:运行 `pnpm build` 确保编译通过
- [ ] 子任务 5.2:复制编译产物到插件目录
- [ ] 子任务 5.3:手动测试导入功能
---
## 任务依赖关系
- [任务 2] 和 [任务 3] 可并行开发
- [任务 1] 依赖 [任务 2] 完成
- [任务 4] 可与任何任务并行
- [任务 5] 需要 [任务 1]、[任务 3] 完成
---
## 实现顺序建议
1. 先完成 [任务 2](文件预览弹窗)- 核心 UI
2. 再完成 [任务 1](导入命令模块)- 核心逻辑
3. 然后完成 [任务 3](注册命令)
4. [任务 4] 可与 [任务 1] 并行
5. 最后 [任务 5](测试)