|
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 |
|
} |