@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 CHANGED
@@ -1,162 +1,57 @@
1
- # @teddyzhu/clipboard
1
+ # `@teddyzhu/clipboard`
2
2
 
3
- ![CI](https://github.com/Teddy-Zhu/node-clipboard-rs/workflows/CI/badge.svg)
4
- [![npm version](https://badge.fury.io/js/@teddyzhu%2Fclipboard.svg)](https://www.npmjs.com/package/@teddyzhu/clipboard)
3
+ v0.0.6
5
4
 
6
- 基于 clipboard-rs 和 napi-rs 的高性能 Node.js 剪贴板操作库,提供跨平台的剪贴板读写和监听功能。
5
+ ![https://github.com/Teddy-Zhu/node-clipboard-rs/actions](https://github.com/Teddy-Zhu/node-clipboard-rs/workflows/CI/badge.svg)
7
6
 
8
- ## 特性
7
+ > 基于 napi-rs 包装 clipboard-rs 的 Node.js 剪贴板库,提供跨平台剪贴板操作功能
9
8
 
10
- - 🚀 **高性能**: 基于 Rust 原生实现,性能优越
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
- // 设置和获取 HTML
38
+ // HTML 操作
38
39
  clipboard.setHtml('<h1>Hello HTML</h1>')
39
40
  console.log(clipboard.getHtml())
40
41
 
41
- // 检查格式是否可用
42
- if (clipboard.hasFormat('text')) {
43
- console.log('剪贴板包含文本内容')
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
- ```javascript
81
- const { ClipboardListener } = require('@teddyzhu/clipboard')
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
- isWaylandClipboardAvailable
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
- const fullData = getFullClipboardData()
182
- console.log('完整剪贴板数据:', fullData)
70
+ // 快速 HTML 操作
71
+ setClipboardHtml('<p>Hello HTML</p>')
72
+ console.log(getClipboardHtml())
183
73
 
184
- // 检查 Wayland 支持
185
- if (isWaylandClipboardAvailable()) {
186
- console.log('当前环境支持 Wayland 剪贴板')
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
- const complexData = {
202
- text: '这是纯文本内容',
203
- html: '<h1>这是 HTML 内容</h1><p>支持丰富的格式</p>',
204
- rtf: '{\\rtf1\\ansi 这是 RTF 格式}',
205
- files: ['/path/to/file1.txt', '/path/to/file2.jpg']
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
- ## 📖 API 文档
102
+ // 保存图片到文件
103
+ fs.writeFileSync('clipboard_image.png', imageData.data)
216
104
 
217
- ### ClipboardManager
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
- ```typescript
224
- new ClipboardManager(): ClipboardManager
118
+ // 快速图片操作
119
+ const quickImageData = getClipboardImageData()
225
120
  ```
226
121
 
227
- #### 文本操作
122
+ ### 异步图片操作
228
123
 
229
- ```typescript
230
- getText(): string // 获取纯文本
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
- ```typescript
239
- getHtml(): string // 获取 HTML 内容
240
- setHtml(html: string): void // 设置 HTML 内容
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
- ```typescript
246
- getRichText(): string // 获取 RTF 富文本
247
- setRichText(rtf: string): void // 设置 RTF 富文本
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
- ```typescript
253
- getImageBase64(): string // 获取图片 base64 数据
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
- ```typescript
262
- getFiles(): string[] // 获取文件路径列表
263
- setFiles(files: string[]): void // 设置文件路径列表
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
- ```typescript
269
- getBuffer(format: string): Uint8Array // 获取自定义格式数据
270
- setBuffer(format: string, data: Uint8Array): void // 设置自定义格式数据
161
+ // 快速文件操作
162
+ setClipboardFiles(['/path/to/document.pdf'])
163
+ const quickFiles = getClipboardFiles()
164
+ console.log('快速获取文件:', quickFiles)
271
165
  ```
272
166
 
273
- #### 复合操作
167
+ ## 自定义格式数据
274
168
 
275
- ```typescript
276
- setContents(data: ClipboardData): void // 设置复合内容
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
- ```typescript
282
- hasFormat(format: string): boolean // 检查格式是否可用
283
- getAvailableFormats(): string[] // 获取所有可用格式
284
- clear(): void // 清空剪贴板
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
- ### ClipboardListener 类
185
+ ## 复合内容操作
288
186
 
289
- 用于监听剪贴板变化的类。
187
+ ```javascript
188
+ const { ClipboardManager, setClipboardContents } = require('@teddyzhu/clipboard')
290
189
 
291
- #### 构造函数
190
+ const clipboard = new ClipboardManager()
292
191
 
293
- ```typescript
294
- new ClipboardListener(): ClipboardListener
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
- ```typescript
300
- watch(callback: (data: ClipboardData) => void): void // 开始监听
301
- stop(): void // 停止监听
302
- isWatching(): boolean // 检查监听状态
303
- getListenerType(): string // 获取监听器类型
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
- #### ClipboardData
214
+ ### 基本监听
309
215
 
310
- ```typescript
311
- interface ClipboardData {
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
- ```typescript
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
- ```typescript
335
- // 文本操作
336
- getClipboardText(): string
337
- setClipboardText(text: string): void
225
+ if (data.text) {
226
+ console.log('文本:', data.text)
227
+ }
338
228
 
339
- // HTML 操作
340
- getClipboardHtml(): string
341
- setClipboardHtml(html: string): void
229
+ if (data.html) {
230
+ console.log('HTML:', data.html)
231
+ }
342
232
 
343
- // 图片操作
344
- getClipboardImage(): string // 获取 base64
345
- getClipboardImageData(): ImageData // 获取详细信息
346
- setClipboardImage(base64: string): void
233
+ if (data.rtf) {
234
+ console.log('RTF:', data.rtf)
235
+ }
347
236
 
348
- // 文件操作
349
- getClipboardFiles(): string[]
350
- setClipboardFiles(files: string[]): void
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
- getClipboardBuffer(format: string): Uint8Array
354
- setClipboardBuffer(format: string, data: Uint8Array): void
245
+ if (data.files) {
246
+ console.log('文件:', data.files)
247
+ }
248
+ })
355
249
 
356
- // 复合操作
357
- getFullClipboardData(): ClipboardData
358
- setClipboardContents(data: ClipboardData): void
250
+ // 检查监听状态
251
+ console.log('是否正在监听:', listener.isWatching())
252
+ console.log('监听器类型:', listener.getListenerType()) // 'wayland' 或 'generic'
359
253
 
360
- // 工具函数
361
- clearClipboard(): void
362
- isWaylandClipboardAvailable(): boolean
254
+ // 停止监听
255
+ setTimeout(() => {
256
+ listener.stop()
257
+ console.log('已停止监听')
258
+ }, 10000)
363
259
  ```
364
260
 
365
- ## 🌟 特殊功能
366
-
367
- ### Wayland 支持
261
+ ## Wayland 支持
368
262
 
369
- 本库自动检测运行环境,在 Wayland 桌面环境下会使用专门优化的监听器:
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('使用 Wayland 优化的剪贴板监听器')
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
- ```javascript
387
- // 检测当前环境是否支持 Wayland 剪贴板
388
- if (isWaylandClipboardAvailable()) {
389
- // Wayland 环境下的特殊处理
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
- - **Node.js**: >= 12.0.0
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
- ### Linux 依赖安装
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
- **Ubuntu/Debian:**
404
- ```bash
405
- sudo apt install libxcb1-dev libxcb-shape0-dev libxcb-xfixes0-dev wl-clipboard
406
- ```
319
+ ### ClipboardListener 类
407
320
 
408
- **CentOS/RHEL:**
409
- ```bash
410
- sudo yum install libxcb-devel wl-clipboard
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
- **Arch Linux:**
414
- ```bash
415
- sudo pacman -S libxcb wl-clipboard
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
- 2. **Wayland 环境下监听不工作**
427
- - 确保安装了 `wl-clipboard` 工具
428
- - 检查环境变量 `WAYLAND_DISPLAY` 是否正确设置
429
-
430
- 3. **图片格式不支持**
431
- - 目前支持 PNG、JPEG、GIF、BMP 格式
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
- 欢迎提交 Issue Pull Request!
378
+ 1. **图片格式**:所有图片都会转换为 PNG 格式存储
379
+ 2. **文件路径**:文件路径需要是绝对路径
380
+ 3. **自定义格式**:自定义格式的 MIME 类型需要遵循标准
381
+ 4. **Wayland 支持**:在 Wayland 环境下会自动使用专用监听器以获得更好的性能
382
+ 5. **异步操作**:对于可能耗时的操作,推荐使用异步版本
383
+ 6. **错误处理**:所有方法都可能抛出异常,请适当处理错误
471
384
 
472
- ## 📞 支持
385
+ ## 许可证
473
386
 
474
- 如遇问题,请在 [GitHub Issues](https://github.com/Teddy-Zhu/node-clipboard-rs/issues) 中报告。
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
- /** 获取剪贴板中的图片详细信息(包含宽度、高度、大小和 base64 数据) */
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: Array<number>): void
75
+ setBuffer(format: string, buffer: Buffer): void
72
76
  /** 获取剪贴板中的自定义格式数据 */
73
- getBuffer(format: string): Array<number>
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
- /** 异步获取剪贴板图片详细信息(包含宽度、高度、大小和 base64 数据) */
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): Array<number>
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
- /** 快速获取剪贴板图片详细信息(包含宽度、高度、大小和 base64 数据) */
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
- /** 图片数据(base64 编码) */
141
- base64Data: string
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: Array<number>): void
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.4",
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.4",
105
- "@teddyzhu/clipboard-darwin-x64": "0.0.4",
106
- "@teddyzhu/clipboard-linux-x64-gnu": "0.0.4",
107
- "@teddyzhu/clipboard-linux-arm64-gnu": "0.0.4",
108
- "@teddyzhu/clipboard-darwin-arm64": "0.0.4",
109
- "@teddyzhu/clipboard-win32-arm64-msvc": "0.0.4"
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
  }