在 Markdown 里,有两种插入图片的方式:
一种是将图片储存在服务器上(自搭服务器或第三方图床),然后以  的格式插入文中;
另一种是将图片保存在本地,然后以  的格式插入文中。
第一种需要你有搭建服务器的能力以及成本,或者找到一个既稳定、又能保证访问速度的第三方图床。另外,「上传图片到图床」这个听起来很简单的操作,实际执行起来也很繁琐,可能还得访问网页或者借助第三方工具。
第二种听起来就更麻烦了,「文件放在哪、文件路径是什么」这两个问题就够普通用户头疼的。慢慢地,很多 Markdown 编辑器将第二种方式演变成一种更直接的方法:允许你将图片拖拽进文章里,然后以内嵌的形式显示。
实际这种方法的原理还是本地图片 + 路径,只是编辑器帮你把代码隐藏了起来。
我发现这种储存图片的方式更简单,而且在预览的时候也更直观。虽说 Markdown 的初衷是简化排版,从 Markdown 创始人 John Gruber 的博客来看,也几乎没什么图片。但对于大多数使用 Markdown 的人来说,图片展示还是一个很强烈的需求。而且我们通常在少数派上见到的文章,由于内容大多跟应用相关,因此界面展示以及效果展示就成了文章很重要的一部分。 这种格式的文章,在导出时通常会生成一份 .md 格式的纯文本文件,文中的图片则保存为一个个单独的图片文件。
我在跟其他人协同编辑文档时,经常会用到这种导出方式。一方面是为了保持文章在离线状态下的预览效果,能直接看到图片;另一方面,也方便对方直接对文档进行编辑。
当你用 Markdown 编辑器打开进行预览时,编辑器会询问你是否允许访问外部文件。
当你选择允许后,才能预览到这些图片。
这是由于沙盒机制导致的,所有在 App Store 上架的应用都需要遵循。如果一个 App 想要获取访问其它 App 文件的权限,需要得到使用者的确认后才可执行。此外,这种机制导致前面提到的这种导出方法,无法在 iOS 上进行预览图片。
TextBundle 的出现就是为了解决这种问题。
Markdown 协作的好伙伴:TextBundle
TextBundle 是一种由 Marked 开发者和 Ulysses 团队联合开发的文件格式。可以实现一个文件内,既包含 md 文档,也包含图片,预览时无需询问权限,同时又方便直接编辑。 TextBundle 的原理其实跟前面提到的将文档和图片放到一起的方法很相似,只不过采取了一种更讨巧的方法来绕过沙盒机制。当你右键 TextBundle 文件「展示包内容」时,会发现,TextBundle 其实还是一个文件夹,只是里面多了一份 json 文件,将整个文件夹打包成了一个文件。
因此当你打开 TextBundle 文件时,系统会认为你在访问的是一个单独的文件,当你调用文件内的图片时,也就无需再获取访问权限。
目前支持导出和读写 TextBundle 格式的 Markdown 编辑器不算多,比较出名的有 Bear 和 Ulysses,此外我们曾介绍过的 Markdown 全能预览工具 Marked 也当然支持。
在 TextBundle 官网的支持列表中,你会发现还包含这样一类应用——思维导图工具,其中有大家熟知的 MindNode 和 iThoughts。那么,它们是怎么结合到一起的呢?
我知道有部分人写作时,喜欢先列一份思维导图作为大纲,然后才开始导出到 Markdown 编辑器中进行写作。这些思维导图工具很早开始就支持导出成 md 格式,但是慢慢地思维导图工具的发展,它们也开始支持在思维导图中插入图片,也就同样碰到了前面的那个问题,「图片储存在哪」以及「获取访问权限」。
但 MindNode 和 iThoughts 这两款工具,则支持直接导出为 TextBundle 格式,用 Markdown 编辑器打开后,可以直接看到图片已经内嵌在文章中。
TextBundle 目前还是一个小项目,但我希望有越来越多的工具支持它。因为它采取了一种很巧妙的方式来绕过系统限制,让我们既能获得良好的浏览效果,还能直接对文本进行编辑。