@chenyomi/leafer-htmltext-edit 1.0.0 → 2.0.2

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.
package/README.md CHANGED
@@ -7,14 +7,11 @@
7
7
  <img src="https://img.shields.io/badge/TypeScript-Ready-blue.svg" alt="TypeScript">
8
8
  </p>
9
9
 
10
- 一个强大的 Leafer UI 富文本编辑器插件,集成了 Quill 编辑器,支持 HTML 文本编辑和丰富的文本样式控制。
11
-
12
- [English](./README_EN.md) | 简体中文
10
+ 一个强大的 Leafer UI 富文本编辑器插件,支持 HTML 文本编辑和丰富的文本样式控制。
13
11
 
14
12
  ## ✨ 特性
15
13
 
16
- - 🎨 **富文本编辑** - 基于 Quill 2.0,支持完整的富文本编辑功能
17
- - 🔤 **多语言字体** - 内置 20+ 种字体,支持中文、日文、韩文等多语言
14
+ - 🔤 **多语言字体** - 支持自定义字体
18
15
  - 📐 **文本样式** - 字体、大小、颜色、对齐、行高、字间距等全面控制
19
16
  - 📝 **格式化工具** - 加粗、斜体、下划线、删除线、上下标
20
17
  - 📋 **列表支持** - 有序列表、无序列表
@@ -44,7 +41,7 @@ yarn add @chenyomi/leafer-htmltext-edit
44
41
  本插件需要以下依赖(请确保已安装):
45
42
 
46
43
  ```bash
47
- npm install leafer-ui @leafer-ui/core @leafer-in/editor @leafer-in/html quill
44
+ npm install leafer-ui @leafer-ui/core @leafer-in/editor @leafer-in/html
48
45
  ```
49
46
 
50
47
  ## 🚀 快速开始
@@ -54,7 +51,7 @@ npm install leafer-ui @leafer-ui/core @leafer-in/editor @leafer-in/html quill
54
51
  ```typescript
55
52
  import { App } from 'leafer-ui'
56
53
  import { Editor } from '@leafer-in/editor'
57
- import { quillManager } from '@chenyomi/leafer-htmltext-edit'
54
+ import { HtmlTextManage } from '@chenyomi/leafer-htmltext-edit'
58
55
 
59
56
  // 1. 创建 Leafer 应用
60
57
  const app = new App({
@@ -64,7 +61,7 @@ const app = new App({
64
61
  })
65
62
 
66
63
  // 2. 初始化 Quill 编辑器
67
- await quillManager.init(app)
64
+ await HtmlTextManage.init(app)
68
65
 
69
66
  // 3. 创建编辑器
70
67
  const editor = new Editor({ app })
@@ -83,7 +80,7 @@ const editor = new Editor({ app })
83
80
  import { ref, onMounted } from 'vue'
84
81
  import { App } from 'leafer-ui'
85
82
  import { Editor } from '@leafer-in/editor'
86
- import { quillManager } from '@chenyomi/leafer-htmltext-edit'
83
+ import { HtmlTextManage } from '@chenyomi/leafer-htmltext-edit'
87
84
 
88
85
  const canvasRef = ref<HTMLDivElement>()
89
86
 
@@ -94,7 +91,7 @@ onMounted(async () => {
94
91
  editor: {}
95
92
  })
96
93
 
97
- await quillManager.init(app)
94
+ await HtmlTextManage.init(app)
98
95
  new Editor({ app })
99
96
  })
100
97
  </script>
@@ -106,7 +103,7 @@ onMounted(async () => {
106
103
  import { useEffect, useRef } from 'react'
107
104
  import { App } from 'leafer-ui'
108
105
  import { Editor } from '@leafer-in/editor'
109
- import { quillManager } from '@chenyomi/leafer-htmltext-edit'
106
+ import { HtmlTextManage } from '@chenyomi/leafer-htmltext-edit'
110
107
 
111
108
  function TextEditor() {
112
109
  const canvasRef = useRef<HTMLDivElement>(null)
@@ -120,7 +117,7 @@ function TextEditor() {
120
117
  editor: {}
121
118
  })
122
119
 
123
- quillManager.init(app).then(() => {
120
+ HtmlTextManage.init(app).then(() => {
124
121
  new Editor({ app })
125
122
  })
126
123
  }, [])
@@ -131,7 +128,7 @@ function TextEditor() {
131
128
 
132
129
  ## 📚 API 文档
133
130
 
134
- ### QuillManager
131
+ ### HtmlTextManage
135
132
 
136
133
  单例模式的 Quill 编辑器管理器。
137
134
 
@@ -142,7 +139,7 @@ function TextEditor() {
142
139
  初始化 Quill 编辑器。
143
140
 
144
141
  ```typescript
145
- const quill = await quillManager.init(app)
142
+ const quill = await HtmlTextManage.init(app)
146
143
  ```
147
144
 
148
145
  ##### `getQuill(): Quill`
@@ -150,7 +147,7 @@ const quill = await quillManager.init(app)
150
147
  获取 Quill 实例。
151
148
 
152
149
  ```typescript
153
- const quill = quillManager.getQuill()
150
+ const quill = HtmlTextManage.getQuill()
154
151
  ```
155
152
 
156
153
  ##### `getCanvas(): any`
@@ -158,7 +155,7 @@ const quill = quillManager.getQuill()
158
155
  获取 Leafer App 实例。
159
156
 
160
157
  ```typescript
161
- const app = quillManager.getCanvas()
158
+ const app = HtmlTextManage.getCanvas()
162
159
  ```
163
160
 
164
161
  ##### `isMultiSelect(): boolean`
@@ -166,7 +163,7 @@ const app = quillManager.getCanvas()
166
163
  判断是否为多选状态。
167
164
 
168
165
  ```typescript
169
- if (quillManager.isMultiSelect()) {
166
+ if (HtmlTextManage.isMultiSelect()) {
170
167
  console.log('Multiple objects selected')
171
168
  }
172
169
  ```
@@ -176,7 +173,7 @@ if (quillManager.isMultiSelect()) {
176
173
  批量编辑选中的对象。
177
174
 
178
175
  ```typescript
179
- quillManager.dateEdit((leaf) => {
176
+ HtmlTextManage.dateEdit((leaf) => {
180
177
  leaf.fontSize = 20
181
178
  leaf.fill = '#ff0000'
182
179
  })
@@ -209,28 +206,28 @@ const tool = new TextEditTool()
209
206
  ### 设置文本样式
210
207
 
211
208
  ```typescript
212
- import { quillManager } from '@chenyomi/leafer-htmltext-edit'
209
+ import { HtmlTextManage } from '@chenyomi/leafer-htmltext-edit'
213
210
 
214
211
  // 获取 Quill 实例
215
- const quill = quillManager.getQuill()
212
+ const quill = HtmlTextManage.getQuill()
216
213
 
217
214
  // 设置字体大小
218
- quillManager.dateEdit((leaf) => {
215
+ HtmlTextManage.dateEdit((leaf) => {
219
216
  leaf.fontSize = 24
220
217
  })
221
218
 
222
219
  // 设置字体
223
- quillManager.dateEdit((leaf) => {
220
+ HtmlTextManage.dateEdit((leaf) => {
224
221
  leaf.fontFamily = 'Roboto'
225
222
  })
226
223
 
227
224
  // 设置颜色
228
- quillManager.dateEdit((leaf) => {
225
+ HtmlTextManage.dateEdit((leaf) => {
229
226
  leaf.fill = '#ff0000'
230
227
  })
231
228
 
232
229
  // 设置对齐方式
233
- quillManager.dateEdit((leaf) => {
230
+ HtmlTextManage.dateEdit((leaf) => {
234
231
  leaf.textAlign = 'center' // 'left' | 'center' | 'right' | 'justify'
235
232
  })
236
233
  ```
@@ -239,8 +236,8 @@ quillManager.dateEdit((leaf) => {
239
236
 
240
237
  ```typescript
241
238
  // 当选中多个文本对象时
242
- if (quillManager.isMultiSelect()) {
243
- quillManager.dateEdit((leaf) => {
239
+ if (HtmlTextManage.isMultiSelect()) {
240
+ HtmlTextManage.dateEdit((leaf) => {
244
241
  leaf.fontSize = 18
245
242
  leaf.fontFamily = 'Inter'
246
243
  leaf.fill = '#333333'
@@ -251,7 +248,7 @@ if (quillManager.isMultiSelect()) {
251
248
  ### 监听文本变化
252
249
 
253
250
  ```typescript
254
- const quill = quillManager.getQuill()
251
+ const quill = HtmlTextManage.getQuill()
255
252
 
256
253
  quill.on('text-change', (delta, oldDelta, source) => {
257
254
  console.log('Text changed:', delta)
@@ -393,7 +390,7 @@ import 'quill/dist/quill.core.css'
393
390
 
394
391
  A: 请确保:
395
392
  1. 已正确安装所有 peer dependencies
396
- 2. 调用了 `quillManager.init(app)`
393
+ 2. 调用了 `HtmlTextManage.init(app)`
397
394
  3. 创建了 `Editor` 实例
398
395
  4. Vite 配置中添加了 `dedupe` 设置
399
396
 
@@ -406,7 +403,7 @@ A: 支持所有现代浏览器(Chrome, Firefox, Safari, Edge)。不支持 IE
406
403
  A: 可以通过修改 Quill 的字体配置:
407
404
 
408
405
  ```typescript
409
- const quill = quillManager.getQuill()
406
+ const quill = HtmlTextManage.getQuill()
410
407
  const Font = quill.constructor.import('attributors/class/font')
411
408
  Font.whitelist = ['CustomFont1', 'CustomFont2']
412
409
  quill.constructor.register(Font, true)
package/dist/index.cjs CHANGED
@@ -1,4 +1,4 @@
1
- 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),y=require('quill');require('quill/dist/quill.core.css');var I=require('crypto-js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var I__default=/*#__PURE__*/_interopDefault(I);var v=(t,a,e,n)=>{for(var i=a,l=t.length-1,o;l>=0;l--)(o=t[l])&&(i=(o(i))||i);return i};var L=async(t,a,e)=>{let{scaleX:n,scaleY:i}=t.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontFamily&&(o.style.fontFamily=t.data.textData.fontFamily),o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*l}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let r=o.querySelector(".ql-editor");r.style.alignContent=t.data.textData.alignContent;}let s=p.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let r=t.text.split("</style>")[0];t.text=r+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,a,e=16,n="1.5",i="0",l="none",o="start")=>{let{scaleX:d,scaleY:s}=t.worldTransform,r=Math.max(Math.abs(d),Math.abs(s)),c=document.createElement("div");c.innerHTML=a;let g={fontSize:`${e}px`,lineHeight:n,letterSpacing:`${i}px`,textShadow:l};c.querySelectorAll("p,ol,ul").forEach(B=>{Object.assign(B.style,g);});let f=c.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let h;document.querySelector("#textInnerEditor");let b=p.getQuill(),u=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let w="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${f}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${f}</div>`:t.data.textData.italic?m=w+f:(console.log(u),m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};var D=class extends editor.EditTool{constructor(e){super(e);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{L(n);},300);}get tag(){return "TextEditTool"}debounce(e,n){let i=null;return((...l)=>{i!==null&&window.clearTimeout(i),i=window.setTimeout(()=>e.apply(this,l),n);})}addEvent(){let{editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l)),d=document.querySelector("#textInnerEditor"),{style:s}=d;this.eventIds=[e.on_(editor.EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(s.width=n.parent.width*o+"px",s.height="auto");let c=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(c=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*c),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),e.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||e.openInnerEditor(n,true);})];}onLoad(){let{editor:e}=p.getCanvas();console.log(e._target,123);let n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:s}=d;n.data.canChangeBox?(s.width=n.parent.width*o+"px",s.height=n.parent.height*o+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(e){e&&e.set({width:e.__layout.boxBounds.width,height:e.__layout.boxBounds.height});}onUpdate(){let {editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText");e._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:e}=p.getCanvas();e.off_(this.eventIds);}onDestroy(){}};D=v([editor.registerEditTool()],D);var T=class extends editor.InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async e=>{e&&localStorage.setItem("selection-change",JSON.stringify(e));};this.onInput=async()=>{let{editDom:e}=this;console.log("onInput"),L(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:e}=this,{config:n}=e.app,i=this.editTarget,{scaleX:l,scaleY:o}=i.worldTransform,d=Math.max(Math.abs(l),Math.abs(o));this.isHTMLText=!(i instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=s;if(r.visibility="visible",i.data.canChangeBox?(r.width=i.parent.width*d+"px",r.height=i.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",i.data.textData.fontSize&&(console.log(i.data.textData.fontSize),s.style.fontSize=`${i.data.textData.fontSize}px`),i.data.textData.fontFamily&&(s.style.fontFamily=`${i.data.textData.fontFamily}`),i.data.textData.lineHeight&&(s.style.lineHeight=i.data.textData.lineHeight),i.data.textData.letterSpacing&&(s.style.letterSpacing=`${i.data.textData.letterSpacing}px`),i.data.textData.textShadow?s.style.textShadow=`${i.data.textData.textShadow}`:s.style.textShadow="none",i.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${i.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(i.text),i.parent.children[0].tag.includes("Shape")?(r.width=i.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[e.app.on_(core.PointerEvent.DOWN,c=>{let{target:g}=c.origin,f=false;for(;g;)g===s&&(f=true),g=g.parentElement;f||(e.closeInnerEditor(),e.cancel());})];}onUpdate(){let{editTarget:e}=this,{scaleX:n,scaleY:i}=e.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),{width:o,height:d}=e.parent.__local;o*=l,d*=l;let{x:s,y:r}=this.inBody?e.app.clientBounds:e.app.tree.clientBounds,{a:c,b:g,c:f,d:h,e:N,f:b}=new core.Matrix(e.worldTransform).scale(1/l).translateInner(0,0),{style:u}=this.editDom;u.transform=`matrix(${c},${g},${f},${h},${N},${b})`,u.left=s+"px",u.top=r+"px",e.set({visible:false});}onUnload(){let{editTarget:e,editor:n,editDom:i}=this;e&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),e.parent&&e.parent.name=="Text"&&e.parent.children.some(l=>l.tag==="Box")?(e.parent.findOne("Box").opacity=1,e.visible=false):e.set({visible:true}),this.quill.getLength()===1&&e.parent.name==="Text"&&e.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};T=v([editor.registerInnerEditor()],T);function C(t,{insertAt:a}={}){if(typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",a==="top"&&e.firstChild?e.insertBefore(n,e.firstChild):e.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
- `);var W="your-secret-key-change-this-2025";function $(t){try{return I__default.default.AES.decrypt(t,W).toString(I__default.default.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function X(t){try{let a=_(t);if(!a)return null;let e=$(a);return e?JSON.parse(e):null}catch{return null}}function Y(t){if(!t||t.length===0)return true;let a=window.location.hostname;return a==="localhost"||a==="127.0.0.1"?true:t.some(e=>{if(e.startsWith("*.")){let n=e.slice(2);return a.endsWith(n)}return a===e})}function k(t){if(!t)return true;try{let a=new Date(t);return new Date<a}catch{return false}}function M(t){let a=X(t);return a?Y(a.domains)?k(a.expireDate)?{valid:true,data:a}:{valid:false,error:"License has expired",data:a}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:a}:{valid:false,error:"Invalid license key"}}var S=null,x=false;function V(t){let a=M(t);return a.valid?(S=t,x=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",a.error),x=false,false)}function E(){if(!S)return console.warn("[License] No license key provided"),false;if(!x)return console.warn("[License] License is not valid"),false;let t=M(S);return x=t.valid,x||console.error("[License] License expired or invalid:",t.error),x}function Z(){return S?M(S).data:null}var H=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(a){if(!E())throw console.error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=a,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new y__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[i]=this.quill.getLine(n.index),l=y__default.default.import("blots/block");if(!l?.bubbleFormats)return true;let o=l.bubbleFormats(i),d=new y.Delta().retain(n.index).delete(n.length).insert(`
3
- `,o);return this.quill.updateContents(d,y__default.default.sources.USER),this.quill.setSelection(n.index+1,y__default.default.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let a=y__default.default.import("attributors/class/font");a.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],y__default.default.register(a,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(a,e=0,n){let{editor:i}=this.app_,l=n||i.leafList.list,o=d=>{e&&(d.tag==="Box"||d.name==="Text")?a(d.children?.[0]||d):a(d);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(o),this.app_.unlockLayout(),i.updateEditBox()):o(l[0]));}},p=H.getInstance();exports.checkLicense=E;exports.getLicenseInfo=Z;exports.quillManager=p;exports.setLicense=V;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),b=require('quill');require('quill/dist/quill.core.css');var z=require('crypto-js'),html=require('@leafer-in/html');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var b__default=/*#__PURE__*/_interopDefault(b);var z__default=/*#__PURE__*/_interopDefault(z);var y=(t,i,n,e)=>{for(var o=i,r=t.length-1,a;r>=0;r--)(a=t[r])&&(o=(a(o))||o);return o};var p=async(t,i,n)=>{let{scaleX:e,scaleY:o}=t.worldTransform,r=Math.max(Math.abs(e),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontFamily&&(a.style.fontFamily=t.data.textData.fontFamily),a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*r}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let s=f.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n.code)){let c=`@font-face {font-family: ${n.code};src: url(${i}) format('woff2') } .ql-font-${n?.name?.replace(/\s+/g,"")} {font-family: ${n.value};}`;t.text=d+c+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(i&&n){let d=`<style>@font-face {font-family: ${t.data.textData.fontFamily.split(",")[0]};src: url(${i}) format('woff2') } .ql-font-${n?.name} {font-family: ${n.value};}</style>`;t.text=d+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent),console.log(d);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,i,n=16,e="1.5",o="0",r="none",a="start")=>{let{scaleX:l,scaleY:s}=t.worldTransform,d=Math.max(Math.abs(l),Math.abs(s)),c=document.createElement("div");c.innerHTML=i;let g={fontSize:`${n}px`,lineHeight:e,letterSpacing:`${o}px`,textShadow:r};c.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let u=c.innerHTML;/<p\b[^>]*><\/p>/.test(u)&&(u=u.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let m;document.querySelector("#textInnerEditor");let T=f.getQuill(),h=Number((T.scroll.domNode.scrollHeight/d).toFixed(0));Number((T.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?m=(h||t.__layout.boxBounds.height)+"px":m=`${t.parent.height}px`:t.parent.height<h?m=(h||t.__layout.boxBounds.height)+"px":m=`${t.parent.height}px`;let D="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",x="";return t.parent.children[0].tag.includes("Shape")?x=D+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${u}</div>`:t.data.canChangeBox?x=D+`<div style="width: ${t.parent.width}px;height:${m};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${u}</div>`:t.data.textData.italic?x=D+u:x=D+`<div style="overflow-wrap:break-word;word-break:break-all;">${u}</div>`,console.log(x,"\u6700\u7EC8\u7684html\u5185\u5BB9"),x},lt=(t,i,n)=>{let e=f.getQuill(),{editor:o,canvas:r}=f.getCanvas();if(console.log(o,f.getCanvas(),"editor"),!e)return;let a=JSON.parse(localStorage.getItem("selection-change")||"{}");f.dateEdit(async l=>{if(t==="font"){let s=i.split(","),d=s[0].replace(/\s+|"|'/g,""),c={code:s[0].replace(/"|'/g,""),name:d,value:i};console.log(c,"obj"),o.innerEditing?(a&&a.length?e.formatText(a.index,a.length,t,d):e.formatText(0,e.getLength()-1,t,d),l.data.textData.fontFamily=i,p(l,n??null,c??null)):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,d),l.data.textData.fontFamily=i,p(l,n??null,c??null));}else if(t==="fontSize")l.data.textData[t]=i,f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),p(l,n??null);else if(t==="textCase"){if(o.innerEditing){let s=e.getText(a.index,a.length),d=e.getFormat(a.index,a.length);e.deleteText(a.index,a.length);let c;s===s.toUpperCase()&&/[A-Z]/.test(s)?c=s.toLowerCase():(s===s.toLowerCase()&&/[a-z]/.test(s),c=s.toUpperCase()),e.insertText(a.index,c,d),a&&o.innerEditing&&e.setSelection(a.index,a.length);}}else if(t==="script"){let s="sub";i==="super"&&(s="sup"),o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,e.getFormat(a).script===i?false:s):e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:s):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:s),p(l));}else if(t==="align")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing?e.format(t,i):e.formatLine(0,e.getLength(),t,i),p(l);else if(t==="alignContent")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="lineHeight"||t==="letterSpacing")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="color")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.tag==="HTMLText"?p(l):l.parent.findOne("HTMLText")&&p(l.parent.findOne("HTMLText"));else if(t==="textShadow")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="list"){if(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing){let[s]=e.getLine(a?.index||0);s.formats().list?e.format(t,false):e.format(t,i);}else {let[s]=e.getLine(a?.index||0);s.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,i);}p(l);}else o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,i===void 0?!e.getFormat(a)[t]:i):e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i),p(l));},1);};var v=class extends editor.EditTool{constructor(n){super(n);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{p(e);},300);}get tag(){return "TextEditTool"}debounce(n,e){let o=null;return((...r)=>{o!==null&&window.clearTimeout(o),o=window.setTimeout(()=>n.apply(this,r),e);})}addEvent(){let{editor:n}=f.getCanvas(),e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:r}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(r)),l=document.querySelector("#textInnerEditor"),{style:s}=l;this.eventIds=[n.on_(editor.EditorScaleEvent.SCALE,d=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(s.width=e.parent.width*a+"px",s.height="auto");let c=1;e.parent.tag==="Box"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(c=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*c),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),n.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||n.openInnerEditor(e,true);})];}onLoad(){let{editor:n}=f.getCanvas();console.log(n._target,123);let e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:r}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(r));this.addEvent(),this.quill=f.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:s}=l;e.data.canChangeBox?(s.width=e.parent.width*a+"px",s.height=e.parent.height*a+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(n){n&&n.set({width:n.__layout.boxBounds.width,height:n.__layout.boxBounds.height});}onUpdate(){let {editor:n}=f.getCanvas(),e=n._target.findOne("HTMLText");n._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:n}=f.getCanvas();n.off_(this.eventIds);}onDestroy(){}};v=y([editor.registerEditTool()],v);var L=class extends editor.InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.onSelectionChange=async n=>{n&&localStorage.setItem("selection-change",JSON.stringify(n));};this.onInput=async()=>{let{editDom:n}=this;console.log("onInput"),p(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:n}=this,{config:e}=n.app,o=this.editTarget,{scaleX:r,scaleY:a}=o.worldTransform,l=Math.max(Math.abs(r),Math.abs(a));this.isHTMLText=!(o instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:d}=s;if(d.visibility="visible",o.data.canChangeBox?(d.width=o.parent.width*l+"px",d.height=o.parent.height*l+"px"):(d.width="auto",d.height="auto"),d.outline="solid #8499EF",o.data.textData.fontSize&&(s.style.fontSize=`${o.data.textData.fontSize*l}px`),o.data.textData.fontFamily&&(s.style.fontFamily=`${o.data.textData.fontFamily}`),o.data.textData.lineHeight&&(s.style.lineHeight=o.data.textData.lineHeight),o.data.textData.letterSpacing&&(s.style.letterSpacing=`${o.data.textData.letterSpacing}px`),o.data.textData.textShadow?s.style.textShadow=`${o.data.textData.textShadow}`:s.style.textShadow="none",o.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${o.data.textData.alignContent}`;}this.quill=f.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(o.text),o.parent.children[0].tag.includes("Shape")?(d.width=o.parent.width*l+"px",d.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[n.app.on_(core.PointerEvent.DOWN,c=>{let{target:g}=c.origin,u=false;for(;g;)g===s&&(u=true),g=g.parentElement;u||(n.closeInnerEditor(),n.cancel());})];}onUpdate(){let{editTarget:n}=this,{scaleX:e,scaleY:o}=n.worldTransform,r=Math.max(Math.abs(e),Math.abs(o)),{width:a,height:l}=n.parent.__local;a*=r,l*=r;let{x:s,y:d}=this.inBody?n.app.clientBounds:n.app.tree.clientBounds,{a:c,b:g,c:u,d:m,e:N,f:T}=new core.Matrix(n.worldTransform).scale(1/r).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${c},${g},${u},${m},${N},${T})`,h.left=s+"px",h.top=d+"px",n.set({visible:false});}onUnload(){let{editTarget:n,editor:e,editDom:o}=this;n&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),n.parent&&n.parent.name=="Text"&&n.parent.children.some(r=>r.tag==="Box")?(n.parent.findOne("Box").opacity=1,n.visible=false):n.set({visible:true}),this.quill.getLength()===1&&n.parent.name==="Text"&&n.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};L=y([editor.registerInnerEditor()],L);function E(t,{insertAt:i}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",i==="top"&&n.firstChild?n.insertBefore(e,n.firstChild):n.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}E(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
+ `);var X="chenyuming-license-key";function B(t){try{return z__default.default.AES.decrypt(t,X).toString(z__default.default.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function Y(t){try{let i=_(t);if(!i)return null;let n=B(i);return n?JSON.parse(n):null}catch{return null}}function k(t){if(!t||t.length===0)return true;let i=window.location.hostname;return i==="localhost"||i==="127.0.0.1"?true:t.some(n=>{if(n.startsWith("*.")){let e=n.slice(2);return i.endsWith(e)}return i===n})}function j(t){if(!t)return true;try{let i=new Date(t);return new Date<i}catch{return false}}function C(t){let i=Y(t);return i?k(i.domains)?j(i.expireDate)?{valid:true,data:i}:{valid:false,error:"License has expired",data:i}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:i}:{valid:false,error:"Invalid license key"}}var w=null,S=false;function V(t){let i=C(t);return i.valid?(w=t,S=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",i.error),S=false,false)}function H(){if(!w)return console.warn("[License] No license key provided"),false;if(!S)return console.warn("[License] License is not valid"),false;let t=C(w);return S=t.valid,S||console.error("[License] License expired or invalid:",t.error),S}function Z(){return w?C(w).data:null}var I=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(i){if(!H())throw console.error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=i,this.quill)return this.quill;let n=document.getElementById("textInnerEditor");if(n)this.quill=this.app_.editor.quill;else return n=document.createElement("div"),n.id="textInnerEditor",n.style.position="fixed",n.style.transformOrigin="left top",n.style.overflowWrap="break-word",n.style.wordBreak="break-all",n.style.visibility="hidden",document.body.appendChild(n),this.quill=new b__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:e=>{let[o]=this.quill.getLine(e.index),r=b__default.default.import("blots/block");if(!r?.bubbleFormats)return true;let a=r.bubbleFormats(o),l=new b.Delta().retain(e.index).delete(e.length).insert(`
3
+ `,a);return this.quill.updateContents(l,b__default.default.sources.USER),this.quill.setSelection(e.index+1,b__default.default.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let i=b__default.default.import("attributors/class/font");i.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],b__default.default.register(i,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(i,n=0,e){let{editor:o}=this.app_,r=e||o.leafList.list,a=l=>{n&&(l.tag==="Box"||l.name==="Text")?i(l.children?.[0]||l):i(l);};r.length&&(Array.isArray(r)&&r.length>1?(this.app_.lockLayout(),r.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(r[0]));}},f=I.getInstance();exports.HtmlText=class M extends core.Box{get __tag(){return "HtmlText"}constructor(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:r,letterSpacing:a,textShadow:l,alignContent:s,...d}=i||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...d}),i&&this.createTextElement(i);}createTextElement(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:r,letterSpacing:a,textShadow:l,alignContent:s}=i,d=`<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style><div style="overflow-wrap:break-word;word-break:break-all;"><p style="font-size: 50px; line-height: 1.5; letter-spacing: 0px; text-shadow: none;"><strong>Hello World</strong></p></div>`,c=new html.HTMLText({name:"Text",text:d+(n||""),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:o||void 0,fontSize:e||20,lineHeight:r||1.5,letterSpacing:a||0,textShadow:l,alignContent:s||"start"}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(c);}};exports.HtmlText=y([core.registerUI()],exports.HtmlText);console.log("start");exports.checkLicense=H;exports.getLicenseInfo=Z;exports.htmlTextManage=f;exports.setHTMLText=lt;exports.setLicense=V;exports.updataHtmlText=p;//# sourceMappingURL=index.cjs.map
4
4
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.cjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1>&nbsp;</p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'your-secret-key-change-this-2025'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
1
+ {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts","../src/index.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","firstFont","fontSimpleName","obj","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily;\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.name?.replace(/\\s+/g, \"\")} {font-family: ${fontObj.value};}`;\n e.text =\n style +\n addStyle +\n \"</style>\" +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n \"</style>\" +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(\",\")[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.name} {font-family: ${fontObj.value};}</style>`;\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n console.log(style);\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n }\n};\nconst addFontSizeToP = (\n e: any,\n html: any,\n fontSize = 16,\n lineHeight = \"1.5\",\n letterSpacing = \"0\",\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = JSON.parse(localStorage.getItem(\"selection-change\") || \"{}\");\n\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n const firstFont = value.split(\",\");\n let fontSimpleName = firstFont[0].replace(/\\s+|\"|'/g, \"\");\n const obj = {\n code: firstFont[0].replace(/\"|'/g, \"\"),\n name: fontSimpleName,\n value: value\n }\n console.log(obj, \"obj\");\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, obj ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, obj ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize?: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style><div style=\"overflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: 50px; line-height: 1.5; letter-spacing: 0px; text-shadow: none;\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || \"\"),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily || undefined,\n fontSize: fontSize || 20,\n lineHeight: lineHeight || 1.5,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent || \"start\",\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./HtmlTextManage\";\nexport * from \"./utils\"\nexport * from \"./HtmlText\";\n// 导出授权相关\nexport { setLicense, checkLicense, getLicenseInfo } from './license';\nexport type { LicenseData } from './license';\nconsole.log('start')\n"]}
package/dist/index.d.mts CHANGED
@@ -1,11 +1,13 @@
1
1
  import Quill from 'quill';
2
+ import { Box } from '@leafer-ui/core';
3
+ import { IBoxInputData } from '@leafer-ui/interface';
2
4
 
3
- declare class QuillManager {
5
+ declare class HtmlTextManage {
4
6
  private static instance;
5
7
  private quill;
6
8
  app_: any | null;
7
9
  private constructor();
8
- static getInstance(): QuillManager;
10
+ static getInstance(): HtmlTextManage;
9
11
  init(app: any): Promise<Quill | undefined>;
10
12
  getQuill(): Quill;
11
13
  getCanvas(): any;
@@ -13,7 +15,26 @@ declare class QuillManager {
13
15
  isMultiSelect(): boolean;
14
16
  dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
15
17
  }
16
- declare const quillManager: QuillManager;
18
+ declare const htmlTextManage: HtmlTextManage;
19
+
20
+ declare const updataHtmlText: (e?: any, base64font?: any, fontObj?: any) => Promise<void>;
21
+ declare const setHTMLText: (key: string, value?: any, base64font?: any) => void;
22
+
23
+ interface IHtmlTextContentData {
24
+ text?: string;
25
+ fontSize?: number;
26
+ fontFamily?: string;
27
+ lineHeight?: number;
28
+ letterSpacing?: number;
29
+ textShadow?: string;
30
+ alignContent?: string;
31
+ }
32
+ type IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;
33
+ declare class HtmlText extends Box {
34
+ get __tag(): string;
35
+ constructor(data?: IHtmlTextInputData);
36
+ private createTextElement;
37
+ }
17
38
 
18
39
  interface LicenseData {
19
40
  key: string;
@@ -37,4 +58,4 @@ declare function checkLicense(): boolean;
37
58
  */
38
59
  declare function getLicenseInfo(): LicenseData | null | undefined;
39
60
 
40
- export { type LicenseData, checkLicense, getLicenseInfo, quillManager, setLicense };
61
+ export { HtmlText, type LicenseData, checkLicense, getLicenseInfo, htmlTextManage, setHTMLText, setLicense, updataHtmlText };
package/dist/index.d.ts CHANGED
@@ -1,11 +1,13 @@
1
1
  import Quill from 'quill';
2
+ import { Box } from '@leafer-ui/core';
3
+ import { IBoxInputData } from '@leafer-ui/interface';
2
4
 
3
- declare class QuillManager {
5
+ declare class HtmlTextManage {
4
6
  private static instance;
5
7
  private quill;
6
8
  app_: any | null;
7
9
  private constructor();
8
- static getInstance(): QuillManager;
10
+ static getInstance(): HtmlTextManage;
9
11
  init(app: any): Promise<Quill | undefined>;
10
12
  getQuill(): Quill;
11
13
  getCanvas(): any;
@@ -13,7 +15,26 @@ declare class QuillManager {
13
15
  isMultiSelect(): boolean;
14
16
  dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
15
17
  }
16
- declare const quillManager: QuillManager;
18
+ declare const htmlTextManage: HtmlTextManage;
19
+
20
+ declare const updataHtmlText: (e?: any, base64font?: any, fontObj?: any) => Promise<void>;
21
+ declare const setHTMLText: (key: string, value?: any, base64font?: any) => void;
22
+
23
+ interface IHtmlTextContentData {
24
+ text?: string;
25
+ fontSize?: number;
26
+ fontFamily?: string;
27
+ lineHeight?: number;
28
+ letterSpacing?: number;
29
+ textShadow?: string;
30
+ alignContent?: string;
31
+ }
32
+ type IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;
33
+ declare class HtmlText extends Box {
34
+ get __tag(): string;
35
+ constructor(data?: IHtmlTextInputData);
36
+ private createTextElement;
37
+ }
17
38
 
18
39
  interface LicenseData {
19
40
  key: string;
@@ -37,4 +58,4 @@ declare function checkLicense(): boolean;
37
58
  */
38
59
  declare function getLicenseInfo(): LicenseData | null | undefined;
39
60
 
40
- export { type LicenseData, checkLicense, getLicenseInfo, quillManager, setLicense };
61
+ export { HtmlText, type LicenseData, checkLicense, getLicenseInfo, htmlTextManage, setHTMLText, setLicense, updataHtmlText };
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import y,{Delta}from'quill';import'quill/dist/quill.core.css';import I from'crypto-js';var v=(t,a,e,n)=>{for(var i=a,l=t.length-1,o;l>=0;l--)(o=t[l])&&(i=(o(i))||i);return i};var L=async(t,a,e)=>{let{scaleX:n,scaleY:i}=t.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontFamily&&(o.style.fontFamily=t.data.textData.fontFamily),o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*l}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let r=o.querySelector(".ql-editor");r.style.alignContent=t.data.textData.alignContent;}let s=p.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let r=t.text.split("</style>")[0];t.text=r+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,a,e=16,n="1.5",i="0",l="none",o="start")=>{let{scaleX:d,scaleY:s}=t.worldTransform,r=Math.max(Math.abs(d),Math.abs(s)),c=document.createElement("div");c.innerHTML=a;let g={fontSize:`${e}px`,lineHeight:n,letterSpacing:`${i}px`,textShadow:l};c.querySelectorAll("p,ol,ul").forEach(B=>{Object.assign(B.style,g);});let f=c.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let h;document.querySelector("#textInnerEditor");let b=p.getQuill(),u=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let w="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${f}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${f}</div>`:t.data.textData.italic?m=w+f:(console.log(u),m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};var D=class extends EditTool{constructor(e){super(e);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{L(n);},300);}get tag(){return "TextEditTool"}debounce(e,n){let i=null;return((...l)=>{i!==null&&window.clearTimeout(i),i=window.setTimeout(()=>e.apply(this,l),n);})}addEvent(){let{editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l)),d=document.querySelector("#textInnerEditor"),{style:s}=d;this.eventIds=[e.on_(EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(s.width=n.parent.width*o+"px",s.height="auto");let c=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(c=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*c),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),e.on_(PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||e.openInnerEditor(n,true);})];}onLoad(){let{editor:e}=p.getCanvas();console.log(e._target,123);let n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:s}=d;n.data.canChangeBox?(s.width=n.parent.width*o+"px",s.height=n.parent.height*o+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(e){e&&e.set({width:e.__layout.boxBounds.width,height:e.__layout.boxBounds.height});}onUpdate(){let {editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText");e._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:e}=p.getCanvas();e.off_(this.eventIds);}onDestroy(){}};D=v([registerEditTool()],D);var T=class extends InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async e=>{e&&localStorage.setItem("selection-change",JSON.stringify(e));};this.onInput=async()=>{let{editDom:e}=this;console.log("onInput"),L(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:e}=this,{config:n}=e.app,i=this.editTarget,{scaleX:l,scaleY:o}=i.worldTransform,d=Math.max(Math.abs(l),Math.abs(o));this.isHTMLText=!(i instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=s;if(r.visibility="visible",i.data.canChangeBox?(r.width=i.parent.width*d+"px",r.height=i.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",i.data.textData.fontSize&&(console.log(i.data.textData.fontSize),s.style.fontSize=`${i.data.textData.fontSize}px`),i.data.textData.fontFamily&&(s.style.fontFamily=`${i.data.textData.fontFamily}`),i.data.textData.lineHeight&&(s.style.lineHeight=i.data.textData.lineHeight),i.data.textData.letterSpacing&&(s.style.letterSpacing=`${i.data.textData.letterSpacing}px`),i.data.textData.textShadow?s.style.textShadow=`${i.data.textData.textShadow}`:s.style.textShadow="none",i.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${i.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(i.text),i.parent.children[0].tag.includes("Shape")?(r.width=i.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[e.app.on_(PointerEvent$1.DOWN,c=>{let{target:g}=c.origin,f=false;for(;g;)g===s&&(f=true),g=g.parentElement;f||(e.closeInnerEditor(),e.cancel());})];}onUpdate(){let{editTarget:e}=this,{scaleX:n,scaleY:i}=e.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),{width:o,height:d}=e.parent.__local;o*=l,d*=l;let{x:s,y:r}=this.inBody?e.app.clientBounds:e.app.tree.clientBounds,{a:c,b:g,c:f,d:h,e:N,f:b}=new Matrix(e.worldTransform).scale(1/l).translateInner(0,0),{style:u}=this.editDom;u.transform=`matrix(${c},${g},${f},${h},${N},${b})`,u.left=s+"px",u.top=r+"px",e.set({visible:false});}onUnload(){let{editTarget:e,editor:n,editDom:i}=this;e&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),e.parent&&e.parent.name=="Text"&&e.parent.children.some(l=>l.tag==="Box")?(e.parent.findOne("Box").opacity=1,e.visible=false):e.set({visible:true}),this.quill.getLength()===1&&e.parent.name==="Text"&&e.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};T=v([registerInnerEditor()],T);function C(t,{insertAt:a}={}){if(typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",a==="top"&&e.firstChild?e.insertBefore(n,e.firstChild):e.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
- `);var W="your-secret-key-change-this-2025";function $(t){try{return I.AES.decrypt(t,W).toString(I.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function X(t){try{let a=_(t);if(!a)return null;let e=$(a);return e?JSON.parse(e):null}catch{return null}}function Y(t){if(!t||t.length===0)return true;let a=window.location.hostname;return a==="localhost"||a==="127.0.0.1"?true:t.some(e=>{if(e.startsWith("*.")){let n=e.slice(2);return a.endsWith(n)}return a===e})}function k(t){if(!t)return true;try{let a=new Date(t);return new Date<a}catch{return false}}function M(t){let a=X(t);return a?Y(a.domains)?k(a.expireDate)?{valid:true,data:a}:{valid:false,error:"License has expired",data:a}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:a}:{valid:false,error:"Invalid license key"}}var S=null,x=false;function V(t){let a=M(t);return a.valid?(S=t,x=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",a.error),x=false,false)}function E(){if(!S)return console.warn("[License] No license key provided"),false;if(!x)return console.warn("[License] License is not valid"),false;let t=M(S);return x=t.valid,x||console.error("[License] License expired or invalid:",t.error),x}function Z(){return S?M(S).data:null}var H=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(a){if(!E())throw console.error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=a,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new y("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[i]=this.quill.getLine(n.index),l=y.import("blots/block");if(!l?.bubbleFormats)return true;let o=l.bubbleFormats(i),d=new Delta().retain(n.index).delete(n.length).insert(`
3
- `,o);return this.quill.updateContents(d,y.sources.USER),this.quill.setSelection(n.index+1,y.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let a=y.import("attributors/class/font");a.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],y.register(a,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(a,e=0,n){let{editor:i}=this.app_,l=n||i.leafList.list,o=d=>{e&&(d.tag==="Box"||d.name==="Text")?a(d.children?.[0]||d):a(d);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(o),this.app_.unlockLayout(),i.updateEditBox()):o(l[0]));}},p=H.getInstance();export{E as checkLicense,Z as getLicenseInfo,p as quillManager,V as setLicense};//# sourceMappingURL=index.mjs.map
1
+ import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {registerUI,Box,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import b,{Delta}from'quill';import'quill/dist/quill.core.css';import z from'crypto-js';import {HTMLText}from'@leafer-in/html';var y=(t,i,n,e)=>{for(var o=i,r=t.length-1,a;r>=0;r--)(a=t[r])&&(o=(a(o))||o);return o};var p=async(t,i,n)=>{let{scaleX:e,scaleY:o}=t.worldTransform,r=Math.max(Math.abs(e),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontFamily&&(a.style.fontFamily=t.data.textData.fontFamily),a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*r}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let s=f.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n.code)){let c=`@font-face {font-family: ${n.code};src: url(${i}) format('woff2') } .ql-font-${n?.name?.replace(/\s+/g,"")} {font-family: ${n.value};}`;t.text=d+c+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(i&&n){let d=`<style>@font-face {font-family: ${t.data.textData.fontFamily.split(",")[0]};src: url(${i}) format('woff2') } .ql-font-${n?.name} {font-family: ${n.value};}</style>`;t.text=d+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent),console.log(d);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,i,n=16,e="1.5",o="0",r="none",a="start")=>{let{scaleX:l,scaleY:s}=t.worldTransform,d=Math.max(Math.abs(l),Math.abs(s)),c=document.createElement("div");c.innerHTML=i;let g={fontSize:`${n}px`,lineHeight:e,letterSpacing:`${o}px`,textShadow:r};c.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let u=c.innerHTML;/<p\b[^>]*><\/p>/.test(u)&&(u=u.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let m;document.querySelector("#textInnerEditor");let T=f.getQuill(),h=Number((T.scroll.domNode.scrollHeight/d).toFixed(0));Number((T.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?m=(h||t.__layout.boxBounds.height)+"px":m=`${t.parent.height}px`:t.parent.height<h?m=(h||t.__layout.boxBounds.height)+"px":m=`${t.parent.height}px`;let D="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",x="";return t.parent.children[0].tag.includes("Shape")?x=D+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${u}</div>`:t.data.canChangeBox?x=D+`<div style="width: ${t.parent.width}px;height:${m};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${u}</div>`:t.data.textData.italic?x=D+u:x=D+`<div style="overflow-wrap:break-word;word-break:break-all;">${u}</div>`,console.log(x,"\u6700\u7EC8\u7684html\u5185\u5BB9"),x},lt=(t,i,n)=>{let e=f.getQuill(),{editor:o,canvas:r}=f.getCanvas();if(console.log(o,f.getCanvas(),"editor"),!e)return;let a=JSON.parse(localStorage.getItem("selection-change")||"{}");f.dateEdit(async l=>{if(t==="font"){let s=i.split(","),d=s[0].replace(/\s+|"|'/g,""),c={code:s[0].replace(/"|'/g,""),name:d,value:i};console.log(c,"obj"),o.innerEditing?(a&&a.length?e.formatText(a.index,a.length,t,d):e.formatText(0,e.getLength()-1,t,d),l.data.textData.fontFamily=i,p(l,n??null,c??null)):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,d),l.data.textData.fontFamily=i,p(l,n??null,c??null));}else if(t==="fontSize")l.data.textData[t]=i,f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),p(l,n??null);else if(t==="textCase"){if(o.innerEditing){let s=e.getText(a.index,a.length),d=e.getFormat(a.index,a.length);e.deleteText(a.index,a.length);let c;s===s.toUpperCase()&&/[A-Z]/.test(s)?c=s.toLowerCase():(s===s.toLowerCase()&&/[a-z]/.test(s),c=s.toUpperCase()),e.insertText(a.index,c,d),a&&o.innerEditing&&e.setSelection(a.index,a.length);}}else if(t==="script"){let s="sub";i==="super"&&(s="sup"),o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,e.getFormat(a).script===i?false:s):e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:s):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:s),p(l));}else if(t==="align")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing?e.format(t,i):e.formatLine(0,e.getLength(),t,i),p(l);else if(t==="alignContent")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="lineHeight"||t==="letterSpacing")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="color")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.tag==="HTMLText"?p(l):l.parent.findOne("HTMLText")&&p(l.parent.findOne("HTMLText"));else if(t==="textShadow")f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,p(l);else if(t==="list"){if(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing){let[s]=e.getLine(a?.index||0);s.formats().list?e.format(t,false):e.format(t,i);}else {let[s]=e.getLine(a?.index||0);s.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,i);}p(l);}else o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,i===void 0?!e.getFormat(a)[t]:i):e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i):(f.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i),p(l));},1);};var v=class extends EditTool{constructor(n){super(n);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{p(e);},300);}get tag(){return "TextEditTool"}debounce(n,e){let o=null;return((...r)=>{o!==null&&window.clearTimeout(o),o=window.setTimeout(()=>n.apply(this,r),e);})}addEvent(){let{editor:n}=f.getCanvas(),e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:r}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(r)),l=document.querySelector("#textInnerEditor"),{style:s}=l;this.eventIds=[n.on_(EditorScaleEvent.SCALE,d=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(s.width=e.parent.width*a+"px",s.height="auto");let c=1;e.parent.tag==="Box"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(c=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*c),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),n.on_(PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||n.openInnerEditor(e,true);})];}onLoad(){let{editor:n}=f.getCanvas();console.log(n._target,123);let e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:r}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(r));this.addEvent(),this.quill=f.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:s}=l;e.data.canChangeBox?(s.width=e.parent.width*a+"px",s.height=e.parent.height*a+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(n){n&&n.set({width:n.__layout.boxBounds.width,height:n.__layout.boxBounds.height});}onUpdate(){let {editor:n}=f.getCanvas(),e=n._target.findOne("HTMLText");n._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:n}=f.getCanvas();n.off_(this.eventIds);}onDestroy(){}};v=y([registerEditTool()],v);var L=class extends InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.onSelectionChange=async n=>{n&&localStorage.setItem("selection-change",JSON.stringify(n));};this.onInput=async()=>{let{editDom:n}=this;console.log("onInput"),p(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:n}=this,{config:e}=n.app,o=this.editTarget,{scaleX:r,scaleY:a}=o.worldTransform,l=Math.max(Math.abs(r),Math.abs(a));this.isHTMLText=!(o instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:d}=s;if(d.visibility="visible",o.data.canChangeBox?(d.width=o.parent.width*l+"px",d.height=o.parent.height*l+"px"):(d.width="auto",d.height="auto"),d.outline="solid #8499EF",o.data.textData.fontSize&&(s.style.fontSize=`${o.data.textData.fontSize*l}px`),o.data.textData.fontFamily&&(s.style.fontFamily=`${o.data.textData.fontFamily}`),o.data.textData.lineHeight&&(s.style.lineHeight=o.data.textData.lineHeight),o.data.textData.letterSpacing&&(s.style.letterSpacing=`${o.data.textData.letterSpacing}px`),o.data.textData.textShadow?s.style.textShadow=`${o.data.textData.textShadow}`:s.style.textShadow="none",o.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${o.data.textData.alignContent}`;}this.quill=f.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(o.text),o.parent.children[0].tag.includes("Shape")?(d.width=o.parent.width*l+"px",d.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[n.app.on_(PointerEvent$1.DOWN,c=>{let{target:g}=c.origin,u=false;for(;g;)g===s&&(u=true),g=g.parentElement;u||(n.closeInnerEditor(),n.cancel());})];}onUpdate(){let{editTarget:n}=this,{scaleX:e,scaleY:o}=n.worldTransform,r=Math.max(Math.abs(e),Math.abs(o)),{width:a,height:l}=n.parent.__local;a*=r,l*=r;let{x:s,y:d}=this.inBody?n.app.clientBounds:n.app.tree.clientBounds,{a:c,b:g,c:u,d:m,e:N,f:T}=new Matrix(n.worldTransform).scale(1/r).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${c},${g},${u},${m},${N},${T})`,h.left=s+"px",h.top=d+"px",n.set({visible:false});}onUnload(){let{editTarget:n,editor:e,editDom:o}=this;n&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),n.parent&&n.parent.name=="Text"&&n.parent.children.some(r=>r.tag==="Box")?(n.parent.findOne("Box").opacity=1,n.visible=false):n.set({visible:true}),this.quill.getLength()===1&&n.parent.name==="Text"&&n.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};L=y([registerInnerEditor()],L);function E(t,{insertAt:i}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",i==="top"&&n.firstChild?n.insertBefore(e,n.firstChild):n.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}E(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
+ `);var X="chenyuming-license-key";function B(t){try{return z.AES.decrypt(t,X).toString(z.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function Y(t){try{let i=_(t);if(!i)return null;let n=B(i);return n?JSON.parse(n):null}catch{return null}}function k(t){if(!t||t.length===0)return true;let i=window.location.hostname;return i==="localhost"||i==="127.0.0.1"?true:t.some(n=>{if(n.startsWith("*.")){let e=n.slice(2);return i.endsWith(e)}return i===n})}function j(t){if(!t)return true;try{let i=new Date(t);return new Date<i}catch{return false}}function C(t){let i=Y(t);return i?k(i.domains)?j(i.expireDate)?{valid:true,data:i}:{valid:false,error:"License has expired",data:i}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:i}:{valid:false,error:"Invalid license key"}}var w=null,S=false;function V(t){let i=C(t);return i.valid?(w=t,S=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",i.error),S=false,false)}function H(){if(!w)return console.warn("[License] No license key provided"),false;if(!S)return console.warn("[License] License is not valid"),false;let t=C(w);return S=t.valid,S||console.error("[License] License expired or invalid:",t.error),S}function Z(){return w?C(w).data:null}var I=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(i){if(!H())throw console.error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=i,this.quill)return this.quill;let n=document.getElementById("textInnerEditor");if(n)this.quill=this.app_.editor.quill;else return n=document.createElement("div"),n.id="textInnerEditor",n.style.position="fixed",n.style.transformOrigin="left top",n.style.overflowWrap="break-word",n.style.wordBreak="break-all",n.style.visibility="hidden",document.body.appendChild(n),this.quill=new b("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:e=>{let[o]=this.quill.getLine(e.index),r=b.import("blots/block");if(!r?.bubbleFormats)return true;let a=r.bubbleFormats(o),l=new Delta().retain(e.index).delete(e.length).insert(`
3
+ `,a);return this.quill.updateContents(l,b.sources.USER),this.quill.setSelection(e.index+1,b.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let i=b.import("attributors/class/font");i.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],b.register(i,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(i,n=0,e){let{editor:o}=this.app_,r=e||o.leafList.list,a=l=>{n&&(l.tag==="Box"||l.name==="Text")?i(l.children?.[0]||l):i(l);};r.length&&(Array.isArray(r)&&r.length>1?(this.app_.lockLayout(),r.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(r[0]));}},f=I.getInstance();var M=class extends Box{get __tag(){return "HtmlText"}constructor(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:r,letterSpacing:a,textShadow:l,alignContent:s,...d}=i||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...d}),i&&this.createTextElement(i);}createTextElement(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:r,letterSpacing:a,textShadow:l,alignContent:s}=i,d=`<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style><div style="overflow-wrap:break-word;word-break:break-all;"><p style="font-size: 50px; line-height: 1.5; letter-spacing: 0px; text-shadow: none;"><strong>Hello World</strong></p></div>`,c=new HTMLText({name:"Text",text:d+(n||""),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:o||void 0,fontSize:e||20,lineHeight:r||1.5,letterSpacing:a||0,textShadow:l,alignContent:s||"start"}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(c);}};M=y([registerUI()],M);console.log("start");export{M as HtmlText,H as checkLicense,Z as getLicenseInfo,f as htmlTextManage,lt as setHTMLText,V as setLicense,p as updataHtmlText};//# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.mjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1>&nbsp;</p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'your-secret-key-change-this-2025'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
1
+ {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts","../src/index.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","firstFont","fontSimpleName","obj","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily;\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.name?.replace(/\\s+/g, \"\")} {font-family: ${fontObj.value};}`;\n e.text =\n style +\n addStyle +\n \"</style>\" +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n \"</style>\" +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(\",\")[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.name} {font-family: ${fontObj.value};}</style>`;\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n console.log(style);\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent,\n );\n }\n};\nconst addFontSizeToP = (\n e: any,\n html: any,\n fontSize = 16,\n lineHeight = \"1.5\",\n letterSpacing = \"0\",\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = JSON.parse(localStorage.getItem(\"selection-change\") || \"{}\");\n\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n const firstFont = value.split(\",\");\n let fontSimpleName = firstFont[0].replace(/\\s+|\"|'/g, \"\");\n const obj = {\n code: firstFont[0].replace(/\"|'/g, \"\"),\n name: fontSimpleName,\n value: value\n }\n console.log(obj, \"obj\");\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, obj ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, obj ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize?: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style><div style=\"overflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: 50px; line-height: 1.5; letter-spacing: 0px; text-shadow: none;\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || \"\"),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily || undefined,\n fontSize: fontSize || 20,\n lineHeight: lineHeight || 1.5,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent || \"start\",\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./HtmlTextManage\";\nexport * from \"./utils\"\nexport * from \"./HtmlText\";\n// 导出授权相关\nexport { setLicense, checkLicense, getLicenseInfo } from './license';\nexport type { LicenseData } from './license';\nconsole.log('start')\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@chenyomi/leafer-htmltext-edit",
3
- "version": "1.0.0",
4
- "description": "A text editor plugin for Leafer UI with HTML text support and Quill integration",
3
+ "version": "2.0.2",
4
+ "description": "A text editor plugin for Leafer UI with HTML text support",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
@@ -23,36 +23,35 @@
23
23
  "leafer",
24
24
  "leafer-ui",
25
25
  "text-editor",
26
- "quill",
27
- "html-text",
28
- "wysiwyg",
29
- "rich-text"
26
+ "quill"
30
27
  ],
31
28
  "author": "chenyomi",
32
29
  "license": "MIT",
33
30
  "repository": {
34
31
  "type": "git",
35
- "url": "https://github.com/yourusername/leafer-htmltext-editor.git"
32
+ "url": "https://github.com/chenyomi/leafer-htmltext-edit.git"
36
33
  },
37
34
  "bugs": {
38
- "url": "https://github.com/yourusername/leafer-htmltext-editor/issues"
39
- },
40
- "homepage": "https://github.com/yourusername/leafer-htmltext-editor#readme",
41
- "peerDependencies": {
42
- "@leafer-in/editor": ">=1.0.0",
43
- "@leafer-in/html": ">=1.0.0",
44
- "@leafer-ui/core": ">=1.0.0",
45
- "leafer-ui": ">=1.0.0",
46
- "quill": ">=2.0.0"
35
+ "url": "https://github.com/chenyomi/leafer-htmltext-edit/issues"
47
36
  },
37
+ "homepage": "https://github.com/chenyomi/leafer-htmltext-edit#readme",
48
38
  "devDependencies": {
49
39
  "@types/crypto-js": "^4.2.2",
50
40
  "@types/lodash": "^4.17.23",
51
41
  "@types/node": "^20.0.0",
52
- "rimraf": "^5.0.0",
53
42
  "tsup": "^8.0.0",
54
43
  "typescript": "^5.0.0"
55
44
  },
45
+ "peerDependencies": {
46
+ "@leafer-in/editor": "^2.0.0",
47
+ "@leafer-in/html": "^2.0.0",
48
+ "@leafer-ui/core": "^2.0.0",
49
+ "leafer-ui": "^2.0.0",
50
+ "quill": "^2.0.0"
51
+ },
52
+ "dependencies": {
53
+ "crypto-js": "^4.2.0"
54
+ },
56
55
  "files": [
57
56
  "dist",
58
57
  "README.md",
@@ -60,8 +59,5 @@
60
59
  ],
61
60
  "publishConfig": {
62
61
  "access": "public"
63
- },
64
- "dependencies": {
65
- "crypto-js": "^4.2.0"
66
62
  }
67
- }
63
+ }