| import Clipboard from 'clipboard' |
| import { decrypt } from '@/utils/crypto' |
|
|
| |
| |
| |
| |
| export const copyText = (text: string) => { |
| return new Promise((resolve, reject) => { |
| const fakeElement = document.createElement('button') |
| const clipboard = new Clipboard(fakeElement, { |
| text: () => text, |
| action: () => 'copy', |
| container: document.body, |
| }) |
| clipboard.on('success', e => { |
| clipboard.destroy() |
| resolve(e) |
| }) |
| clipboard.on('error', e => { |
| clipboard.destroy() |
| reject(e) |
| }) |
| document.body.appendChild(fakeElement) |
| fakeElement.click() |
| document.body.removeChild(fakeElement) |
| }) |
| } |
|
|
| |
| export const readClipboard = (): Promise<string> => { |
| return new Promise((resolve, reject) => { |
| if (navigator.clipboard?.readText) { |
| navigator.clipboard.readText().then(text => { |
| if (!text) reject('剪贴板为空或者不包含文本') |
| return resolve(text) |
| }) |
| } |
| else reject('浏览器不支持或禁止访问剪贴板,请使用快捷键 Ctrl + V') |
| }) |
| } |
|
|
| |
| export const pasteCustomClipboardString = (text: string) => { |
| let clipboardData |
| try { |
| clipboardData = JSON.parse(decrypt(text)) |
| } |
| catch { |
| clipboardData = text |
| } |
|
|
| return clipboardData |
| } |
|
|
| |
| export const pasteExcelClipboardString = (text: string): string[][] | null => { |
| const lines: string[] = text.split('\r\n') |
|
|
| if (lines[lines.length - 1] === '') lines.pop() |
|
|
| let colCount = -1 |
| const data: string[][] = [] |
| for (const index in lines) { |
| data[index] = lines[index].split('\t') |
|
|
| if (data[index].length === 1) return null |
| if (colCount === -1) colCount = data[index].length |
| else if (colCount !== data[index].length) return null |
| } |
| return data |
| } |
|
|
| |
| export const pasteHTMLTableClipboardString = (text: string): string[][] | null => { |
| const parser = new DOMParser() |
| const doc = parser.parseFromString(text, 'text/html') |
| const table = doc.querySelector('table') |
| const data: string[][] = [] |
|
|
| if (!table) return data |
|
|
| const rows = table.querySelectorAll('tr') |
| for (const row of rows) { |
| const rowData = [] |
| const cells = row.querySelectorAll('td, th') |
| for (const cell of cells) { |
| const text = cell.textContent ? cell.textContent.trim() : '' |
| const colspan = parseInt(cell.getAttribute('colspan') || '1', 10) |
| for (let i = 0; i < colspan; i++) { |
| rowData.push(text) |
| } |
| } |
| data.push(rowData) |
| } |
|
|
| return data |
| } |