Ulysses一键发送文章到Day One

可爱的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文本进行图片链接处理,图片上传到七牛并且转换为七牛链接。

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

原文发布于微信公众号 - 玉树芝兰(nkwangshuyi)

原文发表时间:2016-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

新手福利 | Burpsuite你可能不知道的技巧

一年一度的Burpsuite过期的时间又到了,Burpsuite作为Web安全者必不可少的一件神器,其实有很多实用的技巧,本篇文章的目的是抛砖引玉,通过分享一些...

23410
来自专栏西枫里博客

使用无线网卡连接网络,默认网关不可用的解决。

工作原因不得不使用台式机,最近挪了窝,不高兴在家横七竖八的拉网线,索性就用了一个USB的免驱无线网卡,通过这个小东西进行联网。而这几天发现网络三番两次的掉线,通...

1661
来自专栏玄魂工作室

[实战]如何在Kali Linux中进行WIFI钓鱼?

文中提及的部分技术可能带有一定攻击性,仅供安全学习和教学用途,禁止非法使用! ? 0x00 实验环境 操作系统:Kali 1.0 (VM) FackAP: ea...

4836
来自专栏数据和云

RAC一个节点自动重启问题分析

题记:在RAC数据库的故障当中,节点重启的现象很常见,在这种问题的处理当中,有一定的规律性。为了更好的说明这个问题的处理过程,保证出现该类问题的时候,能够有序的...

3685
来自专栏pangguoming

最火的Android开源项目整理

一、代码库 1、from  代码家 整理比较好的源码连接 ***************************************************...

7524
来自专栏运维小白

18.7 LVS介绍

LVS介绍 LVS是由国人章文嵩开发 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高 LVS最新版本基于Linux内核2...

2198
来自专栏小白课代表

Origin Pro 2017 中文版安装教程

9441
来自专栏云计算教程系列

为公益伸出援手,自建 NTP 服务器池

在本教程中,讲述如何设置了自己的时间服务器,并使其成为NTP池项目的成员,为社区服务,现在国内NTP服务器数量还是不够乐观,还是那句话,如果你有位于国内的、长期...

3.6K12
来自专栏FreeBuf

挖洞经验 | Facebook的手机扫码登录漏洞

Facebook最近推出了忘记密码的手机登录功能,我发现该功能中的二维码扫描存在漏洞,可以利用其进行CSRF攻击,劫持其它Facebook账户。 ? 当我的手机...

6828
来自专栏文武兼修ing——机器学习与IC设计

AXI学习笔记-11.AXI总线结构2.AXI接口时序3.数据结构4.传输特性

握手信号包括VALID和READY信号,传输行为仅在VALID和READY同时有效时发生。其中:

3803

扫码关注云+社区

领取腾讯云代金券