背景

Typora是我非常喜欢的Markdown编辑器,之前的一个更新,Typora支持了“上传图像”的功能(即写文章时,插入图片自动将其上传至图床),我们可以直接借助IPic、uPic、PicGo等程序,配合Typora自动将图片上传至又拍云等对象存储平台。但是,官方的文档晦涩难懂,我尝试进行了一些配置,但始终还是不好使,那咋办嘛?

其实,将本地图片上传至图床,这个过程本质上来说就是一条HTTP请求,但是如果这个过程还需要在后台一直开着一个图床软件或者安装一些命令行工具(更何况很多工具也是收费的),代价就有些大了。庆幸的是,Typora支持不借助这些图床工具,通过自定义命令(脚本)的方式,完成自动上传图片的功能。

那么,能不能自己写一个十几行代码的脚本来适配Typora呢?当然可以了。

一起开始吧

以Typora自定义命令上传图片为例,当我们从我们插入一张图片时,发生了什么?我们在Typora插入一张本地的图片后,Typora会调用预先设置的自定义命令(通常是运行一个脚本)来上传图片,自定义命令(脚本)上传完图片后输出(注意这里有坑)相应的URL,Typora会读取该URL,并自动把本地图片地址替换为相应的URL。所以只要配置得当,我们在写作时,只需要准备好素材,直接对素材command + ccommand + v了。

如果我们要通过自定义命令来上传图片,只需要三步:

  • 编写能够上传图片至相应的图床或者对象存储的脚本
  • 在偏好设置中进行相应的设置
  • 测试是否正常

编写脚本

脚本如下所示:

1
2
3
4
@echo off
echo Upload Success:
if exist %1 curl -F name=@%1 https://img.vim-cn.com/
if exist %2 curl -F name=@%2 https://img.vim-cn.com/

我们在写一个脚本的时候,大体上关注三部分内容,输入、处理过程和输出。处理过程是自己实现的所以还好,但Typora上传图片自定义命令的传参和输出是真的奇坑。

  • 传参。Typora上传图片调用自定义命令时,会将待上传的图片作为命令行参数,传入脚本。如bash upload.sh 1.jpg 2.jpg,这里具体有几张待上传的图片不确定,所以参数长度是不固定的,你的脚本必须上传所有作为参数传入的图片。Typora并没有在文档中直接说明这一点(传参的方式、长度),真的给我坑坏了。
  • 输出。事实上,Typora并不关心我们脚本中上传图片的具体过程如何,它只关心我们脚本的最终输出。Typora要求脚本输出结果的方式简单粗暴,直接echo(其他语言比如Python的print)。注意,直接echo也是有格式要求的,脚本需要首先输出Upload Success:,之后,一行对应一个URL,具体格式如下:
1
2
3
Upload Success:
https://sample.com/1.jpg
https://sample.com/2.jpg

这里,我使用bat脚本,事实上,你可以使用任何变成语言,上传图片至任意的平台。只要你脚本处理好传入的参数,上传完所有图片,最终的输出结果是上面的格式即可。

偏好设置

Typora上传脚本支持的自定义命令,可以在偏好设置中选择。上传服务选择Custom Command,自定义命令就是我们插入图片后,Typora调用的命令。如刚才我们的脚本名称为upload.cmd,自定义命令就可以设为upload,注意替换upload的路径为绝对路径。

偏好设置
偏好设置

测试是否正常

完成脚本和偏好设置后,就可以测试脚本是否正常了。打开偏好设置,直接点击验证图片上传选项

验证图片
验证图片

尾巴

市面上确实有很多功能丰富的Markdown编辑器,但所见即所得、小巧轻量的Typora依然是我最喜欢的。图片上传功能的加入,极大方便了写作的过程,想想之前,写文章需要手动将图片拖到图床APP,再把URL复制到文章中,就两个字,“繁琐”。

最后,用Typora写作,自定义命令上传图片,自己写一个脚本,四行代码,卸载掉各种图床工具,插入图片直接command + v,写作原本就该这么简单嘛!©