123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- import {
- createPasteEvent,
- parseClipboard,
- serializeAsClipboardJSON,
- } from "./clipboard";
- import { API } from "./tests/helpers/api";
- describe("parseClipboard()", () => {
- it("should parse JSON as plaintext if not excalidraw-api/clipboard data", async () => {
- let text;
- let clipboardData;
- // -------------------------------------------------------------------------
- text = "123";
- clipboardData = await parseClipboard(
- createPasteEvent({ types: { "text/plain": text } }),
- );
- expect(clipboardData.text).toBe(text);
- // -------------------------------------------------------------------------
- text = "[123]";
- clipboardData = await parseClipboard(
- createPasteEvent({ types: { "text/plain": text } }),
- );
- expect(clipboardData.text).toBe(text);
- // -------------------------------------------------------------------------
- text = JSON.stringify({ val: 42 });
- clipboardData = await parseClipboard(
- createPasteEvent({ types: { "text/plain": text } }),
- );
- expect(clipboardData.text).toBe(text);
- });
- it("should parse valid excalidraw JSON if inside text/plain", async () => {
- const rect = API.createElement({ type: "rectangle" });
- const json = serializeAsClipboardJSON({ elements: [rect], files: null });
- const clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/plain": json,
- },
- }),
- );
- expect(clipboardData.elements).toEqual([rect]);
- });
- it("should parse valid excalidraw JSON if inside text/html", async () => {
- const rect = API.createElement({ type: "rectangle" });
- let json;
- let clipboardData;
- // -------------------------------------------------------------------------
- json = serializeAsClipboardJSON({ elements: [rect], files: null });
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": json,
- },
- }),
- );
- expect(clipboardData.elements).toEqual([rect]);
- // -------------------------------------------------------------------------
- json = serializeAsClipboardJSON({ elements: [rect], files: null });
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `<div> ${json}</div>`,
- },
- }),
- );
- expect(clipboardData.elements).toEqual([rect]);
- // -------------------------------------------------------------------------
- });
- it("should parse <image> `src` urls out of text/html", async () => {
- let clipboardData;
- // -------------------------------------------------------------------------
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `<img src="https://example.com/image.png" />`,
- },
- }),
- );
- expect(clipboardData.mixedContent).toEqual([
- {
- type: "imageUrl",
- value: "https://example.com/image.png",
- },
- ]);
- // -------------------------------------------------------------------------
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `<div><img src="https://example.com/image.png" /></div><a><img src="https://example.com/image2.png" /></a>`,
- },
- }),
- );
- expect(clipboardData.mixedContent).toEqual([
- {
- type: "imageUrl",
- value: "https://example.com/image.png",
- },
- {
- type: "imageUrl",
- value: "https://example.com/image2.png",
- },
- ]);
- });
- it("should parse text content alongside <image> `src` urls out of text/html", async () => {
- const clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `<a href="https://example.com">hello </a><div><img src="https://example.com/image.png" /></div><b>my friend!</b>`,
- },
- }),
- );
- expect(clipboardData.mixedContent).toEqual([
- {
- type: "text",
- // trimmed
- value: "hello",
- },
- {
- type: "imageUrl",
- value: "https://example.com/image.png",
- },
- {
- type: "text",
- value: "my friend!",
- },
- ]);
- });
- it("should parse spreadsheet from either text/plain and text/html", async () => {
- let clipboardData;
- // -------------------------------------------------------------------------
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/plain": `a b
- 1 2
- 4 5
- 7 10`,
- },
- }),
- );
- expect(clipboardData.spreadsheet).toEqual({
- title: "b",
- labels: ["1", "4", "7"],
- values: [2, 5, 10],
- });
- // -------------------------------------------------------------------------
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `a b
- 1 2
- 4 5
- 7 10`,
- },
- }),
- );
- expect(clipboardData.spreadsheet).toEqual({
- title: "b",
- labels: ["1", "4", "7"],
- values: [2, 5, 10],
- });
- // -------------------------------------------------------------------------
- clipboardData = await parseClipboard(
- createPasteEvent({
- types: {
- "text/html": `<html>
- <body>
- <!--StartFragment--><google-sheets-html-origin><style type="text/css"><!--td {border: 1px solid #cccccc;}br {mso-data-placement:same-cell;}--></style><table xmlns="http://www.w3.org/1999/xhtml" cellspacing="0" cellpadding="0" dir="ltr" border="1" style="table-layout:fixed;font-size:10pt;font-family:Arial;width:0px;border-collapse:collapse;border:none"><colgroup><col width="100"/><col width="100"/></colgroup><tbody><tr style="height:21px;"><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;" data-sheets-value="{"1":2,"2":"a"}">a</td><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;" data-sheets-value="{"1":2,"2":"b"}">b</td></tr><tr style="height:21px;"><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":1}">1</td><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":2}">2</td></tr><tr style="height:21px;"><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":4}">4</td><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":5}">5</td></tr><tr style="height:21px;"><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":7}">7</td><td style="overflow:hidden;padding:2px 3px 2px 3px;vertical-align:bottom;text-align:right;" data-sheets-value="{"1":3,"3":10}">10</td></tr></tbody></table><!--EndFragment-->
- </body>
- </html>`,
- "text/plain": `a b
- 1 2
- 4 5
- 7 10`,
- },
- }),
- );
- expect(clipboardData.spreadsheet).toEqual({
- title: "b",
- labels: ["1", "4", "7"],
- values: [2, 5, 10],
- });
- });
- });
|