写在最前面 · 进阶声明

这是「稍后电影短评」主题系列文章进阶篇教程,如果你觉得 基础篇 看得不过瘾,我表示完全理解。所谓基础篇,就是面向普通用户的,主要讲解如何打通整个流程,更多是基于直观的「手动操作」而言,所以不会涉及太多「自动化」知识,否则会让学习曲线陡增。基础篇是解决「用」的问题,而进阶篇是解决「爽」的问题,简单来说,基础篇是为进阶篇做的准备工作,真正核心的东西都会放在进阶篇里讲,所以,如果你想完全掌握本篇的内容,需要对以下方面有最基本的了解:

  1. HTML + CSS 基础知识;
  2. Python 基础语法及使用;
  3. Workflow 的模块化搭建;
  4. URL Schemes 原理及用法;

对了,如果你喜欢这个系列文章 or 「稍后电影短评」项目,请记得关注我的 微博即刻主题 哦 🙂。

为什么需要自动化?

开始之前,我们需要对自动化这个概念达成基本共识,在我看来:

  1. 自动化代表的是一种对工具的使用态度,你对工具掌握得越好,可实现的自动化程度就会越高。
  2. 自动化体现的是一种对生活的认知态度,你越主动思考生活,自动化越能突显价值,如果你都没有优化生活的意愿,哪来的自动化需求?

从生活的角度来看,为什么需要自动化?是因为我不想浪费时间和心情:

  1. 不想浪费时间。我们来算一算,如果自动化后的流程能帮你每天节省 5 分钟,那么你一年可以节省 30 个小时,这一天多时间你可以去约会、看电影、刷美剧,whatever。
  2. 不想浪费心情。其实更多时候,不是你对创作无感,而是对创作之外的琐事无感。比如你想写个博客,但是突然想到文章写完后还要发布、维护、推广,balabala,你就没心情写了。

自动化流程可以帮你快速地摆脱掉创作之外的琐事,让你有时间和心情 focus 在最重要的创作上面,自动化流程体现的就是效率,效率则是生产力,生产力在你的重视下会像雪球一样,越滚越大。

自动化切入点在哪?

机器能完成的,就不要人来做。

用这句话总结自动化再合适不过了,另外,我们也需要用这个标准来重新审视我们在 基础篇 里的流程,找出可以优化的点:

  1. 每次新开短评,都要手动复制粘贴上一篇的格式?好烦啊!
  2. 每次评完分,都要手动转换成对应的 emoji ?好烦啊!
  3. 每次出图,都要手动选图拼图,还要裁剪?好烦啊!

以上就是 基础篇 流程里最烦人的三大痛点了,我相信也是大部分人觉得不够酷的点,下面我们就来看如何把它们一一调教成自动化亮点。


自动化一 · 模板兼顾格式和样式

我们需要模板,除了其可重复利用的特性外,模板的另一大好处就是风格沉淀。稳定且有显著个人风格的模板是最好的品牌特征,充分利用这一点,可以为你的推广带来积极的正面效果。
基础篇 里,我们说过用 Markdown 书写短评正文的目的是为了能更好地排版,在进阶篇里,我们会用 Editorial 替代 Ulysses,虽然 Ulysses 有样式库,但依旧满足不了自定义这种更自由的需求,理论上来说,你也可以自己写好样式上传到 Ulysses 官方的样式库里,然后应用到手机上,但如果你需要临时调整样式呢?面对这种需求 Ulysses 只能歇菜了。而 Editorial 强大就强大在这里,它支持本地自定义样式表,修改即生效,简直不能太赞!
那么 Markdown 是如何跟 CSS 样式表结合的呢?虽然很多人会写 Markdown,但可能并不理解 Markdown 是如何工作的,其实 Markdown 是 HTML 语法的子集,最后会转换成标准的 HTML 语法,下面简单列举下:

  • # 一级标题 —> <h1> 一级标题 </h1>
  • ## 二级标题 —> <h2> 二级标题 </h2>
  • **文本加粗** —> <strong> 文本加粗 </strong>
  • * 无序列表项 —> <ul><li> 无序列表项 </li></ul>
  • > 引用文本 —> <blockquote> 引用文本 </blockquote>
  • [链接文字](链接地址) —> <a href="链接地址"> 链接文字 </a>
  • ![图片文字](图片链接) —> <img src="图片链接"> 图片文字 </img>

更完整的说明请参考 Markdown 文档
所以,你在 Editorial 里自定义 CSS 样式表的时候,只需要根据对应的 HTML 标签设置对应的样式内容即可。贴心的是,Editorial 已经内置了 2 套默认样式表,我们只需要在其基础上修改就行了。

请输入图片标题

温馨提示,如果你想要实现的效果比较复杂,简单的 Markdown 格式满足不了你的需求,你完全可以裸写 HTML,Editorial 是完全支持原生 HTML 语法的,放心大胆地释放你的创造力吧~

从文本开始

幸好 Editorial 默认使用的是 Dropbox,而不是 iCloud,否则,iCloud 低级的文件管理系统肯定会把事情搞砸……所以你首先要做的是把 Editorial 链接到 Dropbox 上的某个文件夹,作为后续项目的文件仓库。

请输入图片标题

由于篇幅有限,本篇教程不对 Editorial 和 Workflow 的基础用法做过多的介绍,不懂的请查阅官方文档:Editorial | Workflow

样式模板

在 Editorial 中,我把 .html 文件称为「样式模板」。「样式模板」不是单独的 css 文件,而是包含了样式表的网页模板(样式表直接内嵌进 .html 文件的 head 里了),通过把 Markdown 文本转换成对应的 HTML 标签后,放进 .html 文件的 body 里,最后渲染该「样式模板」来实现更换样式的效果。
所以,你只需要新建个文件,把后缀名改为 .html 即可生成一个「样式模板」,然后再去编辑里面的样式代码即可。
Tips:通过长按顶部文件名可快捷「重命名」。

请输入图片标题

需要注意的是,Editoiral 不支持读取非本地的「样式模板」,所以,你新建的「样式模板」需要放在 Editorial 本地,而不是 Dropbox 里,当然了,你可以定期备份 Editorial 本地的数据到 Dropbox 里,官方有提供该插件。

请输入图片标题

具体你需要什么样的样式风格,当然需要你自己思考和尝试,或者参考主流的视觉设计风格也是不错的选择。

预览 & 调试

在编辑窗口左划即可进入「预览模式」,即 Preview 页面,通过点击页面顶部的倒三角形可以弹出「样式模板」列表,选择你新建的那个就行。

请输入图片标题

既然你可以编辑,又可以预览,那就可以调试了(编辑 + 预览 = 调试),但由于手机屏幕的局限,你需要不断地左划右划来回切换文件,调试过程并没有想象中轻松,尤其对于新手来说,虽然麻烦了点,但对于后期的微调,是相当方便的,所以前期我还是偷懒地用了 VSCode 把大部分样式写好之后再放进 Editorial 里微调 😉。

无图不成文

基础篇 里,每次出图都要选择页头和页脚图片,麻烦得要死,既然它们是不变的(基本上),为什么不直接写进文档里呢?没错,这就是自动化的第一步,把不变的东西写进模板里,下面我们先介绍下如何在 Editorial 嵌入图片。
Tips: 我建议在 Dropbox 里建个专门放图片的文件夹,当文件越来越多的时候才便于管理和查找。

请输入图片标题

通过点击文件管理面板左下角的「+」按钮选择「Import Photo…」即可导入本地相簿照片,导入成功后 Editorial 会默认把完整的图片文件名(包括后缀)复制到粘贴板里,在你需要用到的地方粘贴进去就行了。Editorial 插入图片用标准的 Markdown 语法来写,需要注意的是,「图片链接」是图片相对于引用图片的文件的路径,通俗地讲就是,从引用图片的文件出发,经过怎样的路径,能够找到该图片,就是该图片的链接地址。比如我把图片都放在引用该图片的 .md 文件所在路径下的 Pictures 文件夹里,所以在 .md 文件里引用该图片的链接里要有 Pictures/ 片段。

请输入图片标题

短评卡片头图的引入也是遵守这样的规则,但由于每张短评卡片的头图都不一要,所以它是模板里需要灵活输入的地方。

自定义模板

每次新开一篇短评,都要手动复制粘贴上一篇的格式?当然不是了!这就是 Editorial 模板要解决的问题,用一句话总结就是「把不变的写进模板里,把可变的写进变量里」。其实 Editorial 的模板是其 workflow 流程的一个动作,位于最后,用于输出整个文档。workflow 的前半部分用于收集手动输入的变量,通过可交互可自定义的 UI 界面来提示用户输入相应的内容,最后汇总到流的末端,也就是模板里,用于生成文档。

请输入图片标题

workflow 流程

简单地理解,workflow 就是「工作流」,核心在于「流」,这种「流」一方面是体现在视觉上的,即所有的逻辑块都是线性由上而下排列,有明显的先后关系。另一方面是体现在逻辑上的,即每个模块先有输入后有输出,模块串成完整的线性流程。然而现实生活中的情况则要复杂得多,存在并发和各种分支,但是,再复杂的逻辑,理论上都是可以分解成线性进程处理的,如果不考虑性能和效率的话。workflow 的这种线性特性,保证了其简单、有效、容易上手,它能做到什么比它为什么是线性的重要得多,如果你对编程有所了解的话,workflow 体现了典型的模块化编程思想。
扯了这么多原理性的东西,我们还是通过例子来理解 workflow 更为实在吧,在「稍后电影短评」模板里,workflow 流程是这样的:

请输入图片标题

  • 「请求文本输入」对应「Request Text Input」动作,该动作会弹出对话框请求输入相应的文本;
  • 「设置保存变量」对应「Set Variable」动作,该动作会把传入的数据,即文本字符串,存储到指定的变量中;
  • 「根据模板规则输出文档」对应「Create Document」动作,该动作负责处理之前保存过的变量,输出相应的文档。

每个动作都可以设置相应的逻辑用于处理接收到的数据,最后输出给下一个动作。你可以把某一类动作标记为特定的颜色,增强标识性,比如我把请求输入类标记为绿色,设置变量类标记为红色,脚本类标记为蓝色,一目了然。
在「Create Document」这个动作里,我们把上面收集的变量放到对应的位置上,把不变的东西(页头页脚)也放到指定的位置,就 OK 了。

请输入图片标题

自动化二 · 脚本即正解也是灵药

每次评完分,都要手动转换成对应的 emoji ?当然不是了!如果都是纯文字输入,上面的创建模板的流程已经基本走通了,但「稍后电影短评」里的评分是用 emoji 表示的,需要做一层数字到 emoji 的转换,这个怎么做呢?用「Conditional Block (If…Then…)」这个动作可以做到,但是,你需要枚举每一种可能的情况,这样就会出现很长很长很长动作列表的情况,这么长的串联动作却只是为了解决一个简单的数字到 emoji 的转换,想想都蛋疼……一来这看着就不够优雅,二来在你枚举每一种情况的时候,你心里一定默默地骂自己笨……

请输入图片标题

在这种情况下,脚本即正解。前面说过了,workflow 线性的理念是为了保持简单,但 Editorial 同时也开放了强大的脚本能力让你定义自己的动作,本质上,「动作」所做的事就是把输入到输出这个过程的逻辑封装起来,而脚本,就是开放权限让你接手这块逻辑。
下面我们简要介绍下思路,Editorial 指定的脚本语言是 Python,其基本语法和使用,这里不做赘述。

请输入图片标题

具体思路如下:

  1. 判断电影评分(数字字符串)是否有小数点
  2. 有小数点的情况:
    1. 🌕 数量为整数部分
    2. 🌗 数量为1
    3. 🌑 数量为剩余数量
  3. 没有小数点的情况:
    1. 🌕 数量为电影评分
    2. 🌗 数量为0
    3. 🌑 数量为剩余数量
  4. 如果有 🌗,判断类型:
    1. 小数部分 < 5,取 🌘
    2. 小数部分 = 5,取 🌗
    3. 小数部分 > 5,取 🌖
  5. 🌕 🌗 🌑 按数量重复,拼成最后的电影得分

脚本优化结束

我们用一个脚本动作取代了一长串的判断动作,整个 workflow 瞬间变得异常简洁,至此,我们创建模板的 workflow 也告一段落了,下面我们完整看下创建一篇短评的 workflow 流程。

请输入图片标题

Tips: 在设置里面选择你创建的模板为「默认模板」,这样,每次点击「+」的时候就会默认调用你创建的模板,而不会再弹出模板选择面板,需要调出该面板的时候长按「+」即可。

请输入图片标题

自动化三 · 动作串烧与控制反转

下一步,我们需要把 Preview 页面渲染的效果导出成图片,以便于在社交网络上分享,但是 Editorial 并没有提供 Preview 导出图片的功能,查看了官方文档,也没有相关的接口,另外,Editorial 的 Preview 也不是调用 Safari 渲染的,而是自己实现的,所以也用不了 Safari 网页截图的相关插件,怎么着都只有通过屏幕截图 + 拼图这一条路可走,算是 Editorial 最大的一个遗憾吧,如果有谁知道一键导出图片的方法,欢迎留言告知~
那么,每次出图,都要手动选图拼图,还要裁剪?当然不是了!虽然只能「手动截图」,但我们可以做到「自动拼图」,这活交给 Workflow 最合适不过了。

控制反转

在自动化流程里面,「控制反转」是一个重要的概念。对于「手动操作」模式而言,任何行为都需要你主动触发,亲力亲为,是主动行为。但对于「自动化」模式,你把控制权交给了机器,它就像你的管家或秘书,你通过设置规则让他们去执行常规任务,在需要决策的重要时刻,反转过来请求你的命令,这是一种被动行为,只在必要的时候触发,这就是所谓的控制反转。
基础篇 里,我们是手动拼接截图的,这种做法相当的笨拙和不明智,现在我们具体来看,如何让 Workflow 接管拼图行为,自动为你服务。

请输入图片标题

具体思路如下:

  1. 选出相簿里最新的 10 张截图
  2. 过滤截图,保证是 5 分钟内截取的
  3. 算出过滤后的截图数量
  4. 发送给 LongScreen 拼接
  5. 拼接完后,获取宽度 & 高度信息
  6. 计算新的高度
  7. 裁剪图片
  8. 保存到指定相册
  9. 删除截图

在「自动拼图」这个 workflow 里面,最核心的一个步骤是「裁剪图片」,它对裁剪位置的精确度要求很高,只能通过软件来实现。如果你手动裁剪,是很容易产生大的误差,因为图片可能会很长,iPhone 相簿自带的裁剪功能不支持「视图放大裁剪」,Pixelmator 支持,但你能忍受每次出图都要手动裁剪一遍么?
Tips: 我们选择 LongScreen 是因为它几乎是市面上唯一一个支持 URL Schemes 的拼图软件,要想在自动化流程里实现完美的动作串烧,只有 URL Schemes 一条路,别无他法。具体请参考 LongScreen 的 URL Schemes 官方说明,上图用到的完整 URL Schemes 是 longscreen://x-callback-url/copy?mode=stitch&count=Count

大功终告成

我们总结一下我们前面都做了哪些优化:

  1. 利用 Editorial 模板解决了格式和样式问题
  2. 利用 Editorial 脚本解决了文本到 emoji 的转换问题
  3. 利用 Workflow 解决了自动拼图和裁剪图片问题

最后通过 iOS 的通知中心或分享操作把 Editorial 和 Workflow 串联起来,就终于完成了我们本篇所讲的自动化流程!

请输入图片标题

写在最后面 · 重要的事

通过本篇教程,我们基本上用 Editorial + Workflow 重写了 上一篇 里的流程,工作流就是这样,颠覆自己是常有的事。本篇内容也算是抛砖引玉,Editorial + Workflow 再配合其它效率类软件,还有更加广阔的想象空间,欢迎喜欢动手的人与我交流~如果你喜欢本篇文章,不妨关注 稍后电影短评 这个项目,因为它是本系列教程的最佳实践 😎。当然了,工具和流程是为创作服务的,它们可以被不断优化和改进,但最后都需要指向优质的内容,内容才是真正核心的凝聚思想的原动力,不是么?