UNPKG

@aplus-frontend/antdv

Version:

Vue basic component library maintained based on ant-design-vue

107 lines (106 loc) 3.52 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _toggleSelection = _interopRequireDefault(require("./toggle-selection")); const clipboardToIE11Formatting = { 'text/plain': 'Text', 'text/html': 'Url', default: 'Text' }; const defaultMessage = 'Copy to clipboard: #{key}, Enter'; function format(message) { const copyKey = (/mac os x/i.test(navigator.userAgent) ? '⌘' : 'Ctrl') + '+C'; return message.replace(/#{\s*key\s*}/g, copyKey); } function copy(text, options) { let message, reselectPrevious, range, selection, mark, success = false; if (!options) { options = {}; } const debug = options.debug || false; try { reselectPrevious = (0, _toggleSelection.default)(); range = document.createRange(); selection = document.getSelection(); mark = document.createElement('span'); mark.textContent = text; // reset user styles for span element mark.style.all = 'unset'; // prevents scrolling to the end of the page mark.style.position = 'fixed'; mark.style.top = 0; mark.style.clip = 'rect(0, 0, 0, 0)'; // used to preserve spaces and line breaks mark.style.whiteSpace = 'pre'; // do not inherit user-select (it may be `none`) mark.style.webkitUserSelect = 'text'; mark.style.MozUserSelect = 'text'; mark.style.msUserSelect = 'text'; mark.style.userSelect = 'text'; mark.addEventListener('copy', function (e) { e.stopPropagation(); if (options.format) { e.preventDefault(); if (typeof e.clipboardData === 'undefined') { // IE 11 debug && console.warn('unable to use e.clipboardData'); debug && console.warn('trying IE specific stuff'); window.clipboardData.clearData(); const format = clipboardToIE11Formatting[options.format] || clipboardToIE11Formatting['default']; window.clipboardData.setData(format, text); } else { // all other browsers e.clipboardData.clearData(); e.clipboardData.setData(options.format, text); } } if (options.onCopy) { e.preventDefault(); options.onCopy(e.clipboardData); } }); document.body.appendChild(mark); range.selectNodeContents(mark); selection.addRange(range); const successful = document.execCommand('copy'); if (!successful) { throw new Error('copy command was unsuccessful'); } success = true; } catch (err) { debug && console.error('unable to copy using execCommand: ', err); debug && console.warn('trying IE specific stuff'); try { window.clipboardData.setData(options.format || 'text', text); options.onCopy && options.onCopy(window.clipboardData); success = true; } catch (err) { debug && console.error('unable to copy using clipboardData: ', err); debug && console.error('falling back to prompt'); message = format('message' in options ? options.message : defaultMessage); window.prompt(message, text); } } finally { if (selection) { if (typeof selection.removeRange == 'function') { selection.removeRange(range); } else { selection.removeAllRanges(); } } if (mark) { document.body.removeChild(mark); } reselectPrevious(); } return success; } var _default = exports.default = copy;