用UserScript来实现Quote Selected Text功能

两年多前Gmail的一个对我来说最重要的功能被取消了,这就是Quote Selected Text,选择了一段想引用的文字,点击回复,然后在打开的回复邮件的窗口里,被选择的文字自动引用后放在邮件正文里,这个功能特别好用,但是没了,为了这事我当时还写了篇博客说明这事和当时找到的应急方案,是用AHK的脚本来实现,但后来发现操作系统级别的脚本通过浏览器然后再去Gmail的页面上做操作真的是很麻烦,而且没有效率,所以后来就慢慢放弃了这个脚本,前段时间回去翻TamperMonkey里的UserScript发现其实这些油猴的脚本的功能真的很强大,而且也是Gmail页面交互的驱动引擎,那么用UserScript实现这个功能是不是应该更简洁和高效呢?既然这么想了,就动手吧。

虽然对Javascript和VBscript很熟悉,但那毕竟是很多年前的事情了,这些年都在忙于什么大数据,AI,数据湖之类的东西,真的从头些这些脚本还有些手生,不过这些工作应该都有人做了吧,赶紧去网上搜了一下,嘿嘿,还真的有人问,也有个大神wOxxOm开发了一个脚本 https://greasyfork.org/en/scripts/34381-gmail-r-key-quotes-selection/code , 这个脚本用键击R键来自动进入回复的内容窗口然后引用内容,虽然基本实现了我想要的,但很多细节让我觉得很不满意,例如,不是挂event的handler到gmail的回复和回复所有的按钮上:

window.addEventListener('keydown', e => {
if (e.ctrlKey || e.altKey || e.metaKey || e.key != 'r')
return;

打开内容窗口清除所有已有内容包括我们公司强制要求的个人签名:
editor.textContent = '';

引用文字的标题行的格式等,看来还是要自己动手啊。
document.execCommand('insertHTML', false, '' + ${date} ${name == email ? '' : name + ' '}&lt;<a href="${email}" target="_blank">${email}</a>&gt;<br> + <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">${selText}</blockquote> + ''); 

既然决定了要动手那就开始吧,第一个要解决的问题是如何把我要做的事情加到“Reply”和“Reply to all”这个两个按钮上,加挂动作需要用到addEventListener到click这个点击的event上,用document这个object挂这个addEventListener就需要对点击的目标进行判断,根据WOxxOm的脚本,是用了一个奇怪的attribute叫aria-haspopup来搜索reply的

const replyMenu = item.parentElement.querySelector('[role="button"] + [aria-haspopup="true"]');
,这个让我有点困惑,在使用Chrome的开发工具找了一下这两个组件后决定用dataset.tooltip来抓取这两个按钮:
document.addEventListener('click', function(e) {
if (e.target.dataset.tooltip != 'Reply to all'&& e.target.dataset.tooltip != 'Reply')
// if not reply or not reply to all then quit
return;
这样就完美的解决了把功能加入到回复的点击上了。

当成功把功能挂到回复按钮的点击上之后,发现了另一个问题,就是当这个功能执行的时候,又触发了另一次点击,所以要把这个点击取消掉

replyMenu.previousElementSibling.dispatchEvent(new MouseEvent('click'));

接下来发现这个点击动作了抓住Editor这个区域之后后续居然没有任何动作了,仔细看了一下代码发现是这三行代码在作怪,这个代码必杀之

e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();

当完成了上述改动之后,主体的功能就已经基本完成,剩下的就是对引用的文字的美化,例如文字的上面加的那一行“某年某月 某人(邮件)写了”改成斜体,加灰色背景条等等,其他的也真的没有必要改动,我原本想挂上特殊的颜色之类的,但后来发现因为需要经常对引用的文字拆成多行分别回复,所以挂颜色可能会引发奇怪的效果就算了,这样就完美的实现了原来谷歌取消的功能,因为没有油猴脚本站点的账号,就先扔到我自己的bbs的site上了。

完整的需要安装的脚本的最新版本在这里: https://bbs.ausmis.com/userscripts/QuoteSelectedTextInGmail.user.js

如何安装Tamper Monkey和安装UserScript,大家可以自己在谷歌或者百度上搜索相关文章,这里就不再说明了。

相关的文章

Leave a Reply

will not be published

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据