@sunmi/max-print
Advanced tools
+12
-5
@@ -16,6 +16,6 @@ // ==================== 主导出函数 ==================== | ||
| * 模板转换器 - 将模板和数据转换为打印指令 | ||
| * @version 2.2.2 | ||
| * @version 2.2.4 | ||
| */ | ||
| // ==================== 常量配置 ==================== | ||
| const VERSION = "2.2.2"; | ||
| const VERSION = "2.2.4"; | ||
@@ -201,3 +201,3 @@ // ========== 字体大小配置(唯一维护点) ========== | ||
| if (typeof key === "string") { | ||
| if (typeof key === "string" && !/^\d+$/.test(key)) { | ||
| const resolvedKey = FONT_SIZE_MAP[key] || key; | ||
@@ -209,3 +209,3 @@ size = this.fontConfig[resolvedKey] || DEFAULT_FONT_CONFIG[resolvedKey]; | ||
| ...config, | ||
| size: size || 24, | ||
| size: Number(size) || 24, | ||
| }; | ||
@@ -311,2 +311,3 @@ } | ||
| weight: other.weight, | ||
| compress: other.compress ?? true, | ||
| ...(other.maxWidth && { maxWidth: other.maxWidth }), | ||
@@ -404,3 +405,3 @@ }; | ||
| // 直接是base64图片 | ||
| if (processedCode.match(/^data:image\/png;base64,/)) { | ||
| if (processedCode.match(/^data:image\/[a-zA-Z0-9]+;base64,/)) { | ||
| return this.convertImage({ | ||
@@ -890,2 +891,8 @@ data: processedCode, | ||
| const innerItem = item.params.items[0]; | ||
| // 保持统一 对于某些特殊类型不添加行号 | ||
| if (innerItem.type === 'cutPaper' || innerItem.type === 'beep' || innerItem.type === 'dividing') { | ||
| return | ||
| } | ||
| item.params.items.unshift(i === 0 ? lineNumberItem : { | ||
@@ -892,0 +899,0 @@ type: "text", |
+2
-2
@@ -1,4 +0,4 @@ | ||
| function E(C,y={}){let L="2.2.2",T={small:20,middle:24,large:28,extraLarge:32,xxl:36,xxxl:64},U={s:"small",m:"middle",l:"large",xl:"extraLarge",xxl:"xxl",xxxl:"xxxl"},D=new Map([[0,""],[1,"stroke"],[2,"dot"]]);class g{static getFontSize(e,t){let n=U[t]||"middle";return e[n]||T[n]}static parseTemplateData(e,t,n,s,r=null){if(!e||typeof e!="string")return"";if(!/\{\{/.test(e))return e;let o=e,l=o.match(/{{[a-zA-Z0-9\.]+}}/g);l&&l.forEach(a=>{let c=a.replace(/^\{\{|\}\}$/g,""),{supported:u=[],supportedIds:h=[]}=s?.param?.multiLanguage??{};if(s?.param?.enableMultiLanguage===!0&&h.includes(a)&&r){let[m,f]=u,x=r[m]?.[c],d=r[f]?.[c],b=`${x!==null&&["string","number"].includes(typeof x)?x:""}${d!==null&&["string","number"].includes(typeof d)?`(${d})`:""}`;o=o.replaceAll(a,b)}else{let m=this.getNestedValue(n,c),f=m!=null&&["string","number"].includes(typeof m)?m:"";o=o.replaceAll(a,f)}});let p=o.match(/{{[a-zA-Z0-9\-]+\|l}}/g);return p&&p.forEach(a=>{let c=a.replace(/^\{\{|\|l\}\}$/g,""),{supported:u=[],supportedIds:h=[]}=s?.param?.multiLanguage??{};if(s?.param?.enableMultiLanguage===!0&&h.includes(a)&&r){let[m,f]=u,x=r[m]?.[c],d=r[f]?.[c],b=`${x!==null&&["string","number"].includes(typeof x)?x:""}${d!==null&&["string","number"].includes(typeof d)?`(${d})`:""}`;o=o.replaceAll(a,b)}else{let m=t?.[c],f=m!=null&&["string","number"].includes(typeof m)?m:"";o=o.replaceAll(a,f)}}),o}static getNestedValue(e,t){return typeof e=="string"?e:t.split(".").reduce((n,s)=>n?.[s],e)}static shouldBold(e,t,n,s){return!!e}static generateIndent(e,t,n){if(t!==0)return"";let s="----------------".substring(0,e);return n!==2?s.replace(/\-/g," "):s}}class P{static shouldPrint(e,t){return!(e.show===!1||!this.checkHideFields(e,t)||!this.checkExcludeFields(e,t))}static checkHideFields(e,t){return e.hideFields?e.hideFields.some(s=>{let r=t[s];return r&&(!Array.isArray(r)||r.length>0)}):!0}static checkExcludeFields(e,t){return e.excludeFields?!e.excludeFields.some(s=>{let r=t[s];return r&&(!Array.isArray(r)||r.length>0)}):!0}}class ${constructor(e){this.fontConfig=e}processSize(e,t){let n=t==="size"?e[t]:t,s=n;if(typeof n=="string"){let r=U[n]||n;s=this.fontConfig[r]||T[r]}return{...e,size:s||24}}processAlign(e){return e!==void 0?e:0}processMargins(e){let t={};return e.type==="divider"?(t.marginTop=e.upline??3,t.marginBottom=e.bottomBlank??3):(e.upline!==void 0&&(t.marginTop=e.upline),e.bottomBlank!==void 0&&(t.marginBottom=e.bottomBlank)),t}}class N{constructor(e){this.context=e,this.styleProcessor=new $(e.fontConfig)}convertText(e,t,n,s={}){let{isColumnChild:r=!1,bold:o,size:l,templatePath:p}=s,{text:a,...c}=e,u=o??c.bold,h=this.context.getTemplateConfig(),f={value:g.parseTemplateData(a,n,t||{},h,this.context.template.lang),...c,...this.styleProcessor.processSize(c,l??"size"),align:this.styleProcessor.processAlign(c.align),bold:g.shouldBold(u,t,"name",n)},x=null;if(p){let b=this.context.createUUIDMapping(p,e,t);b&&(f.templateUUID=b,x=b)}!r&&this.context.type!=="printPic"&&(f={params:f});let d=[{type:"text",...f}];return x&&d[0].params&&(d[0].templateUUID=x),d}convertImage(e,t,n,s=!1,r={}){let{data:o,...l}=e,{templatePath:p}=r;if(!o&&!this.context.enableUUID)return[];let c={value:g.parseTemplateData(o,n,t)?.replace(/^data:image\/[a-zA-Z0-9]+;base64,/,"")||"",align:l.align,weight:l.weight,...l.maxWidth&&{maxWidth:l.maxWidth}},u=null;if(p){let m=this.context.createUUIDMapping(p,e,t);m&&(c.templateUUID=m,u=m)}!s&&this.context.type!=="printPic"&&(c={params:c});let h=[{type:"image",...c}];return u&&h[0].params&&(h[0].templateUUID=u),h}convertStaticImage(e,t,n,s={}){let{url:r,...o}=e,l=g.parseTemplateData(r,n,t);return this.convertImage({data:l,align:o.align},t,n,!1,s)}convertDivider(e,t=null,n={}){let{templatePath:s}=n,r=n.isColumnChild||!1,o={value:D.get(e.style)||"",marginTop:e?.marginTop??3,marginBottom:e?.marginBottom??3},l=null;if(s){let a=this.context.createUUIDMapping(s,e,t);a&&(o.templateUUID=a,l=a)}!r&&this.context.type!=="printPic"&&(o={params:o});let p=[{type:"dividing",...o}];return l&&p[0].params&&(p[0].templateUUID=l),p}convertQrCode(e,t,n,s={},r=!1){let{code:o,...l}=e,p=g.parseTemplateData(o,n,t);return p.match(/^data:image\/png;base64,/)?this.convertImage({data:p,align:l.align,weight:l.weight},t,n,r,s):this.context.type==="printPic"?[{type:"qr",value:p,align:l.align}]:[{type:"qrcode",params:{...l,value:p}}]}convertBarCode(e,t,n,s={}){let{code:r,...o}=e,l=g.parseTemplateData(r,n,t);return this.context.type==="printPic"?[{type:"barcode",value:l,height:10,format:e.symbology,...o}]:[{type:"barcode",params:{...o,value:l,format:e.symbology}}]}}class A{constructor(e,t){this.context=e,this.converter=t}convertColumns(e,t,n,s={}){let{columns:r,level:o,dataKey:l,titleBold:p,bodyBold:a,headerSize:c,bodySize:u,fields:h}=e,m=[];return this.hasColumnTitles(r)&&m.push(this.createColumnHeader(r,t,n,p,c,s,l)),l&&this.context.data[l]&&Array.isArray(this.context.data[l])?this.context.data[l].forEach((f,x)=>{let d={...s,templatePath:s.templatePath?`${s.templatePath}.data[${x}]`:`data[${x}]`};m.push(...this.createColumnRows(r,f,n,o,0,a,u,h,d,l))}):m.push(...this.createColumnRows(r,t,n,o,0,a,u,h,s,l)),m}convertColumnInColumn(e,t,n,s={}){return!e?.columns||!Array.isArray(e.columns)?[]:[{type:"columns",params:{items:this.processNestedColumnItems(e.columns,t,n,s)},...this.context.enableUUID&&s.templatePath?{templateUUID:this.context.createUUIDMapping(s.templatePath,e,t)}:{}}]}hasColumnTitles(e){return e.some(t=>t.title!=null)}createColumnHeader(e,t,n,s,r,o={},l=null){let p=e.filter(a=>a.show!==!1).map(a=>{let{title:c,...u}=a;return{...this.converter.styleProcessor.processSize(u,r),text:c}});return{type:"columns",params:{items:p.reduce((a,c,u)=>{let h={isColumnChild:!0,bold:s,templatePath:o.templatePath?`${o.templatePath}.header[${u}]`:`header[${u}]`};return a.push(...this.converter.convertText(c,t,n,h)),a},[])},...this.context.enableUUID&&o.templatePath?{templateUUID:this.context.createUUIDMapping(`${o.templatePath}.header`,{titles:p},t,l)}:{}}}createColumnRows(e,t,n,s,r,o,l,p=null,a={},c=null){let u=p?.find(v=>v?.dataId===t?.dataId),h=u?.param?.bold??o,m=u?.param?.size??l,f=e.filter(v=>v.show!==!1),x=this.context.getTemplateConfig(),d=f.map(v=>{let I=g.parseTemplateData(v.text,n,t,x,this.context.template.lang),w=I&&I.trim()!=="";return{...v,parsedText:I,hasValue:w}}),b=d.filter(v=>v.hasValue).length,V=d;if(b===1){let v=d.reduce((I,w)=>I+(w.weight||1),0);V=d.map(I=>({...I,weight:I.hasValue?v:0}))}let B=[{type:"columns",params:{items:V.reduce((v,I,w)=>{let O=g.generateIndent(r,w,this.context.columnIndent),R={isColumnChild:!0,bold:h,size:m,templatePath:a.templatePath?`${a.templatePath}.row[${w}]`:`row[${w}]`};return v.push(...this.converter.convertText({...I,text:O+I.parsedText,weight:I.weight},t,n,R)),v},[])},...this.context.enableUUID&&a.templatePath?{templateUUID:this.context.createUUIDMapping(`${a.templatePath}.row`,V,t,c)}:{}}];return s&&Array.isArray(t[s])&&t[s].forEach((v,I)=>{let w={...a,templatePath:a.templatePath?`${a.templatePath}.children[${I}]`:`children[${I}]`};B.push(...this.createColumnRows(e,v,n,s,r+1,o,l,p,w,c))}),B}processNestedColumnItems(e,t,n,s={}){let r=[];for(let o=0;o<e.length;o++){let l=e[o];if(!P.shouldPrint(l,t))continue;let p=this.applyMargins(l),a={...s,templatePath:s.templatePath?`${s.templatePath}.items[${o}]`:`items[${o}]`};switch(p.type){case"text":r.push(...this.converter.convertText(p.param,t,n,{isColumnChild:!0,templatePath:a.templatePath}));break;case"image":r.push(...this.converter.convertImage(p.param,t,n,!0,a));break;case"staticImage":r.push(...this.converter.convertStaticImage(p.param,t,n,a));break;case"divider":r.push(...this.converter.convertDivider(p.param,t,{isColumnChild:!0,templatePath:a.templatePath}));break;case"row":r.push(this.processRowType(p,t,n,a));break;case"column":r.push(...this.convertColumns(p.param,t,n,a));break;case"qr":r.push(...this.converter.convertQrCode(p.param,t,n,a,!0));break;default:console.warn(`Unknown item type in columnInColumn: ${p.type}`)}}return r}processRowType(e,t,n,s={}){if(!e.param?.rows||!Array.isArray(e.param.rows))return null;let r=e.param.rows.map((o,l)=>{let p={...s,templatePath:s.templatePath?`${s.templatePath}.rows[${l}]`:`rows[${l}]`},a=this.processNestedColumnItems([o],t,n,p);return a.length===1&&a[0].type==="columns"?a[0]:{type:"columns",params:{items:a}}});return{type:"rows",weight:e.param.weight||1,items:r,...this.context.enableUUID&&s.templatePath?{templateUUID:this.context.createUUIDMapping(s.templatePath,e.param,t)}:{}}}applyMargins(e){let t=this.converter.styleProcessor.processMargins(e);return{...e,param:{...e.param,...t}}}}class z{constructor(e){this.context=e,this.componentConverter=new N(e),this.columnProcessor=new A(e,this.componentConverter)}processComponent(e,t=""){if(!P.shouldPrint(e,this.context.data))return[];let n=this.applyMargins(e),{param:s,loopKey:r}=n;return r?this.processLoopComponent(n,t):this.processSingleComponent(n,null,t)}processLoopComponent(e,t=""){let n=this.context.data[e.loopKey]||[],s=[];for(let r=0;r<n.length;r++){let o=n[r],l=`${t}.loop[${r}]`,p=this.processSingleComponent({...e,loopKey:void 0},o,l);s.push(...p)}return s}processSingleComponent(e,t=null,n=""){let s=t||this.context.data,{param:r,type:o}=e,l={templatePath:n};switch(o){case"text":return this.componentConverter.convertText(r,s,this.context.lang,l);case"column":return this.columnProcessor.convertColumns(r,s,this.context.lang,l);case"columnInColumn":return this.columnProcessor.convertColumnInColumn(r,s,this.context.lang,l);case"image":return this.componentConverter.convertImage(r,s,this.context.lang,!1,l);case"staticImage":return this.componentConverter.convertStaticImage(r,s,this.context.lang,l);case"divider":return this.componentConverter.convertDivider(r,s,l);case"qr":return this.componentConverter.convertQrCode(r,s,this.context.lang,l);case"brcode":return this.componentConverter.convertBarCode(r,s,this.context.lang,l);case"config":return[];default:return console.warn(`Unknown component type: ${o}`),[]}}wrapWithLineNumber(e){if(!this.context.enableLineNumbers||e.type==="cutPaper"||e.type==="beep"||e.type==="dividing")return e;let n={type:"text",value:`${(this.context.lineNumberCounter++).toString()}`,weight:1,align:0,size:20},s=e.templateUUID;if(e.type==="columns"&&e.params&&e.params.items){if(e.params.items.some(a=>a.type==="rows")){let a=e.params.items[0]?.items??[];if(a.length>0)return a.forEach((c,u)=>{c.params.items.unshift(u===0?n:{type:"text",value:`${(this.context.lineNumberCounter++).toString()}`,weight:1,align:0,size:20})}),e}return{type:"columns",params:{...e.params.marginTop&&{marginTop:e.params.marginTop},items:[n,{type:"rows",weight:9,items:[{type:"columns",params:{items:e.params.items},...s&&{templateUUID:s}}]}]},_isLineNumberWrapped:!0,...s&&{templateUUID:s}}}let r=e.params?e.params.value:e.value,o=r!=null?String(r):"";return{type:"columns",params:{items:[n,{type:e.type,weight:9,...e.params||{},value:o,align:e.params?e.params.align||0:e.align||0,size:e.params?e.params.size||24:e.size||24,bold:e.params?e.params.bold||!1:e.bold||!1,...s&&{templateUUID:s}}]},_isLineNumberWrapped:!0,...s&&{templateUUID:s}}}wrapInstructionsWithLineNumbers(e){return this.context.enableLineNumbers?e.map(t=>this.wrapWithLineNumber(t)):e}applyMargins(e){let t=this.componentConverter.styleProcessor.processMargins(e);return{...e,param:{...e.param,...t}}}addPrintEndCommands(e){e.push({type:"cutPaper",params:{mode:1}}),this.context.enableBuzz&&e.push({type:"beep",params:{beepN:1,beepT:2}})}convert(){if(console.log(`convertTemplate version: ${L}`),!this.context.data||!this.context.template?.list)return[];let e=[];for(let t=0;t<this.context.template.list.length;t++){let n=this.context.template.list[t],s=`list.${t}`,r=this.processComponent(n,s);this.context.enableLineNumbers?e.push(...this.wrapInstructionsWithLineNumbers(r)):e.push(...r)}if(this.context.enableUUID){let t=this.context.getUUIDMappings();e._uuidMappings=t}return console.log("convertResult===",e),this.addPrintEndCommands(e),e}}class k{constructor({type:e,template:t,data:n,langKey:s,options:r={}}){this.type=e,this.data=n,this.template=this.parseTemplate(t),this.lang=this.parseLang(s),this.fontConfig=r.fontSize||T,this.enableBuzz=r.enableBuzz||!1,this.columnIndent=r.columnIndent||"",this.marginLeft=r.marginLeft||0;let o=this.template.list?.find(l=>l.type==="config");this.enableLineNumbers=o?.param?.enableLineNumbers||r.enableLineNumbers||!1,this.lineNumberCounter=1,this.qrCodeGenerator=r.qrCodeGenerator||(typeof max<"u"?max.converter?.qrCode:null),this.enableUUID=r.enableUUID||!1,this.uuidMapping=new Map,this.templateMapping=new Map}generateUUID(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e=="x"?t:t&3|8).toString(16)})}createUUIDMapping(e,t,n=null,s=null){if(!this.enableUUID)return null;if(this.templateMapping.has(e))return this.templateMapping.get(e);let r=n;s&&(e.includes(".row")||e.includes(".header"))&&(r={...n,namespace:s,dataId:n?.dataId||`${s}.row`});let o=this.generateUUID();return this.uuidMapping.set(o,{templatePath:e,component:t,renderData:r,timestamp:Date.now()}),this.templateMapping.set(e,o),o}getUUIDMappings(){return this.enableUUID?{uuidToTemplate:Object.fromEntries(this.uuidMapping),templateToUuid:Object.fromEntries(this.templateMapping)}:null}parseTemplate(e){return{...e,list:typeof e?.list=="string"?JSON.parse(e?.list):e?.list,lang:typeof e?.lang=="string"?JSON.parse(e?.lang):e?.lang}}parseLang(e){let t=e||this.template.defaultLang;if(this.template.lang?.[t])return this.template.lang[t];if(this.template.lang&&t){let s=Object.keys(this.template.lang)?.find(r=>r.toLowerCase().startsWith(t.toLowerCase()+"-"));if(s)return this.template.lang[s]}return this.template.lang}getTemplateConfig(){return this.template.list.find(e=>e.type==="config")}}try{let i=new k({...C,options:y});return new z(i).convert()}catch(i){return console.error("Template conversion failed:",i),[]}finally{console.warn("Template conversion end")}}function F(C,y){function L(i){return(i.params?.value||i.value)==="dot"?["\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014".substring(0,y)]:["----------------------------------------------------------".substring(0,y)]}function T(i){let e=0;for(let t=0;t<i.length;t++){let n=i.charAt(t);/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(n)?e+=2:e+=1}return e}function U(i,e){let t=0,n="";for(let s=0;s<i.length;s++){let r=i.charAt(s),o=/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(r)?2:1;if(t+o>e)break;n+=r,t+=o}return n}function D(i,e){let t=[];return(i!=null?String(i):"").split(/\n/g).forEach(s=>{for(;s.length>0;){let r=U(s,e);t.push(r);let o=0,l=0;for(let p=0;p<s.length;p++){let a=s.charAt(p),c=/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(a)?2:1;if(l+c>e)break;l+=c,o++}s=s.substring(o)}}),t}let g=" ";function P(i,e,t){let n=T(i);if(e<=n)return i;let s=e-n;switch(t){case"right":i=g.substring(0,s)+i;break;case"left":i=i+g.substring(0,s);break;case"center":i=g.substring(0,Math.floor(s/2))+i+g.substring(0,Math.ceil(s/2));break}return i}function $(i,e,t){return D(i,e).map(s=>P(s,e,t==null||t==0?"left":t==2?"right":"center"))}function N(i,e){return $(i.params.value,e,i.params.align)}function A(i){let e=i.params.items.map(a=>{let c=!1,u="";return a.value?(c=a.value.trim()!=="",u=a.value):a.type==="rows"&&(u=z(a).join(` | ||
| `),c=u.trim()!==""),{...a,hasValue:c,textContent:u}}),t=e.filter(a=>a.hasValue).length,n=e;if(t===1){let a=e.reduce((c,u)=>c+(u.weight||1),0);n=e.map(c=>({...c,weight:c.hasValue?a:0}))}let s=n.reduce((a,c)=>a+(c.weight||1),0),r=n.map(a=>Math.floor(y*(a.weight||1)/s));r[r.length-1]+=y-r.reduce((a,c)=>a+c,0);let o=0,l=n.map((a,c)=>{let u;if(a.type==="rows"){let h=z(a);u=h.length>0?h:[""]}else u=$(a.textContent||a.value||"",r[c],a.align);return o=Math.max(o,u.length),u}),p=[];for(let a=0;a<o;a++)p.push(l.reduce((c,u,h)=>c+(u[a]?u[a]:P("",r[h],"left")),""));return p}function z(i){let e=[];return i.items&&Array.isArray(i.items)&&i.items.forEach(t=>{e.push(...k(t))}),e}function k(i){switch(i.type){case"dividing":case"divider":return L(i);case"text":return N(i,y);case"columns":return A(i);case"rows":return z(i);case"cutPaper":return["========== \u5207\u7EB8 =========="];case"beep":return["*** \u8702\u9E23 ***"];case"qrcode":return[`[QR\u7801: ${i.params?.value||"N/A"}]`];case"barcode":return[`[\u6761\u5F62\u7801: ${i.params?.value||"N/A"}]`];case"image":return["[\u56FE\u7247]"];default:return console.warn(`Unknown item type in toStringText: ${i.type}`),[]}}return C.reduce((i,e)=>(i.push(...k(e)),i),[])}import M from"fs";import S from"path";import{execSync as W}from"child_process";function K(C){try{let y=W("adb devices",{encoding:"utf8"});console.log("ADB devices:",y),y.includes(" device")?(W("adb shell mkdir -p /sdcard/MaxFile/test/",{encoding:"utf8"}),console.log("Created directory: /sdcard/MaxFile/test/"),W(`adb push "${C}" /sdcard/MaxFile/test/max.json`,{encoding:"utf8"}),console.log("Successfully pushed printData.json to /sdcard/MaxFile/test/max.json on Android device")):console.log("No Android device connected. Skipping file push.")}catch(y){console.error("Error pushing file to Android device:",y.message)}}async function Y(C,y,L={}){let T=await E({type:"print",template:C,data:y,langKey:"zh-CN"},{...C.options,...L}),U=S.join(process.cwd(),"output");M.existsSync(U)||M.mkdirSync(U,{recursive:!0});let D=S.join(U,"printData.json");M.writeFileSync(D,JSON.stringify(T,null,2),"utf8"),console.log(`PrintData saved to: ${D}`);let g=S.join(U,"template.json");C.data=y,M.writeFileSync(g,JSON.stringify(C,null,2),"utf8"),console.log(`Template saved to: ${g}`);let P=S.join(S.dirname(import.meta.url.replace("file://","")),"convertTemplate.mjs"),$=S.join(U,"convertTemplate.js");M.existsSync(P)&&(M.copyFileSync(P,$),console.log(`ConvertTemplate saved to: ${$}`)),K(D);let N=F(T,60).join(` | ||
| function E(b,y={}){let L="2.2.4",P={small:20,middle:24,large:28,extraLarge:32,xxl:36,xxxl:64},U={s:"small",m:"middle",l:"large",xl:"extraLarge",xxl:"xxl",xxxl:"xxxl"},D=new Map([[0,""],[1,"stroke"],[2,"dot"]]);class g{static getFontSize(e,t){let n=U[t]||"middle";return e[n]||P[n]}static parseTemplateData(e,t,n,s,r=null){if(!e||typeof e!="string")return"";if(!/\{\{/.test(e))return e;let o=e,l=o.match(/{{[a-zA-Z0-9\.]+}}/g);l&&l.forEach(a=>{let c=a.replace(/^\{\{|\}\}$/g,""),{supported:u=[],supportedIds:m=[]}=s?.param?.multiLanguage??{};if(s?.param?.enableMultiLanguage===!0&&m.includes(a)&&r){let[h,f]=u,x=r[h]?.[c],d=r[f]?.[c],C=`${x!==null&&["string","number"].includes(typeof x)?x:""}${d!==null&&["string","number"].includes(typeof d)?`(${d})`:""}`;o=o.replaceAll(a,C)}else{let h=this.getNestedValue(n,c),f=h!=null&&["string","number"].includes(typeof h)?h:"";o=o.replaceAll(a,f)}});let p=o.match(/{{[a-zA-Z0-9\-]+\|l}}/g);return p&&p.forEach(a=>{let c=a.replace(/^\{\{|\|l\}\}$/g,""),{supported:u=[],supportedIds:m=[]}=s?.param?.multiLanguage??{};if(s?.param?.enableMultiLanguage===!0&&m.includes(a)&&r){let[h,f]=u,x=r[h]?.[c],d=r[f]?.[c],C=`${x!==null&&["string","number"].includes(typeof x)?x:""}${d!==null&&["string","number"].includes(typeof d)?`(${d})`:""}`;o=o.replaceAll(a,C)}else{let h=t?.[c],f=h!=null&&["string","number"].includes(typeof h)?h:"";o=o.replaceAll(a,f)}}),o}static getNestedValue(e,t){return typeof e=="string"?e:t.split(".").reduce((n,s)=>n?.[s],e)}static shouldBold(e,t,n,s){return!!e}static generateIndent(e,t,n){if(t!==0)return"";let s="----------------".substring(0,e);return n!==2?s.replace(/\-/g," "):s}}class T{static shouldPrint(e,t){return!(e.show===!1||!this.checkHideFields(e,t)||!this.checkExcludeFields(e,t))}static checkHideFields(e,t){return e.hideFields?e.hideFields.some(s=>{let r=t[s];return r&&(!Array.isArray(r)||r.length>0)}):!0}static checkExcludeFields(e,t){return e.excludeFields?!e.excludeFields.some(s=>{let r=t[s];return r&&(!Array.isArray(r)||r.length>0)}):!0}}class ${constructor(e){this.fontConfig=e}processSize(e,t){let n=t==="size"?e[t]:t,s=n;if(typeof n=="string"&&!/^\d+$/.test(n)){let r=U[n]||n;s=this.fontConfig[r]||P[r]}return{...e,size:Number(s)||24}}processAlign(e){return e!==void 0?e:0}processMargins(e){let t={};return e.type==="divider"?(t.marginTop=e.upline??3,t.marginBottom=e.bottomBlank??3):(e.upline!==void 0&&(t.marginTop=e.upline),e.bottomBlank!==void 0&&(t.marginBottom=e.bottomBlank)),t}}class N{constructor(e){this.context=e,this.styleProcessor=new $(e.fontConfig)}convertText(e,t,n,s={}){let{isColumnChild:r=!1,bold:o,size:l,templatePath:p}=s,{text:a,...c}=e,u=o??c.bold,m=this.context.getTemplateConfig(),f={value:g.parseTemplateData(a,n,t||{},m,this.context.template.lang),...c,...this.styleProcessor.processSize(c,l??"size"),align:this.styleProcessor.processAlign(c.align),bold:g.shouldBold(u,t,"name",n)},x=null;if(p){let C=this.context.createUUIDMapping(p,e,t);C&&(f.templateUUID=C,x=C)}!r&&this.context.type!=="printPic"&&(f={params:f});let d=[{type:"text",...f}];return x&&d[0].params&&(d[0].templateUUID=x),d}convertImage(e,t,n,s=!1,r={}){let{data:o,...l}=e,{templatePath:p}=r;if(!o&&!this.context.enableUUID)return[];let c={value:g.parseTemplateData(o,n,t)?.replace(/^data:image\/[a-zA-Z0-9]+;base64,/,"")||"",align:l.align,weight:l.weight,compress:l.compress??!0,...l.maxWidth&&{maxWidth:l.maxWidth}},u=null;if(p){let h=this.context.createUUIDMapping(p,e,t);h&&(c.templateUUID=h,u=h)}!s&&this.context.type!=="printPic"&&(c={params:c});let m=[{type:"image",...c}];return u&&m[0].params&&(m[0].templateUUID=u),m}convertStaticImage(e,t,n,s={}){let{url:r,...o}=e,l=g.parseTemplateData(r,n,t);return this.convertImage({data:l,align:o.align},t,n,!1,s)}convertDivider(e,t=null,n={}){let{templatePath:s}=n,r=n.isColumnChild||!1,o={value:D.get(e.style)||"",marginTop:e?.marginTop??3,marginBottom:e?.marginBottom??3},l=null;if(s){let a=this.context.createUUIDMapping(s,e,t);a&&(o.templateUUID=a,l=a)}!r&&this.context.type!=="printPic"&&(o={params:o});let p=[{type:"dividing",...o}];return l&&p[0].params&&(p[0].templateUUID=l),p}convertQrCode(e,t,n,s={},r=!1){let{code:o,...l}=e,p=g.parseTemplateData(o,n,t);return p.match(/^data:image\/[a-zA-Z0-9]+;base64,/)?this.convertImage({data:p,align:l.align,weight:l.weight},t,n,r,s):this.context.type==="printPic"?[{type:"qr",value:p,align:l.align}]:[{type:"qrcode",params:{...l,value:p}}]}convertBarCode(e,t,n,s={}){let{code:r,...o}=e,l=g.parseTemplateData(r,n,t);return this.context.type==="printPic"?[{type:"barcode",value:l,height:10,format:e.symbology,...o}]:[{type:"barcode",params:{...o,value:l,format:e.symbology}}]}}class A{constructor(e,t){this.context=e,this.converter=t}convertColumns(e,t,n,s={}){let{columns:r,level:o,dataKey:l,titleBold:p,bodyBold:a,headerSize:c,bodySize:u,fields:m}=e,h=[];return this.hasColumnTitles(r)&&h.push(this.createColumnHeader(r,t,n,p,c,s,l)),l&&this.context.data[l]&&Array.isArray(this.context.data[l])?this.context.data[l].forEach((f,x)=>{let d={...s,templatePath:s.templatePath?`${s.templatePath}.data[${x}]`:`data[${x}]`};h.push(...this.createColumnRows(r,f,n,o,0,a,u,m,d,l))}):h.push(...this.createColumnRows(r,t,n,o,0,a,u,m,s,l)),h}convertColumnInColumn(e,t,n,s={}){return!e?.columns||!Array.isArray(e.columns)?[]:[{type:"columns",params:{items:this.processNestedColumnItems(e.columns,t,n,s)},...this.context.enableUUID&&s.templatePath?{templateUUID:this.context.createUUIDMapping(s.templatePath,e,t)}:{}}]}hasColumnTitles(e){return e.some(t=>t.title!=null)}createColumnHeader(e,t,n,s,r,o={},l=null){let p=e.filter(a=>a.show!==!1).map(a=>{let{title:c,...u}=a;return{...this.converter.styleProcessor.processSize(u,r),text:c}});return{type:"columns",params:{items:p.reduce((a,c,u)=>{let m={isColumnChild:!0,bold:s,templatePath:o.templatePath?`${o.templatePath}.header[${u}]`:`header[${u}]`};return a.push(...this.converter.convertText(c,t,n,m)),a},[])},...this.context.enableUUID&&o.templatePath?{templateUUID:this.context.createUUIDMapping(`${o.templatePath}.header`,{titles:p},t,l)}:{}}}createColumnRows(e,t,n,s,r,o,l,p=null,a={},c=null){let u=p?.find(v=>v?.dataId===t?.dataId),m=u?.param?.bold??o,h=u?.param?.size??l,f=e.filter(v=>v.show!==!1),x=this.context.getTemplateConfig(),d=f.map(v=>{let I=g.parseTemplateData(v.text,n,t,x,this.context.template.lang),w=I&&I.trim()!=="";return{...v,parsedText:I,hasValue:w}}),C=d.filter(v=>v.hasValue).length,V=d;if(C===1){let v=d.reduce((I,w)=>I+(w.weight||1),0);V=d.map(I=>({...I,weight:I.hasValue?v:0}))}let B=[{type:"columns",params:{items:V.reduce((v,I,w)=>{let O=g.generateIndent(r,w,this.context.columnIndent),R={isColumnChild:!0,bold:m,size:h,templatePath:a.templatePath?`${a.templatePath}.row[${w}]`:`row[${w}]`};return v.push(...this.converter.convertText({...I,text:O+I.parsedText,weight:I.weight},t,n,R)),v},[])},...this.context.enableUUID&&a.templatePath?{templateUUID:this.context.createUUIDMapping(`${a.templatePath}.row`,V,t,c)}:{}}];return s&&Array.isArray(t[s])&&t[s].forEach((v,I)=>{let w={...a,templatePath:a.templatePath?`${a.templatePath}.children[${I}]`:`children[${I}]`};B.push(...this.createColumnRows(e,v,n,s,r+1,o,l,p,w,c))}),B}processNestedColumnItems(e,t,n,s={}){let r=[];for(let o=0;o<e.length;o++){let l=e[o];if(!T.shouldPrint(l,t))continue;let p=this.applyMargins(l),a={...s,templatePath:s.templatePath?`${s.templatePath}.items[${o}]`:`items[${o}]`};switch(p.type){case"text":r.push(...this.converter.convertText(p.param,t,n,{isColumnChild:!0,templatePath:a.templatePath}));break;case"image":r.push(...this.converter.convertImage(p.param,t,n,!0,a));break;case"staticImage":r.push(...this.converter.convertStaticImage(p.param,t,n,a));break;case"divider":r.push(...this.converter.convertDivider(p.param,t,{isColumnChild:!0,templatePath:a.templatePath}));break;case"row":r.push(this.processRowType(p,t,n,a));break;case"column":r.push(...this.convertColumns(p.param,t,n,a));break;case"qr":r.push(...this.converter.convertQrCode(p.param,t,n,a,!0));break;default:console.warn(`Unknown item type in columnInColumn: ${p.type}`)}}return r}processRowType(e,t,n,s={}){if(!e.param?.rows||!Array.isArray(e.param.rows))return null;let r=e.param.rows.map((o,l)=>{let p={...s,templatePath:s.templatePath?`${s.templatePath}.rows[${l}]`:`rows[${l}]`},a=this.processNestedColumnItems([o],t,n,p);return a.length===1&&a[0].type==="columns"?a[0]:{type:"columns",params:{items:a}}});return{type:"rows",weight:e.param.weight||1,items:r,...this.context.enableUUID&&s.templatePath?{templateUUID:this.context.createUUIDMapping(s.templatePath,e.param,t)}:{}}}applyMargins(e){let t=this.converter.styleProcessor.processMargins(e);return{...e,param:{...e.param,...t}}}}class z{constructor(e){this.context=e,this.componentConverter=new N(e),this.columnProcessor=new A(e,this.componentConverter)}processComponent(e,t=""){if(!T.shouldPrint(e,this.context.data))return[];let n=this.applyMargins(e),{param:s,loopKey:r}=n;return r?this.processLoopComponent(n,t):this.processSingleComponent(n,null,t)}processLoopComponent(e,t=""){let n=this.context.data[e.loopKey]||[],s=[];for(let r=0;r<n.length;r++){let o=n[r],l=`${t}.loop[${r}]`,p=this.processSingleComponent({...e,loopKey:void 0},o,l);s.push(...p)}return s}processSingleComponent(e,t=null,n=""){let s=t||this.context.data,{param:r,type:o}=e,l={templatePath:n};switch(o){case"text":return this.componentConverter.convertText(r,s,this.context.lang,l);case"column":return this.columnProcessor.convertColumns(r,s,this.context.lang,l);case"columnInColumn":return this.columnProcessor.convertColumnInColumn(r,s,this.context.lang,l);case"image":return this.componentConverter.convertImage(r,s,this.context.lang,!1,l);case"staticImage":return this.componentConverter.convertStaticImage(r,s,this.context.lang,l);case"divider":return this.componentConverter.convertDivider(r,s,l);case"qr":return this.componentConverter.convertQrCode(r,s,this.context.lang,l);case"brcode":return this.componentConverter.convertBarCode(r,s,this.context.lang,l);case"config":return[];default:return console.warn(`Unknown component type: ${o}`),[]}}wrapWithLineNumber(e){if(!this.context.enableLineNumbers||e.type==="cutPaper"||e.type==="beep"||e.type==="dividing")return e;let n={type:"text",value:`${(this.context.lineNumberCounter++).toString()}`,weight:1,align:0,size:20},s=e.templateUUID;if(e.type==="columns"&&e.params&&e.params.items){if(e.params.items.some(a=>a.type==="rows")){let a=e.params.items[0]?.items??[];if(a.length>0)return a.forEach((c,u)=>{let m=c.params.items[0];m.type==="cutPaper"||m.type==="beep"||m.type==="dividing"||c.params.items.unshift(u===0?n:{type:"text",value:`${(this.context.lineNumberCounter++).toString()}`,weight:1,align:0,size:20})}),e}return{type:"columns",params:{...e.params.marginTop&&{marginTop:e.params.marginTop},items:[n,{type:"rows",weight:9,items:[{type:"columns",params:{items:e.params.items},...s&&{templateUUID:s}}]}]},_isLineNumberWrapped:!0,...s&&{templateUUID:s}}}let r=e.params?e.params.value:e.value,o=r!=null?String(r):"";return{type:"columns",params:{items:[n,{type:e.type,weight:9,...e.params||{},value:o,align:e.params?e.params.align||0:e.align||0,size:e.params?e.params.size||24:e.size||24,bold:e.params?e.params.bold||!1:e.bold||!1,...s&&{templateUUID:s}}]},_isLineNumberWrapped:!0,...s&&{templateUUID:s}}}wrapInstructionsWithLineNumbers(e){return this.context.enableLineNumbers?e.map(t=>this.wrapWithLineNumber(t)):e}applyMargins(e){let t=this.componentConverter.styleProcessor.processMargins(e);return{...e,param:{...e.param,...t}}}addPrintEndCommands(e){e.push({type:"cutPaper",params:{mode:1}}),this.context.enableBuzz&&e.push({type:"beep",params:{beepN:1,beepT:2}})}convert(){if(console.log(`convertTemplate version: ${L}`),!this.context.data||!this.context.template?.list)return[];let e=[];for(let t=0;t<this.context.template.list.length;t++){let n=this.context.template.list[t],s=`list.${t}`,r=this.processComponent(n,s);this.context.enableLineNumbers?e.push(...this.wrapInstructionsWithLineNumbers(r)):e.push(...r)}if(this.context.enableUUID){let t=this.context.getUUIDMappings();e._uuidMappings=t}return console.log("convertResult===",e),this.addPrintEndCommands(e),e}}class k{constructor({type:e,template:t,data:n,langKey:s,options:r={}}){this.type=e,this.data=n,this.template=this.parseTemplate(t),this.lang=this.parseLang(s),this.fontConfig=r.fontSize||P,this.enableBuzz=r.enableBuzz||!1,this.columnIndent=r.columnIndent||"",this.marginLeft=r.marginLeft||0;let o=this.template.list?.find(l=>l.type==="config");this.enableLineNumbers=o?.param?.enableLineNumbers||r.enableLineNumbers||!1,this.lineNumberCounter=1,this.qrCodeGenerator=r.qrCodeGenerator||(typeof max<"u"?max.converter?.qrCode:null),this.enableUUID=r.enableUUID||!1,this.uuidMapping=new Map,this.templateMapping=new Map}generateUUID(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){let t=Math.random()*16|0;return(e=="x"?t:t&3|8).toString(16)})}createUUIDMapping(e,t,n=null,s=null){if(!this.enableUUID)return null;if(this.templateMapping.has(e))return this.templateMapping.get(e);let r=n;s&&(e.includes(".row")||e.includes(".header"))&&(r={...n,namespace:s,dataId:n?.dataId||`${s}.row`});let o=this.generateUUID();return this.uuidMapping.set(o,{templatePath:e,component:t,renderData:r,timestamp:Date.now()}),this.templateMapping.set(e,o),o}getUUIDMappings(){return this.enableUUID?{uuidToTemplate:Object.fromEntries(this.uuidMapping),templateToUuid:Object.fromEntries(this.templateMapping)}:null}parseTemplate(e){return{...e,list:typeof e?.list=="string"?JSON.parse(e?.list):e?.list,lang:typeof e?.lang=="string"?JSON.parse(e?.lang):e?.lang}}parseLang(e){let t=e||this.template.defaultLang;if(this.template.lang?.[t])return this.template.lang[t];if(this.template.lang&&t){let s=Object.keys(this.template.lang)?.find(r=>r.toLowerCase().startsWith(t.toLowerCase()+"-"));if(s)return this.template.lang[s]}return this.template.lang}getTemplateConfig(){return this.template.list.find(e=>e.type==="config")}}try{let i=new k({...b,options:y});return new z(i).convert()}catch(i){return console.error("Template conversion failed:",i),[]}finally{console.warn("Template conversion end")}}function F(b,y){function L(i){return(i.params?.value||i.value)==="dot"?["\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014\u2014".substring(0,y)]:["----------------------------------------------------------".substring(0,y)]}function P(i){let e=0;for(let t=0;t<i.length;t++){let n=i.charAt(t);/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(n)?e+=2:e+=1}return e}function U(i,e){let t=0,n="";for(let s=0;s<i.length;s++){let r=i.charAt(s),o=/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(r)?2:1;if(t+o>e)break;n+=r,t+=o}return n}function D(i,e){let t=[];return(i!=null?String(i):"").split(/\n/g).forEach(s=>{for(;s.length>0;){let r=U(s,e);t.push(r);let o=0,l=0;for(let p=0;p<s.length;p++){let a=s.charAt(p),c=/[\u4e00-\u9fff\u3400-\u4dbf\uf900-\ufaff]/.test(a)?2:1;if(l+c>e)break;l+=c,o++}s=s.substring(o)}}),t}let g=" ";function T(i,e,t){let n=P(i);if(e<=n)return i;let s=e-n;switch(t){case"right":i=g.substring(0,s)+i;break;case"left":i=i+g.substring(0,s);break;case"center":i=g.substring(0,Math.floor(s/2))+i+g.substring(0,Math.ceil(s/2));break}return i}function $(i,e,t){return D(i,e).map(s=>T(s,e,t==null||t==0?"left":t==2?"right":"center"))}function N(i,e){return $(i.params.value,e,i.params.align)}function A(i){let e=i.params.items.map(a=>{let c=!1,u="";return a.value?(c=a.value.trim()!=="",u=a.value):a.type==="rows"&&(u=z(a).join(` | ||
| `),c=u.trim()!==""),{...a,hasValue:c,textContent:u}}),t=e.filter(a=>a.hasValue).length,n=e;if(t===1){let a=e.reduce((c,u)=>c+(u.weight||1),0);n=e.map(c=>({...c,weight:c.hasValue?a:0}))}let s=n.reduce((a,c)=>a+(c.weight||1),0),r=n.map(a=>Math.floor(y*(a.weight||1)/s));r[r.length-1]+=y-r.reduce((a,c)=>a+c,0);let o=0,l=n.map((a,c)=>{let u;if(a.type==="rows"){let m=z(a);u=m.length>0?m:[""]}else u=$(a.textContent||a.value||"",r[c],a.align);return o=Math.max(o,u.length),u}),p=[];for(let a=0;a<o;a++)p.push(l.reduce((c,u,m)=>c+(u[a]?u[a]:T("",r[m],"left")),""));return p}function z(i){let e=[];return i.items&&Array.isArray(i.items)&&i.items.forEach(t=>{e.push(...k(t))}),e}function k(i){switch(i.type){case"dividing":case"divider":return L(i);case"text":return N(i,y);case"columns":return A(i);case"rows":return z(i);case"cutPaper":return["========== \u5207\u7EB8 =========="];case"beep":return["*** \u8702\u9E23 ***"];case"qrcode":return[`[QR\u7801: ${i.params?.value||"N/A"}]`];case"barcode":return[`[\u6761\u5F62\u7801: ${i.params?.value||"N/A"}]`];case"image":return["[\u56FE\u7247]"];default:return console.warn(`Unknown item type in toStringText: ${i.type}`),[]}}return b.reduce((i,e)=>(i.push(...k(e)),i),[])}import M from"fs";import S from"path";import{execSync as W}from"child_process";function K(b){try{let y=W("adb devices",{encoding:"utf8"});console.log("ADB devices:",y),y.includes(" device")?(W("adb shell mkdir -p /sdcard/MaxFile/test/",{encoding:"utf8"}),console.log("Created directory: /sdcard/MaxFile/test/"),W(`adb push "${b}" /sdcard/MaxFile/test/max.json`,{encoding:"utf8"}),console.log("Successfully pushed printData.json to /sdcard/MaxFile/test/max.json on Android device")):console.log("No Android device connected. Skipping file push.")}catch(y){console.error("Error pushing file to Android device:",y.message)}}async function Y(b,y,L={}){let P=await E({type:"print",template:b,data:y,langKey:"zh-CN"},{...b.options,...L}),U=S.join(process.cwd(),"output");M.existsSync(U)||M.mkdirSync(U,{recursive:!0});let D=S.join(U,"printData.json");M.writeFileSync(D,JSON.stringify(P,null,2),"utf8"),console.log(`PrintData saved to: ${D}`);let g=S.join(U,"template.json");b.data=y,M.writeFileSync(g,JSON.stringify(b,null,2),"utf8"),console.log(`Template saved to: ${g}`);let T=S.join(S.dirname(import.meta.url.replace("file://","")),"convertTemplate.mjs"),$=S.join(U,"convertTemplate.js");M.existsSync(T)&&(M.copyFileSync(T,$),console.log(`ConvertTemplate saved to: ${$}`)),K(D);let N=F(P,60).join(` | ||
| `),A=S.join(U,"receipt.txt");M.writeFileSync(A,N,"utf8"),console.log(`Receipt text saved to: ${A}`),console.log(` | ||
| --- Receipt Preview ---`),console.log(N)}export{E as convertTemplate,Y as print,K as sendToPrinter}; |
+1
-1
| { | ||
| "name": "@sunmi/max-print", | ||
| "version": "2.2.2", | ||
| "version": "2.2.3", | ||
| "type": "module", | ||
@@ -5,0 +5,0 @@ "description": "Max print utility package", |
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
69841
0.84%1215
0.58%1
-50%