@chenyomi/leafer-htmltext-edit 1.0.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 chenyomi
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,454 @@
1
+ # Leafer HTMLText Editor
2
+
3
+ <p align="center">
4
+ <img src="https://img.shields.io/npm/v/@chenyomi/leafer-htmltext-edit.svg" alt="npm version">
5
+ <img src="https://img.shields.io/npm/dm/@chenyomi/leafer-htmltext-edit.svg" alt="npm downloads">
6
+ <img src="https://img.shields.io/npm/l/@chenyomi/leafer-htmltext-edit.svg" alt="license">
7
+ <img src="https://img.shields.io/badge/TypeScript-Ready-blue.svg" alt="TypeScript">
8
+ </p>
9
+
10
+ 一个强大的 Leafer UI 富文本编辑器插件,集成了 Quill 编辑器,支持 HTML 文本编辑和丰富的文本样式控制。
11
+
12
+ [English](./README_EN.md) | 简体中文
13
+
14
+ ## ✨ 特性
15
+
16
+ - 🎨 **富文本编辑** - 基于 Quill 2.0,支持完整的富文本编辑功能
17
+ - 🔤 **多语言字体** - 内置 20+ 种字体,支持中文、日文、韩文等多语言
18
+ - 📐 **文本样式** - 字体、大小、颜色、对齐、行高、字间距等全面控制
19
+ - 📝 **格式化工具** - 加粗、斜体、下划线、删除线、上下标
20
+ - 📋 **列表支持** - 有序列表、无序列表
21
+ - 🎯 **完美集成** - 无缝集成到 Leafer UI 生态系统
22
+ - 📦 **轻量级** - 代码混淆压缩,体积小,加载快
23
+ - 🔧 **TypeScript** - 完整的类型定义支持
24
+ - 🚀 **现代化构建** - ESM + CJS 双格式,支持 Tree Shaking
25
+
26
+ ## 📦 安装
27
+
28
+ ```bash
29
+ npm install @chenyomi/leafer-htmltext-edit
30
+ ```
31
+
32
+ 或使用其他包管理器:
33
+
34
+ ```bash
35
+ # pnpm
36
+ pnpm add @chenyomi/leafer-htmltext-edit
37
+
38
+ # yarn
39
+ yarn add @chenyomi/leafer-htmltext-edit
40
+ ```
41
+
42
+ ### Peer Dependencies
43
+
44
+ 本插件需要以下依赖(请确保已安装):
45
+
46
+ ```bash
47
+ npm install leafer-ui @leafer-ui/core @leafer-in/editor @leafer-in/html quill
48
+ ```
49
+
50
+ ## 🚀 快速开始
51
+
52
+ ### 基本使用
53
+
54
+ ```typescript
55
+ import { App } from 'leafer-ui'
56
+ import { Editor } from '@leafer-in/editor'
57
+ import { quillManager } from '@chenyomi/leafer-htmltext-edit'
58
+
59
+ // 1. 创建 Leafer 应用
60
+ const app = new App({
61
+ view: window,
62
+ tree: {},
63
+ editor: {}
64
+ })
65
+
66
+ // 2. 初始化 Quill 编辑器
67
+ await quillManager.init(app)
68
+
69
+ // 3. 创建编辑器
70
+ const editor = new Editor({ app })
71
+
72
+ // 现在可以在画布上编辑文本了!
73
+ ```
74
+
75
+ ### 在 Vue 3 中使用
76
+
77
+ ```vue
78
+ <template>
79
+ <div ref="canvasRef" style="width: 100vw; height: 100vh;"></div>
80
+ </template>
81
+
82
+ <script setup lang="ts">
83
+ import { ref, onMounted } from 'vue'
84
+ import { App } from 'leafer-ui'
85
+ import { Editor } from '@leafer-in/editor'
86
+ import { quillManager } from '@chenyomi/leafer-htmltext-edit'
87
+
88
+ const canvasRef = ref<HTMLDivElement>()
89
+
90
+ onMounted(async () => {
91
+ const app = new App({
92
+ view: canvasRef.value,
93
+ tree: {},
94
+ editor: {}
95
+ })
96
+
97
+ await quillManager.init(app)
98
+ new Editor({ app })
99
+ })
100
+ </script>
101
+ ```
102
+
103
+ ### 在 React 中使用
104
+
105
+ ```tsx
106
+ import { useEffect, useRef } from 'react'
107
+ import { App } from 'leafer-ui'
108
+ import { Editor } from '@leafer-in/editor'
109
+ import { quillManager } from '@chenyomi/leafer-htmltext-edit'
110
+
111
+ function TextEditor() {
112
+ const canvasRef = useRef<HTMLDivElement>(null)
113
+
114
+ useEffect(() => {
115
+ if (!canvasRef.current) return
116
+
117
+ const app = new App({
118
+ view: canvasRef.current,
119
+ tree: {},
120
+ editor: {}
121
+ })
122
+
123
+ quillManager.init(app).then(() => {
124
+ new Editor({ app })
125
+ })
126
+ }, [])
127
+
128
+ return <div ref={canvasRef} style={{ width: '100vw', height: '100vh' }} />
129
+ }
130
+ ```
131
+
132
+ ## 📚 API 文档
133
+
134
+ ### QuillManager
135
+
136
+ 单例模式的 Quill 编辑器管理器。
137
+
138
+ #### 方法
139
+
140
+ ##### `init(app: any): Promise<Quill>`
141
+
142
+ 初始化 Quill 编辑器。
143
+
144
+ ```typescript
145
+ const quill = await quillManager.init(app)
146
+ ```
147
+
148
+ ##### `getQuill(): Quill`
149
+
150
+ 获取 Quill 实例。
151
+
152
+ ```typescript
153
+ const quill = quillManager.getQuill()
154
+ ```
155
+
156
+ ##### `getCanvas(): any`
157
+
158
+ 获取 Leafer App 实例。
159
+
160
+ ```typescript
161
+ const app = quillManager.getCanvas()
162
+ ```
163
+
164
+ ##### `isMultiSelect(): boolean`
165
+
166
+ 判断是否为多选状态。
167
+
168
+ ```typescript
169
+ if (quillManager.isMultiSelect()) {
170
+ console.log('Multiple objects selected')
171
+ }
172
+ ```
173
+
174
+ ##### `dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void`
175
+
176
+ 批量编辑选中的对象。
177
+
178
+ ```typescript
179
+ quillManager.dateEdit((leaf) => {
180
+ leaf.fontSize = 20
181
+ leaf.fill = '#ff0000'
182
+ })
183
+ ```
184
+
185
+ ### TextEditor
186
+
187
+ 文本编辑器类,继承自 `InnerEditor`。
188
+
189
+ ```typescript
190
+ import { TextEditor } from '@chenyomi/leafer-htmltext-edit'
191
+
192
+ // TextEditor 会自动注册到 Leafer Editor 中
193
+ // 无需手动实例化
194
+ ```
195
+
196
+ ### TextEditTool
197
+
198
+ 文本编辑工具类。
199
+
200
+ ```typescript
201
+ import { TextEditTool } from '@chenyomi/leafer-htmltext-edit'
202
+
203
+ // 使用编辑工具
204
+ const tool = new TextEditTool()
205
+ ```
206
+
207
+ ## 🎨 使用示例
208
+
209
+ ### 设置文本样式
210
+
211
+ ```typescript
212
+ import { quillManager } from '@chenyomi/leafer-htmltext-edit'
213
+
214
+ // 获取 Quill 实例
215
+ const quill = quillManager.getQuill()
216
+
217
+ // 设置字体大小
218
+ quillManager.dateEdit((leaf) => {
219
+ leaf.fontSize = 24
220
+ })
221
+
222
+ // 设置字体
223
+ quillManager.dateEdit((leaf) => {
224
+ leaf.fontFamily = 'Roboto'
225
+ })
226
+
227
+ // 设置颜色
228
+ quillManager.dateEdit((leaf) => {
229
+ leaf.fill = '#ff0000'
230
+ })
231
+
232
+ // 设置对齐方式
233
+ quillManager.dateEdit((leaf) => {
234
+ leaf.textAlign = 'center' // 'left' | 'center' | 'right' | 'justify'
235
+ })
236
+ ```
237
+
238
+ ### 批量编辑多个对象
239
+
240
+ ```typescript
241
+ // 当选中多个文本对象时
242
+ if (quillManager.isMultiSelect()) {
243
+ quillManager.dateEdit((leaf) => {
244
+ leaf.fontSize = 18
245
+ leaf.fontFamily = 'Inter'
246
+ leaf.fill = '#333333'
247
+ })
248
+ }
249
+ ```
250
+
251
+ ### 监听文本变化
252
+
253
+ ```typescript
254
+ const quill = quillManager.getQuill()
255
+
256
+ quill.on('text-change', (delta, oldDelta, source) => {
257
+ console.log('Text changed:', delta)
258
+ })
259
+
260
+ quill.on('selection-change', (range, oldRange, source) => {
261
+ if (range) {
262
+ console.log('Selection:', range.index, range.length)
263
+ }
264
+ })
265
+ ```
266
+
267
+ ## 🔤 支持的字体
268
+
269
+ 插件内置以下字体支持:
270
+
271
+ ### 西文字体
272
+ - **Roboto** - Google 设计的现代无衬线字体
273
+ - **Roboto Mono** - 等宽字体
274
+ - **Inter** - 现代 UI 字体
275
+ - **Open Sans** - 清晰易读
276
+ - **Montserrat** - 几何无衬线
277
+ - **Lato** - 人文主义无衬线
278
+ - **Poppins** - 几何无衬线
279
+ - **Arimo** - 无衬线字体
280
+
281
+ ### 衬线字体
282
+ - **Merriweather** - 可读性强的衬线字体
283
+ - **Playfair Display** - 优雅的显示字体
284
+ - **Noto Serif** - Google Noto 衬线
285
+ - **Spectral** - 现代衬线字体
286
+
287
+ ### 手写字体
288
+ - **Dancing Script** - 手写风格
289
+
290
+ ### 中日韩字体
291
+ - **Noto Sans Simplified Chinese** - 思源黑体简体
292
+ - **Noto Serif Simplified Chinese** - 思源宋体简体
293
+ - **Noto Sans Traditional Chinese** - 思源黑体繁体
294
+ - **Noto Sans Hong Kong** - 思源黑体香港
295
+ - **Noto Serif Traditional Chinese** - 思源宋体繁体
296
+ - **Noto Serif Hong Kong** - 思源宋体香港
297
+ - **Noto Sans Japanese** - 思源黑体日文
298
+ - **Noto Sans Korean** - 思源黑体韩文
299
+
300
+ ## ⚙️ 高级配置
301
+
302
+ ### Vite 项目配置
303
+
304
+ 为了确保插件正常工作,建议在 Vite 配置中添加以下设置:
305
+
306
+ ```typescript
307
+ // vite.config.ts
308
+ import { defineConfig } from 'vite'
309
+
310
+ export default defineConfig({
311
+ resolve: {
312
+ // 确保使用项目的依赖实例
313
+ dedupe: [
314
+ '@leafer-ui/core',
315
+ '@leafer-in/editor',
316
+ '@leafer-in/html',
317
+ 'leafer-ui',
318
+ 'quill'
319
+ ]
320
+ },
321
+ optimizeDeps: {
322
+ // 排除插件的预构建
323
+ exclude: ['@chenyomi/leafer-htmltext-edit']
324
+ }
325
+ })
326
+ ```
327
+
328
+ ### 自定义样式
329
+
330
+ 如果需要自定义编辑器样式,可以覆盖 CSS 变量:
331
+
332
+ ```css
333
+ /* 覆盖编辑器样式 */
334
+ #textInnerEditor {
335
+ /* 自定义样式 */
336
+ }
337
+
338
+ /* Quill 编辑器样式 */
339
+ .ql-editor {
340
+ /* 自定义样式 */
341
+ }
342
+ ```
343
+
344
+ ## 🔧 开发
345
+
346
+ ### 克隆仓库
347
+
348
+ ```bash
349
+ git clone https://github.com/yourusername/leafer-htmltext-editor.git
350
+ cd leafer-htmltext-editor
351
+ ```
352
+
353
+ ### 安装依赖
354
+
355
+ ```bash
356
+ npm install
357
+ ```
358
+
359
+ ### 构建
360
+
361
+ ```bash
362
+ # 生产构建(混淆压缩)
363
+ npm run build
364
+
365
+ # 开发构建(不混淆)
366
+ npm run build:dev
367
+
368
+ # 监听模式
369
+ npm run build:watch
370
+ ```
371
+
372
+ ### 本地测试
373
+
374
+ ```bash
375
+ # 在插件目录
376
+ npm link
377
+
378
+ # 在你的项目目录
379
+ npm link @chenyomi/leafer-htmltext-edit
380
+ ```
381
+
382
+ ## 📝 常见问题
383
+
384
+ ### Q: 如何导入 CSS 样式?
385
+
386
+ A: 插件的 CSS 会自动注入,无需手动导入。如果遇到样式问题,可以手动导入 Quill CSS:
387
+
388
+ ```typescript
389
+ import 'quill/dist/quill.core.css'
390
+ ```
391
+
392
+ ### Q: 为什么编辑器不显示?
393
+
394
+ A: 请确保:
395
+ 1. 已正确安装所有 peer dependencies
396
+ 2. 调用了 `quillManager.init(app)`
397
+ 3. 创建了 `Editor` 实例
398
+ 4. Vite 配置中添加了 `dedupe` 设置
399
+
400
+ ### Q: 支持哪些浏览器?
401
+
402
+ A: 支持所有现代浏览器(Chrome, Firefox, Safari, Edge)。不支持 IE11。
403
+
404
+ ### Q: 如何自定义字体?
405
+
406
+ A: 可以通过修改 Quill 的字体配置:
407
+
408
+ ```typescript
409
+ const quill = quillManager.getQuill()
410
+ const Font = quill.constructor.import('attributors/class/font')
411
+ Font.whitelist = ['CustomFont1', 'CustomFont2']
412
+ quill.constructor.register(Font, true)
413
+ ```
414
+
415
+ ### Q: 文本编辑器的位置不对?
416
+
417
+ A: 这通常是由于画布缩放导致的。编辑器会自动处理缩放,如果仍有问题,请检查 CSS transform。
418
+
419
+ ## 🤝 贡献
420
+
421
+ 欢迎提交 Issue 和 Pull Request!
422
+
423
+ 1. Fork 本仓库
424
+ 2. 创建你的特性分支 (`git checkout -b feature/AmazingFeature`)
425
+ 3. 提交你的改动 (`git commit -m 'Add some AmazingFeature'`)
426
+ 4. 推送到分支 (`git push origin feature/AmazingFeature`)
427
+ 5. 开启一个 Pull Request
428
+
429
+ ## 📄 许可证
430
+
431
+ 本项目采用 [MIT](./LICENSE) 许可证。
432
+
433
+ ## 👤 作者
434
+
435
+ **chenyomi**
436
+
437
+ - GitHub: [@chenyomi](https://github.com/yourusername)
438
+ - npm: [@chenyomi](https://www.npmjs.com/~chenyomi)
439
+
440
+ ## 🙏 致谢
441
+
442
+ - [Leafer UI](https://www.leaferjs.com/) - 强大的 Canvas 渲染引擎
443
+ - [Quill](https://quilljs.com/) - 现代化的富文本编辑器
444
+ - [TypeScript](https://www.typescriptlang.org/) - JavaScript 的超集
445
+
446
+ ## 📊 统计
447
+
448
+ ![npm](https://img.shields.io/npm/v/@chenyomi/leafer-htmltext-edit)
449
+ ![npm bundle size](https://img.shields.io/bundlephobia/minzip/@chenyomi/leafer-htmltext-edit)
450
+ ![npm](https://img.shields.io/npm/dt/@chenyomi/leafer-htmltext-edit)
451
+
452
+ ---
453
+
454
+ 如果这个项目对你有帮助,请给个 ⭐️ Star!
package/dist/index.cjs ADDED
@@ -0,0 +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
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +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"]}
@@ -0,0 +1,40 @@
1
+ import Quill from 'quill';
2
+
3
+ declare class QuillManager {
4
+ private static instance;
5
+ private quill;
6
+ app_: any | null;
7
+ private constructor();
8
+ static getInstance(): QuillManager;
9
+ init(app: any): Promise<Quill | undefined>;
10
+ getQuill(): Quill;
11
+ getCanvas(): any;
12
+ private registerFonts;
13
+ isMultiSelect(): boolean;
14
+ dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
15
+ }
16
+ declare const quillManager: QuillManager;
17
+
18
+ interface LicenseData {
19
+ key: string;
20
+ domains?: string[];
21
+ expireDate?: string;
22
+ features?: string[];
23
+ userId?: string;
24
+ email?: string;
25
+ }
26
+
27
+ /**
28
+ * 设置 License
29
+ */
30
+ declare function setLicense(license: string): boolean;
31
+ /**
32
+ * 检查 License 是否有效
33
+ */
34
+ declare function checkLicense(): boolean;
35
+ /**
36
+ * 获取 License 信息
37
+ */
38
+ declare function getLicenseInfo(): LicenseData | null | undefined;
39
+
40
+ export { type LicenseData, checkLicense, getLicenseInfo, quillManager, setLicense };
@@ -0,0 +1,40 @@
1
+ import Quill from 'quill';
2
+
3
+ declare class QuillManager {
4
+ private static instance;
5
+ private quill;
6
+ app_: any | null;
7
+ private constructor();
8
+ static getInstance(): QuillManager;
9
+ init(app: any): Promise<Quill | undefined>;
10
+ getQuill(): Quill;
11
+ getCanvas(): any;
12
+ private registerFonts;
13
+ isMultiSelect(): boolean;
14
+ dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
15
+ }
16
+ declare const quillManager: QuillManager;
17
+
18
+ interface LicenseData {
19
+ key: string;
20
+ domains?: string[];
21
+ expireDate?: string;
22
+ features?: string[];
23
+ userId?: string;
24
+ email?: string;
25
+ }
26
+
27
+ /**
28
+ * 设置 License
29
+ */
30
+ declare function setLicense(license: string): boolean;
31
+ /**
32
+ * 检查 License 是否有效
33
+ */
34
+ declare function checkLicense(): boolean;
35
+ /**
36
+ * 获取 License 信息
37
+ */
38
+ declare function getLicenseInfo(): LicenseData | null | undefined;
39
+
40
+ export { type LicenseData, checkLicense, getLicenseInfo, quillManager, setLicense };
package/dist/index.mjs ADDED
@@ -0,0 +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
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
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",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "sideEffects": true,
16
+ "scripts": {
17
+ "build": "tsup",
18
+ "build:dev": "tsup --minify false",
19
+ "build:watch": "tsup --watch",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "leafer",
24
+ "leafer-ui",
25
+ "text-editor",
26
+ "quill",
27
+ "html-text",
28
+ "wysiwyg",
29
+ "rich-text"
30
+ ],
31
+ "author": "chenyomi",
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/yourusername/leafer-htmltext-editor.git"
36
+ },
37
+ "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"
47
+ },
48
+ "devDependencies": {
49
+ "@types/crypto-js": "^4.2.2",
50
+ "@types/lodash": "^4.17.23",
51
+ "@types/node": "^20.0.0",
52
+ "rimraf": "^5.0.0",
53
+ "tsup": "^8.0.0",
54
+ "typescript": "^5.0.0"
55
+ },
56
+ "files": [
57
+ "dist",
58
+ "README.md",
59
+ "LICENSE"
60
+ ],
61
+ "publishConfig": {
62
+ "access": "public"
63
+ },
64
+ "dependencies": {
65
+ "crypto-js": "^4.2.0"
66
+ }
67
+ }