@teddyzhu/clipboard 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +266 -353
- package/clipboard.darwin-arm64.node +0 -0
- package/clipboard.darwin-x64.node +0 -0
- package/clipboard.linux-arm64-gnu.node +0 -0
- package/clipboard.linux-x64-gnu.node +0 -0
- package/clipboard.win32-arm64-msvc.node +0 -0
- package/clipboard.win32-x64-msvc.node +0 -0
- package/index.d.ts +19 -9
- package/index.js +2 -0
- package/package.json +10 -8
package/README.md
CHANGED
|
@@ -1,162 +1,57 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `@teddyzhu/clipboard`
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
[](https://www.npmjs.com/package/@teddyzhu/clipboard)
|
|
3
|
+
v0.0.6
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+

|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
> 基于 napi-rs 包装 clipboard-rs 的 Node.js 剪贴板库,提供跨平台剪贴板操作功能
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
- 🔄 **实时监听**: 支持剪贴板变化监听,自动检测内容更新
|
|
12
|
-
- 🌐 **跨平台**: 支持 Windows、macOS 和 Linux(包括 Wayland(实验))
|
|
13
|
-
- 📝 **多格式**: 支持文本、HTML、RTF、图片、文件等多种数据格式
|
|
14
|
-
- ⚡ **异步支持**: 提供同步和异步 API
|
|
15
|
-
- 🖼️ **图片处理**: 完整的图片剪贴板支持,包含尺寸和格式信息
|
|
16
|
-
- 🔧 **自定义格式**: 支持自定义数据格式的读写
|
|
9
|
+
## 特性
|
|
17
10
|
|
|
18
|
-
|
|
11
|
+
- 🚀 跨平台支持(Windows、macOS、Linux)
|
|
12
|
+
- 📝 支持多种数据格式:文本、HTML、 RTF、图片、文件列表
|
|
13
|
+
- 🖼️ 完整的图片处理支持(PNG、JPEG、GIF、BMP)
|
|
14
|
+
- 👂 剪贴板实时监听功能
|
|
15
|
+
- 🐧 Linux Wayland 环境原生支持
|
|
16
|
+
- ⚡ 同步和异步 API
|
|
17
|
+
- 🎯 TypeScript 类型定义
|
|
18
|
+
|
|
19
|
+
## 安装
|
|
19
20
|
|
|
20
21
|
```bash
|
|
21
22
|
npm install @teddyzhu/clipboard
|
|
22
23
|
```
|
|
23
24
|
|
|
24
|
-
##
|
|
25
|
+
## 基本使用
|
|
25
26
|
|
|
26
|
-
###
|
|
27
|
+
### 剪贴板管理器
|
|
27
28
|
|
|
28
29
|
```javascript
|
|
29
30
|
const { ClipboardManager } = require('@teddyzhu/clipboard')
|
|
30
31
|
|
|
31
32
|
const clipboard = new ClipboardManager()
|
|
32
33
|
|
|
33
|
-
//
|
|
34
|
+
// 文本操作
|
|
34
35
|
clipboard.setText('Hello World!')
|
|
35
36
|
console.log(clipboard.getText()) // "Hello World!"
|
|
36
37
|
|
|
37
|
-
//
|
|
38
|
+
// HTML 操作
|
|
38
39
|
clipboard.setHtml('<h1>Hello HTML</h1>')
|
|
39
40
|
console.log(clipboard.getHtml())
|
|
40
41
|
|
|
41
|
-
//
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### 图片操作
|
|
48
|
-
|
|
49
|
-
```javascript
|
|
50
|
-
const { ClipboardManager } = require('@teddyzhu/clipboard')
|
|
51
|
-
|
|
52
|
-
const clipboard = new ClipboardManager()
|
|
53
|
-
|
|
54
|
-
// 检查是否有图片
|
|
55
|
-
if (clipboard.hasFormat('image')) {
|
|
56
|
-
// 获取图片详细信息
|
|
57
|
-
const imageData = clipboard.getImageData()
|
|
58
|
-
console.log('图片信息:', {
|
|
59
|
-
width: imageData.width,
|
|
60
|
-
height: imageData.height,
|
|
61
|
-
size: imageData.size,
|
|
62
|
-
format: 'PNG (base64)'
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
// 保存图片到文件
|
|
66
|
-
const fs = require('fs')
|
|
67
|
-
const imageBuffer = Buffer.from(imageData.base64Data, 'base64')
|
|
68
|
-
fs.writeFileSync('clipboard-image.png', imageBuffer)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// 从文件设置图片到剪贴板
|
|
72
|
-
const fs = require('fs')
|
|
73
|
-
const imageBuffer = fs.readFileSync('my-image.png')
|
|
74
|
-
const base64Data = imageBuffer.toString('base64')
|
|
75
|
-
clipboard.setImageBase64(base64Data)
|
|
76
|
-
```
|
|
42
|
+
// 富文本(RTF)操作
|
|
43
|
+
clipboard.setRichText('Hello RTF')
|
|
44
|
+
console.log(clipboard.getRichText())
|
|
77
45
|
|
|
78
|
-
|
|
46
|
+
// 检查格式支持
|
|
47
|
+
console.log(clipboard.hasFormat('text')) // true
|
|
48
|
+
console.log(clipboard.getAvailableFormats()) // ['text', 'html', ...]
|
|
79
49
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const listener = new ClipboardListener()
|
|
84
|
-
|
|
85
|
-
listener.watch((data) => {
|
|
86
|
-
console.log('剪贴板内容变化:')
|
|
87
|
-
console.log('可用格式:', data.available_formats)
|
|
88
|
-
|
|
89
|
-
// 处理文本内容
|
|
90
|
-
if (data.text) {
|
|
91
|
-
console.log('📝 文本:', data.text)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
// 处理 HTML 内容
|
|
95
|
-
if (data.html) {
|
|
96
|
-
console.log('🌐 HTML:', data.html)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// 处理富文本内容
|
|
100
|
-
if (data.rtf) {
|
|
101
|
-
console.log('📄 RTF:', data.rtf)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// 处理图片内容
|
|
105
|
-
if (data.image) {
|
|
106
|
-
console.log('🖼️ 图片信息:')
|
|
107
|
-
console.log(` 尺寸: ${data.image.width}x${data.image.height}px`)
|
|
108
|
-
console.log(` 大小: ${data.image.size} bytes`)
|
|
109
|
-
console.log(` 数据长度: ${data.image.base64_data.length} 字符`)
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// 处理文件列表
|
|
113
|
-
if (data.files) {
|
|
114
|
-
console.log('📁 文件列表:', data.files)
|
|
115
|
-
}
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
// 检查监听状态
|
|
119
|
-
console.log('监听器类型:', listener.getListenerType()) // "wayland" 或 "generic"
|
|
120
|
-
console.log('正在监听:', listener.isWatching())
|
|
121
|
-
|
|
122
|
-
// 停止监听
|
|
123
|
-
// listener.stop()
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
### 异步操作
|
|
127
|
-
|
|
128
|
-
```javascript
|
|
129
|
-
const { ClipboardManager } = require('@teddyzhu/clipboard')
|
|
130
|
-
|
|
131
|
-
const clipboard = new ClipboardManager()
|
|
132
|
-
|
|
133
|
-
async function asyncClipboardDemo() {
|
|
134
|
-
try {
|
|
135
|
-
// 异步设置文本
|
|
136
|
-
await clipboard.setTextAsync('异步设置的文本')
|
|
137
|
-
|
|
138
|
-
// 异步获取文本
|
|
139
|
-
const text = await clipboard.getTextAsync()
|
|
140
|
-
console.log('异步获取的文本:', text)
|
|
141
|
-
|
|
142
|
-
// 异步获取图片
|
|
143
|
-
if (clipboard.hasFormat('image')) {
|
|
144
|
-
const imageData = await clipboard.getImageDataAsync()
|
|
145
|
-
console.log('异步获取的图片信息:', {
|
|
146
|
-
width: imageData.width,
|
|
147
|
-
height: imageData.height,
|
|
148
|
-
size: imageData.size
|
|
149
|
-
})
|
|
150
|
-
}
|
|
151
|
-
} catch (error) {
|
|
152
|
-
console.error('异步操作失败:', error)
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
asyncClipboardDemo()
|
|
50
|
+
// 清空剪贴板
|
|
51
|
+
clipboard.clear()
|
|
157
52
|
```
|
|
158
53
|
|
|
159
|
-
###
|
|
54
|
+
### 快速操作函数
|
|
160
55
|
|
|
161
56
|
```javascript
|
|
162
57
|
const {
|
|
@@ -164,311 +59,329 @@ const {
|
|
|
164
59
|
setClipboardText,
|
|
165
60
|
getClipboardHtml,
|
|
166
61
|
setClipboardHtml,
|
|
167
|
-
getClipboardImageData,
|
|
168
|
-
setClipboardImage,
|
|
169
|
-
getClipboardFiles,
|
|
170
|
-
setClipboardFiles,
|
|
171
|
-
getFullClipboardData,
|
|
172
62
|
clearClipboard,
|
|
173
|
-
|
|
63
|
+
getFullClipboardData,
|
|
174
64
|
} = require('@teddyzhu/clipboard')
|
|
175
65
|
|
|
176
66
|
// 快速文本操作
|
|
177
|
-
setClipboardText('
|
|
67
|
+
setClipboardText('Hello World!')
|
|
178
68
|
console.log(getClipboardText())
|
|
179
69
|
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
console.log(
|
|
70
|
+
// 快速 HTML 操作
|
|
71
|
+
setClipboardHtml('<p>Hello HTML</p>')
|
|
72
|
+
console.log(getClipboardHtml())
|
|
183
73
|
|
|
184
|
-
//
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
74
|
+
// 获取完整剪贴板数据
|
|
75
|
+
const data = getFullClipboardData()
|
|
76
|
+
console.log('可用格式:', data.availableFormats)
|
|
77
|
+
console.log('文本内容:', data.text)
|
|
78
|
+
console.log('HTML内容:', data.html)
|
|
188
79
|
|
|
189
80
|
// 清空剪贴板
|
|
190
81
|
clearClipboard()
|
|
191
82
|
```
|
|
192
83
|
|
|
193
|
-
|
|
84
|
+
## 图片操作
|
|
85
|
+
|
|
86
|
+
### 基本图片操作
|
|
194
87
|
|
|
195
88
|
```javascript
|
|
196
|
-
const { ClipboardManager } = require('@teddyzhu/clipboard')
|
|
89
|
+
const { ClipboardManager, getClipboardImageData } = require('@teddyzhu/clipboard')
|
|
90
|
+
const fs = require('fs')
|
|
197
91
|
|
|
198
92
|
const clipboard = new ClipboardManager()
|
|
199
93
|
|
|
200
|
-
//
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
clipboard.setContents(complexData)
|
|
209
|
-
|
|
210
|
-
// 或使用便利函数
|
|
211
|
-
const { setClipboardContents } = require('@teddyzhu/clipboard')
|
|
212
|
-
setClipboardContents(complexData)
|
|
213
|
-
```
|
|
94
|
+
// 检查是否有图片
|
|
95
|
+
if (clipboard.hasFormat('image')) {
|
|
96
|
+
// 获取图片详细信息
|
|
97
|
+
const imageData = clipboard.getImageData()
|
|
98
|
+
console.log('图片宽度:', imageData.width + 'px')
|
|
99
|
+
console.log('图片高度:', imageData.height + 'px')
|
|
100
|
+
console.log('图片大小:', imageData.size + ' bytes')
|
|
214
101
|
|
|
215
|
-
|
|
102
|
+
// 保存图片到文件
|
|
103
|
+
fs.writeFileSync('clipboard_image.png', imageData.data)
|
|
216
104
|
|
|
217
|
-
|
|
105
|
+
// 获取 base64 编码
|
|
106
|
+
const base64 = clipboard.getImageBase64()
|
|
107
|
+
console.log('Base64 长度:', base64.length)
|
|
108
|
+
}
|
|
218
109
|
|
|
219
|
-
|
|
110
|
+
// 从文件设置图片
|
|
111
|
+
const imageBuffer = fs.readFileSync('image.png')
|
|
112
|
+
clipboard.setImageRaw(imageBuffer)
|
|
220
113
|
|
|
221
|
-
|
|
114
|
+
// 从 base64 设置图片
|
|
115
|
+
const base64Data = fs.readFileSync('image.png', 'base64')
|
|
116
|
+
clipboard.setImageBase64(base64Data)
|
|
222
117
|
|
|
223
|
-
|
|
224
|
-
|
|
118
|
+
// 快速图片操作
|
|
119
|
+
const quickImageData = getClipboardImageData()
|
|
225
120
|
```
|
|
226
121
|
|
|
227
|
-
|
|
122
|
+
### 异步图片操作
|
|
228
123
|
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
setText(text: string): void // 设置纯文本
|
|
232
|
-
getTextAsync(): Promise<string> // 异步获取纯文本
|
|
233
|
-
setTextAsync(text: string): Promise<void> // 异步设置纯文本
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
#### HTML 操作
|
|
124
|
+
```javascript
|
|
125
|
+
const clipboard = new ClipboardManager()
|
|
237
126
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
127
|
+
// 异步获取图片
|
|
128
|
+
try {
|
|
129
|
+
const imageData = await clipboard.getImageDataAsync()
|
|
130
|
+
console.log('异步获取图片:', imageData.width + 'x' + imageData.height)
|
|
242
131
|
|
|
243
|
-
|
|
132
|
+
const base64 = await clipboard.getImageBase64Async()
|
|
133
|
+
console.log('异步获取 Base64 长度:', base64.length)
|
|
134
|
+
} catch (error) {
|
|
135
|
+
console.error('获取图片失败:', error.message)
|
|
136
|
+
}
|
|
244
137
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
138
|
+
// 异步文本操作
|
|
139
|
+
await clipboard.setTextAsync('Hello Async!')
|
|
140
|
+
const text = await clipboard.getTextAsync()
|
|
141
|
+
console.log('异步文本:', text)
|
|
248
142
|
```
|
|
249
143
|
|
|
250
|
-
|
|
144
|
+
## 文件操作
|
|
251
145
|
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
getImageData(): ImageData // 获取图片详细信息
|
|
255
|
-
getImageDataAsync(): Promise<ImageData> // 异步获取图片信息
|
|
256
|
-
setImageBase64(base64: string): void // 设置图片(base64)
|
|
257
|
-
```
|
|
146
|
+
```javascript
|
|
147
|
+
const { ClipboardManager, getClipboardFiles, setClipboardFiles } = require('@teddyzhu/clipboard')
|
|
258
148
|
|
|
259
|
-
|
|
149
|
+
const clipboard = new ClipboardManager()
|
|
260
150
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
setFiles(files
|
|
264
|
-
```
|
|
151
|
+
// 设置文件列表
|
|
152
|
+
const files = ['/path/to/file1.txt', '/path/to/file2.pdf']
|
|
153
|
+
clipboard.setFiles(files)
|
|
265
154
|
|
|
266
|
-
|
|
155
|
+
// 获取文件列表
|
|
156
|
+
if (clipboard.hasFormat('files')) {
|
|
157
|
+
const clipboardFiles = clipboard.getFiles()
|
|
158
|
+
console.log('剪贴板中的文件:', clipboardFiles)
|
|
159
|
+
}
|
|
267
160
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
161
|
+
// 快速文件操作
|
|
162
|
+
setClipboardFiles(['/path/to/document.pdf'])
|
|
163
|
+
const quickFiles = getClipboardFiles()
|
|
164
|
+
console.log('快速获取文件:', quickFiles)
|
|
271
165
|
```
|
|
272
166
|
|
|
273
|
-
|
|
167
|
+
## 自定义格式数据
|
|
274
168
|
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
```
|
|
169
|
+
```javascript
|
|
170
|
+
const clipboard = new ClipboardManager()
|
|
278
171
|
|
|
279
|
-
|
|
172
|
+
// 设置自定义格式数据
|
|
173
|
+
const customData = Buffer.from('custom binary data')
|
|
174
|
+
clipboard.setBuffer('application/custom', customData)
|
|
280
175
|
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
176
|
+
// 获取自定义格式数据
|
|
177
|
+
try {
|
|
178
|
+
const data = clipboard.getBuffer('application/custom')
|
|
179
|
+
console.log('自定义数据:', data.toString())
|
|
180
|
+
} catch (error) {
|
|
181
|
+
console.error('自定义格式不存在')
|
|
182
|
+
}
|
|
285
183
|
```
|
|
286
184
|
|
|
287
|
-
|
|
185
|
+
## 复合内容操作
|
|
288
186
|
|
|
289
|
-
|
|
187
|
+
```javascript
|
|
188
|
+
const { ClipboardManager, setClipboardContents } = require('@teddyzhu/clipboard')
|
|
290
189
|
|
|
291
|
-
|
|
190
|
+
const clipboard = new ClipboardManager()
|
|
292
191
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
192
|
+
// 同时设置多种格式
|
|
193
|
+
const contents = {
|
|
194
|
+
text: 'Hello World!',
|
|
195
|
+
html: '<h1>Hello HTML</h1>',
|
|
196
|
+
rtf: 'Hello RTF',
|
|
197
|
+
// 可选:图片数据
|
|
198
|
+
// image: { width: 100, height: 100, size: 1000, data: imageBuffer },
|
|
199
|
+
// 可选:文件列表
|
|
200
|
+
// files: ['/path/to/file.txt']
|
|
201
|
+
}
|
|
296
202
|
|
|
297
|
-
|
|
203
|
+
clipboard.setContents(contents)
|
|
298
204
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
205
|
+
// 快速设置复合内容
|
|
206
|
+
setClipboardContents({
|
|
207
|
+
text: 'Multi-format content',
|
|
208
|
+
html: '<p>Multi-format <strong>content</strong></p>',
|
|
209
|
+
})
|
|
304
210
|
```
|
|
305
211
|
|
|
306
|
-
|
|
212
|
+
## 剪贴板监听
|
|
307
213
|
|
|
308
|
-
|
|
214
|
+
### 基本监听
|
|
309
215
|
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
available_formats: string[] // 可用格式列表
|
|
313
|
-
text?: string // 纯文本内容
|
|
314
|
-
rtf?: string // RTF 富文本内容
|
|
315
|
-
html?: string // HTML 内容
|
|
316
|
-
image?: ImageData // 图片数据
|
|
317
|
-
files?: string[] // 文件路径列表
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
#### ImageData
|
|
216
|
+
```javascript
|
|
217
|
+
const { ClipboardListener } = require('@teddyzhu/clipboard')
|
|
322
218
|
|
|
323
|
-
|
|
324
|
-
interface ImageData {
|
|
325
|
-
width: number // 图片宽度(像素)
|
|
326
|
-
height: number // 图片高度(像素)
|
|
327
|
-
size: number // 数据大小(字节)
|
|
328
|
-
base64_data: string // base64 编码的图片数据
|
|
329
|
-
}
|
|
330
|
-
```
|
|
219
|
+
const listener = new ClipboardListener()
|
|
331
220
|
|
|
332
|
-
|
|
221
|
+
listener.watch((data) => {
|
|
222
|
+
console.log('剪贴板数据变化:', data)
|
|
223
|
+
console.log('可用格式:', data.availableFormats)
|
|
333
224
|
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
setClipboardText(text: string): void
|
|
225
|
+
if (data.text) {
|
|
226
|
+
console.log('文本:', data.text)
|
|
227
|
+
}
|
|
338
228
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
229
|
+
if (data.html) {
|
|
230
|
+
console.log('HTML:', data.html)
|
|
231
|
+
}
|
|
342
232
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
setClipboardImage(base64: string): void
|
|
233
|
+
if (data.rtf) {
|
|
234
|
+
console.log('RTF:', data.rtf)
|
|
235
|
+
}
|
|
347
236
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
237
|
+
if (data.image) {
|
|
238
|
+
console.log('图片信息:')
|
|
239
|
+
console.log(' 尺寸:', data.image.width + 'x' + data.image.height + 'px')
|
|
240
|
+
console.log(' 大小:', data.image.size + ' bytes')
|
|
241
|
+
// 注意:图片数据在 data.image.data (Buffer) 中,不是 base64Data
|
|
242
|
+
console.log(' 数据类型:', Buffer.isBuffer(data.image.data) ? 'Buffer' : typeof data.image.data)
|
|
243
|
+
}
|
|
351
244
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
245
|
+
if (data.files) {
|
|
246
|
+
console.log('文件:', data.files)
|
|
247
|
+
}
|
|
248
|
+
})
|
|
355
249
|
|
|
356
|
-
//
|
|
357
|
-
|
|
358
|
-
|
|
250
|
+
// 检查监听状态
|
|
251
|
+
console.log('是否正在监听:', listener.isWatching())
|
|
252
|
+
console.log('监听器类型:', listener.getListenerType()) // 'wayland' 或 'generic'
|
|
359
253
|
|
|
360
|
-
//
|
|
361
|
-
|
|
362
|
-
|
|
254
|
+
// 停止监听
|
|
255
|
+
setTimeout(() => {
|
|
256
|
+
listener.stop()
|
|
257
|
+
console.log('已停止监听')
|
|
258
|
+
}, 10000)
|
|
363
259
|
```
|
|
364
260
|
|
|
365
|
-
##
|
|
366
|
-
|
|
367
|
-
### Wayland 支持
|
|
261
|
+
## Wayland 支持
|
|
368
262
|
|
|
369
|
-
|
|
263
|
+
本库对 Linux Wayland 环境提供原生支持:
|
|
370
264
|
|
|
371
265
|
```javascript
|
|
372
266
|
const { isWaylandClipboardAvailable, ClipboardListener } = require('@teddyzhu/clipboard')
|
|
373
267
|
|
|
268
|
+
// 检查 Wayland 剪贴板是否可用
|
|
374
269
|
if (isWaylandClipboardAvailable()) {
|
|
375
|
-
console.log('
|
|
376
|
-
} else {
|
|
377
|
-
console.log('使用通用剪贴板监听器')
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
const listener = new ClipboardListener()
|
|
381
|
-
console.log('监听器类型:', listener.getListenerType())
|
|
382
|
-
```
|
|
270
|
+
console.log('Wayland 剪贴板监听可用')
|
|
383
271
|
|
|
384
|
-
|
|
272
|
+
const listener = new ClipboardListener()
|
|
273
|
+
console.log('当前监听器类型:', listener.getListenerType()) // 在 Wayland 下会显示 'wayland'
|
|
385
274
|
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
275
|
+
// Wayland 监听器会自动处理不同的 MIME 类型
|
|
276
|
+
listener.watch((data) => {
|
|
277
|
+
console.log('Wayland 剪贴板变化:', data)
|
|
278
|
+
})
|
|
279
|
+
} else {
|
|
280
|
+
console.log('使用通用剪贴板监听器')
|
|
390
281
|
}
|
|
391
282
|
```
|
|
392
283
|
|
|
393
|
-
##
|
|
284
|
+
## API 参考
|
|
394
285
|
|
|
395
|
-
|
|
396
|
-
- **操作系统**: Windows 7+, macOS 10.9+, Linux
|
|
397
|
-
- **Linux 额外要求**:
|
|
398
|
-
- X11: `libxcb`, `libxcb-shape`, `libxcb-xfixes`
|
|
399
|
-
- Wayland: `wl-clipboard` 工具
|
|
286
|
+
### ClipboardManager 类
|
|
400
287
|
|
|
401
|
-
|
|
288
|
+
| 方法 | 描述 |
|
|
289
|
+
| ---------------------------- | -------------------------------------- |
|
|
290
|
+
| `getText()` | 获取纯文本内容 |
|
|
291
|
+
| `setText(text)` | 设置纯文本内容 |
|
|
292
|
+
| `getHtml()` | 获取 HTML 内容 |
|
|
293
|
+
| `setHtml(html)` | 设置 HTML 内容 |
|
|
294
|
+
| `getRichText()` | 获取 RTF 富文本内容 |
|
|
295
|
+
| `setRichText(text)` | 设置 RTF 富文本内容 |
|
|
296
|
+
| `getImageBase64()` | 获取图片的 base64 编码 |
|
|
297
|
+
| `getImageData()` | 获取图片详细信息(包含尺寸和原始数据) |
|
|
298
|
+
| `setImageBase64(base64Data)` | 从 base64 设置图片 |
|
|
299
|
+
| `setImageRaw(buffer)` | 从 Buffer 设置图片 |
|
|
300
|
+
| `getImageRaw()` | 获取图片原始数据(Buffer) |
|
|
301
|
+
| `getFiles()` | 获取文件列表 |
|
|
302
|
+
| `setFiles(files)` | 设置文件列表 |
|
|
303
|
+
| `setBuffer(format, buffer)` | 设置自定义格式数据 |
|
|
304
|
+
| `getBuffer(format)` | 获取自定义格式数据 |
|
|
305
|
+
| `setContents(contents)` | 设置复合内容 |
|
|
306
|
+
| `hasFormat(format)` | 检查是否包含指定格式 |
|
|
307
|
+
| `getAvailableFormats()` | 获取所有可用格式 |
|
|
308
|
+
| `clear()` | 清空剪贴板 |
|
|
309
|
+
|
|
310
|
+
### 异步方法
|
|
311
|
+
|
|
312
|
+
| 方法 | 描述 |
|
|
313
|
+
| ----------------------- | -------------------- |
|
|
314
|
+
| `getTextAsync()` | 异步获取文本内容 |
|
|
315
|
+
| `setTextAsync(text)` | 异步设置文本内容 |
|
|
316
|
+
| `getImageBase64Async()` | 异步获取图片 base64 |
|
|
317
|
+
| `getImageDataAsync()` | 异步获取图片详细信息 |
|
|
402
318
|
|
|
403
|
-
|
|
404
|
-
```bash
|
|
405
|
-
sudo apt install libxcb1-dev libxcb-shape0-dev libxcb-xfixes0-dev wl-clipboard
|
|
406
|
-
```
|
|
319
|
+
### ClipboardListener 类
|
|
407
320
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
321
|
+
| 方法 | 描述 |
|
|
322
|
+
| ------------------- | ---------------------------------------- |
|
|
323
|
+
| `watch(callback)` | 开始监听剪贴板变化 |
|
|
324
|
+
| `stop()` | 停止监听 |
|
|
325
|
+
| `isWatching()` | 检查是否正在监听 |
|
|
326
|
+
| `getListenerType()` | 获取监听器类型('wayland' 或 'generic') |
|
|
327
|
+
|
|
328
|
+
### 快速操作函数
|
|
329
|
+
|
|
330
|
+
| 函数 | 描述 |
|
|
331
|
+
| ------------------------------------ | --------------------------- |
|
|
332
|
+
| `getClipboardText()` | 快速获取文本 |
|
|
333
|
+
| `setClipboardText(text)` | 快速设置文本 |
|
|
334
|
+
| `getClipboardHtml()` | 快速获取 HTML |
|
|
335
|
+
| `setClipboardHtml(html)` | 快速设置 HTML |
|
|
336
|
+
| `getClipboardImage()` | 快速获取图片(base64) |
|
|
337
|
+
| `getClipboardImageData()` | 快速获取图片详细信息 |
|
|
338
|
+
| `setClipboardImage(base64Data)` | 快速设置图片(base64) |
|
|
339
|
+
| `setClipboardImageRaw(buffer)` | 快速设置图片(Buffer) |
|
|
340
|
+
| `getClipboardImageRaw()` | 快速获取图片原始数据 |
|
|
341
|
+
| `getClipboardFiles()` | 快速获取文件列表 |
|
|
342
|
+
| `setClipboardFiles(files)` | 快速设置文件列表 |
|
|
343
|
+
| `getClipboardBuffer(format)` | 快速获取自定义格式数据 |
|
|
344
|
+
| `setClipboardBuffer(format, buffer)` | 快速设置自定义格式数据 |
|
|
345
|
+
| `setClipboardContents(contents)` | 快速设置复合内容 |
|
|
346
|
+
| `getFullClipboardData()` | 快速获取完整剪贴板数据 |
|
|
347
|
+
| `clearClipboard()` | 快速清空剪贴板 |
|
|
348
|
+
| `isWaylandClipboardAvailable()` | 检查 Wayland 剪贴板是否可用 |
|
|
349
|
+
|
|
350
|
+
## 数据结构
|
|
351
|
+
|
|
352
|
+
### ClipboardData
|
|
412
353
|
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
354
|
+
```typescript
|
|
355
|
+
interface ClipboardData {
|
|
356
|
+
availableFormats: string[] // 可用的格式列表
|
|
357
|
+
text?: string // 纯文本内容
|
|
358
|
+
rtf?: string // RTF 富文本内容
|
|
359
|
+
html?: string // HTML 内容
|
|
360
|
+
image?: ImageData // 图片数据
|
|
361
|
+
files?: string[] // 文件列表
|
|
362
|
+
}
|
|
416
363
|
```
|
|
417
364
|
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
### 常见问题
|
|
421
|
-
|
|
422
|
-
1. **Linux 环境下无法访问剪贴板**
|
|
423
|
-
- 确保安装了必要的系统依赖
|
|
424
|
-
- 检查桌面环境是否支持剪贴板操作
|
|
365
|
+
### ImageData
|
|
425
366
|
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
- 图片数据统一转换为 PNG 格式输出
|
|
433
|
-
|
|
434
|
-
4. **权限问题**
|
|
435
|
-
- 某些 Linux 发行版可能需要额外的权限配置
|
|
436
|
-
- 确保应用程序有访问剪贴板的权限
|
|
437
|
-
|
|
438
|
-
### 调试模式
|
|
439
|
-
|
|
440
|
-
```javascript
|
|
441
|
-
const { ClipboardManager } = require('@teddyzhu/clipboard')
|
|
442
|
-
|
|
443
|
-
const clipboard = new ClipboardManager()
|
|
444
|
-
|
|
445
|
-
try {
|
|
446
|
-
// 检查可用格式
|
|
447
|
-
const formats = clipboard.getAvailableFormats()
|
|
448
|
-
console.log('可用格式:', formats)
|
|
449
|
-
|
|
450
|
-
// 逐一测试各种格式
|
|
451
|
-
if (clipboard.hasFormat('text')) {
|
|
452
|
-
console.log('文本内容:', clipboard.getText())
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
if (clipboard.hasFormat('image')) {
|
|
456
|
-
const imageData = clipboard.getImageData()
|
|
457
|
-
console.log('图片信息:', imageData.width, 'x', imageData.height)
|
|
458
|
-
}
|
|
459
|
-
} catch (error) {
|
|
460
|
-
console.error('剪贴板操作失败:', error.message)
|
|
367
|
+
```typescript
|
|
368
|
+
interface ImageData {
|
|
369
|
+
width: number // 图片宽度(像素)
|
|
370
|
+
height: number // 图片高度(像素)
|
|
371
|
+
size: number // 图片数据大小(字节)
|
|
372
|
+
data: Buffer // 图片原始数据(Buffer)
|
|
461
373
|
}
|
|
462
374
|
```
|
|
463
375
|
|
|
464
|
-
##
|
|
465
|
-
|
|
466
|
-
MIT License - 详见 [LICENSE](LICENSE) 文件。
|
|
467
|
-
|
|
468
|
-
## 🤝 贡献
|
|
376
|
+
## 注意事项
|
|
469
377
|
|
|
470
|
-
|
|
378
|
+
1. **图片格式**:所有图片都会转换为 PNG 格式存储
|
|
379
|
+
2. **文件路径**:文件路径需要是绝对路径
|
|
380
|
+
3. **自定义格式**:自定义格式的 MIME 类型需要遵循标准
|
|
381
|
+
4. **Wayland 支持**:在 Wayland 环境下会自动使用专用监听器以获得更好的性能
|
|
382
|
+
5. **异步操作**:对于可能耗时的操作,推荐使用异步版本
|
|
383
|
+
6. **错误处理**:所有方法都可能抛出异常,请适当处理错误
|
|
471
384
|
|
|
472
|
-
##
|
|
385
|
+
## 许可证
|
|
473
386
|
|
|
474
|
-
|
|
387
|
+
MIT
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/index.d.ts
CHANGED
|
@@ -59,18 +59,22 @@ export declare class ClipboardManager {
|
|
|
59
59
|
setRichText(text: string): void
|
|
60
60
|
/** 获取剪贴板中的图片数据(以 base64 编码返回) */
|
|
61
61
|
getImageBase64(): string
|
|
62
|
-
/**
|
|
62
|
+
/** 获取剪贴板中的图片详细信息(包含宽度、高度、大小和原始数据) */
|
|
63
63
|
getImageData(): ImageData
|
|
64
64
|
/** 从 base64 编码的图片数据设置剪贴板图片 */
|
|
65
65
|
setImageBase64(base64Data: string): void
|
|
66
|
+
/** 从原始字节数据设置剪贴板图片 */
|
|
67
|
+
setImageRaw(imageData: Buffer): void
|
|
68
|
+
/** 获取剪贴板中的图片原始数据(Buffer) */
|
|
69
|
+
getImageRaw(): Buffer
|
|
66
70
|
/** 获取剪贴板中的文件列表 */
|
|
67
71
|
getFiles(): Array<string>
|
|
68
72
|
/** 设置剪贴板中的文件列表 */
|
|
69
73
|
setFiles(files: Array<string>): void
|
|
70
74
|
/** 设置剪贴板中的自定义格式数据 */
|
|
71
|
-
setBuffer(format: string, buffer:
|
|
75
|
+
setBuffer(format: string, buffer: Buffer): void
|
|
72
76
|
/** 获取剪贴板中的自定义格式数据 */
|
|
73
|
-
getBuffer(format: string):
|
|
77
|
+
getBuffer(format: string): Buffer
|
|
74
78
|
/** 设置剪贴板中的复合内容(可同时设置多种格式) */
|
|
75
79
|
setContents(contents: ClipboardData): void
|
|
76
80
|
/** 检查剪贴板是否包含指定格式的内容 */
|
|
@@ -85,7 +89,7 @@ export declare class ClipboardManager {
|
|
|
85
89
|
setTextAsync(text: string): Promise<void>
|
|
86
90
|
/** 异步获取剪贴板图片数据(以 base64 编码返回) */
|
|
87
91
|
getImageBase64Async(): Promise<string>
|
|
88
|
-
/**
|
|
92
|
+
/** 异步获取剪贴板图片详细信息(包含宽度、高度、大小和原始数据) */
|
|
89
93
|
getImageDataAsync(): Promise<ImageData>
|
|
90
94
|
}
|
|
91
95
|
|
|
@@ -109,7 +113,7 @@ export interface ClipboardData {
|
|
|
109
113
|
}
|
|
110
114
|
|
|
111
115
|
/** 快速获取剪贴板自定义格式数据 */
|
|
112
|
-
export declare function getClipboardBuffer(format: string):
|
|
116
|
+
export declare function getClipboardBuffer(format: string): Buffer
|
|
113
117
|
|
|
114
118
|
/** 快速获取剪贴板文件列表 */
|
|
115
119
|
export declare function getClipboardFiles(): Array<string>
|
|
@@ -120,9 +124,12 @@ export declare function getClipboardHtml(): string
|
|
|
120
124
|
/** 快速获取剪贴板图片(base64 编码) */
|
|
121
125
|
export declare function getClipboardImage(): string
|
|
122
126
|
|
|
123
|
-
/**
|
|
127
|
+
/** 快速获取剪贴板图片详细信息(包含宽度、高度、大小和原始数据) */
|
|
124
128
|
export declare function getClipboardImageData(): ImageData
|
|
125
129
|
|
|
130
|
+
/** 快速获取剪贴板图片原始数据(Buffer) */
|
|
131
|
+
export declare function getClipboardImageRaw(): Buffer
|
|
132
|
+
|
|
126
133
|
/** 快速获取剪贴板文本内容 */
|
|
127
134
|
export declare function getClipboardText(): string
|
|
128
135
|
|
|
@@ -137,8 +144,8 @@ export interface ImageData {
|
|
|
137
144
|
height: number
|
|
138
145
|
/** 图片数据大小(字节) */
|
|
139
146
|
size: number
|
|
140
|
-
/**
|
|
141
|
-
|
|
147
|
+
/** 图片原始数据(Buffer) */
|
|
148
|
+
data: Buffer
|
|
142
149
|
}
|
|
143
150
|
|
|
144
151
|
/**
|
|
@@ -149,7 +156,7 @@ export interface ImageData {
|
|
|
149
156
|
export declare function isWaylandClipboardAvailable(): boolean
|
|
150
157
|
|
|
151
158
|
/** 快速设置剪贴板自定义格式数据 */
|
|
152
|
-
export declare function setClipboardBuffer(format: string, buffer:
|
|
159
|
+
export declare function setClipboardBuffer(format: string, buffer: Buffer): void
|
|
153
160
|
|
|
154
161
|
/** 快速设置剪贴板复合内容(可同时设置多种格式) */
|
|
155
162
|
export declare function setClipboardContents(contents: ClipboardData): void
|
|
@@ -163,5 +170,8 @@ export declare function setClipboardHtml(html: string): void
|
|
|
163
170
|
/** 快速设置剪贴板图片(从 base64 编码) */
|
|
164
171
|
export declare function setClipboardImage(base64Data: string): void
|
|
165
172
|
|
|
173
|
+
/** 快速设置剪贴板图片(从原始字节数据) */
|
|
174
|
+
export declare function setClipboardImageRaw(imageData: Buffer): void
|
|
175
|
+
|
|
166
176
|
/** 快速设置剪贴板文本内容 */
|
|
167
177
|
export declare function setClipboardText(text: string): void
|
package/index.js
CHANGED
|
@@ -401,6 +401,7 @@ module.exports.getClipboardFiles = nativeBinding.getClipboardFiles
|
|
|
401
401
|
module.exports.getClipboardHtml = nativeBinding.getClipboardHtml
|
|
402
402
|
module.exports.getClipboardImage = nativeBinding.getClipboardImage
|
|
403
403
|
module.exports.getClipboardImageData = nativeBinding.getClipboardImageData
|
|
404
|
+
module.exports.getClipboardImageRaw = nativeBinding.getClipboardImageRaw
|
|
404
405
|
module.exports.getClipboardText = nativeBinding.getClipboardText
|
|
405
406
|
module.exports.getFullClipboardData = nativeBinding.getFullClipboardData
|
|
406
407
|
module.exports.isWaylandClipboardAvailable = nativeBinding.isWaylandClipboardAvailable
|
|
@@ -409,4 +410,5 @@ module.exports.setClipboardContents = nativeBinding.setClipboardContents
|
|
|
409
410
|
module.exports.setClipboardFiles = nativeBinding.setClipboardFiles
|
|
410
411
|
module.exports.setClipboardHtml = nativeBinding.setClipboardHtml
|
|
411
412
|
module.exports.setClipboardImage = nativeBinding.setClipboardImage
|
|
413
|
+
module.exports.setClipboardImageRaw = nativeBinding.setClipboardImageRaw
|
|
412
414
|
module.exports.setClipboardText = nativeBinding.setClipboardText
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teddyzhu/clipboard",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "it's a node package with napi-rs wrapper clipboard-rs",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"repository": "git@github.com:Teddy-Zhu/node-clipboard-rs.git",
|
|
@@ -15,7 +15,8 @@
|
|
|
15
15
|
],
|
|
16
16
|
"files": [
|
|
17
17
|
"index.d.ts",
|
|
18
|
-
"index.js"
|
|
18
|
+
"index.js",
|
|
19
|
+
"*.node"
|
|
19
20
|
],
|
|
20
21
|
"napi": {
|
|
21
22
|
"binaryName": "clipboard",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"@oxc-node/core": "^0.0.29",
|
|
58
59
|
"@taplo/cli": "^0.7.0",
|
|
59
60
|
"@tybys/wasm-util": "^0.10.0",
|
|
61
|
+
"@types/node": "^24.1.0",
|
|
60
62
|
"ava": "^6.4.0",
|
|
61
63
|
"chalk": "^5.4.1",
|
|
62
64
|
"husky": "^9.1.7",
|
|
@@ -101,11 +103,11 @@
|
|
|
101
103
|
},
|
|
102
104
|
"packageManager": "yarn@4.9.2",
|
|
103
105
|
"optionalDependencies": {
|
|
104
|
-
"@teddyzhu/clipboard-win32-x64-msvc": "0.0.
|
|
105
|
-
"@teddyzhu/clipboard-darwin-x64": "0.0.
|
|
106
|
-
"@teddyzhu/clipboard-linux-x64-gnu": "0.0.
|
|
107
|
-
"@teddyzhu/clipboard-linux-arm64-gnu": "0.0.
|
|
108
|
-
"@teddyzhu/clipboard-darwin-arm64": "0.0.
|
|
109
|
-
"@teddyzhu/clipboard-win32-arm64-msvc": "0.0.
|
|
106
|
+
"@teddyzhu/clipboard-win32-x64-msvc": "0.0.6",
|
|
107
|
+
"@teddyzhu/clipboard-darwin-x64": "0.0.6",
|
|
108
|
+
"@teddyzhu/clipboard-linux-x64-gnu": "0.0.6",
|
|
109
|
+
"@teddyzhu/clipboard-linux-arm64-gnu": "0.0.6",
|
|
110
|
+
"@teddyzhu/clipboard-darwin-arm64": "0.0.6",
|
|
111
|
+
"@teddyzhu/clipboard-win32-arm64-msvc": "0.0.6"
|
|
110
112
|
}
|
|
111
113
|
}
|