我是从2015年夏天开始用Ulysses的。这个编辑器的设计哲学是“所有的文字都放在一处”。这令我很欣喜,因为它非常适合我这种懒人。
之前我也可能时常有记录或者写作的欲望。但是一想到每次的只言片语都要保存一个单独的文件名,就会觉得麻烦。而且更要命的是将来想要用的时候,兴许根本就找不到了。
于是——算了,不写了。
现在就不会了。因为Ulysses中把所有的记录都称为表单(sheet)。用户不需要给表单命名。它随时帮你把更新的文章自动同步到iCloud里面,还定期进行整库备份。而且不管你写了多少东西,都可以用 Cmd + o 检索需要的内容。
Ulysses支持Markdown,所以置入插图、代码和文字列表都很方便。我尤其喜欢其中的插图功能,因为可以快捷键呼出,放入链接即可。“一幅图胜过千言万语”嘛。
结合Marked 2,用户可以对Ulysses中写好文章进行预览,以及导出成为Word, PDF和HTML网页等各种常见格式。
因为Wifi无线网络并非随时都有,所以我在写文章的时候插入的图片链接都指向本地文件。如果用远程连接的话,一旦断网就看不到了。
文章写好之后,我喜欢把劳动成果保存到Day One应用里面。Day One是一款非常优秀的日记应用,也支持Markdown格式。
这时候就遇到了问题——Day One里面无法显示本地图片。为了让图片正常显示,存储到Day One之前,我需要把图片上传到远程图床(我用的是七牛云存储),并且修改Markdown正文里面的所有图片链接,都指向七牛上远程图片地址。
说起来容易,做起来不那么方便。作为懒人的我,就用Python编写了个脚本,可以自动帮我把所有链接上传到七牛,并且转换为七牛链接。
但是如果每次让我键入Python脚本,我还是觉得不够方便,于是我用Alfred Workflow设置了快捷键,来调用这些脚本。
前些日子,我的工作流程是这样的:
这个过程,嗯……很繁琐!
脚本是用来简化生活的,不是为了给自己增添麻烦的。作为一个合格的懒人,我有必要改进自己的工作流程。
受到了一篇文章的启发,我突然发现在Automator内部集成Python脚本之后,可以保存为应用。Ulysses中可以调用该应用,来处理Markdown文本。
于是,我修改之后的工作流程就成了这个样子:
这……太神奇了吧!
首先,我们把原先剪贴板操作的Python文件修改,存成了一个新的Python脚本,用来把指定输入的文件名中的Markdown文本进行图片链接处理,图片上传到七牛并且转换为七牛链接。
import qiniu_upload
import wsyFileOperator
import re
import sys
import os
reload(sys)
sys.setdefaultencoding('utf-8')
def change_link_to_qiniu_upload(data):
sp_str_image = '^!\[\]\(.*\)'
data = data.split('\n')
new_data = []
for line in data:
if re.match(sp_str_image, line):
localfile = line.split('(')[-1].split(')')[0]
key = localfile.split('/')[-1]
filelink = qiniu_upload.qiniu_upload(key, localfile)
line = '![](' + filelink + ')'
new_data.append(line)
new_data_str = '\n'.join(line for line in new_data)
return new_data_str
def main(argv):
# My code here
num_vars = len(argv)
output_filename = os.path.expanduser("~/Dropbox/var/wsywork/data/org/temp.md")
if num_vars == 1:
print "Please input the original markdown filename!"
elif num_vars == 3:
output_filename = os.path.expanduser(argv[2])
#print "output filename changed to {}".format(output_filename)
else:
input_filename = os.path.expanduser(argv[1])
#print "good!"
with open(input_filename) as f_in:
data = f_in.read()
new_data = change_link_to_qiniu_upload(data)
#print new_data
with open(output_filename, 'w') as f_out:
f_out.write(new_data)
#pass
if __name__ == "__main__":
main(sys.argv)
其次,新建Automator应用。
注意这里完全可以用bash script替代python脚本。但是由于本人当年上操作系统课学bash这一章的时候不小心走神儿了,bash脚本编程没学会(惭愧),所以只好用笨办法——也就是Python生成静态bash命令的办法——来替代。懒人嘛,没办法。 :-P
因为Ulysses默认导出的临时markdown文件名就是标题。标题里面是完全可以包含空格的(尤其是英文标题)。所以生成静态bash命令的时候,别忘了对输入markdown文件名的两侧用引号括起来,避免因为文件名中的空格导致“文件找不到”之类的窘境。
看似轻描淡写,这却是我花费了很长时间才纠正过来的错误。教训啊。 :-P