{
"version": 3,
"sources": ["../../src/lib/defaultExternalContentHandlers.ts"],
"sourcesContent": ["import {\n\tAssetRecordType,\n\tEditor,\n\tMediaHelpers,\n\tTLAsset,\n\tTLAssetId,\n\tTLEmbedShape,\n\tTLShapePartial,\n\tTLTextShape,\n\tTLTextShapeProps,\n\tVec2d,\n\tVecLike,\n\tcompact,\n\tcreateShapeId,\n\tgetHashForString,\n} from '@tldraw/editor'\nimport { FONT_FAMILIES, FONT_SIZES, TEXT_PROPS } from './shapes/shared/default-shape-constants'\nimport { containBoxSize, getResizedImageDataUrl, isGifAnimated } from './utils/assets'\nimport { getEmbedInfo } from './utils/embeds'\nimport { cleanupText, isRightToLeftLanguage, truncateStringWithEllipsis } from './utils/text'\n\n/** @public */\nexport type TLExternalContentProps = {\n\t// The maximum dimension (width or height) of an image. Images larger than this will be rescaled to fit. Defaults to infinity.\n\tmaxImageDimension: number\n\t// The maximum size (in bytes) of an asset. Assets larger than this will be rejected. Defaults to 10mb (10 * 1024 * 1024).\n\tmaxAssetSize: number\n\t// The mime types of images that are allowed to be handled. Defaults to ['image/jpeg', 'image/png', 'image/gif', 'image/svg+xml'].\n\tacceptedImageMimeTypes: string[]\n\t// The mime types of videos that are allowed to be handled. Defaults to ['video/mp4', 'video/webm', 'video/quicktime'].\n\tacceptedVideoMimeTypes: string[]\n}\n\nexport function registerDefaultExternalContentHandlers(\n\teditor: Editor,\n\t{\n\t\tmaxImageDimension,\n\t\tmaxAssetSize,\n\t\tacceptedImageMimeTypes,\n\t\tacceptedVideoMimeTypes,\n\t}: TLExternalContentProps\n) {\n\t// files -> asset\n\teditor.registerExternalAssetHandler('file', async ({ file }) => {\n\t\treturn await new Promise((resolve, reject) => {\n\t\t\tif (\n\t\t\t\t!acceptedImageMimeTypes.includes(file.type) &&\n\t\t\t\t!acceptedVideoMimeTypes.includes(file.type)\n\t\t\t) {\n\t\t\t\tconsole.warn(`File type not allowed: ${file.type}`)\n\t\t\t\treject()\n\t\t\t}\n\n\t\t\tif (file.size > maxAssetSize) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`File size too big: ${(file.size / 1024).toFixed()}kb > ${(\n\t\t\t\t\t\tmaxAssetSize / 1024\n\t\t\t\t\t).toFixed()}kb`\n\t\t\t\t)\n\t\t\t\treject()\n\t\t\t}\n\n\t\t\tconst reader = new FileReader()\n\t\t\treader.onerror = () => reject(reader.error)\n\t\t\treader.onload = async () => {\n\t\t\t\tlet dataUrl = reader.result as string\n\n\t\t\t\t// Hack to make .mov videos work via dataURL.\n\t\t\t\tif (file.type === 'video/quicktime' && dataUrl.includes('video/quicktime')) {\n\t\t\t\t\tdataUrl = dataUrl.replace('video/quicktime', 'video/mp4')\n\t\t\t\t}\n\n\t\t\t\tconst isImageType = acceptedImageMimeTypes.includes(file.type)\n\n\t\t\t\tlet size: {\n\t\t\t\t\tw: number\n\t\t\t\t\th: number\n\t\t\t\t}\n\t\t\t\tlet isAnimated: boolean\n\n\t\t\t\tif (isImageType) {\n\t\t\t\t\tsize = await MediaHelpers.getImageSizeFromSrc(dataUrl)\n\t\t\t\t\tisAnimated = file.type === 'image/gif' && (await isGifAnimated(file))\n\t\t\t\t} else {\n\t\t\t\t\tisAnimated = true\n\t\t\t\t\tsize = await MediaHelpers.getVideoSizeFromSrc(dataUrl)\n\t\t\t\t}\n\n\t\t\t\tif (isFinite(maxImageDimension)) {\n\t\t\t\t\tconst resizedSize = containBoxSize(size, { w: maxImageDimension, h: maxImageDimension })\n\t\t\t\t\tif (size !== resizedSize && (file.type === 'image/jpeg' || file.type === 'image/png')) {\n\t\t\t\t\t\t// If we created a new size and the type is an image, rescale the image\n\t\t\t\t\t\tdataUrl = await getResizedImageDataUrl(dataUrl, size.w, size.h)\n\t\t\t\t\t}\n\t\t\t\t\tsize = resizedSize\n\t\t\t\t}\n\n\t\t\t\tconst assetId: TLAssetId = AssetRecordType.createId(getHashForString(dataUrl))\n\n\t\t\t\tconst asset = AssetRecordType.create({\n\t\t\t\t\tid: assetId,\n\t\t\t\t\ttype: isImageType ? 'image' : 'video',\n\t\t\t\t\ttypeName: 'asset',\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tname: file.name,\n\t\t\t\t\t\tsrc: dataUrl,\n\t\t\t\t\t\tw: size.w,\n\t\t\t\t\t\th: size.h,\n\t\t\t\t\t\tmimeType: file.type,\n\t\t\t\t\t\tisAnimated,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tresolve(asset)\n\t\t\t}\n\n\t\t\treader.readAsDataURL(file)\n\t\t})\n\t})\n\n\t// urls -> bookmark asset\n\teditor.registerExternalAssetHandler('url', async ({ url }) => {\n\t\tlet meta: { image: string; title: string; description: string }\n\n\t\ttry {\n\t\t\tconst resp = await fetch(url, { method: 'GET', mode: 'no-cors' })\n\t\t\tconst html = await resp.text()\n\t\t\tconst doc = new DOMParser().parseFromString(html, 'text/html')\n\t\t\tmeta = {\n\t\t\t\timage: doc.head.querySelector('meta[property=\"og:image\"]')?.getAttribute('content') ?? '',\n\t\t\t\ttitle:\n\t\t\t\t\tdoc.head.querySelector('meta[property=\"og:title\"]')?.getAttribute('content') ??\n\t\t\t\t\ttruncateStringWithEllipsis(url, 32),\n\t\t\t\tdescription:\n\t\t\t\t\tdoc.head.querySelector('meta[property=\"og:description\"]')?.getAttribute('content') ?? '',\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(error)\n\t\t\tmeta = { image: '', title: truncateStringWithEllipsis(url, 32), description: '' }\n\t\t}\n\n\t\t// Create the bookmark asset from the meta\n\t\treturn {\n\t\t\tid: AssetRecordType.createId(getHashForString(url)),\n\t\t\ttypeName: 'asset',\n\t\t\ttype: 'bookmark',\n\t\t\tprops: {\n\t\t\t\tsrc: url,\n\t\t\t\tdescription: meta.description,\n\t\t\t\timage: meta.image,\n\t\t\t\ttitle: meta.title,\n\t\t\t},\n\t\t\tmeta: {},\n\t\t}\n\t})\n\n\t// svg text\n\teditor.registerExternalContentHandler('svg-text', async ({ point, text }) => {\n\t\tconst position =\n\t\t\tpoint ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : editor.viewportPageCenter)\n\n\t\tconst svg = new DOMParser().parseFromString(text, 'image/svg+xml').querySelector('svg')\n\t\tif (!svg) {\n\t\t\tthrow new Error('No element present')\n\t\t}\n\n\t\tlet width = parseFloat(svg.getAttribute('width') || '0')\n\t\tlet height = parseFloat(svg.getAttribute('height') || '0')\n\n\t\tif (!(width && height)) {\n\t\t\tdocument.body.appendChild(svg)\n\t\t\tconst box = svg.getBoundingClientRect()\n\t\t\tdocument.body.removeChild(svg)\n\n\t\t\twidth = box.width\n\t\t\theight = box.height\n\t\t}\n\n\t\tconst asset = await editor.getAssetForExternalContent({\n\t\t\ttype: 'file',\n\t\t\tfile: new File([text], 'asset.svg', { type: 'image/svg+xml' }),\n\t\t})\n\n\t\tif (!asset) throw Error('Could not create an asset')\n\n\t\tcreateShapesForAssets(editor, [asset], position)\n\t})\n\n\t// embeds\n\teditor.registerExternalContentHandler('embed', ({ point, url, embed }) => {\n\t\tconst position =\n\t\t\tpoint ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : editor.viewportPageCenter)\n\n\t\tconst { width, height } = embed\n\n\t\tconst id = createShapeId()\n\n\t\tconst shapePartial: TLShapePartial = {\n\t\t\tid,\n\t\t\ttype: 'embed',\n\t\t\tx: position.x - (width || 450) / 2,\n\t\t\ty: position.y - (height || 450) / 2,\n\t\t\tprops: {\n\t\t\t\tw: width,\n\t\t\t\th: height,\n\t\t\t\turl,\n\t\t\t},\n\t\t}\n\n\t\teditor.createShapes([shapePartial]).select(id)\n\t})\n\n\t// files\n\teditor.registerExternalContentHandler('files', async ({ point, files }) => {\n\t\tconst position =\n\t\t\tpoint ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : editor.viewportPageCenter)\n\n\t\tconst pagePoint = new Vec2d(position.x, position.y)\n\n\t\tconst assets: TLAsset[] = []\n\n\t\tawait Promise.all(\n\t\t\tfiles.map(async (file, i) => {\n\t\t\t\tif (file.size > maxAssetSize) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`File size too big: ${(file.size / 1024).toFixed()}kb > ${(\n\t\t\t\t\t\t\tmaxAssetSize / 1024\n\t\t\t\t\t\t).toFixed()}kb`\n\t\t\t\t\t)\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\t// Use mime type instead of file ext, this is because\n\t\t\t\t// window.navigator.clipboard does not preserve file names\n\t\t\t\t// of copied files.\n\t\t\t\tif (!file.type) {\n\t\t\t\t\tthrow new Error('No mime type')\n\t\t\t\t}\n\n\t\t\t\t// We can only accept certain extensions (either images or a videos)\n\t\t\t\tif (!acceptedImageMimeTypes.concat(acceptedVideoMimeTypes).includes(file.type)) {\n\t\t\t\t\tconsole.warn(`${file.name} not loaded - Extension not allowed.`)\n\t\t\t\t\treturn null\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tconst asset = await editor.getAssetForExternalContent({ type: 'file', file })\n\n\t\t\t\t\tif (!asset) {\n\t\t\t\t\t\tthrow Error('Could not create an asset')\n\t\t\t\t\t}\n\n\t\t\t\t\tassets[i] = asset\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(error)\n\t\t\t\t\treturn null\n\t\t\t\t}\n\t\t\t})\n\t\t)\n\n\t\tcreateShapesForAssets(editor, compact(assets), pagePoint)\n\t})\n\n\t// text\n\teditor.registerExternalContentHandler('text', async ({ point, text }) => {\n\t\tconst p =\n\t\t\tpoint ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : editor.viewportPageCenter)\n\n\t\tconst defaultProps = editor.getShapeUtil('text').getDefaultProps()\n\n\t\tconst textToPaste = cleanupText(text)\n\n\t\t// Measure the text with default values\n\t\tlet w: number\n\t\tlet h: number\n\t\tlet autoSize: boolean\n\t\tlet align = 'middle' as TLTextShapeProps['align']\n\n\t\tconst isMultiLine = textToPaste.split('\\n').length > 1\n\n\t\t// check whether the text contains the most common characters in RTL languages\n\t\tconst isRtl = isRightToLeftLanguage(textToPaste)\n\n\t\tif (isMultiLine) {\n\t\t\talign = isMultiLine ? (isRtl ? 'end' : 'start') : 'middle'\n\t\t}\n\n\t\tconst rawSize = editor.textMeasure.measureText(textToPaste, {\n\t\t\t...TEXT_PROPS,\n\t\t\tfontFamily: FONT_FAMILIES[defaultProps.font],\n\t\t\tfontSize: FONT_SIZES[defaultProps.size],\n\t\t\tmaxWidth: null,\n\t\t})\n\n\t\tconst minWidth = Math.min(\n\t\t\tisMultiLine ? editor.viewportPageBounds.width * 0.9 : 920,\n\t\t\tMath.max(200, editor.viewportPageBounds.width * 0.9)\n\t\t)\n\n\t\tif (rawSize.w > minWidth) {\n\t\t\tconst shrunkSize = editor.textMeasure.measureText(textToPaste, {\n\t\t\t\t...TEXT_PROPS,\n\t\t\t\tfontFamily: FONT_FAMILIES[defaultProps.font],\n\t\t\t\tfontSize: FONT_SIZES[defaultProps.size],\n\t\t\t\tmaxWidth: minWidth,\n\t\t\t})\n\t\t\tw = shrunkSize.w\n\t\t\th = shrunkSize.h\n\t\t\tautoSize = false\n\t\t\talign = isRtl ? 'end' : 'start'\n\t\t} else {\n\t\t\t// autosize is fine\n\t\t\tw = rawSize.w\n\t\t\th = rawSize.h\n\t\t\tautoSize = true\n\t\t}\n\n\t\tif (p.y - h / 2 < editor.viewportPageBounds.minY + 40) {\n\t\t\tp.y = editor.viewportPageBounds.minY + 40 + h / 2\n\t\t}\n\n\t\teditor.createShapes([\n\t\t\t{\n\t\t\t\tid: createShapeId(),\n\t\t\t\ttype: 'text',\n\t\t\t\tx: p.x - w / 2,\n\t\t\t\ty: p.y - h / 2,\n\t\t\t\tprops: {\n\t\t\t\t\ttext: textToPaste,\n\t\t\t\t\t// if the text has more than one line, align it to the left\n\t\t\t\t\talign,\n\t\t\t\t\tautoSize,\n\t\t\t\t\tw,\n\t\t\t\t},\n\t\t\t},\n\t\t])\n\t})\n\n\t// url\n\teditor.registerExternalContentHandler('url', async ({ point, url }) => {\n\t\t// try to paste as an embed first\n\t\tconst embedInfo = getEmbedInfo(url)\n\n\t\tif (embedInfo) {\n\t\t\treturn editor.putExternalContent({\n\t\t\t\ttype: 'embed',\n\t\t\t\turl: embedInfo.url,\n\t\t\t\tpoint,\n\t\t\t\tembed: embedInfo.definition,\n\t\t\t})\n\t\t}\n\n\t\tconst position =\n\t\t\tpoint ?? (editor.inputs.shiftKey ? editor.inputs.currentPagePoint : editor.viewportPageCenter)\n\n\t\tconst assetId: TLAssetId = AssetRecordType.createId(getHashForString(url))\n\n\t\t// Use an existing asset if we have one, or else else create a new one\n\t\tlet asset = editor.getAsset(assetId) as TLAsset\n\t\tlet shouldAlsoCreateAsset = false\n\t\tif (!asset) {\n\t\t\tshouldAlsoCreateAsset = true\n\t\t\tconst bookmarkAsset = await editor.getAssetForExternalContent({ type: 'url', url })\n\t\t\tif (!bookmarkAsset) throw Error('Could not create an asset')\n\t\t\tasset = bookmarkAsset\n\t\t}\n\n\t\teditor.batch(() => {\n\t\t\tif (shouldAlsoCreateAsset) {\n\t\t\t\teditor.createAssets([asset])\n\t\t\t}\n\n\t\t\tcreateShapesForAssets(editor, [asset], position)\n\t\t})\n\t})\n}\n\nexport async function createShapesForAssets(editor: Editor, assets: TLAsset[], position: VecLike) {\n\tif (!assets.length) return\n\n\tconst currentPoint = Vec2d.From(position)\n\tconst partials: TLShapePartial[] = []\n\n\tfor (const asset of assets) {\n\t\tswitch (asset.type) {\n\t\t\tcase 'bookmark': {\n\t\t\t\tpartials.push({\n\t\t\t\t\tid: createShapeId(),\n\t\t\t\t\ttype: 'bookmark',\n\t\t\t\t\tx: currentPoint.x - 150,\n\t\t\t\t\ty: currentPoint.y - 160,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tassetId: asset.id,\n\t\t\t\t\t\turl: asset.props.src,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tcurrentPoint.x += 300\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'image': {\n\t\t\t\tpartials.push({\n\t\t\t\t\tid: createShapeId(),\n\t\t\t\t\ttype: 'image',\n\t\t\t\t\tx: currentPoint.x - asset.props.w / 2,\n\t\t\t\t\ty: currentPoint.y - asset.props.h / 2,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tassetId: asset.id,\n\t\t\t\t\t\tw: asset.props.w,\n\t\t\t\t\t\th: asset.props.h,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tcurrentPoint.x += asset.props.w\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tcase 'video': {\n\t\t\t\tpartials.push({\n\t\t\t\t\tid: createShapeId(),\n\t\t\t\t\ttype: 'video',\n\t\t\t\t\tx: currentPoint.x - asset.props.w / 2,\n\t\t\t\t\ty: currentPoint.y - asset.props.h / 2,\n\t\t\t\t\topacity: 1,\n\t\t\t\t\tprops: {\n\t\t\t\t\t\tassetId: asset.id,\n\t\t\t\t\t\tw: asset.props.w,\n\t\t\t\t\t\th: asset.props.h,\n\t\t\t\t\t},\n\t\t\t\t})\n\n\t\t\t\tcurrentPoint.x += asset.props.w\n\t\t\t}\n\t\t}\n\t}\n\n\teditor.batch(() => {\n\t\t// Create any assets\n\t\tconst assetsToCreate = assets.filter((asset) => !editor.getAsset(asset.id))\n\t\tif (assetsToCreate.length) {\n\t\t\teditor.createAssets(assetsToCreate)\n\t\t}\n\n\t\t// Create the shapes\n\t\teditor.createShapes(partials).select(...partials.map((p) => p.id))\n\n\t\t// Re-position shapes so that the center of the group is at the provided point\n\t\tconst { viewportPageBounds } = editor\n\t\tlet { selectionPageBounds } = editor\n\n\t\tif (selectionPageBounds) {\n\t\t\tconst offset = selectionPageBounds!.center.sub(position)\n\n\t\t\teditor.updateShapes(\n\t\t\t\teditor.selectedShapes.map((shape) => {\n\t\t\t\t\tconst localRotation = editor.getShapeParentTransform(shape).decompose().rotation\n\t\t\t\t\tconst localDelta = Vec2d.Rot(offset, -localRotation)\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: shape.id,\n\t\t\t\t\t\ttype: shape.type,\n\t\t\t\t\t\tx: shape.x! - localDelta.x,\n\t\t\t\t\t\ty: shape.y! - localDelta.y,\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t)\n\t\t}\n\n\t\t// Zoom out to fit the shapes, if necessary\n\t\tselectionPageBounds = editor.selectionPageBounds\n\t\tif (selectionPageBounds && !viewportPageBounds.contains(selectionPageBounds)) {\n\t\t\teditor.zoomToSelection()\n\t\t}\n\t})\n}\n"],
"mappings": "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",
"names": []
}