Skip to content

HelloJysun/clipboard-rules

Repository files navigation

Clipboard Rules v1.1

通用化的"复制触发跳转"Chrome 插件。复制内容匹配规则后,右下角弹出 toast,一键打开对应 URL。

v1.1 关键改进:覆盖现代命令式复制按钮

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 老站

数据模型(v1.1)

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.0 / v1.1 兼容

v1.1 完全向后兼容 v1.0 的规则格式:

  • 老规则的 buttonSelector / buttonAriaLabelMatch 默认 undefined → 不约束(行为同 v1.0)
  • 触发路径 2/3/4 保留(不删任何老路径),加了路径 1 来覆盖现代场景
  • storage 数据结构不变,无需迁移

About

No description, website, or topics provided.

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors