@opentiny/fluent-editor 3.25.3-alpha.0 → 3.25.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
- import Quill, { Delta } from "quill";
1
+ import Quill from "quill";
2
2
  import { Range } from "quill/core/selection";
3
3
  import CustomImage from "./image.es.js";
4
+ const Delta = Quill.import("delta");
4
5
  class ImageBar {
5
6
  constructor(quill, target) {
6
7
  this.quill = quill;
@@ -1 +1 @@
1
- {"version":3,"file":"image-bar.es.js","sources":["../../../../src/modules/custom-image/image-bar.ts"],"sourcesContent":["import Quill, { Delta } from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport CustomImage from './image'\r\n\r\nexport default class ImageBar {\r\n quill: Quill\r\n image: HTMLImageElement\r\n domNode: HTMLElement\r\n imageRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.image = target\r\n const imageBlot = Quill.find(target)\r\n const index = this.quill.getIndex(imageBlot)\r\n const [imageItem, offset] = this.quill.scroll.descendant(CustomImage, index)\r\n const length = imageItem && imageItem.length()\r\n this.imageRange = new Range(index - offset, length)\r\n\r\n this.template = [\r\n // `<a class=\"ql-image-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-image-download\"><i class=\"icon-download\"></i></a>`,\r\n `<a class=\"ql-image-copy\">\r\n <svg width=\"16\" height=\"16\" t=\"1736062378465\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1630\"><path d=\"M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z\" fill=\"#000000\" p-id=\"1631\"></path></svg>\r\n </a>`,\r\n `<a class=\"ql-image-delete\"><i class=\"icon-delete\"></i></a>`,\r\n ].join('')\r\n\r\n this.createImageBar()\r\n }\r\n\r\n createImageBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-image-bar'\r\n this.domNode.innerHTML = this.template\r\n // 下载图片\r\n const imageDownload = this.domNode.querySelector('a.ql-image-download')\r\n if (imageDownload) {\r\n imageDownload.addEventListener('click', (event) => {\r\n this.operateImage(event, 'download')\r\n })\r\n }\r\n // 复制图片\r\n const imageCopy = this.domNode.querySelector('a.ql-image-copy')\r\n if (imageCopy) {\r\n imageCopy.addEventListener('click', (event) => {\r\n this.operateImage(event, 'copy')\r\n })\r\n }\r\n // 删除图片\r\n const imageDelete = this.domNode.querySelector('a.ql-image-delete')\r\n if (imageDelete) {\r\n imageDelete.addEventListener('click', (event) => {\r\n this.operateImage(event, 'delete')\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.image = null\r\n }\r\n }\r\n\r\n async operateImage(event, operate) {\r\n event.preventDefault()\r\n const imageName = this.image.dataset.title || ''\r\n const imageDownloadUrl = this.image.src || ''\r\n if (operate === 'download') {\r\n try {\r\n const a = document.createElement('a')\r\n a.href = imageDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = imageName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n catch (_e) {\r\n throw new Error('Download image failed')\r\n }\r\n }\r\n else if (operate === 'copy') {\r\n const imageUrl = this.image.src\r\n try {\r\n const response = await fetch(imageUrl)\r\n if (!response.ok) {\r\n throw new Error('Copy image failed')\r\n }\r\n const blob = await response.blob()\r\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })])\r\n }\r\n catch (_e) {\r\n throw new Error('Copy image failed')\r\n }\r\n }\r\n else if (operate === 'delete') {\r\n try {\r\n const delta = new Delta()\r\n .retain(this.imageRange.index)\r\n .delete(this.imageRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.imageRange.index)\r\n }\r\n catch (_e) {\r\n throw new Error('Delete image failed')\r\n }\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.image) {\r\n const parent = this.quill.root.parentNode\r\n const containerRect = parent.getBoundingClientRect()\r\n const imageRect = this.image.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${imageRect.left + imageRect.width - containerRect.left - 125}px`,\r\n top: `${imageRect.top - containerRect.top}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAIA,MAAqB,SAAS;AAAA,EAO5B,YAAY,OAAO,QAAQ;AACzB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACP,UAAA,YAAY,MAAM,KAAK,MAAM;AACnC,UAAM,QAAQ,KAAK,MAAM,SAAS,SAAS;AACrC,UAAA,CAAC,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,WAAW,aAAa,KAAK;AACrE,UAAA,SAAS,aAAa,UAAU,OAAO;AAC7C,SAAK,aAAa,IAAI,MAAM,QAAQ,QAAQ,MAAM;AAElD,SAAK,WAAW;AAAA;AAAA,MAEd;AAAA,MACA;AAAA;AAAA;AAAA,MAGA;AAAA,IAAA,EACA,KAAK,EAAE;AAET,SAAK,eAAe;AAAA,EAAA;AAAA,EAGtB,iBAAiB;AACV,SAAA,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY;AACpB,SAAA,QAAQ,YAAY,KAAK;AAE9B,UAAM,gBAAgB,KAAK,QAAQ,cAAc,qBAAqB;AACtE,QAAI,eAAe;AACH,oBAAA,iBAAiB,SAAS,CAAC,UAAU;AAC5C,aAAA,aAAa,OAAO,UAAU;AAAA,MAAA,CACpC;AAAA,IAAA;AAGH,UAAM,YAAY,KAAK,QAAQ,cAAc,iBAAiB;AAC9D,QAAI,WAAW;AACH,gBAAA,iBAAiB,SAAS,CAAC,UAAU;AACxC,aAAA,aAAa,OAAO,MAAM;AAAA,MAAA,CAChC;AAAA,IAAA;AAGH,UAAM,cAAc,KAAK,QAAQ,cAAc,mBAAmB;AAClE,QAAI,aAAa;AACH,kBAAA,iBAAiB,SAAS,CAAC,UAAU;AAC1C,aAAA,aAAa,OAAO,QAAQ;AAAA,MAAA,CAClC;AAAA,IAAA;AAGH,SAAK,YAAY;AACjB,SAAK,MAAM,KAAK,WAAW,YAAY,KAAK,OAAO;AAAA,EAAA;AAAA,EAGrD,UAAU;AACR,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,OAAO;AACpB,WAAK,UAAU;AACf,WAAK,QAAQ;AAAA,IAAA;AAAA,EACf;AAAA,EAGF,MAAM,aAAa,OAAO,SAAS;AACjC,UAAM,eAAe;AACrB,UAAM,YAAY,KAAK,MAAM,QAAQ,SAAS;AACxC,UAAA,mBAAmB,KAAK,MAAM,OAAO;AAC3C,QAAI,YAAY,YAAY;AACtB,UAAA;AACI,cAAA,IAAI,SAAS,cAAc,GAAG;AACpC,UAAE,OAAO;AACT,UAAE,SAAS;AACX,UAAE,KAAK;AACP,UAAE,WAAW;AACJ,iBAAA,KAAK,YAAY,CAAC;AACrB,cAAA,QAAQ,SAAS,eAAe,QAAQ;AAC9C,cAAM,MAAM;AACN,cAAA,WAAW,YAAY,CAAC;AAAA,eAEzB,IAAI;AACH,cAAA,IAAI,MAAM,uBAAuB;AAAA,MAAA;AAAA,IACzC,WAEO,YAAY,QAAQ;AACrB,YAAA,WAAW,KAAK,MAAM;AACxB,UAAA;AACI,cAAA,WAAW,MAAM,MAAM,QAAQ;AACjC,YAAA,CAAC,SAAS,IAAI;AACV,gBAAA,IAAI,MAAM,mBAAmB;AAAA,QAAA;AAE/B,cAAA,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,UAAU,UAAU,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,eAErE,IAAI;AACH,cAAA,IAAI,MAAM,mBAAmB;AAAA,MAAA;AAAA,IACrC,WAEO,YAAY,UAAU;AACzB,UAAA;AACF,cAAM,QAAQ,IAAI,MAAM,EACrB,OAAO,KAAK,WAAW,KAAK,EAC5B,OAAO,KAAK,WAAW,MAAM;AAChC,aAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,aAAK,MAAM,aAAa,KAAK,WAAW,KAAK;AAAA,eAExC,IAAI;AACH,cAAA,IAAI,MAAM,qBAAqB;AAAA,MAAA;AAAA,IACvC;AAEF,SAAK,QAAQ;AAAA,EAAA;AAAA,EAGf,cAAc;AACR,QAAA,KAAK,WAAW,KAAK,OAAO;AACxB,YAAA,SAAS,KAAK,MAAM,KAAK;AACzB,YAAA,gBAAgB,OAAO,sBAAsB;AAC7C,YAAA,YAAY,KAAK,MAAM,sBAAsB;AAC9C,WAAA,IAAI,KAAK,SAAS;AAAA,QACrB,MAAM,GAAG,UAAU,OAAO,UAAU,QAAQ,cAAc,OAAO,GAAG;AAAA,QACpE,KAAK,GAAG,UAAU,MAAM,cAAc,GAAG;AAAA,MAAA,CAC1C;AAAA,IAAA;AAAA,EACH;AAAA,EAGF,IAAI,SAAS,OAAO;AACd,QAAA,OAAO,UAAU,UAAU;AAC7B,iBAAW,QAAQ,OAAO;AACxB,YAAI,MAAM;AACR,cAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG;AAE9B,kBAAM,IAAI,EAAE,QAAQ,CAAC,QAAQ;AACnB,sBAAA,MAAM,IAAI,IAAI;AAAA,YAAA,CACvB;AAAA,UAAA,OAEE;AACH,oBAAQ,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,UAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEJ;"}
1
+ {"version":3,"file":"image-bar.es.js","sources":["../../../../src/modules/custom-image/image-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport CustomImage from './image'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport default class ImageBar {\r\n quill: Quill\r\n image: HTMLImageElement\r\n domNode: HTMLElement\r\n imageRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.image = target\r\n const imageBlot = Quill.find(target)\r\n const index = this.quill.getIndex(imageBlot)\r\n const [imageItem, offset] = this.quill.scroll.descendant(CustomImage, index)\r\n const length = imageItem && imageItem.length()\r\n this.imageRange = new Range(index - offset, length)\r\n\r\n this.template = [\r\n // `<a class=\"ql-image-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-image-download\"><i class=\"icon-download\"></i></a>`,\r\n `<a class=\"ql-image-copy\">\r\n <svg width=\"16\" height=\"16\" t=\"1736062378465\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1630\"><path d=\"M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z\" fill=\"#000000\" p-id=\"1631\"></path></svg>\r\n </a>`,\r\n `<a class=\"ql-image-delete\"><i class=\"icon-delete\"></i></a>`,\r\n ].join('')\r\n\r\n this.createImageBar()\r\n }\r\n\r\n createImageBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-image-bar'\r\n this.domNode.innerHTML = this.template\r\n // 下载图片\r\n const imageDownload = this.domNode.querySelector('a.ql-image-download')\r\n if (imageDownload) {\r\n imageDownload.addEventListener('click', (event) => {\r\n this.operateImage(event, 'download')\r\n })\r\n }\r\n // 复制图片\r\n const imageCopy = this.domNode.querySelector('a.ql-image-copy')\r\n if (imageCopy) {\r\n imageCopy.addEventListener('click', (event) => {\r\n this.operateImage(event, 'copy')\r\n })\r\n }\r\n // 删除图片\r\n const imageDelete = this.domNode.querySelector('a.ql-image-delete')\r\n if (imageDelete) {\r\n imageDelete.addEventListener('click', (event) => {\r\n this.operateImage(event, 'delete')\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.image = null\r\n }\r\n }\r\n\r\n async operateImage(event, operate) {\r\n event.preventDefault()\r\n const imageName = this.image.dataset.title || ''\r\n const imageDownloadUrl = this.image.src || ''\r\n if (operate === 'download') {\r\n try {\r\n const a = document.createElement('a')\r\n a.href = imageDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = imageName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n catch (_e) {\r\n throw new Error('Download image failed')\r\n }\r\n }\r\n else if (operate === 'copy') {\r\n const imageUrl = this.image.src\r\n try {\r\n const response = await fetch(imageUrl)\r\n if (!response.ok) {\r\n throw new Error('Copy image failed')\r\n }\r\n const blob = await response.blob()\r\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })])\r\n }\r\n catch (_e) {\r\n throw new Error('Copy image failed')\r\n }\r\n }\r\n else if (operate === 'delete') {\r\n try {\r\n const delta = new Delta()\r\n .retain(this.imageRange.index)\r\n .delete(this.imageRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.imageRange.index)\r\n }\r\n catch (_e) {\r\n throw new Error('Delete image failed')\r\n }\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.image) {\r\n const parent = this.quill.root.parentNode as HTMLElement\r\n const containerRect = parent.getBoundingClientRect()\r\n const imageRect = this.image.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${imageRect.left + imageRect.width - containerRect.left - 125}px`,\r\n top: `${imageRect.top - containerRect.top}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAIA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAElC,MAAqB,SAAS;AAAA,EAO5B,YAAY,OAAO,QAAQ;AACzB,SAAK,QAAQ;AACb,SAAK,QAAQ;AACP,UAAA,YAAY,MAAM,KAAK,MAAM;AACnC,UAAM,QAAQ,KAAK,MAAM,SAAS,SAAS;AACrC,UAAA,CAAC,WAAW,MAAM,IAAI,KAAK,MAAM,OAAO,WAAW,aAAa,KAAK;AACrE,UAAA,SAAS,aAAa,UAAU,OAAO;AAC7C,SAAK,aAAa,IAAI,MAAM,QAAQ,QAAQ,MAAM;AAElD,SAAK,WAAW;AAAA;AAAA,MAEd;AAAA,MACA;AAAA;AAAA;AAAA,MAGA;AAAA,IAAA,EACA,KAAK,EAAE;AAET,SAAK,eAAe;AAAA,EAAA;AAAA,EAGtB,iBAAiB;AACV,SAAA,UAAU,SAAS,cAAc,KAAK;AAC3C,SAAK,QAAQ,YAAY;AACpB,SAAA,QAAQ,YAAY,KAAK;AAE9B,UAAM,gBAAgB,KAAK,QAAQ,cAAc,qBAAqB;AACtE,QAAI,eAAe;AACH,oBAAA,iBAAiB,SAAS,CAAC,UAAU;AAC5C,aAAA,aAAa,OAAO,UAAU;AAAA,MAAA,CACpC;AAAA,IAAA;AAGH,UAAM,YAAY,KAAK,QAAQ,cAAc,iBAAiB;AAC9D,QAAI,WAAW;AACH,gBAAA,iBAAiB,SAAS,CAAC,UAAU;AACxC,aAAA,aAAa,OAAO,MAAM;AAAA,MAAA,CAChC;AAAA,IAAA;AAGH,UAAM,cAAc,KAAK,QAAQ,cAAc,mBAAmB;AAClE,QAAI,aAAa;AACH,kBAAA,iBAAiB,SAAS,CAAC,UAAU;AAC1C,aAAA,aAAa,OAAO,QAAQ;AAAA,MAAA,CAClC;AAAA,IAAA;AAGH,SAAK,YAAY;AACjB,SAAK,MAAM,KAAK,WAAW,YAAY,KAAK,OAAO;AAAA,EAAA;AAAA,EAGrD,UAAU;AACR,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,OAAO;AACpB,WAAK,UAAU;AACf,WAAK,QAAQ;AAAA,IAAA;AAAA,EACf;AAAA,EAGF,MAAM,aAAa,OAAO,SAAS;AACjC,UAAM,eAAe;AACrB,UAAM,YAAY,KAAK,MAAM,QAAQ,SAAS;AACxC,UAAA,mBAAmB,KAAK,MAAM,OAAO;AAC3C,QAAI,YAAY,YAAY;AACtB,UAAA;AACI,cAAA,IAAI,SAAS,cAAc,GAAG;AACpC,UAAE,OAAO;AACT,UAAE,SAAS;AACX,UAAE,KAAK;AACP,UAAE,WAAW;AACJ,iBAAA,KAAK,YAAY,CAAC;AACrB,cAAA,QAAQ,SAAS,eAAe,QAAQ;AAC9C,cAAM,MAAM;AACN,cAAA,WAAW,YAAY,CAAC;AAAA,eAEzB,IAAI;AACH,cAAA,IAAI,MAAM,uBAAuB;AAAA,MAAA;AAAA,IACzC,WAEO,YAAY,QAAQ;AACrB,YAAA,WAAW,KAAK,MAAM;AACxB,UAAA;AACI,cAAA,WAAW,MAAM,MAAM,QAAQ;AACjC,YAAA,CAAC,SAAS,IAAI;AACV,gBAAA,IAAI,MAAM,mBAAmB;AAAA,QAAA;AAE/B,cAAA,OAAO,MAAM,SAAS,KAAK;AACjC,cAAM,UAAU,UAAU,MAAM,CAAC,IAAI,cAAc,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC;AAAA,eAErE,IAAI;AACH,cAAA,IAAI,MAAM,mBAAmB;AAAA,MAAA;AAAA,IACrC,WAEO,YAAY,UAAU;AACzB,UAAA;AACF,cAAM,QAAQ,IAAI,MAAM,EACrB,OAAO,KAAK,WAAW,KAAK,EAC5B,OAAO,KAAK,WAAW,MAAM;AAChC,aAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,aAAK,MAAM,aAAa,KAAK,WAAW,KAAK;AAAA,eAExC,IAAI;AACH,cAAA,IAAI,MAAM,qBAAqB;AAAA,MAAA;AAAA,IACvC;AAEF,SAAK,QAAQ;AAAA,EAAA;AAAA,EAGf,cAAc;AACR,QAAA,KAAK,WAAW,KAAK,OAAO;AACxB,YAAA,SAAS,KAAK,MAAM,KAAK;AACzB,YAAA,gBAAgB,OAAO,sBAAsB;AAC7C,YAAA,YAAY,KAAK,MAAM,sBAAsB;AAC9C,WAAA,IAAI,KAAK,SAAS;AAAA,QACrB,MAAM,GAAG,UAAU,OAAO,UAAU,QAAQ,cAAc,OAAO,GAAG;AAAA,QACpE,KAAK,GAAG,UAAU,MAAM,cAAc,GAAG;AAAA,MAAA,CAC1C;AAAA,IAAA;AAAA,EACH;AAAA,EAGF,IAAI,SAAS,OAAO;AACd,QAAA,OAAO,UAAU,UAAU;AAC7B,iBAAW,QAAQ,OAAO;AACxB,YAAI,MAAM;AACR,cAAI,MAAM,QAAQ,MAAM,IAAI,CAAC,GAAG;AAE9B,kBAAM,IAAI,EAAE,QAAQ,CAAC,QAAQ;AACnB,sBAAA,MAAM,IAAI,IAAI;AAAA,YAAA,CACvB;AAAA,UAAA,OAEE;AACH,oBAAQ,MAAM,IAAI,IAAI,MAAM,IAAI;AAAA,UAAA;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEJ;"}
@@ -1,4 +1,5 @@
1
1
  import Quill from "quill";
2
+ import { isString } from "../../utils/is.es.js";
2
3
  const Delta = Quill.import("delta");
3
4
  const Tooltip = Quill.import("ui/tooltip");
4
5
  const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
@@ -49,10 +50,14 @@ const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
49
50
  const range = this.quill.getSelection(true);
50
51
  const inputValue = this.mathliveDom.value;
51
52
  if (!inputValue) return;
52
- const index = range ? range.index : this.quill.getLength() - 1;
53
- const delta = new Delta().retain(index).delete(this.editValue ? 1 : (range == null ? void 0 : range.length) || 0).insert({ mathlive: { value: inputValue, mode: "dialog" } });
53
+ const contentData = this.quill.getContents(range.index, 1).ops[0].insert;
54
+ let deleteCount = 0;
55
+ if (!isString(contentData) && contentData.mathlive) {
56
+ deleteCount += 1;
57
+ }
58
+ const delta = new Delta().retain(range.index).delete(Math.max(deleteCount, range.length)).insert({ mathlive: { value: inputValue, mode: "dialog" } });
54
59
  this.quill.updateContents(delta, Quill.sources.USER);
55
- this.quill.setSelection(index + 1, Quill.sources.SILENT);
60
+ this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
56
61
  this.hide();
57
62
  }
58
63
  position(reference) {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.es.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const index = range ? range.index : this.quill.getLength() - 1\r\n const delta = new Delta()\r\n .retain(index)\r\n .delete(this.editValue ? 1 : range?.length || 0)\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":[],"mappings":";AAKA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EAAA;AAAA,EAGd,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MAAA;AAAA,IACd,CACD;AAAA,EAAA;AAAA,EAGH,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EAAA;AAAA,EAGpB,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IAAA;AAEtB,SAAK,KAAK;AACV,SAAK,YAAY,MAAM;AAAA,EAAA;AAAA,EAGzB,eAAe;AACb,SAAK,YAAY,KAAK;AACtB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAAA;AAAA,EAG1C,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,MAAM,cAAc;AACvD,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,EACZ,OAAO,KAAK,YAAY,KAAI,+BAAO,WAAU,CAAC,EAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,GAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,QAAQ,GAAG,MAAM,QAAQ,MAAM;AACvD,SAAK,KAAK;AAAA,EAAA;AAAA,EAGZ,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG,UAAU;AACvB,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EAAA;AAE3C;AAzEE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;"}
1
+ {"version":3,"file":"tooltip.es.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\nimport { isString } from '../../utils/is'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const contentData = this.quill.getContents(range.index, 1).ops[0].insert\r\n let deleteCount = 0\r\n if (!isString(contentData) && contentData.mathlive) {\r\n deleteCount += 1\r\n }\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(Math.max(deleteCount, range.length))\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAMA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EAAA;AAAA,EAGd,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MAAA;AAAA,IACd,CACD;AAAA,EAAA;AAAA,EAGH,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EAAA;AAAA,EAGpB,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IAAA;AAEtB,SAAK,KAAK;AACV,SAAK,YAAY,MAAM;AAAA,EAAA;AAAA,EAGzB,eAAe;AACb,SAAK,YAAY,KAAK;AACtB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAAA;AAAA,EAG1C,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACX,UAAA,cAAc,KAAK,MAAM,YAAY,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAClE,QAAI,cAAc;AAClB,QAAI,CAAC,SAAS,WAAW,KAAK,YAAY,UAAU;AACnC,qBAAA;AAAA,IAAA;AAEX,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,MAAM,KAAK,EAClB,OAAO,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC,EAC1C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,GAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,MAAM,QAAQ,MAAM;AAC7D,SAAK,KAAK;AAAA,EAAA;AAAA,EAGZ,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG,UAAU;AACvB,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EAAA;AAE3C;AA7EE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;"}
@@ -3,6 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const Quill = require("quill");
4
4
  const selection = require("quill/core/selection");
5
5
  const image = require("./image.cjs.js");
6
+ const Delta = Quill.import("delta");
6
7
  class ImageBar {
7
8
  constructor(quill, target) {
8
9
  this.quill = quill;
@@ -86,7 +87,7 @@ class ImageBar {
86
87
  }
87
88
  } else if (operate === "delete") {
88
89
  try {
89
- const delta = new Quill.Delta().retain(this.imageRange.index).delete(this.imageRange.length);
90
+ const delta = new Delta().retain(this.imageRange.index).delete(this.imageRange.length);
90
91
  this.quill.updateContents(delta, Quill.sources.USER);
91
92
  this.quill.setSelection(this.imageRange.index);
92
93
  } catch (_e) {
@@ -1 +1 @@
1
- {"version":3,"file":"image-bar.cjs.js","sources":["../../../../src/modules/custom-image/image-bar.ts"],"sourcesContent":["import Quill, { Delta } from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport CustomImage from './image'\r\n\r\nexport default class ImageBar {\r\n quill: Quill\r\n image: HTMLImageElement\r\n domNode: HTMLElement\r\n imageRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.image = target\r\n const imageBlot = Quill.find(target)\r\n const index = this.quill.getIndex(imageBlot)\r\n const [imageItem, offset] = this.quill.scroll.descendant(CustomImage, index)\r\n const length = imageItem && imageItem.length()\r\n this.imageRange = new Range(index - offset, length)\r\n\r\n this.template = [\r\n // `<a class=\"ql-image-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-image-download\"><i class=\"icon-download\"></i></a>`,\r\n `<a class=\"ql-image-copy\">\r\n <svg width=\"16\" height=\"16\" t=\"1736062378465\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1630\"><path d=\"M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z\" fill=\"#000000\" p-id=\"1631\"></path></svg>\r\n </a>`,\r\n `<a class=\"ql-image-delete\"><i class=\"icon-delete\"></i></a>`,\r\n ].join('')\r\n\r\n this.createImageBar()\r\n }\r\n\r\n createImageBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-image-bar'\r\n this.domNode.innerHTML = this.template\r\n // 下载图片\r\n const imageDownload = this.domNode.querySelector('a.ql-image-download')\r\n if (imageDownload) {\r\n imageDownload.addEventListener('click', (event) => {\r\n this.operateImage(event, 'download')\r\n })\r\n }\r\n // 复制图片\r\n const imageCopy = this.domNode.querySelector('a.ql-image-copy')\r\n if (imageCopy) {\r\n imageCopy.addEventListener('click', (event) => {\r\n this.operateImage(event, 'copy')\r\n })\r\n }\r\n // 删除图片\r\n const imageDelete = this.domNode.querySelector('a.ql-image-delete')\r\n if (imageDelete) {\r\n imageDelete.addEventListener('click', (event) => {\r\n this.operateImage(event, 'delete')\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.image = null\r\n }\r\n }\r\n\r\n async operateImage(event, operate) {\r\n event.preventDefault()\r\n const imageName = this.image.dataset.title || ''\r\n const imageDownloadUrl = this.image.src || ''\r\n if (operate === 'download') {\r\n try {\r\n const a = document.createElement('a')\r\n a.href = imageDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = imageName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n catch (_e) {\r\n throw new Error('Download image failed')\r\n }\r\n }\r\n else if (operate === 'copy') {\r\n const imageUrl = this.image.src\r\n try {\r\n const response = await fetch(imageUrl)\r\n if (!response.ok) {\r\n throw new Error('Copy image failed')\r\n }\r\n const blob = await response.blob()\r\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })])\r\n }\r\n catch (_e) {\r\n throw new Error('Copy image failed')\r\n }\r\n }\r\n else if (operate === 'delete') {\r\n try {\r\n const delta = new Delta()\r\n .retain(this.imageRange.index)\r\n .delete(this.imageRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.imageRange.index)\r\n }\r\n catch (_e) {\r\n throw new Error('Delete image failed')\r\n }\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.image) {\r\n const parent = this.quill.root.parentNode\r\n const containerRect = parent.getBoundingClientRect()\r\n const imageRect = this.image.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${imageRect.left + imageRect.width - containerRect.left - 125}px`,\r\n top: `${imageRect.top - containerRect.top}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["CustomImage","Range","Delta"],"mappings":"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"}
1
+ {"version":3,"file":"image-bar.cjs.js","sources":["../../../../src/modules/custom-image/image-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { Range } from 'quill/core/selection'\r\nimport CustomImage from './image'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport default class ImageBar {\r\n quill: Quill\r\n image: HTMLImageElement\r\n domNode: HTMLElement\r\n imageRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.image = target\r\n const imageBlot = Quill.find(target)\r\n const index = this.quill.getIndex(imageBlot)\r\n const [imageItem, offset] = this.quill.scroll.descendant(CustomImage, index)\r\n const length = imageItem && imageItem.length()\r\n this.imageRange = new Range(index - offset, length)\r\n\r\n this.template = [\r\n // `<a class=\"ql-image-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-image-download\"><i class=\"icon-download\"></i></a>`,\r\n `<a class=\"ql-image-copy\">\r\n <svg width=\"16\" height=\"16\" t=\"1736062378465\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"1630\"><path d=\"M394.666667 106.666667h448a74.666667 74.666667 0 0 1 74.666666 74.666666v448a74.666667 74.666667 0 0 1-74.666666 74.666667H394.666667a74.666667 74.666667 0 0 1-74.666667-74.666667V181.333333a74.666667 74.666667 0 0 1 74.666667-74.666666z m0 64a10.666667 10.666667 0 0 0-10.666667 10.666666v448a10.666667 10.666667 0 0 0 10.666667 10.666667h448a10.666667 10.666667 0 0 0 10.666666-10.666667V181.333333a10.666667 10.666667 0 0 0-10.666666-10.666666H394.666667z m245.333333 597.333333a32 32 0 0 1 64 0v74.666667a74.666667 74.666667 0 0 1-74.666667 74.666666H181.333333a74.666667 74.666667 0 0 1-74.666666-74.666666V394.666667a74.666667 74.666667 0 0 1 74.666666-74.666667h74.666667a32 32 0 0 1 0 64h-74.666667a10.666667 10.666667 0 0 0-10.666666 10.666667v448a10.666667 10.666667 0 0 0 10.666666 10.666666h448a10.666667 10.666667 0 0 0 10.666667-10.666666v-74.666667z\" fill=\"#000000\" p-id=\"1631\"></path></svg>\r\n </a>`,\r\n `<a class=\"ql-image-delete\"><i class=\"icon-delete\"></i></a>`,\r\n ].join('')\r\n\r\n this.createImageBar()\r\n }\r\n\r\n createImageBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-image-bar'\r\n this.domNode.innerHTML = this.template\r\n // 下载图片\r\n const imageDownload = this.domNode.querySelector('a.ql-image-download')\r\n if (imageDownload) {\r\n imageDownload.addEventListener('click', (event) => {\r\n this.operateImage(event, 'download')\r\n })\r\n }\r\n // 复制图片\r\n const imageCopy = this.domNode.querySelector('a.ql-image-copy')\r\n if (imageCopy) {\r\n imageCopy.addEventListener('click', (event) => {\r\n this.operateImage(event, 'copy')\r\n })\r\n }\r\n // 删除图片\r\n const imageDelete = this.domNode.querySelector('a.ql-image-delete')\r\n if (imageDelete) {\r\n imageDelete.addEventListener('click', (event) => {\r\n this.operateImage(event, 'delete')\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.image = null\r\n }\r\n }\r\n\r\n async operateImage(event, operate) {\r\n event.preventDefault()\r\n const imageName = this.image.dataset.title || ''\r\n const imageDownloadUrl = this.image.src || ''\r\n if (operate === 'download') {\r\n try {\r\n const a = document.createElement('a')\r\n a.href = imageDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = imageName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n catch (_e) {\r\n throw new Error('Download image failed')\r\n }\r\n }\r\n else if (operate === 'copy') {\r\n const imageUrl = this.image.src\r\n try {\r\n const response = await fetch(imageUrl)\r\n if (!response.ok) {\r\n throw new Error('Copy image failed')\r\n }\r\n const blob = await response.blob()\r\n await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })])\r\n }\r\n catch (_e) {\r\n throw new Error('Copy image failed')\r\n }\r\n }\r\n else if (operate === 'delete') {\r\n try {\r\n const delta = new Delta()\r\n .retain(this.imageRange.index)\r\n .delete(this.imageRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.imageRange.index)\r\n }\r\n catch (_e) {\r\n throw new Error('Delete image failed')\r\n }\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.image) {\r\n const parent = this.quill.root.parentNode as HTMLElement\r\n const containerRect = parent.getBoundingClientRect()\r\n const imageRect = this.image.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${imageRect.left + imageRect.width - containerRect.left - 125}px`,\r\n top: `${imageRect.top - containerRect.top}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["CustomImage","Range"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const Quill = require("quill");
4
+ const is = require("../../utils/is.cjs.js");
4
5
  const Delta = Quill.import("delta");
5
6
  const Tooltip = Quill.import("ui/tooltip");
6
7
  const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
@@ -51,10 +52,14 @@ const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
51
52
  const range = this.quill.getSelection(true);
52
53
  const inputValue = this.mathliveDom.value;
53
54
  if (!inputValue) return;
54
- const index = range ? range.index : this.quill.getLength() - 1;
55
- const delta = new Delta().retain(index).delete(this.editValue ? 1 : (range == null ? void 0 : range.length) || 0).insert({ mathlive: { value: inputValue, mode: "dialog" } });
55
+ const contentData = this.quill.getContents(range.index, 1).ops[0].insert;
56
+ let deleteCount = 0;
57
+ if (!is.isString(contentData) && contentData.mathlive) {
58
+ deleteCount += 1;
59
+ }
60
+ const delta = new Delta().retain(range.index).delete(Math.max(deleteCount, range.length)).insert({ mathlive: { value: inputValue, mode: "dialog" } });
56
61
  this.quill.updateContents(delta, Quill.sources.USER);
57
- this.quill.setSelection(index + 1, Quill.sources.SILENT);
62
+ this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
58
63
  this.hide();
59
64
  }
60
65
  position(reference) {
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const index = range ? range.index : this.quill.getLength() - 1\r\n const delta = new Delta()\r\n .retain(index)\r\n .delete(this.editValue ? 1 : range?.length || 0)\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAKA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EAAA;AAAA,EAGd,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MAAA;AAAA,IACd,CACD;AAAA,EAAA;AAAA,EAGH,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EAAA;AAAA,EAGpB,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IAAA;AAEtB,SAAK,KAAK;AACV,SAAK,YAAY,MAAM;AAAA,EAAA;AAAA,EAGzB,eAAe;AACb,SAAK,YAAY,KAAK;AACtB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAAA;AAAA,EAG1C,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,MAAM,cAAc;AACvD,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,EACZ,OAAO,KAAK,YAAY,KAAI,+BAAO,WAAU,CAAC,EAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,GAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,QAAQ,GAAG,MAAM,QAAQ,MAAM;AACvD,SAAK,KAAK;AAAA,EAAA;AAAA,EAGZ,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG,UAAU;AACvB,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EAAA;AAE3C;AAzEE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;;"}
1
+ {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\nimport { isString } from '../../utils/is'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport default class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const contentData = this.quill.getContents(range.index, 1).ops[0].insert\r\n let deleteCount = 0\r\n if (!isString(contentData) && contentData.mathlive) {\r\n deleteCount += 1\r\n }\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(Math.max(deleteCount, range.length))\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":["isString"],"mappings":";;;;AAMA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EAAA;AAAA,EAGd,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MAAA;AAAA,IACd,CACD;AAAA,EAAA;AAAA,EAGH,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EAAA;AAAA,EAGpB,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IAAA;AAEtB,SAAK,KAAK;AACV,SAAK,YAAY,MAAM;AAAA,EAAA;AAAA,EAGzB,eAAe;AACb,SAAK,YAAY,KAAK;AACtB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAAA;AAAA,EAG1C,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACX,UAAA,cAAc,KAAK,MAAM,YAAY,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAClE,QAAI,cAAc;AAClB,QAAI,CAACA,GAAAA,SAAS,WAAW,KAAK,YAAY,UAAU;AACnC,qBAAA;AAAA,IAAA;AAEX,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,MAAM,KAAK,EAClB,OAAO,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC,EAC1C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,GAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,MAAM,QAAQ,MAAM;AAC7D,SAAK,KAAK;AAAA,EAAA;AAAA,EAGZ,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG,UAAU;AACvB,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EAAA;AAE3C;AA7EE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;;"}
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
- "version": "3.25.3-alpha.0",
3
+ "type": "module",
4
+ "version": "3.25.4",
4
5
  "description": "A rich text editor based on Quill 2.0, which extends rich modules and formats on the basis of Quill. It's powerful and out-of-the-box.",
5
6
  "author": "OpenTiny Team",
6
7
  "license": "MIT",
@@ -22,7 +23,6 @@
22
23
  "opentiny",
23
24
  "fluent-editor"
24
25
  ],
25
- "type": "module",
26
26
  "main": "lib/index.cjs.js",
27
27
  "module": "es/index.es.js",
28
28
  "types": "types/index.d.ts",