Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 1x 1x 5x 5x 1x 1x 1x 14x 14x 25x 25x 3x 3x 3x 3x 3x 3x 3x 22x 8x 8x 8x 7x 7x 8x 14x 14x 14x 14x 12x 12x 12x 14x 14x 14x 14x | import { readFile } from '../readFile'; import type { ClipboardData, EdgeLinkPreview } from 'roosterjs-content-model-types'; const ContentHandlers: { [contentType: string]: (data: ClipboardData, value: string, type?: string) => void; } = { ['text/html']: (data, value) => (data.rawHtml = value), ['text/plain']: (data, value) => (data.text = value), ['text/*']: (data, value, type?) => !!type && (data.customValues[type] = value), ['text/link-preview']: tryParseLinkPreview, ['text/uri-list']: (data, value) => (data.text = value), }; /** * Extract clipboard items to be a ClipboardData object for IE * @param items The clipboard items retrieve from a DataTransfer object * @param allowedCustomPasteType Allowed custom content type when paste besides text/plain, text/html and images Only text types are supported, and do not add "text/" prefix to the type values */ export function extractClipboardItems( items: DataTransferItem[], allowedCustomPasteType?: string[] ): Promise<ClipboardData> { const data: ClipboardData = { types: [], text: '', image: null, files: [], rawHtml: null, customValues: {}, pasteNativeEvent: true, }; return Promise.all( (items || []).map(item => { const type = item.type; if (type.indexOf('image/') == 0 && !data.image && item.kind == 'file') { data.types.push(type); data.image = item.getAsFile(); return new Promise<void>(resolve => { Eif (data.image) { readFile(data.image, dataUrl => { data.imageDataUri = dataUrl; resolve(); }); } else { resolve(); } }); } else if (item.kind == 'file') { return new Promise<void>(resolve => { const file = item.getAsFile(); if (!!file) { data.types.push(type); data.files!.push(file); } resolve(); }); } else { const customType = getAllowedCustomType(type, allowedCustomPasteType); const handler = ContentHandlers[type] || (customType ? ContentHandlers['text/*'] : null); return new Promise<void>(resolve => handler ? item.getAsString(value => { data.types.push(type); handler(data, value, customType); resolve(); }) : resolve() ); } }) ).then(() => data); } function tryParseLinkPreview(data: ClipboardData, value: string) { try { data.customValues['link-preview'] = value; data.linkPreview = JSON.parse(value) as EdgeLinkPreview; } catch {} } function getAllowedCustomType(type: string, allowedCustomPasteType?: string[]) { const textType = type.indexOf('text/') == 0 ? type.substring('text/'.length) : null; const index = allowedCustomPasteType && textType ? allowedCustomPasteType.indexOf(textType) : -1; return textType && index >= 0 ? textType : undefined; } |