web_ppt / frontend /src /utils /clipboard.ts
CatPtain's picture
Upload 339 files
89ce340 verified
raw
history blame
2.71 kB
import Clipboard from 'clipboard'
import { decrypt } from '@/utils/crypto'
/**
* 复制文本到剪贴板
* @param text 文本内容
*/
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
}
// 尝试解析剪贴板内容是否为Excel表格(或类似的)数据格式
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
}
// 尝试解析剪贴板内容是否为HTML table代码
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
}