@chenyomi/leafer-htmltext-edit 2.1.4 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -269,24 +269,6 @@ if (checkLicense()) {
269
269
  }
270
270
  ```
271
271
 
272
- **返回:** boolean - 授权是否有效
273
-
274
- #### `getLicenseInfo(): LicenseData | null`
275
-
276
- 获取授权信息。
277
-
278
- ```typescript
279
- import { getLicenseInfo } from "@chenyomi/leafer-htmltext-edit";
280
-
281
- const info = getLicenseInfo();
282
- if (info) {
283
- console.log("License holder:", info.name);
284
- console.log("Expires at:", info.expirationDate);
285
- }
286
- ```
287
-
288
- **返回:** LicenseData | null - 授权信息对象或 null
289
-
290
272
  ### HtmlText
291
273
 
292
274
  自定义的 HTML 文本类,扩展自 Leafer 的文本对象。
package/dist/index.cjs CHANGED
@@ -1,5 +1,5 @@
1
- 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),S=require('quill');require('quill/dist/quill.core.css');var font=require('quill/formats/font'),B=require('crypto-js'),html=require('@leafer-in/html');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var B__default=/*#__PURE__*/_interopDefault(B);var y=(t,i,n,e)=>{for(var o=i,s=t.length-1,a;s>=0;s--)(a=t[s])&&(o=(a(o))||o);return o};var u=async(t,i,n)=>{let{scaleX:e,scaleY:o}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*s}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let r=c.getQuill().getSemanticHTML();if(r==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n)){let p=`@font-face {font-family: ${n.split(",")[0]};src: url(${i}) format('woff2') }</style>`;t.text=d+p+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(i&&n){let d=`<style>@font-face {font-family: ${n.split(",")[0]};src: url(${i}) format('woff2') }</style>`;t.text=d+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},L=(t,i,n=20.67,e=1.5,o=0,s="none",a="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,d=Math.max(Math.abs(l),Math.abs(r)),p=document.createElement("div");p.innerHTML=i;let g={fontSize:`${n}px`,lineHeight:e,letterSpacing:`${o}px`,textShadow:s};p.querySelectorAll("p,ol,ul").forEach(P=>{Object.assign(P.style,g);});let f=p.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(f)&&(f=f.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let T=c.getQuill(),h=Number((T.scroll.domNode.scrollHeight/d).toFixed(0));Number((T.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`;let D="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=D+`<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=D+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${f}</div>`:t.data.textData.italic?m=D+f:m=D+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},rt=(t,i,n)=>{let e=c.getQuill(),{editor:o,canvas:s}=c.getCanvas();if(!e)return;let a=e.selection.savedRange;c.dateEdit(async l=>{if(t==="font")o.innerEditing?(a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.data.textData.fontFamily=i,u(l,n??null,i??null)):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i),l.data.textData.fontFamily=i,u(l,n??null,i??null));else if(t==="fontSize")l.data.textData[t]=i,c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),u(l,n??null);else if(t==="textCase"){if(o.innerEditing){let r=e.getText(a.index,a.length),d=e.getFormat(a.index,a.length);e.deleteText(a.index,a.length);let p;r===r.toUpperCase()&&/[A-Z]/.test(r)?p=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),p=r.toUpperCase()),e.insertText(a.index,p,d),a&&o.innerEditing&&e.setSelection(a.index,a.length);}}else if(t==="script"){let r="sub";i==="super"&&(r="sup"),o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,e.getFormat(a).script===i?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:r):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:r),u(l));}else if(t==="align")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing?e.format(t,i):e.formatLine(0,e.getLength(),t,i),u(l);else if(t==="alignContent")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="lineHeight"||t==="letterSpacing")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="color")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.tag==="HTMLText"?u(l):l.parent.findOne("HTMLText")&&u(l.parent.findOne("HTMLText"));else if(t==="textShadow")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="list"){if(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing){let[r]=e.getLine(a?.index||0);r.formats().list?e.format(t,false):e.format(t,i);}else {let[r]=e.getLine(a?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,i);}u(l);}else o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,i===void 0?!e.getFormat(a)[t]:i):e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i),u(l));},1);};var v=class extends editor.EditTool{constructor(n){super(n);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{u(e);},300);}get tag(){return "TextEditTool"}debounce(n,e){let o=null;return((...s)=>{o!==null&&window.clearTimeout(o),o=window.setTimeout(()=>n.apply(this,s),e);})}addEvent(){let{editor:n}=c.getCanvas(),e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:s}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[n.on_(editor.EditorScaleEvent.SCALE,d=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*a+"px",r.height="auto");let p=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(p=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*p),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),n.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||n.openInnerEditor(e,true);})];}onLoad(){let{editor:n}=c.getCanvas();console.log(n._target,123);let e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:s}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(s));this.addEvent(),this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*a+"px",r.height=e.parent.height*a+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(n){n&&n.set({width:n.__layout.boxBounds.width,height:n.__layout.boxBounds.height});}onUpdate(){let {editor:n}=c.getCanvas(),e=n._target.findOne("HTMLText");n._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:n}=c.getCanvas();n.off_(this.eventIds);}onDestroy(){}};v=y([editor.registerEditTool()],v);var q=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.onInput=async()=>{let{editDom:n}=this;u(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:n}=this,{config:e}=n.app,o=this.editTarget,{scaleX:s,scaleY:a}=o.worldTransform,l=Math.max(Math.abs(s),Math.abs(a));this.isHTMLText=!(o instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:d}=r;if(d.visibility="visible",o.data.canChangeBox?(d.width=o.parent.width*l+"px",d.height=o.parent.height*l+"px"):(d.width="auto",d.height="auto"),d.outline="solid #8499EF",o.data.textData.fontSize&&(r.style.fontSize=`${o.data.textData.fontSize*l}px`),o.data.textData.lineHeight&&(r.style.lineHeight=o.data.textData.lineHeight),o.data.textData.letterSpacing&&(r.style.letterSpacing=`${o.data.textData.letterSpacing}px`),o.data.textData.textShadow?r.style.textShadow=`${o.data.textData.textShadow}`:r.style.textShadow="none",o.data.textData.alignContent){let p=r.querySelector(".ql-editor");p.style.alignContent=`${o.data.textData.alignContent}`;}this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(o.text),o.parent.children[0].tag.includes("Shape")?(d.width=o.parent.width*l+"px",d.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.eventIds=[n.app.on_(core.PointerEvent.DOWN,p=>{let{target:g}=p.origin,f=false;for(;g;)g===r&&(f=true),g=g.parentElement;f||(n.closeInnerEditor(),n.cancel());})];}onUpdate(){let{editTarget:n}=this,{scaleX:e,scaleY:o}=n.worldTransform,s=Math.max(Math.abs(e),Math.abs(o)),{width:a,height:l}=n.parent.__local;a*=s,l*=s;let{x:r,y:d}=this.inBody?n.app.clientBounds:n.app.tree.clientBounds,{a:p,b:g,c:f,d:x,e:z,f:T}=new core.Matrix(n.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${p},${g},${f},${x},${z},${T})`,h.left=r+"px",h.top=d+"px",n.set({visible:false});}onUnload(){let{editTarget:n,editor:e,editDom:o}=this;n&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),n.parent&&n.parent.name=="Text"&&n.parent.children.some(s=>s.tag==="Box")?(n.parent.findOne("Box").opacity=1,n.visible=false):n.set({visible:true}),this.quill.getLength()===1&&n.parent.name==="Text"&&n.parent.remove(),this.quill.off("text-change",this.onInput);}};q=y([editor.registerInnerEditor()],q);function C(t,{insertAt:i}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",i==="top"&&n.firstChild?n.insertBefore(e,n.firstChild):n.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}
2
- `);var j="chenyuming-license-key";function _(t){try{return B__default.default.AES.decrypt(t,j).toString(B__default.default.enc.Utf8)}catch{return ""}}function $(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function J(t){try{let i=$(t);if(!i)return null;let n=_(i);return n?JSON.parse(n):null}catch{return null}}function K(t){if(!t||t.length===0)return true;let i=window.location.hostname;return i==="localhost"||i==="127.0.0.1"?true:t.some(n=>{if(n.startsWith("*.")){let e=n.slice(2);return i.endsWith(e)}return i===n})}function V(t){if(!t)return true;try{let i=new Date(t);return new Date<i}catch{return false}}function E(t){let i=J(t);return i?K(i.domains)?V(i.expireDate)?{valid:true,data:i}:{valid:false,error:"License has expired",data:i}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:i}:{valid:false,error:"Invalid license key"}}var w=null,b=false;function Z(t){let i=E(t);return i.valid?(w=t,b=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",i.error),b=false,false)}function H(){if(!w)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=E(w);return b=t.valid,b||console.error("[License] License expired or invalid:",t.error),b}function G(){return w?E(w).data:null}var I=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(i){if(!H())throw console.error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=i,this.quill)return this.quill;let n=document.getElementById("textInnerEditor");if(n)this.quill=this.app_.editor.quill;else return n=document.createElement("div"),n.id="textInnerEditor",n.style.position="fixed",n.style.transformOrigin="left top",n.style.overflowWrap="break-word",n.style.wordBreak="break-all",n.style.visibility="hidden",document.body.appendChild(n),this.quill=new S__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:e=>{let[o]=this.quill.getLine(e.index),s=S__default.default.import("blots/block");if(!s?.bubbleFormats)return true;let a=s.bubbleFormats(o),l=new S.Delta().retain(e.index).delete(e.length).insert(`
3
- `,a);return this.quill.updateContents(l,S__default.default.sources.USER),this.quill.setSelection(e.index+1,S__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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){font.FontStyle.whitelist=void 0,S__default.default.register("formats/font",font.FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(i,n=0,e){let{editor:o}=this.app_,s=e||o.leafList.list,a=l=>{n&&(l.tag==="Box"||l.name==="Text")?i(l.children?.[0]||l):i(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(s[0]));}},c=I.getInstance();exports.HtmlText=class M extends core.Box{get __tag(){return "HtmlText"}constructor(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:s,letterSpacing:a,textShadow:l,alignContent:r,...d}=i||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...d}),i&&this.createTextElement(i);}createTextElement(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:s,letterSpacing:a,textShadow:l,alignContent:r}=i,d="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",p=`<div style="ove
4
- rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${a}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new html.HTMLText({name:"Text",text:d+(n||p),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:o,fontSize:e,lineHeight:s,letterSpacing:a||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};exports.HtmlText=y([core.registerUI()],exports.HtmlText);console.log("start");exports.checkLicense=H;exports.getLicenseInfo=G;exports.htmlTextManage=c;exports.setHTMLText=rt;exports.setLicense=Z;exports.updataHtmlText=u;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),S=require('quill');require('quill/dist/quill.core.css');var font=require('quill/formats/font'),html=require('@leafer-in/html');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var y=(t,n,i,e)=>{for(var a=n,s=t.length-1,o;s>=0;s--)(o=t[s])&&(a=(o(a))||a);return a};var f=async(t,n,i)=>{let{scaleX:e,scaleY:a}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*s}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 c=o.querySelector(".ql-editor");c.style.alignContent=t.data.textData.alignContent;}let r=d.getQuill().getSemanticHTML();if(r==="<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 c=t.text.split("</style>")[0];if(i&&!c.includes(i)){let u=`@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+u+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=c+"</style>"+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(n&&i){let c=`<style>@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,n,i=20.67,e=1.5,a=0,s="none",o="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,c=Math.max(Math.abs(l),Math.abs(r)),u=document.createElement("div");u.innerHTML=n;let g={fontSize:`${i}px`,lineHeight:e,letterSpacing:`${a}px`,textShadow:s};u.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let L=d.getQuill(),h=Number((L.scroll.domNode.scrollHeight/c).toFixed(0));Number((L.scroll.domNode.scrollWidth/c).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${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;">${p}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${p}</div>`:t.data.textData.italic?m=w+p:m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},dt=(t,n,i)=>{let e=d.getQuill(),{editor:a,canvas:s}=d.getCanvas();if(!e)return;let o=e.selection.savedRange;d.dateEdit(async l=>{if(t==="font")a.innerEditing?(o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null)):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null));else if(t==="fontSize")l.data.textData[t]=n,d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),f(l,i??null);else if(t==="textCase"){if(a.innerEditing){let r=e.getText(o.index,o.length),c=e.getFormat(o.index,o.length);e.deleteText(o.index,o.length);let u;r===r.toUpperCase()&&/[A-Z]/.test(r)?u=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),u=r.toUpperCase()),e.insertText(o.index,u,c),o&&a.innerEditing&&e.setSelection(o.index,o.length);}}else if(t==="script"){let r="sub";n==="super"&&(r="sup"),a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,e.getFormat(o).script===n?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r),f(l));}else if(t==="align")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing?e.format(t,n):e.formatLine(0,e.getLength(),t,n),f(l);else if(t==="alignContent")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="lineHeight"||t==="letterSpacing")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="color")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.tag==="HTMLText"?f(l):l.parent.findOne("HTMLText")&&f(l.parent.findOne("HTMLText"));else if(t==="textShadow")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="list"){if(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing){let[r]=e.getLine(o?.index||0);r.formats().list?e.format(t,false):e.format(t,n);}else {let[r]=e.getLine(o?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,n);}f(l);}else a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,n===void 0?!e.getFormat(o)[t]:n):e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n),f(l));},1);};var v=class extends editor.EditTool{constructor(i){super(i);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(i,e){let a=null;return((...s)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>i.apply(this,s),e);})}addEvent(){let{editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[i.on_(editor.EditorScaleEvent.SCALE,c=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*o+"px",r.height="auto");let u=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(u=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*u),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),i.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||i.openInnerEditor(e,true);})];}onLoad(){let{editor:i}=d.getCanvas();console.log(i._target,123);let e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s));this.addEvent(),this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*o+"px",r.height=e.parent.height*o+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(i){i&&i.set({width:i.__layout.boxBounds.width,height:i.__layout.boxBounds.height});}onUpdate(){let {editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText");i._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:i}=d.getCanvas();i.off_(this.eventIds);}onDestroy(){}};v=y([editor.registerEditTool()],v);var D=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.onInput=async()=>{let{editDom:i}=this;f(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:i}=this,{config:e}=i.app,a=this.editTarget,{scaleX:s,scaleY:o}=a.worldTransform,l=Math.max(Math.abs(s),Math.abs(o));this.isHTMLText=!(a instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:c}=r;if(c.visibility="visible",a.data.canChangeBox?(c.width=a.parent.width*l+"px",c.height=a.parent.height*l+"px"):(c.width="auto",c.height="auto"),c.outline="solid #8499EF",a.data.textData.fontSize&&(r.style.fontSize=`${a.data.textData.fontSize*l}px`),a.data.textData.lineHeight&&(r.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(r.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?r.style.textShadow=`${a.data.textData.textShadow}`:r.style.textShadow="none",a.data.textData.alignContent){let u=r.querySelector(".ql-editor");u.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(c.width=a.parent.width*l+"px",c.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.eventIds=[i.app.on_(core.PointerEvent.DOWN,u=>{let{target:g}=u.origin,p=false;for(;g;)g===r&&(p=true),g=g.parentElement;p||(i.closeInnerEditor(),i.cancel());})];}onUpdate(){let{editTarget:i}=this,{scaleX:e,scaleY:a}=i.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),{width:o,height:l}=i.parent.__local;o*=s,l*=s;let{x:r,y:c}=this.inBody?i.app.clientBounds:i.app.tree.clientBounds,{a:u,b:g,c:p,d:x,e:U,f:L}=new core.Matrix(i.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${u},${g},${p},${x},${U},${L})`,h.left=r+"px",h.top=c+"px",i.set({visible:false});}onUnload(){let{editTarget:i,editor:e,editDom:a}=this;i&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),i.parent&&i.parent.name=="Text"&&i.parent.children.some(s=>s.tag==="Box")?(i.parent.findOne("Box").opacity=1,i.visible=false):i.set({visible:true}),this.quill.getLength()===1&&i.parent.name==="Text"&&i.parent.remove(),this.quill.off("text-change",this.onInput);}};D=y([editor.registerInnerEditor()],D);function C(t,{insertAt:n}={}){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",n==="top"&&i.firstChild?i.insertBefore(e,i.firstChild):i.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}
2
+ `);var F="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function O(t){let n=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return P(n)}function P(t){let n=atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n.charCodeAt(e);return i.buffer}async function J(){let t=atob(F),n=O(t);return await crypto.subtle.importKey("spki",n,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function z(t,n){try{let i=await J(),e=new TextEncoder().encode(t),a=P(n);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",i,a,e)}catch(i){return console.error("[RSA] Signature verification failed:",i),false}}async function j(t){try{let n=atob(t),i=JSON.parse(n);if(!i.data||!i.signature)return console.error("[License] Invalid license format"),null;if(!await z(i.data,i.signature))return console.error("[License] Invalid signature - License may be tampered or forged"),null;let a=JSON.parse(i.data);return console.log("[License] Signature verified successfully"),a}catch(n){return console.error("[License] Failed to parse license:",n),null}}function X(t){if(!t||t.length===0)return true;let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let i=t.some(e=>{if(e.startsWith("*.")){let a=e.slice(2);return n.endsWith(a)}return n===e});return i||(console.error(`[License] Domain not authorized: ${n}`),console.error("[License] Allowed domains:",t)),i}function G(t){if(!t)return true;try{let n=new Date(t),i=new Date;if(i>=n)return console.error(`[License] License has expired on ${t}`),!1;let e=Math.ceil((n.getTime()-i.getTime())/(1e3*60*60*24));return e<=7&&console.warn(`[License] License will expire in ${e} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function tt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function H(t){try{let n=await j(t);return n?tt(n.issueDate)?X(n.domains)?G(n.expireDate)?(console.log("[License] All validations passed"),console.log("[License] License info:",{key:n.key,domains:n.domains,expireDate:n.expireDate,features:n.features}),{valid:!0,data:n}):{valid:!1,error:"License has expired",data:n}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:n}:{valid:!1,error:"Invalid license issue date",data:n}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(n){return console.error("[License] Validation error:",n),{valid:false,error:"License validation failed"}}}var E=null,M=null,b=false;async function et(t){console.log("[License] Activating license...");let n=await H(t);return n.valid&&n.data?(E=t,M=n.data,b=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${n.data.expireDate||"unlimited"}`),true):(E=null,M=null,b=false,console.error("[License] \u274C License activation failed:",n.error),false)}async function I(){if(!E)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=await H(E);return b=t.valid,b||(console.error("[License] License validation failed:",t.error),M=null),b}function nt(){return M}var B=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(n){if(!await I())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=n,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 S__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:a=>{let[s]=this.quill.getLine(a.index),o=S__default.default.import("blots/block");if(!o?.bubbleFormats)return true;let l=o.bubbleFormats(s),r=new S.Delta().retain(a.index).delete(a.length).insert(`
3
+ `,l);return this.quill.updateContents(r,S__default.default.sources.USER),this.quill.setSelection(a.index+1,S__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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){font.FontStyle.whitelist=void 0,S__default.default.register("formats/font",font.FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(n,i=0,e){let{editor:a}=this.app_,s=e||a.leafList.list,o=l=>{i&&(l.tag==="Box"||l.name==="Text")?n(l.children?.[0]||l):n(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(o),this.app_.unlockLayout(),a.updateEditBox()):o(s[0]));}},d=B.getInstance();exports.HtmlText=class q extends core.Box{get __tag(){return "HtmlText"}constructor(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r,...c}=n||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...c}),n&&this.createTextElement(n);}createTextElement(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r}=n,c="<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>",u=`<div style="ove
4
+ rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${o}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new html.HTMLText({name:"Text",text:c+(i||u),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:a,fontSize:e,lineHeight:s,letterSpacing:o||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};exports.HtmlText=y([core.registerUI()],exports.HtmlText);exports.checkLicense=I;exports.getLicenseInfo=nt;exports.htmlTextManage=d;exports.setHTMLText=dt;exports.setLicense=et;exports.updataHtmlText=f;//# sourceMappingURL=index.cjs.map
5
5
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts","../src/index.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'HtmlText' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n // if (dom && e.data.textData?.fontFamily) {\n // dom.style.fontFamily = e.data.textData.fontFamily;\n // }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n // if (text.data.textData.fontFamily) {\n // div.style.fontFamily = `${text.data.textData.fontFamily}`;\n // }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(this.quill?.selection.savedRange, 'this.quill?.selection.savedRange')\n return this.quill?.selection.savedRange\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./HtmlTextManage\";\nexport * from \"./utils\"\nexport * from \"./HtmlText\";\n// 导出授权相关\nexport { setLicense, checkLicense, getLicenseInfo } from './license';\nexport type { LicenseData } from './license';\nconsole.log('start')\n"]}
1
+ {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/public-key.ts","../src/license/rsa-verify.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","PUBLIC_KEY_BASE64","pemToArrayBuffer","pem","base64","base64ToArrayBuffer","binaryString","bytes","i","importPublicKey","publicKeyPem","publicKeyBuffer","verifySignature","data","signature","publicKey","dataBuffer","signatureBuffer","error","parseLicense","license","decoded","licensePackage","validateDomain","allowedDomains","currentDomain","isValid","domain","baseDomain","validateExpireDate","expireDate","expire","now","daysRemaining","validateIssueDate","issueDate","validateLicense","licenseKey","licenseData","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'HtmlText' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n // if (dom && e.data.textData?.fontFamily) {\n // dom.style.fontFamily = e.data.textData.fontFamily;\n // }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n // if (text.data.textData.fontFamily) {\n // div.style.fontFamily = `${text.data.textData.fontFamily}`;\n // }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}\\n\")","/**\n * RSA 公钥 (自动生成)\n * 用于验证 License 签名\n * \n * 注意: 这个公钥是公开的,不需要保密\n */\n\nexport const PUBLIC_KEY_BASE64 = `LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==`;\n","/**\n * RSA 签名验证工具 (浏览器版本)\n * \n * 使用 Web Crypto API 验证 RSA-SHA256 签名\n */\n\nimport { PUBLIC_KEY_BASE64 } from './public-key';\n\n/**\n * 将 PEM 格式公钥转换为 ArrayBuffer\n */\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n // 移除 PEM 头尾和换行符\n const base64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n return base64ToArrayBuffer(base64);\n}\n\n/**\n * Base64 字符串转 ArrayBuffer\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n \n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n \n return bytes.buffer;\n}\n\n/**\n * 导入 RSA 公钥\n */\nasync function importPublicKey(): Promise<CryptoKey> {\n // 解码 Base64 公钥\n const publicKeyPem = atob(PUBLIC_KEY_BASE64);\n const publicKeyBuffer = pemToArrayBuffer(publicKeyPem);\n\n // 导入公钥\n const publicKey = await crypto.subtle.importKey(\n 'spki',\n publicKeyBuffer,\n {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n },\n false,\n ['verify']\n );\n\n return publicKey;\n}\n\n/**\n * 验证 RSA 签名\n * \n * @param data - 原始数据字符串\n * @param signature - Base64 编码的签名\n * @returns 签名是否有效\n */\nexport async function verifySignature(\n data: string,\n signature: string\n): Promise<boolean> {\n try {\n // 导入公钥\n const publicKey = await importPublicKey();\n\n // 准备数据\n const dataBuffer = new TextEncoder().encode(data);\n const signatureBuffer = base64ToArrayBuffer(signature);\n\n // 验证签名\n const isValid = await crypto.subtle.verify(\n 'RSASSA-PKCS1-v1_5',\n publicKey,\n signatureBuffer,\n dataBuffer\n );\n\n return isValid;\n } catch (error) {\n console.error('[RSA] Signature verification failed:', error);\n return false;\n }\n}\n\n/**\n * 测试 RSA 验证是否正常工作\n */\nexport async function testRSAVerification(): Promise<boolean> {\n try {\n // 尝试导入公钥\n await importPublicKey();\n console.log('[RSA] Public key loaded successfully');\n return true;\n } catch (error) {\n console.error('[RSA] Failed to load public key:', error);\n return false;\n }\n}","/**\n * License 验证器 V2 (RSA 签名版本)\n * \n * 主要改进:\n * 1. 使用 RSA 签名防止 License 伪造\n * 2. 保留原有的域名和过期时间验证\n * 3. 向后兼容旧版 License\n */\n\nimport { verifySignature } from './rsa-verify';\n\nexport interface LicenseData {\n key: string; // License Key (格式: XXXX-XXXX-XXXX-XXXX)\n domains?: string[]; // 允许的域名列表\n expireDate?: string; // 过期时间 YYYY-MM-DD\n issueDate?: string; // 签发时间 YYYY-MM-DD\n features?: string[]; // 功能列表\n userId?: string; // 用户ID\n email?: string; // 用户邮箱\n version?: string; // License 版本\n}\n\ninterface LicensePackage {\n data: string; // JSON 序列化的 LicenseData\n signature: string; // RSA 签名\n}\n\n/**\n * 解析 License\n */\nasync function parseLicense(license: string): Promise<LicenseData | null> {\n try {\n // 1. Base64 解码\n const decoded = atob(license);\n \n // 2. 解析 JSON\n const licensePackage: LicensePackage = JSON.parse(decoded);\n\n // 验证格式\n if (!licensePackage.data || !licensePackage.signature) {\n console.error('[License] Invalid license format');\n return null;\n }\n\n // 3. 验证 RSA 签名\n const signatureValid = await verifySignature(\n licensePackage.data,\n licensePackage.signature\n );\n\n if (!signatureValid) {\n console.error('[License] Invalid signature - License may be tampered or forged');\n return null;\n }\n\n // 4. 解析数据\n const data: LicenseData = JSON.parse(licensePackage.data);\n \n console.log('[License] Signature verified successfully');\n return data;\n\n } catch (error) {\n console.error('[License] Failed to parse license:', error);\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 console.log('[License] Local development environment detected');\n return true;\n }\n\n // 检查域名是否在允许列表中\n const isValid = 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 if (!isValid) {\n console.error(`[License] Domain not authorized: ${currentDomain}`);\n console.error(`[License] Allowed domains:`, allowedDomains);\n }\n\n return isValid;\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 \n if (now >= expire) {\n console.error(`[License] License has expired on ${expireDate}`);\n return false;\n }\n\n // 计算剩余天数\n const daysRemaining = Math.ceil((expire.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysRemaining <= 7) {\n console.warn(`[License] License will expire in ${daysRemaining} days`);\n }\n\n return true;\n } catch (error) {\n console.error('[License] Invalid expire date format:', expireDate);\n return false;\n }\n}\n\n/**\n * 验证签发时间(防止使用未来时间)\n */\nfunction validateIssueDate(issueDate?: string): boolean {\n if (!issueDate) return true;\n\n try {\n const issue = new Date(issueDate);\n const now = new Date();\n \n if (issue > now) {\n console.error('[License] License issue date is in the future');\n return false;\n }\n\n return true;\n } catch {\n return true; // 如果没有签发时间,跳过此检查\n }\n}\n\n/**\n * 验证 License (主函数)\n */\nexport async function validateLicense(license: string): Promise<{\n valid: boolean;\n error?: string;\n data?: LicenseData;\n}> {\n try {\n // 1. 解析 License 并验证签名\n const data = await parseLicense(license);\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key or signature verification failed'\n };\n }\n\n // 2. 验证签发时间\n if (!validateIssueDate(data.issueDate)) {\n return {\n valid: false,\n error: 'Invalid license issue date',\n data\n };\n }\n\n // 3. 验证域名\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 // 4. 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n };\n }\n\n // 5. 所有验证通过\n console.log('[License] All validations passed');\n console.log('[License] License info:', {\n key: data.key,\n domains: data.domains,\n expireDate: data.expireDate,\n features: data.features\n });\n\n return {\n valid: true,\n data\n };\n\n } catch (error) {\n console.error('[License] Validation error:', error);\n return {\n valid: false,\n error: 'License validation failed'\n };\n }\n}\n\n/**\n * 检查是否有特定功能权限\n */\nexport function hasFeature(data: LicenseData | null, feature: string): boolean {\n if (!data || !data.features) return false;\n return data.features.includes(feature);\n}","/**\n * License 管理器\n *\n * 提供统一的 License 管理接口\n */\n\nimport { validateLicense, hasFeature, type LicenseData } from \"./validator\";\n\n// 全局状态\nlet licenseKey: string | null = null;\nlet licenseData: LicenseData | null = null;\nlet isLicenseValid = false;\n\n/**\n * 设置 License\n *\n * @param license - License Key 字符串\n * @returns 是否激活成功\n */\nexport async function setLicense(license: string): Promise<boolean> {\n console.log(\"[License] Activating license...\");\n\n const result = await validateLicense(license);\n\n if (result.valid && result.data) {\n licenseKey = license;\n licenseData = result.data;\n isLicenseValid = true;\n\n console.log(\"[License] ✅ License activated successfully\");\n console.log(\n `[License] Valid until: ${result.data.expireDate || \"unlimited\"}`,\n );\n\n return true;\n } else {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n\n console.error(\"[License] ❌ License activation failed:\", result.error);\n\n return false;\n }\n}\n\n/**\n * 检查 License 是否有效\n *\n * @returns License 是否有效\n */\nexport async function checkLicense(): Promise<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 = await validateLicense(licenseKey);\n isLicenseValid = result.valid;\n\n if (!isLicenseValid) {\n console.error(\"[License] License validation failed:\", result.error);\n licenseData = null;\n }\n\n return isLicenseValid;\n}\n\n/**\n * 获取 License 信息\n *\n * @returns License 数据或 null\n */\nexport function getLicenseInfo(): LicenseData | null {\n return licenseData;\n}\n\n/**\n * 检查是否有特定功能权限\n *\n * @param feature - 功能名称\n * @returns 是否有权限\n */\nexport function checkFeature(feature: string): boolean {\n if (!isLicenseValid || !licenseData) {\n return false;\n }\n\n return hasFeature(licenseData, feature);\n}\n\n/**\n * 清除 License\n */\nexport function clearLicense(): void {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n console.log(\"[License] License cleared\");\n}\n\n/**\n * 获取 License 状态摘要\n */\nexport function getLicenseStatus(): {\n activated: boolean;\n key?: string;\n expireDate?: string;\n domains?: string[];\n features?: string[];\n} {\n if (!isLicenseValid || !licenseData) {\n return { activated: false };\n }\n\n return {\n activated: true,\n key: licenseData.key,\n expireDate: licenseData.expireDate,\n domains: licenseData.domains,\n features: licenseData.features,\n };\n}\n\nexport function assertLicenseValid(): void {\n // if (!isLicenseValid || !licenseData) {\n console.log(isLicenseValid)\n if (!isLicenseValid) {\n throw new Error(\n \"[Plugin] License validation failed. Plugin execution has been blocked. Please contact the plugin developer for assistance. Email: 408550179@qq.com\",\n );\n }\n}\n\n// 导出类型\nexport type { LicenseData } from \"./validator\";\n","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n const seccess = await checkLicense();\n if (!seccess) {\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(\n this.quill?.selection.savedRange,\n \"this.quill?.selection.savedRange\",\n );\n return this.quill?.selection.savedRange;\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n"]}
package/dist/index.d.mts CHANGED
@@ -38,26 +38,49 @@ declare class HtmlText extends Box {
38
38
  private createTextElement;
39
39
  }
40
40
 
41
+ /**
42
+ * License 验证器 V2 (RSA 签名版本)
43
+ *
44
+ * 主要改进:
45
+ * 1. 使用 RSA 签名防止 License 伪造
46
+ * 2. 保留原有的域名和过期时间验证
47
+ * 3. 向后兼容旧版 License
48
+ */
41
49
  interface LicenseData {
42
50
  key: string;
43
51
  domains?: string[];
44
52
  expireDate?: string;
53
+ issueDate?: string;
45
54
  features?: string[];
46
55
  userId?: string;
47
56
  email?: string;
57
+ version?: string;
48
58
  }
49
59
 
60
+ /**
61
+ * License 管理器
62
+ *
63
+ * 提供统一的 License 管理接口
64
+ */
65
+
50
66
  /**
51
67
  * 设置 License
68
+ *
69
+ * @param license - License Key 字符串
70
+ * @returns 是否激活成功
52
71
  */
53
- declare function setLicense(license: string): boolean;
72
+ declare function setLicense(license: string): Promise<boolean>;
54
73
  /**
55
74
  * 检查 License 是否有效
75
+ *
76
+ * @returns License 是否有效
56
77
  */
57
- declare function checkLicense(): boolean;
78
+ declare function checkLicense(): Promise<boolean>;
58
79
  /**
59
80
  * 获取 License 信息
81
+ *
82
+ * @returns License 数据或 null
60
83
  */
61
- declare function getLicenseInfo(): LicenseData | null | undefined;
84
+ declare function getLicenseInfo(): LicenseData | null;
62
85
 
63
86
  export { HtmlText, type LicenseData, checkLicense, getLicenseInfo, htmlTextManage, setHTMLText, setLicense, updataHtmlText };
package/dist/index.d.ts CHANGED
@@ -38,26 +38,49 @@ declare class HtmlText extends Box {
38
38
  private createTextElement;
39
39
  }
40
40
 
41
+ /**
42
+ * License 验证器 V2 (RSA 签名版本)
43
+ *
44
+ * 主要改进:
45
+ * 1. 使用 RSA 签名防止 License 伪造
46
+ * 2. 保留原有的域名和过期时间验证
47
+ * 3. 向后兼容旧版 License
48
+ */
41
49
  interface LicenseData {
42
50
  key: string;
43
51
  domains?: string[];
44
52
  expireDate?: string;
53
+ issueDate?: string;
45
54
  features?: string[];
46
55
  userId?: string;
47
56
  email?: string;
57
+ version?: string;
48
58
  }
49
59
 
60
+ /**
61
+ * License 管理器
62
+ *
63
+ * 提供统一的 License 管理接口
64
+ */
65
+
50
66
  /**
51
67
  * 设置 License
68
+ *
69
+ * @param license - License Key 字符串
70
+ * @returns 是否激活成功
52
71
  */
53
- declare function setLicense(license: string): boolean;
72
+ declare function setLicense(license: string): Promise<boolean>;
54
73
  /**
55
74
  * 检查 License 是否有效
75
+ *
76
+ * @returns License 是否有效
56
77
  */
57
- declare function checkLicense(): boolean;
78
+ declare function checkLicense(): Promise<boolean>;
58
79
  /**
59
80
  * 获取 License 信息
81
+ *
82
+ * @returns License 数据或 null
60
83
  */
61
- declare function getLicenseInfo(): LicenseData | null | undefined;
84
+ declare function getLicenseInfo(): LicenseData | null;
62
85
 
63
86
  export { HtmlText, type LicenseData, checkLicense, getLicenseInfo, htmlTextManage, setHTMLText, setLicense, updataHtmlText };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {registerUI,Box,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import S,{Delta}from'quill';import'quill/dist/quill.core.css';import {FontStyle}from'quill/formats/font';import B from'crypto-js';import {HTMLText}from'@leafer-in/html';var y=(t,i,n,e)=>{for(var o=i,s=t.length-1,a;s>=0;s--)(a=t[s])&&(o=(a(o))||o);return o};var u=async(t,i,n)=>{let{scaleX:e,scaleY:o}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*s}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let r=c.getQuill().getSemanticHTML();if(r==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n)){let p=`@font-face {font-family: ${n.split(",")[0]};src: url(${i}) format('woff2') }</style>`;t.text=d+p+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(i&&n){let d=`<style>@font-face {font-family: ${n.split(",")[0]};src: url(${i}) format('woff2') }</style>`;t.text=d+L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=L(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},L=(t,i,n=20.67,e=1.5,o=0,s="none",a="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,d=Math.max(Math.abs(l),Math.abs(r)),p=document.createElement("div");p.innerHTML=i;let g={fontSize:`${n}px`,lineHeight:e,letterSpacing:`${o}px`,textShadow:s};p.querySelectorAll("p,ol,ul").forEach(P=>{Object.assign(P.style,g);});let f=p.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(f)&&(f=f.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let T=c.getQuill(),h=Number((T.scroll.domNode.scrollHeight/d).toFixed(0));Number((T.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`;let D="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=D+`<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=D+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${f}</div>`:t.data.textData.italic?m=D+f:m=D+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},rt=(t,i,n)=>{let e=c.getQuill(),{editor:o,canvas:s}=c.getCanvas();if(!e)return;let a=e.selection.savedRange;c.dateEdit(async l=>{if(t==="font")o.innerEditing?(a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.data.textData.fontFamily=i,u(l,n??null,i??null)):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i),l.data.textData.fontFamily=i,u(l,n??null,i??null));else if(t==="fontSize")l.data.textData[t]=i,c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),u(l,n??null);else if(t==="textCase"){if(o.innerEditing){let r=e.getText(a.index,a.length),d=e.getFormat(a.index,a.length);e.deleteText(a.index,a.length);let p;r===r.toUpperCase()&&/[A-Z]/.test(r)?p=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),p=r.toUpperCase()),e.insertText(a.index,p,d),a&&o.innerEditing&&e.setSelection(a.index,a.length);}}else if(t==="script"){let r="sub";i==="super"&&(r="sup"),o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,e.getFormat(a).script===i?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:r):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===i?false:r),u(l));}else if(t==="align")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing?e.format(t,i):e.formatLine(0,e.getLength(),t,i),u(l);else if(t==="alignContent")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="lineHeight"||t==="letterSpacing")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="color")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a&&a.length?e.formatText(a.index,a.length,t,i):e.formatText(0,e.getLength()-1,t,i),l.tag==="HTMLText"?u(l):l.parent.findOne("HTMLText")&&u(l.parent.findOne("HTMLText"));else if(t==="textShadow")c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=i,u(l);else if(t==="list"){if(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o.innerEditing){let[r]=e.getLine(a?.index||0);r.formats().list?e.format(t,false):e.format(t,i);}else {let[r]=e.getLine(a?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,i);}u(l);}else o.innerEditing?a&&a.length?e.formatText(a.index,a.length,t,i===void 0?!e.getFormat(a)[t]:i):e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i):(c.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,i===void 0?!e.getFormat()[t]:i),u(l));},1);};var v=class extends EditTool{constructor(n){super(n);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{u(e);},300);}get tag(){return "TextEditTool"}debounce(n,e){let o=null;return((...s)=>{o!==null&&window.clearTimeout(o),o=window.setTimeout(()=>n.apply(this,s),e);})}addEvent(){let{editor:n}=c.getCanvas(),e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:s}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[n.on_(EditorScaleEvent.SCALE,d=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*a+"px",r.height="auto");let p=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(p=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*p),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),n.on_(PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||n.openInnerEditor(e,true);})];}onLoad(){let{editor:n}=c.getCanvas();console.log(n._target,123);let e=n._target.findOne("HTMLText"),{scaleX:o,scaleY:s}=e.worldTransform,a=Math.max(Math.abs(o),Math.abs(s));this.addEvent(),this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*a+"px",r.height=e.parent.height*a+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(n){n&&n.set({width:n.__layout.boxBounds.width,height:n.__layout.boxBounds.height});}onUpdate(){let {editor:n}=c.getCanvas(),e=n._target.findOne("HTMLText");n._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:n}=c.getCanvas();n.off_(this.eventIds);}onDestroy(){}};v=y([registerEditTool()],v);var q=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.onInput=async()=>{let{editDom:n}=this;u(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:n}=this,{config:e}=n.app,o=this.editTarget,{scaleX:s,scaleY:a}=o.worldTransform,l=Math.max(Math.abs(s),Math.abs(a));this.isHTMLText=!(o instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:d}=r;if(d.visibility="visible",o.data.canChangeBox?(d.width=o.parent.width*l+"px",d.height=o.parent.height*l+"px"):(d.width="auto",d.height="auto"),d.outline="solid #8499EF",o.data.textData.fontSize&&(r.style.fontSize=`${o.data.textData.fontSize*l}px`),o.data.textData.lineHeight&&(r.style.lineHeight=o.data.textData.lineHeight),o.data.textData.letterSpacing&&(r.style.letterSpacing=`${o.data.textData.letterSpacing}px`),o.data.textData.textShadow?r.style.textShadow=`${o.data.textData.textShadow}`:r.style.textShadow="none",o.data.textData.alignContent){let p=r.querySelector(".ql-editor");p.style.alignContent=`${o.data.textData.alignContent}`;}this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(o.text),o.parent.children[0].tag.includes("Shape")?(d.width=o.parent.width*l+"px",d.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.eventIds=[n.app.on_(PointerEvent$1.DOWN,p=>{let{target:g}=p.origin,f=false;for(;g;)g===r&&(f=true),g=g.parentElement;f||(n.closeInnerEditor(),n.cancel());})];}onUpdate(){let{editTarget:n}=this,{scaleX:e,scaleY:o}=n.worldTransform,s=Math.max(Math.abs(e),Math.abs(o)),{width:a,height:l}=n.parent.__local;a*=s,l*=s;let{x:r,y:d}=this.inBody?n.app.clientBounds:n.app.tree.clientBounds,{a:p,b:g,c:f,d:x,e:z,f:T}=new Matrix(n.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${p},${g},${f},${x},${z},${T})`,h.left=r+"px",h.top=d+"px",n.set({visible:false});}onUnload(){let{editTarget:n,editor:e,editDom:o}=this;n&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),n.parent&&n.parent.name=="Text"&&n.parent.children.some(s=>s.tag==="Box")?(n.parent.findOne("Box").opacity=1,n.visible=false):n.set({visible:true}),this.quill.getLength()===1&&n.parent.name==="Text"&&n.parent.remove(),this.quill.off("text-change",this.onInput);}};q=y([registerInnerEditor()],q);function C(t,{insertAt:i}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",i==="top"&&n.firstChild?n.insertBefore(e,n.firstChild):n.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}
2
- `);var j="chenyuming-license-key";function _(t){try{return B.AES.decrypt(t,j).toString(B.enc.Utf8)}catch{return ""}}function $(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function J(t){try{let i=$(t);if(!i)return null;let n=_(i);return n?JSON.parse(n):null}catch{return null}}function K(t){if(!t||t.length===0)return true;let i=window.location.hostname;return i==="localhost"||i==="127.0.0.1"?true:t.some(n=>{if(n.startsWith("*.")){let e=n.slice(2);return i.endsWith(e)}return i===n})}function V(t){if(!t)return true;try{let i=new Date(t);return new Date<i}catch{return false}}function E(t){let i=J(t);return i?K(i.domains)?V(i.expireDate)?{valid:true,data:i}:{valid:false,error:"License has expired",data:i}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:i}:{valid:false,error:"Invalid license key"}}var w=null,b=false;function Z(t){let i=E(t);return i.valid?(w=t,b=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",i.error),b=false,false)}function H(){if(!w)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=E(w);return b=t.valid,b||console.error("[License] License expired or invalid:",t.error),b}function G(){return w?E(w).data:null}var I=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(i){if(!H())throw console.error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=i,this.quill)return this.quill;let n=document.getElementById("textInnerEditor");if(n)this.quill=this.app_.editor.quill;else return n=document.createElement("div"),n.id="textInnerEditor",n.style.position="fixed",n.style.transformOrigin="left top",n.style.overflowWrap="break-word",n.style.wordBreak="break-all",n.style.visibility="hidden",document.body.appendChild(n),this.quill=new S("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:e=>{let[o]=this.quill.getLine(e.index),s=S.import("blots/block");if(!s?.bubbleFormats)return true;let a=s.bubbleFormats(o),l=new Delta().retain(e.index).delete(e.length).insert(`
3
- `,a);return this.quill.updateContents(l,S.sources.USER),this.quill.setSelection(e.index+1,S.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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){FontStyle.whitelist=void 0,S.register("formats/font",FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(i,n=0,e){let{editor:o}=this.app_,s=e||o.leafList.list,a=l=>{n&&(l.tag==="Box"||l.name==="Text")?i(l.children?.[0]||l):i(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(s[0]));}},c=I.getInstance();var M=class extends Box{get __tag(){return "HtmlText"}constructor(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:s,letterSpacing:a,textShadow:l,alignContent:r,...d}=i||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...d}),i&&this.createTextElement(i);}createTextElement(i){let{text:n,fontSize:e,fontFamily:o,lineHeight:s,letterSpacing:a,textShadow:l,alignContent:r}=i,d="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",p=`<div style="ove
4
- rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${a}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new HTMLText({name:"Text",text:d+(n||p),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:o,fontSize:e,lineHeight:s,letterSpacing:a||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};M=y([registerUI()],M);console.log("start");export{M as HtmlText,H as checkLicense,G as getLicenseInfo,c as htmlTextManage,rt as setHTMLText,Z as setLicense,u as updataHtmlText};//# sourceMappingURL=index.mjs.map
1
+ import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {registerUI,Box,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import S,{Delta}from'quill';import'quill/dist/quill.core.css';import {FontStyle}from'quill/formats/font';import {HTMLText}from'@leafer-in/html';var y=(t,n,i,e)=>{for(var a=n,s=t.length-1,o;s>=0;s--)(o=t[s])&&(a=(o(a))||a);return a};var f=async(t,n,i)=>{let{scaleX:e,scaleY:a}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*s}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 c=o.querySelector(".ql-editor");c.style.alignContent=t.data.textData.alignContent;}let r=d.getQuill().getSemanticHTML();if(r==="<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 c=t.text.split("</style>")[0];if(i&&!c.includes(i)){let u=`@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+u+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=c+"</style>"+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(n&&i){let c=`<style>@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,n,i=20.67,e=1.5,a=0,s="none",o="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,c=Math.max(Math.abs(l),Math.abs(r)),u=document.createElement("div");u.innerHTML=n;let g={fontSize:`${i}px`,lineHeight:e,letterSpacing:`${a}px`,textShadow:s};u.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let L=d.getQuill(),h=Number((L.scroll.domNode.scrollHeight/c).toFixed(0));Number((L.scroll.domNode.scrollWidth/c).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${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;">${p}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${p}</div>`:t.data.textData.italic?m=w+p:m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},dt=(t,n,i)=>{let e=d.getQuill(),{editor:a,canvas:s}=d.getCanvas();if(!e)return;let o=e.selection.savedRange;d.dateEdit(async l=>{if(t==="font")a.innerEditing?(o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null)):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null));else if(t==="fontSize")l.data.textData[t]=n,d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),f(l,i??null);else if(t==="textCase"){if(a.innerEditing){let r=e.getText(o.index,o.length),c=e.getFormat(o.index,o.length);e.deleteText(o.index,o.length);let u;r===r.toUpperCase()&&/[A-Z]/.test(r)?u=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),u=r.toUpperCase()),e.insertText(o.index,u,c),o&&a.innerEditing&&e.setSelection(o.index,o.length);}}else if(t==="script"){let r="sub";n==="super"&&(r="sup"),a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,e.getFormat(o).script===n?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r),f(l));}else if(t==="align")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing?e.format(t,n):e.formatLine(0,e.getLength(),t,n),f(l);else if(t==="alignContent")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="lineHeight"||t==="letterSpacing")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="color")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.tag==="HTMLText"?f(l):l.parent.findOne("HTMLText")&&f(l.parent.findOne("HTMLText"));else if(t==="textShadow")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="list"){if(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing){let[r]=e.getLine(o?.index||0);r.formats().list?e.format(t,false):e.format(t,n);}else {let[r]=e.getLine(o?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,n);}f(l);}else a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,n===void 0?!e.getFormat(o)[t]:n):e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n),f(l));},1);};var v=class extends EditTool{constructor(i){super(i);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(i,e){let a=null;return((...s)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>i.apply(this,s),e);})}addEvent(){let{editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[i.on_(EditorScaleEvent.SCALE,c=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*o+"px",r.height="auto");let u=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(u=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*u),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),i.on_(PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||i.openInnerEditor(e,true);})];}onLoad(){let{editor:i}=d.getCanvas();console.log(i._target,123);let e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s));this.addEvent(),this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*o+"px",r.height=e.parent.height*o+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(i){i&&i.set({width:i.__layout.boxBounds.width,height:i.__layout.boxBounds.height});}onUpdate(){let {editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText");i._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:i}=d.getCanvas();i.off_(this.eventIds);}onDestroy(){}};v=y([registerEditTool()],v);var D=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.onInput=async()=>{let{editDom:i}=this;f(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:i}=this,{config:e}=i.app,a=this.editTarget,{scaleX:s,scaleY:o}=a.worldTransform,l=Math.max(Math.abs(s),Math.abs(o));this.isHTMLText=!(a instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:c}=r;if(c.visibility="visible",a.data.canChangeBox?(c.width=a.parent.width*l+"px",c.height=a.parent.height*l+"px"):(c.width="auto",c.height="auto"),c.outline="solid #8499EF",a.data.textData.fontSize&&(r.style.fontSize=`${a.data.textData.fontSize*l}px`),a.data.textData.lineHeight&&(r.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(r.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?r.style.textShadow=`${a.data.textData.textShadow}`:r.style.textShadow="none",a.data.textData.alignContent){let u=r.querySelector(".ql-editor");u.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(c.width=a.parent.width*l+"px",c.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.eventIds=[i.app.on_(PointerEvent$1.DOWN,u=>{let{target:g}=u.origin,p=false;for(;g;)g===r&&(p=true),g=g.parentElement;p||(i.closeInnerEditor(),i.cancel());})];}onUpdate(){let{editTarget:i}=this,{scaleX:e,scaleY:a}=i.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),{width:o,height:l}=i.parent.__local;o*=s,l*=s;let{x:r,y:c}=this.inBody?i.app.clientBounds:i.app.tree.clientBounds,{a:u,b:g,c:p,d:x,e:U,f:L}=new Matrix(i.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${u},${g},${p},${x},${U},${L})`,h.left=r+"px",h.top=c+"px",i.set({visible:false});}onUnload(){let{editTarget:i,editor:e,editDom:a}=this;i&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),i.parent&&i.parent.name=="Text"&&i.parent.children.some(s=>s.tag==="Box")?(i.parent.findOne("Box").opacity=1,i.visible=false):i.set({visible:true}),this.quill.getLength()===1&&i.parent.name==="Text"&&i.parent.remove(),this.quill.off("text-change",this.onInput);}};D=y([registerInnerEditor()],D);function C(t,{insertAt:n}={}){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",n==="top"&&i.firstChild?i.insertBefore(e,i.firstChild):i.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}
2
+ `);var F="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function O(t){let n=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return P(n)}function P(t){let n=atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n.charCodeAt(e);return i.buffer}async function J(){let t=atob(F),n=O(t);return await crypto.subtle.importKey("spki",n,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function z(t,n){try{let i=await J(),e=new TextEncoder().encode(t),a=P(n);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",i,a,e)}catch(i){return console.error("[RSA] Signature verification failed:",i),false}}async function j(t){try{let n=atob(t),i=JSON.parse(n);if(!i.data||!i.signature)return console.error("[License] Invalid license format"),null;if(!await z(i.data,i.signature))return console.error("[License] Invalid signature - License may be tampered or forged"),null;let a=JSON.parse(i.data);return console.log("[License] Signature verified successfully"),a}catch(n){return console.error("[License] Failed to parse license:",n),null}}function X(t){if(!t||t.length===0)return true;let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let i=t.some(e=>{if(e.startsWith("*.")){let a=e.slice(2);return n.endsWith(a)}return n===e});return i||(console.error(`[License] Domain not authorized: ${n}`),console.error("[License] Allowed domains:",t)),i}function G(t){if(!t)return true;try{let n=new Date(t),i=new Date;if(i>=n)return console.error(`[License] License has expired on ${t}`),!1;let e=Math.ceil((n.getTime()-i.getTime())/(1e3*60*60*24));return e<=7&&console.warn(`[License] License will expire in ${e} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function tt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function H(t){try{let n=await j(t);return n?tt(n.issueDate)?X(n.domains)?G(n.expireDate)?(console.log("[License] All validations passed"),console.log("[License] License info:",{key:n.key,domains:n.domains,expireDate:n.expireDate,features:n.features}),{valid:!0,data:n}):{valid:!1,error:"License has expired",data:n}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:n}:{valid:!1,error:"Invalid license issue date",data:n}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(n){return console.error("[License] Validation error:",n),{valid:false,error:"License validation failed"}}}var E=null,M=null,b=false;async function et(t){console.log("[License] Activating license...");let n=await H(t);return n.valid&&n.data?(E=t,M=n.data,b=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${n.data.expireDate||"unlimited"}`),true):(E=null,M=null,b=false,console.error("[License] \u274C License activation failed:",n.error),false)}async function I(){if(!E)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=await H(E);return b=t.valid,b||(console.error("[License] License validation failed:",t.error),M=null),b}function nt(){return M}var B=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(n){if(!await I())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=n,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 S("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:a=>{let[s]=this.quill.getLine(a.index),o=S.import("blots/block");if(!o?.bubbleFormats)return true;let l=o.bubbleFormats(s),r=new Delta().retain(a.index).delete(a.length).insert(`
3
+ `,l);return this.quill.updateContents(r,S.sources.USER),this.quill.setSelection(a.index+1,S.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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){FontStyle.whitelist=void 0,S.register("formats/font",FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(n,i=0,e){let{editor:a}=this.app_,s=e||a.leafList.list,o=l=>{i&&(l.tag==="Box"||l.name==="Text")?n(l.children?.[0]||l):n(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(o),this.app_.unlockLayout(),a.updateEditBox()):o(s[0]));}},d=B.getInstance();var q=class extends Box{get __tag(){return "HtmlText"}constructor(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r,...c}=n||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...c}),n&&this.createTextElement(n);}createTextElement(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r}=n,c="<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>",u=`<div style="ove
4
+ rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${o}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new HTMLText({name:"Text",text:c+(i||u),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:a,fontSize:e,lineHeight:s,letterSpacing:o||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};q=y([registerUI()],q);export{q as HtmlText,I as checkLicense,nt as getLicenseInfo,d as htmlTextManage,dt as setHTMLText,et as setLicense,f as updataHtmlText};//# sourceMappingURL=index.mjs.map
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts","../src/index.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'HtmlText' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n // if (dom && e.data.textData?.fontFamily) {\n // dom.style.fontFamily = e.data.textData.fontFamily;\n // }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n // if (text.data.textData.fontFamily) {\n // div.style.fontFamily = `${text.data.textData.fontFamily}`;\n // }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(this.quill?.selection.savedRange, 'this.quill?.selection.savedRange')\n return this.quill?.selection.savedRange\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./HtmlTextManage\";\nexport * from \"./utils\"\nexport * from \"./HtmlText\";\n// 导出授权相关\nexport { setLicense, checkLicense, getLicenseInfo } from './license';\nexport type { LicenseData } from './license';\nconsole.log('start')\n"]}
1
+ {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/public-key.ts","../src/license/rsa-verify.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","PUBLIC_KEY_BASE64","pemToArrayBuffer","pem","base64","base64ToArrayBuffer","binaryString","bytes","i","importPublicKey","publicKeyPem","publicKeyBuffer","verifySignature","data","signature","publicKey","dataBuffer","signatureBuffer","error","parseLicense","license","decoded","licensePackage","validateDomain","allowedDomains","currentDomain","isValid","domain","baseDomain","validateExpireDate","expireDate","expire","now","daysRemaining","validateIssueDate","issueDate","validateLicense","licenseKey","licenseData","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'HtmlText' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = htmlTextManage.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = htmlTextManage.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = htmlTextManage.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const dom: any = document.querySelector(\"#textInnerEditor\");\n // if (dom && e.data.textData?.fontFamily) {\n // dom.style.fontFamily = e.data.textData.fontFamily;\n // }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`;\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight;\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`;\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow;\n } else {\n dom.style.textShadow = \"none\";\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = e.data.textData.alignContent;\n }\n // 如果是空的就把text滞空\n const quill = htmlTextManage.getQuill();\n const html = quill.getSemanticHTML();\n if (html === \"<p></p>\") {\n if (e.text.includes(\"<style>@font-face\")) {\n e.text = e.text.split(\"</style>\")[0] + \"</style>\";\n } else {\n e.text = \"\";\n }\n return;\n }\n if (e.text.includes(\"<style>@font-face\")) {\n // text已经加载过字体\n const style = e.text.split(\"</style>\")[0];\n if (fontObj && !style.includes(fontObj)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\n const { scaleX, scaleY } = e.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = html;\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow,\n };\n wrapper.querySelectorAll(\"p,ol,ul\").forEach((p: any) => {\n Object.assign(p.style, wrapperStyle);\n });\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML;\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, \"<p$1>&nbsp;</p>\");\n }\n if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\n if ([\"center\", \"end\"].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + \"px\";\n } else {\n height = `${e.parent.height}px`;\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n let divBox = \"\";\n if (e.parent.children[0].tag.includes(\"Shape\")) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`;\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`;\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str;\n } else {\n divBox =\n style +\n `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`;\n }\n }\n console.log(divBox, \"最终的html内容\");\n return divBox;\n};\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n updataHtmlText(e, base64font ?? null);\n } else if (key === \"textCase\") {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length);\n const formats = quill.getFormat(range.index, range.length);\n quill.deleteText(range.index, range.length);\n let convertedText;\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase();\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase();\n } else {\n convertedText = text.toUpperCase();\n }\n\n quill.insertText(range.index, convertedText, formats);\n range &&\n editor.innerEditing &&\n quill.setSelection(range.index, range.length);\n }\n } else if (key === \"script\") {\n // 上下标\n let val = \"sub\";\n if (value === \"super\") val = \"sup\";\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n quill.format(key, value);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n updataHtmlText(e);\n } else if (key === \"alignContent\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n if (e.tag === \"HTMLText\") {\n updataHtmlText(e);\n } else if (e.parent.findOne(\"HTMLText\")) {\n updataHtmlText(e.parent.findOne(\"HTMLText\"));\n }\n } else if (key === \"textShadow\") {\n // 阴影\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.format(key, false);\n } else {\n quill.format(key, value);\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0);\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false);\n } else {\n quill.formatLine(0, quill.getLength(), key, value);\n }\n }\n updataHtmlText(e);\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\n updataHtmlText(e);\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1);\n};\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}px`;\n }\n // if (text.data.textData.fontFamily) {\n // div.style.fontFamily = `${text.data.textData.fontFamily}`;\n // }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = htmlTextManage.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}\\n\")","/**\n * RSA 公钥 (自动生成)\n * 用于验证 License 签名\n * \n * 注意: 这个公钥是公开的,不需要保密\n */\n\nexport const PUBLIC_KEY_BASE64 = `LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==`;\n","/**\n * RSA 签名验证工具 (浏览器版本)\n * \n * 使用 Web Crypto API 验证 RSA-SHA256 签名\n */\n\nimport { PUBLIC_KEY_BASE64 } from './public-key';\n\n/**\n * 将 PEM 格式公钥转换为 ArrayBuffer\n */\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n // 移除 PEM 头尾和换行符\n const base64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n return base64ToArrayBuffer(base64);\n}\n\n/**\n * Base64 字符串转 ArrayBuffer\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n \n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n \n return bytes.buffer;\n}\n\n/**\n * 导入 RSA 公钥\n */\nasync function importPublicKey(): Promise<CryptoKey> {\n // 解码 Base64 公钥\n const publicKeyPem = atob(PUBLIC_KEY_BASE64);\n const publicKeyBuffer = pemToArrayBuffer(publicKeyPem);\n\n // 导入公钥\n const publicKey = await crypto.subtle.importKey(\n 'spki',\n publicKeyBuffer,\n {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n },\n false,\n ['verify']\n );\n\n return publicKey;\n}\n\n/**\n * 验证 RSA 签名\n * \n * @param data - 原始数据字符串\n * @param signature - Base64 编码的签名\n * @returns 签名是否有效\n */\nexport async function verifySignature(\n data: string,\n signature: string\n): Promise<boolean> {\n try {\n // 导入公钥\n const publicKey = await importPublicKey();\n\n // 准备数据\n const dataBuffer = new TextEncoder().encode(data);\n const signatureBuffer = base64ToArrayBuffer(signature);\n\n // 验证签名\n const isValid = await crypto.subtle.verify(\n 'RSASSA-PKCS1-v1_5',\n publicKey,\n signatureBuffer,\n dataBuffer\n );\n\n return isValid;\n } catch (error) {\n console.error('[RSA] Signature verification failed:', error);\n return false;\n }\n}\n\n/**\n * 测试 RSA 验证是否正常工作\n */\nexport async function testRSAVerification(): Promise<boolean> {\n try {\n // 尝试导入公钥\n await importPublicKey();\n console.log('[RSA] Public key loaded successfully');\n return true;\n } catch (error) {\n console.error('[RSA] Failed to load public key:', error);\n return false;\n }\n}","/**\n * License 验证器 V2 (RSA 签名版本)\n * \n * 主要改进:\n * 1. 使用 RSA 签名防止 License 伪造\n * 2. 保留原有的域名和过期时间验证\n * 3. 向后兼容旧版 License\n */\n\nimport { verifySignature } from './rsa-verify';\n\nexport interface LicenseData {\n key: string; // License Key (格式: XXXX-XXXX-XXXX-XXXX)\n domains?: string[]; // 允许的域名列表\n expireDate?: string; // 过期时间 YYYY-MM-DD\n issueDate?: string; // 签发时间 YYYY-MM-DD\n features?: string[]; // 功能列表\n userId?: string; // 用户ID\n email?: string; // 用户邮箱\n version?: string; // License 版本\n}\n\ninterface LicensePackage {\n data: string; // JSON 序列化的 LicenseData\n signature: string; // RSA 签名\n}\n\n/**\n * 解析 License\n */\nasync function parseLicense(license: string): Promise<LicenseData | null> {\n try {\n // 1. Base64 解码\n const decoded = atob(license);\n \n // 2. 解析 JSON\n const licensePackage: LicensePackage = JSON.parse(decoded);\n\n // 验证格式\n if (!licensePackage.data || !licensePackage.signature) {\n console.error('[License] Invalid license format');\n return null;\n }\n\n // 3. 验证 RSA 签名\n const signatureValid = await verifySignature(\n licensePackage.data,\n licensePackage.signature\n );\n\n if (!signatureValid) {\n console.error('[License] Invalid signature - License may be tampered or forged');\n return null;\n }\n\n // 4. 解析数据\n const data: LicenseData = JSON.parse(licensePackage.data);\n \n console.log('[License] Signature verified successfully');\n return data;\n\n } catch (error) {\n console.error('[License] Failed to parse license:', error);\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 console.log('[License] Local development environment detected');\n return true;\n }\n\n // 检查域名是否在允许列表中\n const isValid = 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 if (!isValid) {\n console.error(`[License] Domain not authorized: ${currentDomain}`);\n console.error(`[License] Allowed domains:`, allowedDomains);\n }\n\n return isValid;\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 \n if (now >= expire) {\n console.error(`[License] License has expired on ${expireDate}`);\n return false;\n }\n\n // 计算剩余天数\n const daysRemaining = Math.ceil((expire.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysRemaining <= 7) {\n console.warn(`[License] License will expire in ${daysRemaining} days`);\n }\n\n return true;\n } catch (error) {\n console.error('[License] Invalid expire date format:', expireDate);\n return false;\n }\n}\n\n/**\n * 验证签发时间(防止使用未来时间)\n */\nfunction validateIssueDate(issueDate?: string): boolean {\n if (!issueDate) return true;\n\n try {\n const issue = new Date(issueDate);\n const now = new Date();\n \n if (issue > now) {\n console.error('[License] License issue date is in the future');\n return false;\n }\n\n return true;\n } catch {\n return true; // 如果没有签发时间,跳过此检查\n }\n}\n\n/**\n * 验证 License (主函数)\n */\nexport async function validateLicense(license: string): Promise<{\n valid: boolean;\n error?: string;\n data?: LicenseData;\n}> {\n try {\n // 1. 解析 License 并验证签名\n const data = await parseLicense(license);\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key or signature verification failed'\n };\n }\n\n // 2. 验证签发时间\n if (!validateIssueDate(data.issueDate)) {\n return {\n valid: false,\n error: 'Invalid license issue date',\n data\n };\n }\n\n // 3. 验证域名\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 // 4. 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n };\n }\n\n // 5. 所有验证通过\n console.log('[License] All validations passed');\n console.log('[License] License info:', {\n key: data.key,\n domains: data.domains,\n expireDate: data.expireDate,\n features: data.features\n });\n\n return {\n valid: true,\n data\n };\n\n } catch (error) {\n console.error('[License] Validation error:', error);\n return {\n valid: false,\n error: 'License validation failed'\n };\n }\n}\n\n/**\n * 检查是否有特定功能权限\n */\nexport function hasFeature(data: LicenseData | null, feature: string): boolean {\n if (!data || !data.features) return false;\n return data.features.includes(feature);\n}","/**\n * License 管理器\n *\n * 提供统一的 License 管理接口\n */\n\nimport { validateLicense, hasFeature, type LicenseData } from \"./validator\";\n\n// 全局状态\nlet licenseKey: string | null = null;\nlet licenseData: LicenseData | null = null;\nlet isLicenseValid = false;\n\n/**\n * 设置 License\n *\n * @param license - License Key 字符串\n * @returns 是否激活成功\n */\nexport async function setLicense(license: string): Promise<boolean> {\n console.log(\"[License] Activating license...\");\n\n const result = await validateLicense(license);\n\n if (result.valid && result.data) {\n licenseKey = license;\n licenseData = result.data;\n isLicenseValid = true;\n\n console.log(\"[License] ✅ License activated successfully\");\n console.log(\n `[License] Valid until: ${result.data.expireDate || \"unlimited\"}`,\n );\n\n return true;\n } else {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n\n console.error(\"[License] ❌ License activation failed:\", result.error);\n\n return false;\n }\n}\n\n/**\n * 检查 License 是否有效\n *\n * @returns License 是否有效\n */\nexport async function checkLicense(): Promise<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 = await validateLicense(licenseKey);\n isLicenseValid = result.valid;\n\n if (!isLicenseValid) {\n console.error(\"[License] License validation failed:\", result.error);\n licenseData = null;\n }\n\n return isLicenseValid;\n}\n\n/**\n * 获取 License 信息\n *\n * @returns License 数据或 null\n */\nexport function getLicenseInfo(): LicenseData | null {\n return licenseData;\n}\n\n/**\n * 检查是否有特定功能权限\n *\n * @param feature - 功能名称\n * @returns 是否有权限\n */\nexport function checkFeature(feature: string): boolean {\n if (!isLicenseValid || !licenseData) {\n return false;\n }\n\n return hasFeature(licenseData, feature);\n}\n\n/**\n * 清除 License\n */\nexport function clearLicense(): void {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n console.log(\"[License] License cleared\");\n}\n\n/**\n * 获取 License 状态摘要\n */\nexport function getLicenseStatus(): {\n activated: boolean;\n key?: string;\n expireDate?: string;\n domains?: string[];\n features?: string[];\n} {\n if (!isLicenseValid || !licenseData) {\n return { activated: false };\n }\n\n return {\n activated: true,\n key: licenseData.key,\n expireDate: licenseData.expireDate,\n domains: licenseData.domains,\n features: licenseData.features,\n };\n}\n\nexport function assertLicenseValid(): void {\n // if (!isLicenseValid || !licenseData) {\n console.log(isLicenseValid)\n if (!isLicenseValid) {\n throw new Error(\n \"[Plugin] License validation failed. Plugin execution has been blocked. Please contact the plugin developer for assistance. Email: 408550179@qq.com\",\n );\n }\n}\n\n// 导出类型\nexport type { LicenseData } from \"./validator\";\n","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n const seccess = await checkLicense();\n if (!seccess) {\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(\n this.quill?.selection.savedRange,\n \"this.quill?.selection.savedRange\",\n );\n return this.quill?.selection.savedRange;\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'•';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`;\n const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenyomi/leafer-htmltext-edit",
3
- "version": "2.1.4",
3
+ "version": "2.1.5",
4
4
  "description": "A text editor plugin for Leafer UI with HTML text support",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",