Quorafind / Outliner.MD

https://outliner.md
161 stars 2 forks source link

[Feature Request] Adding support for disabling editing for specific block. #19

Closed Moyf closed 4 months ago

Moyf commented 4 months ago

Requirement

Is it possible to support a method to disable the editable feature of a specific reference block? Even when plugins are enabled, I still have some reference blocks that are purely for viewing, do not need editing, and I don't want to accidentally modify them.

I hope to disable editing for these reference blocks (rendered in a traditional reading mode).

Idea

For example, using an alias like |readonly to specify this "read-only, non-editable" ? 🤔 image


Additionally, conversely, I hope to add classes to the basic DOM to differentiate between "editable reference blocks" and "non-editable reference blocks", so that different styles can be applied to each.

需求

能不能支持某种方法去「禁用」某个引用块的可编辑功能? 在启用插件的情况下,我仍然会有一部分「单纯引用来看,不需要编辑,也不想误操作」的引用块,希望能针对这种引用块禁用编辑(按传统的 reading 模式渲染)

想法

例如通过 |readonly 的别名去指定这个「只读,不可编辑」🤔 image


另外,以此相对的,希望能增加基础 dom 的 class,区分「可编辑的引用块」和「不可编辑的引用块」,这样能分别添加不同的样式应用。

enneaa commented 4 months ago

如果是实时预览模式,按道理应该所有的内容都是可以编辑的。如果是阅读模式,那所有的内容都不可编辑。为啥需要这一个块引用不可编辑,如果不需要编辑也不会去编辑,什么情况下会误操作呢

Moyf commented 4 months ago

如果是实时预览模式,按道理应该所有的内容都是可以编辑的。如果是阅读模式,那所有的内容都不可编辑。为啥需要这一个块引用不可编辑,如果不需要编辑也不会去编辑,什么情况下会误操作呢

我个人很少使用阅读模式,大部分情况下都是在实时预览模式 0 0

然后 LiveEditing 中的 原生 Embed引用块就是只能预览,不能编辑: image

现在我想做一个汇总页,把多个笔记的内容摘要放在一起方便浏览,这个时候页面内的嵌入的 ![[笔记.md]] 我都只想查看,并不需要编辑。 与此同时,页面本身可能会加一些说明的文本,所以不想开阅读模式。

这个场景下,如果能自己指定「这些引用块按原来的预览模式渲染就好了」会灵活很多!


至于误触的话,文档太长了就会担心误触的……可以理解为一种以防万一吧。 比如说鼠标中键拖动,目前原生嵌入(作为阅读模式渲染)是不会影响的,编辑模式下就会变成拖选文本: 907966b7-966d-4666-b6fc-094724b14b5b

exam-ple commented 4 months ago

@enneaa 这种双向同步修改, 有可能引起数据丢失的 比如a为源数据, b引用了它, 但是后面又觉得没必要引用了, 于是把b删了, 如果操作不当就有可能引起a也会被删 再者, 如果c也引用了a, 是否删除c也会引起b被删除呢?(目前尚未测试)

我目前测试的情况是: ![[源文#^code]] ←暂且称为d 渲染的源文内容 ←暂且称为e

如果删除d, 或d和e一起删, 这样不会引起源文被删, 但是如果不小心只删除了e的话, 源文就会被删 目前d和e里的链接图标经渲染后, 鼠标或光标不靠近的话是看不见的, 不易分清是源文还是引用文, 很容易只删除e, 导致源文也被误删

所以, 建议: 对于引用来的文字 (1)弄个标识, 能一眼就看出它是从其它地方引用来的, 以区分源文本 (2)选择双向同步修改, 还是引用来的文字不能修改, 弄个设置选项, 让用户根据自己的情况设定(目前设置里虽然有'editable block embeds'选项, 但似乎不起作用)

Quorafind commented 4 months ago

关于引用块的明显标识,之前增加过,后边主动去除了,如果需要,自行增加 CSS: https://docs.outliner.md/pages/20240515002542

Quorafind commented 4 months ago

0.1.2 已支持,教程:https://docs.outliner.md/pages/20240515233501

exam-ple commented 4 months ago

@Quorafind 非常感谢 上面两个链接正确的是: https://docs.outliner.md/zh-CN/style-for-embedded-editing https://docs.outliner.md/zh-CN/read-only-mode

Quorafind commented 4 months ago

@Quorafind 非常感谢 上面两个链接正确的是: https://docs.outliner.md/zh-CN/style-for-embedded-editing https://docs.outliner.md/zh-CN/read-only-mode

都更新为唯一链接了。

exam-ple commented 4 months ago

@Quorafind 能否直接在设置里弄个"嵌入块只读模式"选项呢? 也就是让所有嵌入块都默认为"只读模式" 目前最新版本(0.1.2)要一一手动添加"readonly", 对于希望所有引用过来的文字都不可编辑的用户来说, 是比较麻烦的

设置里有个'editable block embeds'选项, 我以为打开就是嵌入块能编辑, 关上就是嵌入块不能编辑, 现在是关上的话插件对嵌入块就不起作用了

Quorafind commented 4 months ago

@Quorafind 能否直接在设置里弄个"嵌入块只读模式"选项呢? 也就是让所有嵌入块都默认为"只读模式" 目前最新版本(0.1.2)要一一手动添加"readonly", 对于希望所有引用过来的文字都不可编辑的用户来说, 是比较麻烦的

设置里有个'editable block embeds'选项, 我以为打开就是嵌入块能编辑, 关上就是嵌入块不能编辑, 现在是关上的话插件对嵌入块就不起作用了

关于后边的设置,想问一下为什么既不想要编辑,又希望保持块嵌入样式?

Moyf commented 4 months ago

@Quorafind 能否直接在设置里弄个"嵌入块只读模式"选项呢? 也就是让所有嵌入块都默认为"只读模式" 目前最新版本(0.1.2)要一一手动添加"readonly", 对于希望所有引用过来的文字都不可编辑的用户来说, 是比较麻烦的 设置里有个'editable block embeds'选项, 我以为打开就是嵌入块能编辑, 关上就是嵌入块不能编辑, 现在是关上的话插件对嵌入块就不起作用了

关于后边的设置,想问一下为什么既不想要编辑,又希望保持块嵌入样式?

我这边加一个自己的想法,这个可能取决于用户的「嵌入块比例」。

如果我 100% 不需要可编辑嵌入块的功能,但又想要 Outliner.md 的其他功能,我可能需要这种「关闭该特性」的开关; 如果我有 20% 的编辑块需要锁住,80% 的编辑块可编辑,那目前这样添加 readonly 就可以满足需求; 但要是反过来,我只有 10% 的编辑块需要可编辑的特性,其他 90% 希望保持原来的渲染,那反而是用白名单制度:「默认不可编辑,添加 editable 的标记才能编辑」会更适合。

(相当于切换“默认模式”的选项吧)

exam-ple commented 4 months ago

@Quorafind 同步编辑的功能本身是好的, 但是我试用的感受是, 就目前版本而言, 在嵌入块这边编辑修改的话, 如果操作稍不留神, 源文可能会被误删或者会产生自己都不知情的变化. 比如:

(1)test2的b是从test1中引用过来的, 如果不想再引用它了, 一开始以为把test2中的'b ^5xu3tm'删了就完事了, 殊不知这一删把源文(test1的'b ^5xu3tm')也给删没了(因为编辑是同步的). 我只是不想再引用它, 并不想把源文删了. 当然现在我知道, 正确的删法应该是把test2中的'![[test1#^5xu3tm]]'删掉才对, 但因为它被渲染后是看不见的, 有时候会没想到应该去删它 240518-220812

(2)在test2的'b ^5xu3tm'后面添加内容的话(比如下图添加了数字1), test1的相应位置也会被同步添加, 一开始以为这就完成双向同步添加了, 殊不知该添加内容在test2中是无效的, 因为test2的嵌入语句仍然是'![[test1#^5xu3tm]]', 仍然只会引用test1中^5xu3tm前面的内容, 之后的内容不会被引用, 所以test2刷新后添加的数字1在test2中就会消失, 但在test1中仍然会被保留. 当然现在我知道正确的添加方法应该是在test2渲染的块编码^5xu3tm之前添加内容才有效 240518-224547

(3)如果test2渲染的块编码^5xu3tm被不小心删了个字母或者加了个什么, 那么test1的块编码也会被同步修改, 但因为test2的嵌入语句仍然是'![[test1#^5xu3tm]]', 所以此时嵌入就会失效(会被渲染成![[test1]]). 因为只是块编码多了或少了个字母, 有时其实是比较难察觉的, 甚至在想怎么渲染出不一样的东西出来了.

上面只是一部分, 基于这些, 有时候我宁愿多麻烦一步, 让嵌入块保持不可编辑状态, 转跳到源文再修改, 让源文是唯一可修改的地方, 这样会更保险些, 心里上也会更踏实些, 因为数据的准确性应该排在操作方便之前.

当然, 随着版本的改进, 后面足够稳定的话, 同步编辑是个非常不错的功能. 另外, 这个插件能够引用一个区域, 这个也是非常吸引人的地方.

除了上面说的, 发现了几个新问题: (4)用本插件语法写的嵌入(比如下图test2中的![[test1|o-f364]]), 在文件最下方的"链接当前文件"里的渲染好像是有问题的, 实际只渲染了![[test1]], 并没有渲染到o-f364 240518-220620

(5)点击文件最下方的"链接当前文件"里的项目时, 原本是可以转跳到对应文件的, 开启本插件backlinks相关功能后就不能转跳了, 转跳功能能否再恢复过来呢?

(6)用本插件语法写的嵌入, 如果源文件块编码的相关内容被剪切到其它文件的话, 嵌入链接就会失效, 这个有办法解决吗?

(7)不知是否与本插件有关, 用上后ob会有点卡, 风扇会一直不停的转, 关闭本插件再重启ob就会好了, 不知其它小伙伴是否有这个情况

最后感谢 @Quorafind 的辛勤劳动, 这个插件在论坛里被广大ob爱好者呼吁好几年了, 一定会爆的😄

enneaa commented 4 months ago

@enneaa 这种双向同步修改, 有可能引起数据丢失的 比如a为源数据, b引用了它, 但是后面又觉得没必要引用了, 于是把b删了, 如果操作不当就有可能引起a也会被删 再者, 如果c也引用了a, 是否删除c也会引起b被删除呢?(目前尚未测试)

我目前测试的情况是: ![[源文#^code]] ←暂且称为d 渲染的源文内容 ←暂且称为e

如果删除d, 或d和e一起删, 这样不会引起源文被删, 但是如果不小心只删除了e的话, 源文就会被删 目前d和e里的链接图标经渲染后, 鼠标或光标不靠近的话是看不见的, 不易分清是源文还是引用文, 很容易只删除e, 导致源文也被误删

所以, 建议: 对于引用来的文字 (1)弄个标识, 能一眼就看出它是从其它地方引用来的, 以区分源文本 (2)选择双向同步修改, 还是引用来的文字不能修改, 弄个设置选项, 让用户根据自己的情况设定(目前设置里虽然有'editable block embeds'选项, 但似乎不起作用)

如果是顾虑双向同步编辑会丢失数据,最好的办法应该还是关闭嵌入块可编辑的功能。