前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Ulysses一键发送文章到Day One

Ulysses一键发送文章到Day One

作者头像
王树义
发布2018-08-22 15:32:32
1.2K0
发布2018-08-22 15:32:32
举报
文章被收录于专栏:玉树芝兰玉树芝兰

可爱的Ulysses

我是从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设置了快捷键,来调用这些脚本。

前些日子,我的工作流程是这样的:

  1. 在Ulysses里面写,写完了拖动到marked 2里面预览,修改到满意;
  2. 使用快捷键(Cmd + A)选择全文,并且拷贝为markdown文本到剪贴板(Opt + Cmd + C);
  3. 快捷键方式(Opt + Cmd + ,)把剪贴板里面的全文中图片上传到七牛,并且把修改链接之后的markdown拷贝到剪贴板;
  4. 用快捷键(Opt + Cmd + .)呼叫Day One的采集窗口;
  5. 把剪贴板里面的内容粘贴进去(Cmd + V)。

这个过程,嗯……很繁琐!

脚本是用来简化生活的,不是为了给自己增添麻烦的。作为一个合格的懒人,我有必要改进自己的工作流程。

解决方案

受到了一篇文章的启发,我突然发现在Automator内部集成Python脚本之后,可以保存为应用。Ulysses中可以调用该应用,来处理Markdown文本。

于是,我修改之后的工作流程就成了这个样子:

  1. 在Ulysses里面写,写完了在marked 2里面预览,修改到满意(跟原先没啥区别);
  2. 用 Cmd + 6 呼叫预览,点开应用按钮,选择其中的第一个“markdown-to-dayone”,完成。

这……太神奇了吧!

原理

首先,我们把原先剪贴板操作的Python文件修改,存成了一个新的Python脚本,用来把指定输入的文件名中的Markdown文本进行图片链接处理,图片上传到七牛并且转换为七牛链接。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 玉树芝兰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可爱的Ulysses
  • 需求
  • 解决方案
  • 原理
  • 注意事项
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档