通用化的"复制触发跳转"Chrome 插件。复制内容匹配规则后,右下角弹出 toast,一键打开对应 URL。
v1.0 只能监听老式声明式按钮(带 value 属性的 <clipboard-copy> 元素,或 Ctrl+C 选区复制)。
v1.1 通过 page-world hook 拦截 navigator.clipboard.writeText(),可以监听到 React/Vue 应用里的所有现代复制按钮——包括:
- ✅ GitHub PR 头部新版分支复制按钮(React 重构后,无
value属性) - ✅ shadcn/ui、MUI、Linear、Notion 等现代组件库的复制按钮
- ✅ 任何调用
navigator.clipboard.writeText()/navigator.clipboard.write()/document.execCommand('copy')的代码
同时新增 按钮特征过滤:可以让规则只在"特定按钮"触发的复制时命中,避免误触。
| 路径 | 拦截的内容 | 典型场景 |
|---|---|---|
| 1 | navigator.clipboard.writeText() (page-world hook) |
React/Vue 应用,GitHub 新版按钮 |
| 2 | <clipboard-copy> 元素的 clipboard-copy 事件 |
GitHub 老版按钮、Primer Web Components |
| 3 | copy 事件(手动 Ctrl/Cmd+C) |
用户选中文本复制 |
| 4 | data-clipboard-text 按钮 |
clipboard.js 系列、jQuery 老站 |
type Rule = {
id: string;
name: string;
enabled: boolean;
pattern: string; // JS RegExp 字符串
flags: string; // 'i' / 'g' / ...
urlTemplate: string; // 支持 {$0}-{$9} 占位符
domains: string[]; // 作用域 hostname (空=全站)
excludeDomains: string[]; // 黑名单 hostname
autoOpen: boolean; // true=直接开tab; false=显示toast
// v1.1 新增: 按钮特征过滤 (可选)
buttonSelector?: string; // 按钮自身或祖先要满足的 CSS selector
buttonAriaLabelMatch?: string; // 按钮 aria-label/title/tooltip 文本要匹配的正则 (i 模式)
}填了任一项 → 规则只在"由满足条件的按钮触发"的复制上命中(手动 Ctrl+C 不会命中此规则)。 两项都不填 → 不约束触发来源,任何复制都可能命中。
对于现代框架,按钮自身可能没有可见文字(只有图标),但通常带有以下属性之一:
aria-label="Copy branch name"—— 直接的无障碍标签aria-labelledby="some-id"—— 指向另一个元素(如 tooltip)title="Copy"—— 老式 title 属性
插件会把这些全部拼起来作为按钮的语义文本喂给正则。例如图中 GitHub 的按钮:
<button aria-labelledby="_R_2b5qmd1d_">...</button>
<span id="_R_2b5qmd1d_" aria-label="Copy head branch name to clipboard">...</span>被提取成 "Copy head branch name to clipboard",正则 Copy.*branch.*name 即可命中。
clipboard-rules/
├── manifest.json # MV3, run_at=document_start (才能赶在 hook 前注入)
├── background.js # service worker
├── injected.js # ★ page-world 注入, hook clipboard API
├── content.js # 注入页面 + 接收 page-world 消息 + 收集 click ctx
├── rules-engine.js # 规则匹配 (含 buttonContext 匹配)
├── defaults.js # 预设规则模板
├── toast.js / toast.css # 右下角 toast UI
├── options.html / .js / .css # 规则管理页 (高级区: 按钮过滤)
└── popup.html / .js
例 1:GitHub PR 头部分支按钮 → 自动打开 grey 环境
name: PR head branch → grey
pattern: ^(bugfix|feature)-(.+)$
urlTemplate: https://{$2}-grey-go.t2.moego.dev
domains: [github.com]
buttonAriaLabelMatch: Copy.*branch.*name.*to clipboard
autoOpen: true只在符合 "Copy ... branch ... name ... to clipboard" 这种 aria-label 的按钮被点击时触发。 分支名复制按钮 = 命中;URL 复制 / 文件路径复制 / 分支选择器自身的文字 = 不会误触。
例 2:Linear issue ID → issue 页
name: Linear issue
pattern: ^([A-Z]+-\d+)$
urlTemplate: https://linear.app/your-team/issue/{$1}
domains: [linear.app, github.com]无按钮过滤。在 Linear 页面里点 issue ID 复制图标,或者在 GitHub PR 评论里手动复制一段 ENG-123,都会命中。
v1.1 完全向后兼容 v1.0 的规则格式:
- 老规则的
buttonSelector/buttonAriaLabelMatch默认 undefined → 不约束(行为同 v1.0) - 触发路径 2/3/4 保留(不删任何老路径),加了路径 1 来覆盖现代场景
- storage 数据结构不变,无需迁移