Skip to content

Conversation

Achuan-2
Copy link
Member

@Achuan-2 Achuan-2 commented Sep 10, 2025

关联:#12387

功能改进

  1. 大纲持久化
  • data/storage文件夹下创建outline.json文件,记录文档展开的标题ID,最多记录2000个文档
  • 每个文档的大纲折叠状态持久化保存,子标题折叠后,再折叠父标题,展开父标题后,依然能保持子标题折叠状态
  • 再次打开同一文档时,自动恢复上次的折叠状态
  • 新建标题、更新标题文字、拖拽标题时,不更改已折叠的标题状态
  1. 支持alt click标题图标折叠/展开同级标题
  2. 新增标题展开特定层级按钮
PixPin_2025-09-14_17-59-47
  1. 新增保持当前标题展开按钮保持全部展开改为全部展开按钮
  • 为什么要改进

    • 保持全部展开这个功能我感觉用处不大,还很容易让用户以为就是普通的全部展开按钮,不知道是会一直持续起作用的,而且很多时候是不需要一直保持全部展开状态的,只是需要展开当前编辑的标题

      个人觉得把 保持全部展开改为普通的全部展开,然后新增一个 保持当前标题展开会更有用,就是当前我编辑这个标题,标题大纲定位到这个标题,就会自动展开到当前标题,把父标题都展开,不影响其他标题,这样就算一直起作用影响也小一点,不至于标题全部都展开了

  • 保持当前标题展开功能

    • 标题大纲定位到这个标题,就会自动展开到当前标题,把父标题都展开
    • 如果父节点是折叠状态,展开路径时会自动折叠兄弟节点,只展开当前节点路径,避免增加干扰,如果父节点是展开状态,则不影响兄弟节点折叠状态
PixPin_2025-09-14_18-00-04

PixPin_2025-09-12_11-22-22

  1. 右键click点击折叠图标,会折叠/展开所有子标题

PixPin_2025-09-17_07-01-37

  1. 大纲支持筛选功能

PixPin_2025-09-17_17-51-01

  • ✅如果标题命中筛选,这个标题的所有父标题展开,以显示出这个标题位置
  • ✅如果父标题命中筛选,子项都没有命中筛选,则折叠全部子项(依然可以展开显示)
  • ✅如果父标题命中筛选,子项也有命中筛选,则展开命中的子项,其他无关子项隐藏

- 添加折叠状态变化的实时保存功能
- 在文档更新时恢复折叠状态
- 保存拖拽前的折叠状态并在拖拽后恢复
- 更新本地存储结构以支持折叠状态
Copy link

Your PR was set to target master, PRs should be target dev
The base branch of this PR has been automatically changed to dev, please check that there are no merge conflicts

@github-actions github-actions bot changed the base branch from master to dev September 10, 2025 03:44
@TCOTC
Copy link
Contributor

TCOTC commented Sep 10, 2025

重启思源之后大纲能恢复吗?

@Achuan-2
Copy link
Member Author

重启思源之后大纲能恢复吗?

可以的,重启后localstorage依然还在的

@Achuan-2

This comment was marked as outdated.

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 11, 2025

实现了
alt click标题图标折叠/展开同级标题标题展开特定层级按钮

PixPin_2025-09-11_18-14-26

- 新增 resetLevelDisplay 方法以重置层级显示状态
- 更新层级控制的初始化逻辑,默认不显示层级
- 在文档切换时重置层级显示状态
- 添加用户主动层级控制标记
- 修改层级显示重置逻辑,仅在非用户操作时重置
- 更新层级控制滑条的点击事件处理
@Achuan-2 Achuan-2 changed the title ✨ 实现大纲持久化 实现标题大纲持久化、折叠同级标题 Sep 11, 2025
- 合并大纲存储为单一文件 outline.json
@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 11, 2025

改为在data/storage文件夹下创建outline.json文件,只需要新建一个json来统一管理,不需要像方案二一样,新文档都新建json


  • ❌方案一:localstorage

    localstorage 会多出 window.siyuan.storage["local-outline"].expand 字段,用来存储打开文档的标题 id

    随着打开文档数量增多,这个字段会越来越大

  • ❌方案二:在data/storage文件夹下创建outline/${docID}.json文件

    • data/storage文件夹下创建outline/${docID}.json文件,记录文档展开的标题ID,需要修改kernel\model\storage.gokernel\api\storage.gokernel\api\router.go文件
    • 修改app\src\layout\dock\Outline.ts,不用window.siyuan.storage["local-outline"].expand,而用api来获取outline.json的数据

    好处

    • 每个文档都一个json,文件小,读取json文件会快一点

    缺点

    • 会新建很多json文件
    • 太多json文件对复制文件夹、同步文件而言是一种负担
  • ✅方案三:在data/storage文件夹下创建outline.json文件

    • outline 标题展开信息改为保存在一个json文件里,在data/storage文件夹下创建outline.json文件,需要修改kernel\model\storage.gokernel\api\storage.go

    • 好处

      • 只需要新建一个json来统一管理,不需要像方案二一样,新文档都新建json
    • 缺点

      • 会越累积越大,如果文档很多,可能写入比较慢(不过一般人文档顶多也就几千,其实也大不到哪里去)

        可以加一个机制,outline.json只存储最近打开的前1000个文档,或者文档超过一年都没打开,就删除折叠标题信息,其实也没必要记住所有文档的标题折叠信息,一个文档长期不打开,就没必要记录了(可以在清理数据

  • 方案四:写入sy文件

    • 这个比较适合思源官方来做

    • 缺点

      • 需要持久化标题大纲的文档,文件一般比较大,读写json会比较慢,我觉得还是独立开比较好

@TCOTC
Copy link
Contributor

TCOTC commented Sep 11, 2025

outline.json 是不是会越来越大?参与同步吗?

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 11, 2025

outline.json 是不是会越来越大?参与同步吗?

几百万行的json才算大,有1w文档都算超级多的了,没多少用户有这个量级

7w字的思源笔记sy文件,40w字符,才590k大小,倒是不必担心文件大小
2.
storage文件参与同步的

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 11, 2025

可以加一个机制,outline.json只存储最近打开的前2000个文档,或者文档超过一年都没打开,就删除折叠标题信息,其实也没必要记住所有文档的标题折叠信息,一个文档长期不打开,就没必要记录了

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 12, 2025

新增保持当前标题展开按钮,保持全部展开改为全部展开按钮

舒服多了

PixPin_2025-09-12_11-22-22

@Achuan-2 Achuan-2 changed the title 实现标题大纲持久化、折叠同级标题 实现标题大纲持久化、折叠展开同级标题、添加保持当前标题展开按钮 Sep 12, 2025
@Achuan-2 Achuan-2 changed the title 实现标题大纲持久化、折叠展开同级标题、添加保持当前标题展开按钮 实现标题大纲持久化、折叠展开同级标题、添加保持当前标题展开按钮 Sep 12, 2025
- 超过两级折叠,也能都展开
- 如果父节点折叠,展开时自动折叠兄弟节点,只展开当前节点路径,如果父节点是展开状态,则不影响兄弟节点折叠状态
@Achuan-2
Copy link
Member Author

新增:右键click点击折叠图标,会展开所有子标题

@Hzz-0802
Copy link

有可能,添加一个搜索过滤按钮吗

@CongSec
Copy link

CongSec commented Sep 15, 2025

有可能,添加滚动定位大纲的功能吗

@Achuan-2
Copy link
Member Author

Achuan-2 commented Sep 15, 2025

有可能,添加滚动定位大纲的功能吗

建议直接和官方提issue

  1. 我不需要滚动定位大纲的功能,我添加的“始终展开当前标题”功能对我而言就已经满足需求了
  2. 我都不知道这个pr能否被采纳,不改进其他功能了

@wish5115
Copy link

有可能,添加滚动定位大纲的功能吗

滚动时自动定位大纲位置 https://ld246.com/article/1757773937694 试试这个

@Achuan-2
Copy link
Member Author

新增:大纲支持筛选功能

PixPin_2025-09-17_17-51-01

- 添加 showAllDescendants 函数以显示所有子标题
- 修改 processUL 函数以在父标题命中时显示所有子标题
- 确保未命中的子标题隐藏
- ✅如果标题命中筛选,这个标题的所有父标题展开,以显示出这个标题位置
- ✅如果父标题命中筛选,子项都没有命中筛选,则折叠全部子项(依然可以展开显示)
- ✅如果父标题命中筛选,子项也有命中筛选,则展开命中的子项,其他无关子项隐藏
@Achuan-2 Achuan-2 changed the title 实现标题大纲持久化、折叠展开同级标题、添加保持当前标题展开按钮 实现标题大纲持久化、折叠展开同级标题、添加保持当前标题展开按钮、支持大纲筛选 Sep 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants