Apple Books 复制内容去除版权信息

最近在电脑上使用 Apple Books 看书,体验还可以,但就是做笔记的时候有个很烦人的地方:复制书本内容时,Books 会自动给复制的内容加上双引号,并且加上版权信息。而且这还不能通过引用的设置去除,导致做笔记摘录时每次粘贴后都还要手动去删除,麻烦得很,

“如果有证据表明分配空集合会损害性能,可以通过重复返回相同的不可变空集合来避免分配,因为不可变对象可以自由共享 (条目 17)。下面的代码就是这样做的”

Excerpt From effective java 3rd 中文版 wizardforcel This material may be protected by copyright.

上网搜了一下,还是挺多人吐槽的,大家也只能通过外部的手段来处理,主要看到的解决方案都是用 Automator.

Automator

Automator 是 macOS 上附带的一个自动化工具,可以通过编排里面的 action,实现自动化的操作。

对于我们这个去除版权信息的需求,整体的思路就是

  1. 获取剪贴板中的文本内容
  2. 将文本内容中原始的文本内容取出来。
    1. 可以通过 JavaScript 脚本来实现
    1
    2
    3
    4
    5
    
    function run(input, parameters) {	
         // Your script goes here
         let matched = input.join('').match(/“([^”]*)”/);
         return matched[1];
     }
    
  3. 将取出来的内容返回入剪贴板中

听起来很简单,就像将大象放入冰箱一样三步完成。

设定好 Automator 后,就可以在系统的快捷键中,为新设置的服务(Quick Action)添加一个快捷键,然后在应用当中触发。但是我在设置好后,无论换怎样的快捷键,都没有办法能够触发成功,最好放弃了这个办法。

Raycast

反正都是用脚本,不如多走一个流程,干脆直接用 Raycast 写个脚本做一次转换?这样还不用去设置和记忆额外的快捷键。

在复制了 Books 当中的内容后,执行 Raycast 的 script 对剪贴板内容做一次转换。这里主要麻烦的地方是 nodejs 原生其实没有直接访问剪贴板的 API。这里就借鉴了一下 clipboardy 的实现,通过调用命令行命令,访问剪贴板。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env node

// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Remove Copyright
// @raycast.mode silent

// Optional parameters:
// @raycast.icon 🤖

// Documentation:
// @raycast.author YeungYeah

const { exec } = require("child_process")
exec(
    "pbpaste",
    {
        env: { ...process.env, LANG: "en_US.UTF-8" },
    },
    (error, stdout, stderr) => {
        if (error) {
            console.error(`exec error: ${error}`)
            return
        }

        // 使用正则表达式匹配中文引号下的内容
        const match = stdout.match(/“([^”]*)”/)
        if (match) {
            const text = match[1]

            // 写入到剪贴板
            exec(
                `echo "${text}" | pbcopy`,
                {
                    env: { ...process.env, LANG: "en_US.UTF-8" },
                },
                (error) => {
                    if (error) {
                        console.error(`exec error: ${error}`)
                        return
                    }
                    console.log("Text has been copied to clipboard.")
                }
            )
        } else {
            console.log("No matching text found.")
        }
    }
)

简单直接,通过 exec 执行命令行命令获取剪贴板内容,然后通过正则表达式抽取其中的文本内容进行抽取,抽取成功后再写入到剪贴板当中。更爽的是,以上的代码还是直接由 ChatGPT 帮我写的。

虽然代码看起来简单,但是调试起来却让我踩坑了很久,一开始写好直接在命令行运行脚本,运行没问题,以后好了,但是从 Raycast 发起,得到的结果确实有问题,怎么都匹配不上。后面通过打日志输出全文才发现,输出居然是乱码,很显然是编码问题,最终人工加上了 env: { ...process.env, LANG: "en_US.UTF-8" } 设置环境变量设置编码,问题解决。看来 AI 还是不够熟悉中文环境 😂

加上这个编码环境变量设置后,问题解决 🛫,又可以继续爽快地看 Books 做笔记了。