@chenyomi/leafer-htmltext-edit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),y=require('quill');require('quill/dist/quill.core.css');var I=require('crypto-js');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var I__default=/*#__PURE__*/_interopDefault(I);var v=(t,a,e,n)=>{for(var i=a,l=t.length-1,o;l>=0;l--)(o=t[l])&&(i=(o(i))||i);return i};var L=async(t,a,e)=>{let{scaleX:n,scaleY:i}=t.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontFamily&&(o.style.fontFamily=t.data.textData.fontFamily),o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*l}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let r=o.querySelector(".ql-editor");r.style.alignContent=t.data.textData.alignContent;}let s=p.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let r=t.text.split("</style>")[0];t.text=r+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,a,e=16,n="1.5",i="0",l="none",o="start")=>{let{scaleX:d,scaleY:s}=t.worldTransform,r=Math.max(Math.abs(d),Math.abs(s)),c=document.createElement("div");c.innerHTML=a;let g={fontSize:`${e}px`,lineHeight:n,letterSpacing:`${i}px`,textShadow:l};c.querySelectorAll("p,ol,ul").forEach(B=>{Object.assign(B.style,g);});let f=c.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1> </p>"));let h;document.querySelector("#textInnerEditor");let b=p.getQuill(),u=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let w="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${f}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${f}</div>`:t.data.textData.italic?m=w+f:(console.log(u),m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};var D=class extends editor.EditTool{constructor(e){super(e);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{L(n);},300);}get tag(){return "TextEditTool"}debounce(e,n){let i=null;return((...l)=>{i!==null&&window.clearTimeout(i),i=window.setTimeout(()=>e.apply(this,l),n);})}addEvent(){let{editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l)),d=document.querySelector("#textInnerEditor"),{style:s}=d;this.eventIds=[e.on_(editor.EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(s.width=n.parent.width*o+"px",s.height="auto");let c=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(c=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*c),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),e.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||e.openInnerEditor(n,true);})];}onLoad(){let{editor:e}=p.getCanvas();console.log(e._target,123);let n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:s}=d;n.data.canChangeBox?(s.width=n.parent.width*o+"px",s.height=n.parent.height*o+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(e){e&&e.set({width:e.__layout.boxBounds.width,height:e.__layout.boxBounds.height});}onUpdate(){let {editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText");e._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:e}=p.getCanvas();e.off_(this.eventIds);}onDestroy(){}};D=v([editor.registerEditTool()],D);var T=class extends editor.InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async e=>{e&&localStorage.setItem("selection-change",JSON.stringify(e));};this.onInput=async()=>{let{editDom:e}=this;console.log("onInput"),L(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:e}=this,{config:n}=e.app,i=this.editTarget,{scaleX:l,scaleY:o}=i.worldTransform,d=Math.max(Math.abs(l),Math.abs(o));this.isHTMLText=!(i instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=s;if(r.visibility="visible",i.data.canChangeBox?(r.width=i.parent.width*d+"px",r.height=i.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",i.data.textData.fontSize&&(console.log(i.data.textData.fontSize),s.style.fontSize=`${i.data.textData.fontSize}px`),i.data.textData.fontFamily&&(s.style.fontFamily=`${i.data.textData.fontFamily}`),i.data.textData.lineHeight&&(s.style.lineHeight=i.data.textData.lineHeight),i.data.textData.letterSpacing&&(s.style.letterSpacing=`${i.data.textData.letterSpacing}px`),i.data.textData.textShadow?s.style.textShadow=`${i.data.textData.textShadow}`:s.style.textShadow="none",i.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${i.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(i.text),i.parent.children[0].tag.includes("Shape")?(r.width=i.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[e.app.on_(core.PointerEvent.DOWN,c=>{let{target:g}=c.origin,f=false;for(;g;)g===s&&(f=true),g=g.parentElement;f||(e.closeInnerEditor(),e.cancel());})];}onUpdate(){let{editTarget:e}=this,{scaleX:n,scaleY:i}=e.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),{width:o,height:d}=e.parent.__local;o*=l,d*=l;let{x:s,y:r}=this.inBody?e.app.clientBounds:e.app.tree.clientBounds,{a:c,b:g,c:f,d:h,e:N,f:b}=new core.Matrix(e.worldTransform).scale(1/l).translateInner(0,0),{style:u}=this.editDom;u.transform=`matrix(${c},${g},${f},${h},${N},${b})`,u.left=s+"px",u.top=r+"px",e.set({visible:false});}onUnload(){let{editTarget:e,editor:n,editDom:i}=this;e&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),e.parent&&e.parent.name=="Text"&&e.parent.children.some(l=>l.tag==="Box")?(e.parent.findOne("Box").opacity=1,e.visible=false):e.set({visible:true}),this.quill.getLength()===1&&e.parent.name==="Text"&&e.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};T=v([editor.registerInnerEditor()],T);function C(t,{insertAt:a}={}){if(typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",a==="top"&&e.firstChild?e.insertBefore(n,e.firstChild):e.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
|
|
2
|
-
`);var W="
|
|
2
|
+
`);var W="chenyuming-license-key";function $(t){try{return I__default.default.AES.decrypt(t,W).toString(I__default.default.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function X(t){try{let a=_(t);if(!a)return null;let e=$(a);return e?JSON.parse(e):null}catch{return null}}function Y(t){if(!t||t.length===0)return true;let a=window.location.hostname;return a==="localhost"||a==="127.0.0.1"?true:t.some(e=>{if(e.startsWith("*.")){let n=e.slice(2);return a.endsWith(n)}return a===e})}function k(t){if(!t)return true;try{let a=new Date(t);return new Date<a}catch{return false}}function M(t){let a=X(t);return a?Y(a.domains)?k(a.expireDate)?{valid:true,data:a}:{valid:false,error:"License has expired",data:a}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:a}:{valid:false,error:"Invalid license key"}}var S=null,x=false;function V(t){let a=M(t);return a.valid?(S=t,x=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",a.error),x=false,false)}function E(){if(!S)return console.warn("[License] No license key provided"),false;if(!x)return console.warn("[License] License is not valid"),false;let t=M(S);return x=t.valid,x||console.error("[License] License expired or invalid:",t.error),x}function Z(){return S?M(S).data:null}var H=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(a){if(!E())throw console.error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=a,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new y__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[i]=this.quill.getLine(n.index),l=y__default.default.import("blots/block");if(!l?.bubbleFormats)return true;let o=l.bubbleFormats(i),d=new y.Delta().retain(n.index).delete(n.length).insert(`
|
|
3
3
|
`,o);return this.quill.updateContents(d,y__default.default.sources.USER),this.quill.setSelection(n.index+1,y__default.default.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let a=y__default.default.import("attributors/class/font");a.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],y__default.default.register(a,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(a,e=0,n){let{editor:i}=this.app_,l=n||i.leafList.list,o=d=>{e&&(d.tag==="Box"||d.name==="Text")?a(d.children?.[0]||d):a(d);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(o),this.app_.unlockLayout(),i.updateEditBox()):o(l[0]));}},p=H.getInstance();exports.checkLicense=E;exports.getLicenseInfo=Z;exports.quillManager=p;exports.setLicense=V;//# sourceMappingURL=index.cjs.map
|
|
4
4
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.cjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1> </p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'your-secret-key-change-this-2025'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.cjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1> </p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import y,{Delta}from'quill';import'quill/dist/quill.core.css';import I from'crypto-js';var v=(t,a,e,n)=>{for(var i=a,l=t.length-1,o;l>=0;l--)(o=t[l])&&(i=(o(i))||i);return i};var L=async(t,a,e)=>{let{scaleX:n,scaleY:i}=t.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontFamily&&(o.style.fontFamily=t.data.textData.fontFamily),o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*l}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let r=o.querySelector(".ql-editor");r.style.alignContent=t.data.textData.alignContent;}let s=p.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let r=t.text.split("</style>")[0];t.text=r+"</style>"+q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=q(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},q=(t,a,e=16,n="1.5",i="0",l="none",o="start")=>{let{scaleX:d,scaleY:s}=t.worldTransform,r=Math.max(Math.abs(d),Math.abs(s)),c=document.createElement("div");c.innerHTML=a;let g={fontSize:`${e}px`,lineHeight:n,letterSpacing:`${i}px`,textShadow:l};c.querySelectorAll("p,ol,ul").forEach(B=>{Object.assign(B.style,g);});let f=c.innerHTML;/<p\b[^>]*><\/p>/.test(f)&&(f=f.replace(/<p\b([^>]*)><\/p>/g,"<p$1> </p>"));let h;document.querySelector("#textInnerEditor");let b=p.getQuill(),u=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<u?h=(u||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let w="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${f}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${f}</div>`:t.data.textData.italic?m=w+f:(console.log(u),m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${f}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};var D=class extends EditTool{constructor(e){super(e);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{L(n);},300);}get tag(){return "TextEditTool"}debounce(e,n){let i=null;return((...l)=>{i!==null&&window.clearTimeout(i),i=window.setTimeout(()=>e.apply(this,l),n);})}addEvent(){let{editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l)),d=document.querySelector("#textInnerEditor"),{style:s}=d;this.eventIds=[e.on_(EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(s.width=n.parent.width*o+"px",s.height="auto");let c=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(c=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*c),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),e.on_(PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||e.openInnerEditor(n,true);})];}onLoad(){let{editor:e}=p.getCanvas();console.log(e._target,123);let n=e._target.findOne("HTMLText"),{scaleX:i,scaleY:l}=n.worldTransform,o=Math.max(Math.abs(i),Math.abs(l));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:s}=d;n.data.canChangeBox?(s.width=n.parent.width*o+"px",s.height=n.parent.height*o+"px"):(s.width="auto",s.height="auto");}updateChangeBoxBound(e){e&&e.set({width:e.__layout.boxBounds.width,height:e.__layout.boxBounds.height});}onUpdate(){let {editor:e}=p.getCanvas(),n=e._target.findOne("HTMLText");e._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:e}=p.getCanvas();e.off_(this.eventIds);}onDestroy(){}};D=v([registerEditTool()],D);var T=class extends InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async e=>{e&&localStorage.setItem("selection-change",JSON.stringify(e));};this.onInput=async()=>{let{editDom:e}=this;console.log("onInput"),L(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:e}=this,{config:n}=e.app,i=this.editTarget,{scaleX:l,scaleY:o}=i.worldTransform,d=Math.max(Math.abs(l),Math.abs(o));this.isHTMLText=!(i instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let s=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=s;if(r.visibility="visible",i.data.canChangeBox?(r.width=i.parent.width*d+"px",r.height=i.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",i.data.textData.fontSize&&(console.log(i.data.textData.fontSize),s.style.fontSize=`${i.data.textData.fontSize}px`),i.data.textData.fontFamily&&(s.style.fontFamily=`${i.data.textData.fontFamily}`),i.data.textData.lineHeight&&(s.style.lineHeight=i.data.textData.lineHeight),i.data.textData.letterSpacing&&(s.style.letterSpacing=`${i.data.textData.letterSpacing}px`),i.data.textData.textShadow?s.style.textShadow=`${i.data.textData.textShadow}`:s.style.textShadow="none",i.data.textData.alignContent){let c=s.querySelector(".ql-editor");c.style.alignContent=`${i.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(i.text),i.parent.children[0].tag.includes("Shape")?(r.width=i.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[e.app.on_(PointerEvent$1.DOWN,c=>{let{target:g}=c.origin,f=false;for(;g;)g===s&&(f=true),g=g.parentElement;f||(e.closeInnerEditor(),e.cancel());})];}onUpdate(){let{editTarget:e}=this,{scaleX:n,scaleY:i}=e.worldTransform,l=Math.max(Math.abs(n),Math.abs(i)),{width:o,height:d}=e.parent.__local;o*=l,d*=l;let{x:s,y:r}=this.inBody?e.app.clientBounds:e.app.tree.clientBounds,{a:c,b:g,c:f,d:h,e:N,f:b}=new Matrix(e.worldTransform).scale(1/l).translateInner(0,0),{style:u}=this.editDom;u.transform=`matrix(${c},${g},${f},${h},${N},${b})`,u.left=s+"px",u.top=r+"px",e.set({visible:false});}onUnload(){let{editTarget:e,editor:n,editDom:i}=this;e&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),e.parent&&e.parent.name=="Text"&&e.parent.children.some(l=>l.tag==="Box")?(e.parent.findOne("Box").opacity=1,e.visible=false):e.set({visible:true}),this.quill.getLength()===1&&e.parent.name==="Text"&&e.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};T=v([registerInnerEditor()],T);function C(t,{insertAt:a}={}){if(typeof document>"u")return;let e=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",a==="top"&&e.firstChild?e.insertBefore(n,e.firstChild):e.appendChild(n),n.styleSheet?n.styleSheet.cssText=t:n.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
|
|
2
|
-
`);var W="
|
|
2
|
+
`);var W="chenyuming-license-key";function $(t){try{return I.AES.decrypt(t,W).toString(I.enc.Utf8)}catch{return ""}}function _(t){try{return decodeURIComponent(atob(t))}catch{return ""}}function X(t){try{let a=_(t);if(!a)return null;let e=$(a);return e?JSON.parse(e):null}catch{return null}}function Y(t){if(!t||t.length===0)return true;let a=window.location.hostname;return a==="localhost"||a==="127.0.0.1"?true:t.some(e=>{if(e.startsWith("*.")){let n=e.slice(2);return a.endsWith(n)}return a===e})}function k(t){if(!t)return true;try{let a=new Date(t);return new Date<a}catch{return false}}function M(t){let a=X(t);return a?Y(a.domains)?k(a.expireDate)?{valid:true,data:a}:{valid:false,error:"License has expired",data:a}:{valid:false,error:`License not valid for domain: ${window.location.hostname}`,data:a}:{valid:false,error:"Invalid license key"}}var S=null,x=false;function V(t){let a=M(t);return a.valid?(S=t,x=true,console.log("[License] License activated successfully"),true):(console.error("[License] License validation failed:",a.error),x=false,false)}function E(){if(!S)return console.warn("[License] No license key provided"),false;if(!x)return console.warn("[License] License is not valid"),false;let t=M(S);return x=t.valid,x||console.error("[License] License expired or invalid:",t.error),x}function Z(){return S?M(S).data:null}var H=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(a){if(!E())throw console.error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com VX : cym5640"),new Error("[QuillManager] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=a,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new y("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[i]=this.quill.getLine(n.index),l=y.import("blots/block");if(!l?.bubbleFormats)return true;let o=l.bubbleFormats(i),d=new Delta().retain(n.index).delete(n.length).insert(`
|
|
3
3
|
`,o);return this.quill.updateContents(d,y.sources.USER),this.quill.setSelection(n.index+1,y.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let a=y.import("attributors/class/font");a.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],y.register(a,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(a,e=0,n){let{editor:i}=this.app_,l=n||i.leafList.list,o=d=>{e&&(d.tag==="Box"||d.name==="Text")?a(d.children?.[0]||d):a(d);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(o),this.app_.unlockLayout(),i.updateEditBox()):o(l[0]));}},p=H.getInstance();export{E as checkLicense,Z as getLicenseInfo,p as quillManager,V as setLicense};//# sourceMappingURL=index.mjs.map
|
|
4
4
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.mjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1> </p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'your-secret-key-change-this-2025'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/encrypt.ts","../src/license/validator.ts","../src/license/index.ts","../src/QuillManager.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","SECRET_KEY","decrypt","encryptedData","CryptoJS","decode","parseLicense","license","decoded","decrypted","validateDomain","allowedDomains","currentDomain","domain","baseDomain","validateExpireDate","expireDate","expire","validateLicense","data","licenseKey","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf"],"mappings":"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","file":"index.mjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1> </p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import CryptoJS from 'crypto-js'\n\n// 加密密钥(请修改为你自己的密钥)\nconst SECRET_KEY = 'chenyuming-license-key'\n\n/**\n * 加密数据\n */\nexport function encrypt(data: string): string {\n return CryptoJS.AES.encrypt(data, SECRET_KEY).toString()\n}\n\n/**\n * 解密数据\n */\nexport function decrypt(encryptedData: string): string {\n try {\n const bytes = CryptoJS.AES.decrypt(encryptedData, SECRET_KEY)\n return bytes.toString(CryptoJS.enc.Utf8)\n } catch {\n return ''\n }\n}\n\n/**\n * Base64 编码\n */\nexport function encode(str: string): string {\n return btoa(encodeURIComponent(str))\n}\n\n/**\n * Base64 解码\n */\nexport function decode(str: string): string {\n try {\n return decodeURIComponent(atob(str))\n } catch {\n return ''\n }\n}","import { decrypt, decode } from './encrypt'\n\nexport interface LicenseData {\n key: string // License Key\n domains?: string[] // 允许的域名列表\n expireDate?: string // 过期时间 YYYY-MM-DD\n features?: string[] // 功能列表\n userId?: string // 用户ID\n email?: string // 用户邮箱\n}\n\n/**\n * 解析 License\n */\nfunction parseLicense(license: string): LicenseData | null {\n try {\n // 1. Base64 解码\n const decoded = decode(license)\n if (!decoded) return null\n\n // 2. AES 解密\n const decrypted = decrypt(decoded)\n if (!decrypted) return null\n\n // 3. 解析 JSON\n const data: LicenseData = JSON.parse(decrypted)\n return data\n } catch {\n return null\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname\n\n // 本地开发环境\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n return true\n }\n\n // 检查域名是否在允许列表中\n return allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2)\n return currentDomain.endsWith(baseDomain)\n }\n return currentDomain === domain\n })\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true\n\n try {\n const expire = new Date(expireDate)\n const now = new Date()\n return now < expire\n } catch {\n return false\n }\n}\n\n/**\n * 验证 License\n */\nexport function validateLicense(license: string): {\n valid: boolean\n error?: string\n data?: LicenseData\n} {\n // 解析 License\n const data = parseLicense(license)\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key'\n }\n }\n\n // 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n }\n }\n\n // 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n }\n }\n\n return {\n valid: true,\n data\n }\n}","import { validateLicense } from './validator'\n\nlet licenseKey: string | null = null\nlet isLicenseValid = false\n\n/**\n * 设置 License\n */\nexport function setLicense(license: string): boolean {\n const result = validateLicense(license)\n \n if (result.valid) {\n licenseKey = license\n isLicenseValid = true\n console.log('[License] License activated successfully')\n return true\n } else {\n console.error('[License] License validation failed:', result.error)\n isLicenseValid = false\n return false\n }\n}\n\n/**\n * 检查 License 是否有效\n */\nexport function checkLicense(): boolean {\n if (!licenseKey) {\n console.warn('[License] No license key provided')\n return false\n }\n\n if (!isLicenseValid) {\n console.warn('[License] License is not valid')\n return false\n }\n\n // 重新验证(防止过期)\n const result = validateLicense(licenseKey)\n isLicenseValid = result.valid\n\n if (!isLicenseValid) {\n console.error('[License] License expired or invalid:', result.error)\n }\n\n return isLicenseValid\n}\n\n/**\n * 获取 License 信息\n */\nexport function getLicenseInfo() {\n if (!licenseKey) return null\n \n const result = validateLicense(licenseKey)\n return result.data\n}\n\n// 导出类型\nexport type { LicenseData } from './validator'","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { checkLicense } from \"./license\";\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n // 检查授权\n if (!checkLicense()) {\n console.error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com VX : cym5640\",\n );\n throw new Error(\n \"[QuillManager] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill;\n }\n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();\n"]}
|
package/package.json
CHANGED