Markdown 之空白压缩

你是否苦恼编辑模式空格空行在阅读模式莫名失踪?你是否习惯自由缩进写出列表?你是否还正面临如下问题:

在你努力尝试之前,也许你需要了解什么是“空白压缩(White Space Collapse)”。

4 个赞

Markdown 是一种标记语言,

类似于换行、列表符号等等,这些在 Word 以及各种常见的笔记应用中只是作为内容;

但在 Markdown 里,这些也是识别的语法。

Obsidian 便是一款基于 Markdown 的编辑器。

它的编辑模式类似“源代码”,而阅读模式类似“输出结果”。

它的渲染显示,始终受到 Markdown 这简化的 HTML 的“限制”,或者说,规范。

“空白压缩”是 Markdown 重要的特性。

任何紧邻前后的空格和 Tab ——不管是 1 个还是 100 个——都会被一起清理,压缩到只剩一个空格

所以,你必须在段落间空一行,也即使用连续 2 个换行符,才能在阅读模式获得一个新的段落块(<p>),

因为 1 个换行符只会变成 1 个空格。

20231109_033335

而当其间没有内容分隔时,不论你在编辑模式连续换多少行,阅读模式都将渲染出唯一的一行。

image

所以,你看到不加标号的文本正好放在列表序号下,以为是换行缩进了;

image

但在编辑器眼里,其实只有一个“内容中间有空格的一行的列表项”,

只不过是给用户折行显示出来了。

不空一行 = 无法被识别为新的段落。不加标号 = 无法被识别为新的列表。

识别不了 = 没有分出新的块。不加标号的缩进 = 没有缩进。

1. 标题1
    段落1

等于

1. 标题1
段落1

等于

  1. 标题1 段落1

没有分出新的块,对于程序是同一个东西,也就无法分开引用、应用不同的样式、运行不同的脚本。

不论如何,Obsidian 首先是一款 Markdown 编辑器,

因此不能超越标记语言以纯文本实现富文本付出的规范。

其他规范,例如表格前后必须空一行,否则就无法渲染,

这些都是 Obsidian 底层逻辑不可或缺的一部分。

如果你已囤积了一些使用不加标号的缩进的文档,想要解决也很简单。

可以使用 Ob 自带的无序、有序列表命令一键转换,

也可以使用【解答合集】批量添加删除修改查找替换 中的其他办法。

客制需求纵生千千万,规范写法恒居上上策。

3 个赞

如果你遇到其他人有类似问题,欢迎引用这篇帖子解答。

文章有任何需要修订或改进的地方,直接回复在楼里即可。

有用的话就点个赞吧。

1 个赞

个人觉得 obsidian的插件社区就是为了打破这种规范 让用户可以根据自己的想象去创造内容, 如果做为纯Markdown编辑器市面上面有很多的选择,包括官方推出的callouts 也是在丰富用户的编辑体验,我相信很多人选择ob并不是冲着markdown来的,期待官方后续推出更多的创新功能 :partying_face:

所以obsidian做实时渲染模式的意义呢,不和自己源码控制的哲学相悖吗,还是说为了妥协?一种好的办法就是砍掉阅读模式,专心做即时渲染模式,像typora那样改为所见即所得的设计哲学,阅读模式改为只读模式,仅仅禁止编辑而不做第二套不同于实时渲染模式的渲染逻辑

1 个赞

阅读模式不仅是防止编辑,也是用 Ob 自带 PDF 导出的“打印预览”。有些文体,比如论文在打印时可能要求标题居中、正文分栏;但在写作时,可能是尽量宽栏、顺序写作更为舒适。
通过采用不同的 HTML 结构,可以使用户分别指定写作和打印时的样式,更加灵活,也是内容和样式分离的体现。

当然,不可否认,这种好处不是时刻能显现。在应用场景有限的情况下,如果只是追求编辑模式和阅读模式样式相近,就总得同时指定两套模式的 CSS 类 :joy:

经常碰到新人不理解ob的语法和渲染逻辑,一时不知怎么解释,大佬这个帖子2楼讲的就很明白了
感谢楼主分享,建议列入新手必读

为什么编辑模式下无序列表有两个空行还是会被无视掉,渲染为下面这样

image


  • test

    • test
  • test

@RyanChan 控制台看一下就知道了。

- test
    - test


- test

image

- test
    - test

<wbr>

- test

20240730_190100

感谢答复。
所以原因就是空行并没有让系统将其识别为两个 ul,需要手动插入 break。
这似乎和空白压缩的规则不一致,为什么空行被完全忽视掉了?
另外还有个疑问,就是所有 html 标签必须和列表内容之间有空行,否则会影响列表的显示样式,这又是什么原因呢?

image

空白压缩并非孤立代指空一行分块,本质上是 Markdown 语法如何设置其纯文本与 HTML 样式之间的映射,一个整体的东西。如果感兴趣可以进一步学习相关方面的内容。

这个空白压缩如何正确使用呢? 比如想要空两行 就按4下空格键?

另外从word复制过来的空格跟obsidian里按空格又不一样。比如很多个姓名在word里做了对齐操作,复制到obsidian会严格执行姓名间的空格,但是在下面新添加的姓名按空格去对齐的话就没用了,阅读模式不认了 (word里也可能不是真的空格,占位符之类的也有可能,但看不见就等于空格了) :sweat_smile:

要带有层级关系或对齐,请使用无序列表

最为蛋疼的是,用EXcalidraw或者canvas的嵌入时候,不得不切换阅读和编辑模式
而两个模式切换又会跳闪,位置根本不能对应
极度恶心编辑
一个主要用来编辑的软件,编辑的体验瞬间没了……