@agile-team/mach-report 1.2.1 → 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/README.md +86 -255
- package/dist/ReportPreview-Cr0IH1Rz.cjs +6 -0
- package/dist/ReportPreview-DwknBgsJ.js +1266 -0
- package/dist/defaults.d.ts +3 -7
- package/dist/format.d.ts +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.d.cts +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +621 -758
- package/dist/layout/textwrap.d.ts +1 -1
- package/dist/pdf.cjs +1 -1
- package/dist/pdf.js +1 -1
- package/dist/plugin-Cj3c2wJc.cjs +1 -0
- package/dist/plugin-DJf_6_fl.js +18 -0
- package/dist/schema/render-plan.d.ts +1 -9
- package/dist/sql/expr.d.ts +3 -3
- package/dist/sql.d.cts +1 -1
- package/dist/sql.d.ts +1 -1
- package/dist/style-CFZ-HE2s.cjs +3 -0
- package/dist/{style-6ihHKVCM.js → style-DnmtG7Gl.js} +69 -81
- package/dist/style.css +1 -1
- package/dist/vue/ReportPreview.d.ts +3 -12
- package/dist/vue/adapters.d.ts +6 -12
- package/dist/vue/async.d.cts +7 -22
- package/dist/vue/async.d.ts +7 -22
- package/dist/vue/local-adapter.d.ts +1 -2
- package/dist/vue/plugin.d.ts +12 -34
- package/dist/vue-async.cjs +1 -1
- package/dist/vue-async.js +6 -6
- package/dist/vue.cjs +1 -1
- package/dist/vue.js +48 -48
- package/package.json +2 -12
- package/dist/ReportPreview-CJLvkTVn.cjs +0 -6
- package/dist/ReportPreview-mZiGtf0L.js +0 -1231
- package/dist/compat/jh4j-template.d.ts +0 -12
- package/dist/manager/api.d.ts +0 -45
- package/dist/manager/index.d.ts +0 -2
- package/dist/manager/types.d.ts +0 -50
- package/dist/manager.cjs +0 -1
- package/dist/manager.d.cts +0 -5
- package/dist/manager.d.ts +0 -5
- package/dist/manager.js +0 -104
- package/dist/plugin-C4qpbdMJ.cjs +0 -1
- package/dist/plugin-DcmAPK_K.js +0 -85
- package/dist/style-Xq08-IsV.cjs +0 -3
package/dist/defaults.d.ts
CHANGED
|
@@ -9,19 +9,15 @@
|
|
|
9
9
|
* 历史:这些值曾散落在 paginate/canvas/pdf/dom 四个文件中各写一份,
|
|
10
10
|
* 是三后端漂移的温床,收敛于此。
|
|
11
11
|
*/
|
|
12
|
-
/** 默认行高倍数(基线距 = 字号 ×
|
|
12
|
+
/** 默认行高倍数(基线距 = 字号 × 该系数) */
|
|
13
13
|
export declare const LINE_HEIGHT = 1.35;
|
|
14
|
-
/** 默认字号(pt
|
|
14
|
+
/** 默认字号(pt) */
|
|
15
15
|
export declare const DEFAULT_FONT_PT = 10.5;
|
|
16
16
|
/** 默认边框线宽(pt) */
|
|
17
17
|
export declare const DEFAULT_BORDER_PT = 0.75;
|
|
18
|
-
/**
|
|
18
|
+
/** 默认描边色 */
|
|
19
19
|
export declare const DEFAULT_STROKE_COLOR = "#333333";
|
|
20
20
|
/** 默认文本色 */
|
|
21
21
|
export declare const DEFAULT_TEXT_COLOR = "#000000";
|
|
22
22
|
/** RenderPlan 正式 schema 版本(core 分页引擎产出) */
|
|
23
23
|
export declare const SCHEMA_VERSION_MACH = "1.0.0-mach";
|
|
24
|
-
/** 本地渲染适配器产出版本标识(vue/createLocalFetcher) */
|
|
25
|
-
export declare const SCHEMA_VERSION_LOCAL = "mach-local";
|
|
26
|
-
/** jh4j gridPlan 兼容数据标识(vue/createJh4jGridPlanFetcher) */
|
|
27
|
-
export declare const SCHEMA_VERSION_JH4J = "jh4j-compatible";
|
package/dist/format.d.ts
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./style-Xq08-IsV.cjs"),ce=require("./grid-geometry-BXpOxznT.cjs");function me(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const r=new Date(e);return Number.isNaN(r.getTime())?null:r}function K(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function ke(e,t){const r=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,r(e.getMonth()+1)).replace(/DD/g,r(e.getDate())).replace(/hh/g,r(e.getHours())).replace(/mm/g,r(e.getMinutes())).replace(/ss/g,r(e.getSeconds()))}function Ae(e,t,r){return r!=null?t?K(e,r):e.toFixed(r):t?K(e):String(e)}function Y(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function X(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const r=Y(e);return r==null?String(e):Ae(r,t.thousands===!0,t.digits)}case"percent":{const r=Y(e);return r==null?String(e):`${K(r*100,t.digits??2)}%`}case"date":{const r=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:me(String(e));return n?ke(n,r):String(e)}default:return String(e)}}function he(e,t){const r=e[t.field];if(r==null||r==="")return!1;if(typeof t.value=="number"){const a=Y(r);if(a==null)return!1;switch(t.op){case">":return a>t.value;case">=":return a>=t.value;case"<":return a<t.value;case"<=":return a<=t.value;case"==":return a===t.value;case"!=":return a!==t.value}}const n=String(r),o=String(t.value);switch(t.op){case"==":return n===o;case"!=":return n!==o;case">":return n>o;case">=":return n>=o;case"<":return n<o;case"<=":return n<=o}return!1}const Re=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function W(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function He(e,t,r,n){const o=e[t];o!=null&&(typeof o!="number"||!Number.isFinite(o))&&n.push({path:`${r}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(o)}`})}function Z(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"组件应为对象"});return}const o=e.kind;typeof o!="string"?r.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):Re.has(o)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(o)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])He(e,i,t,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const a=e.grid;a!==void 0&&(!W(a)||!Array.isArray(a.cells)?r.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):a.cells.forEach((i,d)=>{if(!Array.isArray(i)){r.push({path:`${t}.grid.cells.${d}`,message:"行应为数组"});return}i.forEach((m,h)=>{m!=null&&W(m)&&Array.isArray(m.children)&&m.children.forEach((g,l)=>{Z(g,`${t}.grid.cells.${d}.${h}.children.${l}`,r,n)})})}));const s=e.richParagraphs;s!==void 0&&(Array.isArray(s)?s.forEach((i,d)=>{(!W(i)||!Array.isArray(i.segments))&&r.push({path:`${t}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):r.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ge(e,t,r,n=[]){if(!W(e)){r.push({path:t,message:"页应为对象"});return}const o=e.pageWidthMm,a=e.pageHeightMm;(typeof o!="number"||!(o>0&&o<3e3))&&r.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(o)}`}),(typeof a!="number"||!(a>0&&a<5e3))&&r.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(a)}`});const s=e.components;s!==void 0&&!Array.isArray(s)?r.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(s)&&s.forEach((i,d)=>Z(i,`${t}.components.${d}`,r,n))}function fe(e){const t=[],r=[],n=W(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((a,s)=>ge(a,`$.pages.${s}`,t,r)),n.length>2e3&&r.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const o=n.reduce((a,s)=>a+(W(s)&&Array.isArray(s.components)?s.components.length:0),0);o>5e4&&r.push({path:"$.pages",message:`组件总数异常大(${o} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:r}}function Ne(e){const t=fe(e);if(!t.ok){const r=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${r}`)}return e.pages}function ae(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function $e(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function Le(e,t){const n=(e.fontSizePt??c.DEFAULT_FONT_PT)*c.LINE_HEIGHT*25.4/72,o=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+o)}function ue(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function _e(e,t){const r=e.fontSizePt??c.DEFAULT_FONT_PT,n=e.paddingMm??1,o=e.columns.map(l=>l.style?{align:"left",verticalAlign:"middle",...l.style}:{align:"left",verticalAlign:"middle"}),a=e.columns.map(l=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...l.style||{}})),s=e.columns.map(l=>l.header),i=s.map((l,u)=>c.wrapText(l,e.columns[u].widthMm-n*2,{fontSizePt:r,bold:e.headerBold??!0},t)),d=Math.max(...i.map(l=>l.length),1),m=Le(e,d),h=s.map((l,u)=>({text:l,style:a[u]})),g=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:n,cellStyles:o,borderStyle:g,headerHeightMm:m,headerGrid:{cells:[h],rowHeightsMm:[m]},columns:e.columns}}function le(e,t,r){const n=e.columns,o=new Array(n.length);let a=1;for(let h=0;h<n.length;h++){const g=n[h];o[h]=g.format?X(t[g.field],g.format):ue(t[g.field])}const s=new Array(n.length);for(let h=0;h<n.length;h++){const g=c.wrapText(o[h],n[h].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);s[h]=g,g.length>a&&(a=g.length)}const i=e.fontSizePt*c.LINE_HEIGHT*25.4/72,d=Math.max(e.rowHeightFloorMm,a*i+e.paddingMm*2),m=new Array(n.length);for(let h=0;h<n.length;h++){const g=n[h];let l=e.cellStyles[h];if(g.rules){for(const u of g.rules)if(he(t,u.when)){l={...l??{},...u.style};break}}m[h]={text:o[h],style:l}}return{grid:{cells:[m],rowHeightsMm:[d]},heightMm:d}}function Be(e,t,r={}){const n=typeof r=="number"?{mmPerRow:r}:r,o=n.mmPerRow??0,a=n.measurer??c.heuristicMeasurer,s=[],i=[];let d=0;const m=g=>`${g}_${(++d).toString(36)}`,h=[];for(const g of e.pages){const l=ae(g),u=()=>$e(g,l),f=l.marginTopMm,T=[],R=()=>{if(i.push({pageWidthMm:l.widthMm,pageHeightMm:l.heightMm,marginTopMm:l.marginTopMm,marginBottomMm:l.marginBottomMm,marginLeftMm:l.marginLeftMm,marginRightMm:l.marginRightMm,components:l.components}),T.length>0){const v=i.length;for(const S of T){const C={...S,text:String(S.text??"").replace(/\{page\}/g,String(v))};i[i.length-1].components.push(C),C.text.includes("{totalPages}")&&h.push(C)}}};for(const v of g.components){if(v.kind!=="list"){if(v.kind==="text"&&typeof v.text=="string"){const M=v.text;if(M.includes("{page}")||M.includes("{totalPages}")){T.push(v);continue}}l.components.push(v);continue}const S=v,C=t[S.dataset];Array.isArray(C)||s.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const w=Array.isArray(C)?C:[],V=S.columns.reduce((M,b)=>M+b.widthMm,0),U=V>S.widthMm?S.widthMm/V:1,x=U===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*U}))},H={..._e(x,a),rowHeightFloorMm:x.rowHeightMm??0},j={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:H.headerHeightMm,grid:H.headerGrid,nid:m("listh"),style:H.borderStyle};let p=S.topMm;const N=(M,b)=>{M.components.push({...j,topMm:b})};N(l,p),p+=H.headerHeightMm+o;const B=M=>{if(p+M>u()){R();const b=ae(g);l.components=b.components,l.heightMm=b.heightMm,x.headerEveryPage!==!1?(N(l,S.topMm),p=S.topMm+H.headerHeightMm):p=f}},y=(M,b,P)=>{B(b),l.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:m(P),style:H.borderStyle}),p+=b},$=()=>le(H,{},a).heightMm,k=(M,b,P,E)=>{const I=[],ie=Math.max(1,Math.min(E,x.columns.length));I.push({text:M,colSpan:ie,style:{bold:!0,...P}});for(let q=ie;q<x.columns.length;q++){const Ce=x.columns[q];I.push({text:b.get(Ce.field)??"",style:P})}const Ee=H.fontSizePt*c.LINE_HEIGHT*25.4/72,se=Math.max(H.rowHeightFloorMm,Ee+H.paddingMm*2);return{grid:{cells:[I],rowHeightsMm:[se]},heightMm:se}},D=(M,b)=>{let P=0;for(const E of M){const I=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(I)&&(P+=I)}return P},J=(M,b)=>{const P=x.columns.find(E=>E.field===b);return X(D(M,b),P?.format??{kind:"number",thousands:!0})},F=x.groupBy,xe=typeof x.grandTotal=="object"&&x.grandTotal.fields||F?.subtotal||[],ne=x.columns.findIndex(M=>xe.includes(M.field)),re=ne>0?ne:1,G=[];if(F){const M=new Map;for(const b of w){const P=ue(b[F.field]),E=M.get(P);E?E.push(b):M.set(P,[b])}for(const[b,P]of M){G.push({kind:"groupHeader",label:(F.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of P)G.push({kind:"row",row:E});F.subtotal&&F.subtotal.length>0&&G.push({kind:"subtotal",label:F.subtotalLabel??"小计",rows:P})}}else for(const M of w)G.push({kind:"row",row:M});const oe=$();for(const M of G)if(M.kind==="row"){const b=le(H,M.row,a);y(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=k(M.label,new Map,F?.headerStyle??{},x.columns.length);F?.keepWithNext!==!1&&p+b.heightMm+oe>u()&&B(b.heightMm+oe),y(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of F.subtotal??[])b.set(E,J(M.rows,E));const P=k(M.label,b,F?.subtotalStyle??{},re);y(P.grid,P.heightMm,"listst")}if(x.grandTotal){const M=typeof x.grandTotal=="object"?x.grandTotal:void 0,b=M?.fields??F?.subtotal??[];if(b.length>0){const P=new Map;for(const I of b)P.set(I,J(w,I));const E=k(M?.label??"合计",P,M?.style??{},re);y(E.grid,E.heightMm,"listgt")}else s.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}R()}for(const g of h){const l=g.text;typeof l=="string"&&l.includes("{totalPages}")&&(g.text=l.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:c.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:s}}const Fe={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function _(e,t){return t?.classNames?.[e]??Fe[e]}class z{constructor(){this.props=[]}add(t,r){return r==null||r===!1||r===""?this:(this.props.push([t,String(r)]),this)}mm(t,r,n,o=2){return this.add(t,`${c.round(c.mmToPx(r,n),o)}px`)}toString(){let t="";for(const[r,n]of this.props)t+=`${r}:${n};`;return t}applyTo(t){const r=this.toString();r&&(t.style.cssText=r)}}function pe(e,t,r){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const o=c.resolveFontSize(n,r);e.add("font-size",`${c.round(o.fontSizePx,2)}px`)}function ze(e,t,r,n,o){const a=o.createElement("table");if(a.className=_("grid",n),new z().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(a),e.colWidthsMm){const m=o.createElement("colgroup");for(const h of e.colWidthsMm){const g=o.createElement("col");new z().mm("width",h,r).applyTo(g),m.appendChild(g)}a.appendChild(m)}const s=c.resolveBoxBorders(t.style),i=c.resolveStroke(t.style),d=s.inner?`${c.round(i.widthPt*r/72,2)}px solid ${i.color}`:"";return e.cells.forEach((m,h)=>{const g=o.createElement("tr");g.className=_("row",n),e.rowHeightsMm?.[h]!=null&&new z().mm("height",e.rowHeightsMm[h],r).applyTo(g),(m||[]).forEach(l=>{const u=o.createElement("td");u.className=_("cell",n),l?.colSpan&&(u.colSpan=l.colSpan),l?.rowSpan&&(u.rowSpan=l.rowSpan);const f=new z;if(d&&f.add("border",d),l?.style){const T=l.style;f.add("text-align",T.align).add("vertical-align",T.verticalAlign).add("background-color",T.backgroundColor).add("color",T.color).add("font-weight",T.bold?"700":void 0),f.add("font-size",`${c.round(c.resolveFontSize(T,r).fontSizePx,2)}px`)}if(f.applyTo(u),l?.text!=null&&(u.textContent=l.text),l?.children?.length)for(const T of l.children)u.appendChild(Q(T,r,n,o));g.appendChild(u)}),a.appendChild(g)}),a}function Ie(e,t,r,n){const o=n.createElement("div");o.className=_("text",r);const a=e.style||{},s=new z().add("text-align",a.align).add("display","flex").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(pe(s,e,t),s.applyTo(o),c.isRichText(e)){const i=n.createElement("div");i.className=_("rich",r);for(const d of e.richParagraphs){const m=n.createElement("div");m.className=_("paragraph",r),new z().add("text-align",d.align).add("line-height",d.lineHeight!=null?String(d.lineHeight):void 0).mm("margin-top",d.spaceBeforeMm??0,t).mm("margin-bottom",d.spaceAfterMm??0,t).mm("text-indent",d.indentMm??0,t).applyTo(m);for(const g of d.segments||[]){const l=n.createElement("span");if(l.className=_("segment",r),l.textContent=g.kind==="field"?g.field??"":g.text??"",g.style){const u=new z().add("color",g.style.color).add("font-weight",g.style.bold?"700":void 0);u.add("font-size",`${c.round(c.resolveFontSize(g.style,t).fontSizePx,2)}px`),u.applyTo(l)}m.appendChild(l)}i.appendChild(m)}return o.appendChild(i),o}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=_("lines",r),a.lineHeight!=null&&new z().add("line-height",String(a.lineHeight)).applyTo(i);for(const d of e.lines){const m=n.createElement("div");m.className=_("line",r),m.textContent=d,i.appendChild(m)}return o.appendChild(i),o}return o.textContent=e.text??"",o}function De(e,t,r){const n=r.createElement("img");return n.className=_("image",t),n.src=e.imageData,new z().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function de(e,t,r,n){const o=n.createElement("div");o.className=_("shape",r);const a=e.style||{},s=c.resolveStroke(a),i=c.resolveBoxBorders(a),d=`${c.round(s.widthPt*t/72,2)}px solid ${s.color}`,m=new z;return e.grid||e.kind==="rect"?(i.top&&m.add("border-top",d),i.right&&m.add("border-right",d),i.bottom&&m.add("border-bottom",d),i.left&&m.add("border-left",d)):e.kind==="ellipse"?(i.inner&&m.add("border",d).add("border-radius","50%"),a.backgroundColor&&m.add("background-color",a.backgroundColor)):e.kind==="line"&&m.add("height","0").add("border-top",d),m.add("box-sizing","border-box").add("width","100%").add("height","100%"),m.applyTo(o),o}function Q(e,t,r,n){const o=n.createElement("div");o.className=`${_("comp",r)} mr-kind-${e.kind}`;const a=new z().add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(pe(a,e,t),a.applyTo(o),c.isImageBackedComponent(e))return o.appendChild(De(e,r,n)),o;if(e.kind==="text")return o.appendChild(Ie(e,t,r,n)),o;if(e.grid){const i=de(e,t,r,n);return i.appendChild(ze(e.grid,e,t,r,n)),o.appendChild(i),o}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return o.appendChild(de(e,t,r,n)),o;const s=n.createElement("div");return s.className=_("unknown",r),s.textContent=e.fallbackText??"",o.appendChild(s),o}function Me(e,t,r,n){const o=n.createElement("div");o.className=_("page",r),new z().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(o);for(const a of e.components)o.appendChild(Q(a,t,r,n));return o}function Oe(e,t,r={}){const n=r.dpi??96,o=t.createElement("div");return o.className=_("root",r),o.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{o.appendChild(Me(a,n,r,t))}),o}function be(e){const{pageHeightsPx:t,viewportHeightPx:r,scrollTopPx:n,overscan:o=1,gapPx:a=0}=e,s=t.length;if(s===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,a),d=new Array(s+1);d[0]=0;for(let w=0;w<s;w++)d[w+1]=d[w]+Math.max(0,t[w]??0)+i;const m=d[s],h=Math.max(0,n);let g=0,l=0,u=s-1;for(;l<=u;){const w=l+u>>1;d[w]<=h?(g=w,l=w+1):u=w-1}const f=Math.max(0,Math.min(s-1,g-o)),T=d[g]+Math.max(0,r);let R=s-1;for(l=0,u=s-1;l<=u;){const w=l+u>>1;d[w+1]<T?l=w+1:(R=w,u=w-1)}const v=Math.min(s-1,R+o),S=d[f],C=Math.max(0,m-d[v+1]);return{start:f,end:v,padTopPx:S,padBottomPx:C}}const ee=96/25.4;function te(e,t=96){const r=t/96*ee;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function We(e,t,r){const n=document.createElement("canvas"),{widthPx:o,heightPx:a}=te(e,r);n.width=Math.round(o*t),n.height=Math.round(a*t),n.style.width=`${o}px`,n.style.height=`${a}px`;const s=n.getContext("2d");if(!s)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return s.scale(t,t),s.fillStyle="#ffffff",s.fillRect(0,0,o,a),{canvas:n,ctx:s}}function je(e,t=96){return c.resolveFontSize(e,t).fontSizePx}function Se(e,t,r,n,o,a,s,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${s}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const d=t.fontSizePx*t.lineHeight,m=t.text===""?[""]:t.text.split(`
|
|
2
|
-
`),h
|
|
3
|
-
`);
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("./style-CFZ-HE2s.cjs"),ae=require("./grid-geometry-BXpOxznT.cjs");function le(e){const t=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})$/.exec(e.trim());if(t){const n=new Date(Number(t[1]),Number(t[2])-1,Number(t[3]));return Number.isNaN(n.getTime())?null:n}const o=new Date(e);return Number.isNaN(o.getTime())?null:o}function V(e,t){return e.toLocaleString("en-US",{minimumFractionDigits:t,maximumFractionDigits:t})}function xe(e,t){const o=n=>String(n).padStart(2,"0");return t.replace(/YYYY/g,String(e.getFullYear())).replace(/MM/g,o(e.getMonth()+1)).replace(/DD/g,o(e.getDate())).replace(/hh/g,o(e.getHours())).replace(/mm/g,o(e.getMinutes())).replace(/ss/g,o(e.getSeconds()))}function Ee(e,t,o){return o!=null?t?V(e,o):e.toFixed(o):t?V(e):String(e)}function U(e){const t=typeof e=="number"?e:Number(String(e).replace(/,/g,""));return Number.isFinite(t)?t:null}function q(e,t){if(e==null||e===""||!t)return String(e??"");switch(t.kind){case"number":{const o=U(e);return o==null?String(e):Ee(o,t.thousands===!0,t.digits)}case"percent":{const o=U(e);return o==null?String(e):`${V(o*100,t.digits??2)}%`}case"date":{const o=t.pattern??"YYYY-MM-DD",n=e instanceof Date?e:le(String(e));return n?xe(n,o):String(e)}default:return String(e)}}function de(e,t){const o=e[t.field];if(o==null||o==="")return!1;if(typeof t.value=="number"){const a=U(o);if(a==null)return!1;switch(t.op){case">":return a>t.value;case">=":return a>=t.value;case"<":return a<t.value;case"<=":return a<=t.value;case"==":return a===t.value;case"!=":return a!==t.value}}const n=String(o),r=String(t.value);switch(t.op){case"==":return n===r;case"!=":return n!==r;case">":return n>r;case">=":return n>=r;case"<":return n<r;case"<=":return n<=r}return!1}const ke=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ce(e,t,o,n){const r=e[t];r!=null&&(typeof r!="number"||!Number.isFinite(r))&&n.push({path:`${o}.${t}`,message:`应为有限数字,实际 ${JSON.stringify(r)}`})}function J(e,t,o,n=[]){if(!I(e)){o.push({path:t,message:"组件应为对象"});return}const r=e.kind;typeof r!="string"?o.push({path:`${t}.kind`,message:"组件缺少 kind 字符串"}):ke.has(r)||n.push({path:`${t}.kind`,message:`未知组件类型 ${JSON.stringify(r)},将以兜底方式渲染`});for(const i of["leftMm","topMm","widthMm","heightMm"])Ce(e,i,t,o);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&o.push({path:t,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const a=e.grid;a!==void 0&&(!I(a)||!Array.isArray(a.cells)?o.push({path:`${t}.grid.cells`,message:"grid.cells 应为二维数组"}):a.cells.forEach((i,d)=>{if(!Array.isArray(i)){o.push({path:`${t}.grid.cells.${d}`,message:"行应为数组"});return}i.forEach((h,g)=>{h!=null&&I(h)&&Array.isArray(h.children)&&h.children.forEach((m,s)=>{J(m,`${t}.grid.cells.${d}.${g}.children.${s}`,o,n)})})}));const l=e.richParagraphs;l!==void 0&&(Array.isArray(l)?l.forEach((i,d)=>{(!I(i)||!Array.isArray(i.segments))&&o.push({path:`${t}.richParagraphs.${d}`,message:"段落缺少 segments 数组"})}):o.push({path:`${t}.richParagraphs`,message:"richParagraphs 应为数组"}))}function ce(e,t,o,n=[]){if(!I(e)){o.push({path:t,message:"页应为对象"});return}const r=e.pageWidthMm,a=e.pageHeightMm;(typeof r!="number"||!(r>0&&r<3e3))&&o.push({path:`${t}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(r)}`}),(typeof a!="number"||!(a>0&&a<5e3))&&o.push({path:`${t}.pageHeightMm`,message:`页高非法: ${JSON.stringify(a)}`});const l=e.components;l!==void 0&&!Array.isArray(l)?o.push({path:`${t}.components`,message:"components 应为数组"}):Array.isArray(l)&&l.forEach((i,d)=>J(i,`${t}.components.${d}`,o,n))}function he(e){const t=[],o=[],n=I(e)?e.pages:void 0;if(!Array.isArray(n))t.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"});else{n.forEach((a,l)=>ce(a,`$.pages.${l}`,t,o)),n.length>2e3&&o.push({path:"$.pages",message:`页数异常大(${n.length} 页),渲染与打印耗时可能显著增加`});const r=n.reduce((a,l)=>a+(I(l)&&Array.isArray(l.components)?l.components.length:0),0);r>5e4&&o.push({path:"$.pages",message:`组件总数异常大(${r} 个),可能触发浏览器性能限制`})}return{ok:t.length===0,errors:t,warnings:o}}function Ae(e){const t=he(e);if(!t.ok){const o=t.errors.slice(0,3).map(n=>`${n.path}: ${n.message}`).join("; ");throw new Error(`渲染计划校验失败(${t.errors.length} 处): ${o}`)}return e.pages}function re(e){return{widthMm:e.widthMm,heightMm:e.heightMm,marginTopMm:e.marginTopMm??0,marginBottomMm:e.marginBottomMm??0,marginLeftMm:e.marginLeftMm??0,marginRightMm:e.marginRightMm??0,components:[]}}function Ne(e,t){return t.heightMm-(e.marginBottomMm??t.marginBottomMm)}function He(e,t){const n=(e.fontSizePt??c.DEFAULT_FONT_PT)*c.LINE_HEIGHT*25.4/72,r=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,t*n+r)}function me(e){if(e==null)return"";if(typeof e=="string")return e;if(typeof e=="number")return String(e);if(typeof e=="boolean")return e?"是":"否";if(e instanceof Date)return e.toISOString().slice(0,10);try{return JSON.stringify(e)}catch{return String(e)}}function $e(e,t){const o=e.fontSizePt??c.DEFAULT_FONT_PT,n=e.paddingMm??1,r=e.columns.map(s=>s.style?{align:"left",verticalAlign:"middle",...s.style}:{align:"left",verticalAlign:"middle"}),a=e.columns.map(s=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...s.style||{}})),l=e.columns.map(s=>s.header),i=l.map((s,u)=>c.wrapText(s,e.columns[u].widthMm-n*2,{fontSizePt:o,bold:e.headerBold??!0},t)),d=Math.max(...i.map(s=>s.length),1),h=He(e,d),g=l.map((s,u)=>({text:s,style:a[u]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:o,paddingMm:n,cellStyles:r,borderStyle:m,headerHeightMm:h,headerGrid:{cells:[g],rowHeightsMm:[h]},columns:e.columns}}function ie(e,t,o){const n=e.columns,r=new Array(n.length);let a=1;for(let g=0;g<n.length;g++){const m=n[g];r[g]=m.format?q(t[m.field],m.format):me(t[m.field])}const l=new Array(n.length);for(let g=0;g<n.length;g++){const m=c.wrapText(r[g],n[g].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},o);l[g]=m,m.length>a&&(a=m.length)}const i=e.fontSizePt*c.LINE_HEIGHT*25.4/72,d=Math.max(e.rowHeightFloorMm,a*i+e.paddingMm*2),h=new Array(n.length);for(let g=0;g<n.length;g++){const m=n[g];let s=e.cellStyles[g];if(m.rules){for(const u of m.rules)if(de(t,u.when)){s={...s??{},...u.style};break}}h[g]={text:r[g],style:s}}return{grid:{cells:[h],rowHeightsMm:[d]},heightMm:d}}function Re(e,t,o={}){const n=typeof o=="number"?{mmPerRow:o}:o,r=n.mmPerRow??0,a=n.measurer??c.heuristicMeasurer,l=[],i=[];let d=0;const h=m=>`${m}_${(++d).toString(36)}`,g=[];for(const m of e.pages){const s=re(m),u=()=>Ne(m,s),f=s.marginTopMm,w=[],A=()=>{if(i.push({pageWidthMm:s.widthMm,pageHeightMm:s.heightMm,marginTopMm:s.marginTopMm,marginBottomMm:s.marginBottomMm,marginLeftMm:s.marginLeftMm,marginRightMm:s.marginRightMm,components:s.components}),w.length>0){const v=i.length;for(const S of w){const k={...S,text:String(S.text??"").replace(/\{page\}/g,String(v))};i[i.length-1].components.push(k),k.text.includes("{totalPages}")&&g.push(k)}}};for(const v of m.components){if(v.kind!=="list"){if(v.kind==="text"&&typeof v.text=="string"){const M=v.text;if(M.includes("{page}")||M.includes("{totalPages}")){w.push(v);continue}}s.components.push(v);continue}const S=v,k=t[S.dataset];Array.isArray(k)||l.push(`数据集 ${S.dataset} 未提供数据,列表 ${S.id??""} 输出为空`);const y=Array.isArray(k)?k:[],W=S.columns.reduce((M,b)=>M+b.widthMm,0),G=W>S.widthMm?S.widthMm/W:1,x=G===1?S:{...S,columns:S.columns.map(M=>({...M,widthMm:M.widthMm*G}))},N={...$e(x,a),rowHeightFloorMm:x.rowHeightMm??0},D={kind:"rect",leftMm:S.leftMm,topMm:0,widthMm:S.widthMm,heightMm:N.headerHeightMm,grid:N.headerGrid,nid:h("listh"),style:N.borderStyle};let p=S.topMm;const H=(M,b)=>{M.components.push({...D,topMm:b})};H(s,p),p+=N.headerHeightMm+r;const _=M=>{if(p+M>u()){A();const b=re(m);s.components=b.components,s.heightMm=b.heightMm,x.headerEveryPage!==!1?(H(s,S.topMm),p=S.topMm+N.headerHeightMm):p=f}},T=(M,b,P)=>{_(b),s.components.push({kind:"rect",leftMm:S.leftMm,topMm:p,widthMm:S.widthMm,heightMm:b,grid:M,nid:h(P),style:N.borderStyle}),p+=b},$=()=>ie(N,{},a).heightMm,C=(M,b,P,E)=>{const F=[],ne=Math.max(1,Math.min(E,x.columns.length));F.push({text:M,colSpan:ne,style:{bold:!0,...P}});for(let Y=ne;Y<x.columns.length;Y++){const ve=x.columns[Y];F.push({text:b.get(ve.field)??"",style:P})}const Pe=N.fontSizePt*c.LINE_HEIGHT*25.4/72,oe=Math.max(N.rowHeightFloorMm,Pe+N.paddingMm*2);return{grid:{cells:[F],rowHeightsMm:[oe]},heightMm:oe}},z=(M,b)=>{let P=0;for(const E of M){const F=typeof E[b]=="number"?E[b]:Number(E[b]);Number.isFinite(F)&&(P+=F)}return P},j=(M,b)=>{const P=x.columns.find(E=>E.field===b);return q(z(M,b),P?.format??{kind:"number",thousands:!0})},L=x.groupBy,ye=typeof x.grandTotal=="object"&&x.grandTotal.fields||L?.subtotal||[],Q=x.columns.findIndex(M=>ye.includes(M.field)),ee=Q>0?Q:1,O=[];if(L){const M=new Map;for(const b of y){const P=me(b[L.field]),E=M.get(P);E?E.push(b):M.set(P,[b])}for(const[b,P]of M){O.push({kind:"groupHeader",label:(L.headerTemplate??"{value}").replace(/\{value\}/g,b)});for(const E of P)O.push({kind:"row",row:E});L.subtotal&&L.subtotal.length>0&&O.push({kind:"subtotal",label:L.subtotalLabel??"小计",rows:P})}}else for(const M of y)O.push({kind:"row",row:M});const te=$();for(const M of O)if(M.kind==="row"){const b=ie(N,M.row,a);T(b.grid,b.heightMm,"listr")}else if(M.kind==="groupHeader"){const b=C(M.label,new Map,L?.headerStyle??{},x.columns.length);L?.keepWithNext!==!1&&p+b.heightMm+te>u()&&_(b.heightMm+te),T(b.grid,b.heightMm,"listg")}else if(M.kind==="subtotal"){const b=new Map;for(const E of L.subtotal??[])b.set(E,j(M.rows,E));const P=C(M.label,b,L?.subtotalStyle??{},ee);T(P.grid,P.heightMm,"listst")}if(x.grandTotal){const M=typeof x.grandTotal=="object"?x.grandTotal:void 0,b=M?.fields??L?.subtotal??[];if(b.length>0){const P=new Map;for(const F of b)P.set(F,j(y,F));const E=C(M?.label??"合计",P,M?.style??{},ee);T(E.grid,E.heightMm,"listgt")}else l.push(`列表 ${S.id??""} 配置了 grandTotal 但未提供合计字段(groupBy.subtotal 或 grandTotal.fields)`)}}A()}for(const m of g){const s=m.text;typeof s=="string"&&s.includes("{totalPages}")&&(m.text=s.replace(/\{totalPages\}/g,String(i.length)))}return{plan:{schemaVersion:c.RENDER_PLAN_SCHEMA_VERSION,pages:i},warnings:l}}const _e={root:"mr-root",page:"mr-page",comp:"mr-comp",text:"mr-text",lines:"mr-lines",line:"mr-line",rich:"mr-rich",paragraph:"mr-paragraph",segment:"mr-segment",image:"mr-image",shape:"mr-shape",grid:"mr-grid",row:"mr-row",cell:"mr-cell",unknown:"mr-unknown"};function R(e,t){return t?.classNames?.[e]??_e[e]}class B{constructor(){this.props=[]}add(t,o){return o==null||o===!1||o===""?this:(this.props.push([t,String(o)]),this)}mm(t,o,n,r=2){return this.add(t,`${c.round(c.mmToPx(o,n),r)}px`)}toString(){let t="";for(const[o,n]of this.props)t+=`${o}:${n};`;return t}applyTo(t){const o=this.toString();o&&(t.style.cssText=o)}}function ge(e,t,o){const n=t.style||{};e.add("color",n.color).add("background-color",n.backgroundColor).add("font-family",n.fontFamily).add("font-weight",n.bold?"700":void 0).add("font-style",n.italic?"italic":void 0).add("text-decoration",n.underline?"underline":void 0).add("letter-spacing",n.letterSpacing!=null?`${n.letterSpacing}pt`:void 0).add("opacity",n.opacity!=null?String(n.opacity):void 0).add("transform",n.rotateDeg?`rotate(${n.rotateDeg}deg)`:void 0);const r=c.resolveFontSize(n,o);e.add("font-size",`${c.round(r.fontSizePx,2)}px`)}function Le(e,t,o,n,r){const a=r.createElement("table");if(a.className=R("grid",n),new B().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(a),e.colWidthsMm){const h=r.createElement("colgroup");for(const g of e.colWidthsMm){const m=r.createElement("col");new B().mm("width",g,o).applyTo(m),h.appendChild(m)}a.appendChild(h)}const l=c.resolveBoxBorders(t.style),i=c.resolveStroke(t.style),d=l.inner?`${c.round(i.widthPt*o/72,2)}px solid ${i.color}`:"";return e.cells.forEach((h,g)=>{const m=r.createElement("tr");m.className=R("row",n),e.rowHeightsMm?.[g]!=null&&new B().mm("height",e.rowHeightsMm[g],o).applyTo(m),(h||[]).forEach(s=>{const u=r.createElement("td");u.className=R("cell",n),s?.colSpan&&(u.colSpan=s.colSpan),s?.rowSpan&&(u.rowSpan=s.rowSpan);const f=new B;if(d&&f.add("border",d),s?.style){const w=s.style;f.add("text-align",w.align).add("vertical-align",w.verticalAlign).add("background-color",w.backgroundColor).add("color",w.color).add("font-weight",w.bold?"700":void 0),f.add("font-size",`${c.round(c.resolveFontSize(w,o).fontSizePx,2)}px`)}if(f.applyTo(u),s?.text!=null&&(u.textContent=s.text),s?.children?.length)for(const w of s.children)u.appendChild(K(w,o,n,r));m.appendChild(u)}),a.appendChild(m)}),a}function Be(e,t,o,n){const r=n.createElement("div");r.className=R("text",o);const a=e.style||{},l=new B().add("text-align",a.align).add("display","flex").add("flex-direction","column").add("justify-content",a.verticalAlign==="middle"?"center":a.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(ge(l,e,t),l.applyTo(r),c.isRichText(e)){const i=n.createElement("div");i.className=R("rich",o);for(const d of e.richParagraphs){const h=n.createElement("div");h.className=R("paragraph",o),new B().add("text-align",d.align).add("line-height",d.lineHeight!=null?String(d.lineHeight):void 0).mm("margin-top",d.spaceBeforeMm??0,t).mm("margin-bottom",d.spaceAfterMm??0,t).mm("text-indent",d.indentMm??0,t).applyTo(h);for(const m of d.segments||[]){const s=n.createElement("span");if(s.className=R("segment",o),s.textContent=m.kind==="field"?m.field??"":m.text??"",m.style){const u=new B().add("color",m.style.color).add("font-weight",m.style.bold?"700":void 0);u.add("font-size",`${c.round(c.resolveFontSize(m.style,t).fontSizePx,2)}px`),u.applyTo(s)}h.appendChild(s)}i.appendChild(h)}return r.appendChild(i),r}if(Array.isArray(e.lines)&&e.lines.length>0){const i=n.createElement("div");i.className=R("lines",o),a.lineHeight!=null&&new B().add("line-height",String(a.lineHeight)).applyTo(i);for(const d of e.lines){const h=n.createElement("div");h.className=R("line",o),h.textContent=d,i.appendChild(h)}return r.appendChild(i),r}return r.textContent=e.text??"",r}function Fe(e,t,o){const n=o.createElement("img");return n.className=R("image",t),n.src=e.imageData,new B().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(n),n.alt=e.kind,n}function se(e,t,o,n){const r=n.createElement("div");r.className=R("shape",o);const a=e.style||{},l=c.resolveStroke(a),i=c.resolveBoxBorders(a),d=`${c.round(l.widthPt*t/72,2)}px solid ${l.color}`,h=new B;return e.grid||e.kind==="rect"?(i.top&&h.add("border-top",d),i.right&&h.add("border-right",d),i.bottom&&h.add("border-bottom",d),i.left&&h.add("border-left",d)):e.kind==="ellipse"?(i.inner&&h.add("border",d).add("border-radius","50%"),a.backgroundColor&&h.add("background-color",a.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",d),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(r),r}function K(e,t,o,n){const r=n.createElement("div");r.className=`${R("comp",o)} mr-kind-${e.kind}`;const a=new B().add("position","absolute").mm("left",e.leftMm,t).mm("top",e.topMm,t).mm("width",e.widthMm,t).mm("height",e.heightMm,t).add("box-sizing","border-box");if(ge(a,e,t),a.applyTo(r),c.isImageBackedComponent(e))return r.appendChild(Fe(e,o,n)),r;if(e.kind==="text")return r.appendChild(Be(e,t,o,n)),r;if(e.grid){const i=se(e,t,o,n);return i.appendChild(Le(e.grid,e,t,o,n)),r.appendChild(i),r}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return r.appendChild(se(e,t,o,n)),r;const l=n.createElement("div");return l.className=R("unknown",o),l.textContent=e.fallbackText??"",r.appendChild(l),r}function fe(e,t,o,n){const r=n.createElement("div");r.className=R("page",o),new B().add("position","relative").mm("width",e.pageWidthMm,t).mm("height",e.pageHeightMm,t).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(r);for(const a of e.components)r.appendChild(K(a,t,o,n));return r}function ze(e,t,o={}){const n=o.dpi??96,r=t.createElement("div");return r.className=R("root",o),r.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(a=>{r.appendChild(fe(a,n,o,t))}),r}function ue(e){const{pageHeightsPx:t,viewportHeightPx:o,scrollTopPx:n,overscan:r=1,gapPx:a=0}=e,l=t.length;if(l===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const i=Math.max(0,a),d=new Array(l+1);d[0]=0;for(let y=0;y<l;y++)d[y+1]=d[y]+Math.max(0,t[y]??0)+i;const h=d[l],g=Math.max(0,n);let m=0,s=0,u=l-1;for(;s<=u;){const y=s+u>>1;d[y]<=g?(m=y,s=y+1):u=y-1}const f=Math.max(0,Math.min(l-1,m-r)),w=d[m]+Math.max(0,o);let A=l-1;for(s=0,u=l-1;s<=u;){const y=s+u>>1;d[y+1]<w?s=y+1:(A=y,u=y-1)}const v=Math.min(l-1,A+r),S=d[f],k=Math.max(0,h-d[v+1]);return{start:f,end:v,padTopPx:S,padBottomPx:k}}const X=96/25.4;function Z(e,t=96){const o=t/96*X;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*o)),heightPx:Math.max(1,Math.round(e.pageHeightMm*o))}}function Ie(e,t,o){const n=document.createElement("canvas"),{widthPx:r,heightPx:a}=Z(e,o);n.width=Math.round(r*t),n.height=Math.round(a*t),n.style.width=`${r}px`,n.style.height=`${a}px`;const l=n.getContext("2d");if(!l)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return l.scale(t,t),l.fillStyle="#ffffff",l.fillRect(0,0,r,a),{canvas:n,ctx:l}}function De(e,t=96){return c.resolveFontSize(e,t).fontSizePx}function pe(e,t,o,n,r,a,l,i="top"){e.font=`${t.bold?"bold ":""}${t.fontSizePx}px ${l}`,e.fillStyle=t.color,e.textBaseline="alphabetic";const d=t.fontSizePx*t.lineHeight,h=t.text===""?[""]:t.text.split(`
|
|
2
|
+
`),g=h.length*d;let m=n;i==="middle"?m=n+(a-g)/2:i==="bottom"&&(m=n+a-g),h.forEach((s,u)=>{e.textAlign=t.align==="center"?"center":t.align==="right"?"right":"left";const f=t.align==="center"?o+r/2:t.align==="right"?o+r:o;e.fillText(s,f,m+u*d+t.fontSizePx*.8,r)}),e.textAlign="left"}function Oe(e,t,o,n,r,a,l,i,d,h,g){const m=ae.resolveGridLayout(t,a/i,l/i),s=c.resolveBoxBorders(o.style),u=c.resolveStroke(o.style);for(const f of m.cells){const w=f.cell.style?.backgroundColor;w&&(e.fillStyle=w,e.fillRect(n+f.xMm*i,r+f.yMm*i,f.widthMm*i,f.heightMm*i))}if(s.inner){e.strokeStyle=u.color,e.lineWidth=c.ptToPx(u.widthPt,d);for(const f of m.edges)e.beginPath(),f.kind==="v"?(e.moveTo(n+f.pos*i,r+f.from*i),e.lineTo(n+f.pos*i,r+f.to*i)):(e.moveTo(n+f.from*i,r+f.pos*i),e.lineTo(n+f.to*i,r+f.pos*i)),e.stroke();e.beginPath(),s.top&&(e.moveTo(n,r),e.lineTo(n+a,r)),s.right&&(e.moveTo(n+a,r),e.lineTo(n+a,r+l)),s.bottom&&(e.moveTo(n+a,r+l),e.lineTo(n,r+l)),s.left&&(e.moveTo(n,r+l),e.lineTo(n,r)),e.stroke()}for(const f of m.cells){const w=typeof f.cell.text=="string"?f.cell.text:"";if(!w)continue;const A=f.cell.style,v=A?.fontSize??c.DEFAULT_FONT_PT,S=c.wrapText(w,f.widthMm-1,{fontSizePt:v},g).join(`
|
|
3
|
+
`);pe(e,{text:S,fontSizePx:c.resolveFontSize(A,d).fontSizePx,bold:A?.bold??!1,color:A?.color??c.resolveTextColor(o.style,c.DEFAULT_TEXT_COLOR),align:A?.align??"left",lineHeight:c.LINE_HEIGHT},n+(f.xMm+.5)*i,r+f.yMm*i,Math.max(0,(f.widthMm-1)*i),f.heightMm*i,h,A?.verticalAlign??"middle")}}function Me(e,t,o,n,r,a){const l=t.leftMm*o,i=t.topMm*o,d=t.widthMm*o,h=t.heightMm*o,g=t.style??{};if(t.grid){Oe(e,t.grid,t,l,i,d,h,o,n,r,a);return}switch(t.kind){case"text":{const m=g.fontSize??c.DEFAULT_FONT_PT,s=c.isRichText(t)?t.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
|
|
4
4
|
`):Array.isArray(t.lines)&&t.lines.length>0?t.lines.join(`
|
|
5
|
-
`):c.wrapText(t.text??"",t.widthMm,{fontSizePt:
|
|
6
|
-
`);Se(e,{text:l,fontSizePx:c.resolveFontSize(h,n).fontSizePx,bold:h.bold??!1,color:c.resolveTextColor(h),align:h.align??"left",lineHeight:c.resolveLineHeight(h)},s,i,d,m,o,h.verticalAlign);break}case"rect":{const g=c.resolveStroke(h),l=c.resolveBoxBorders(h);h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.fillRect(s,i,d,m)),l.inner&&(e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),e.beginPath(),l.top&&(e.moveTo(s,i),e.lineTo(s+d,i)),l.right&&(e.moveTo(s+d,i),e.lineTo(s+d,i+m)),l.bottom&&(e.moveTo(s+d,i+m),e.lineTo(s,i+m)),l.left&&(e.moveTo(s,i+m),e.lineTo(s,i)),e.stroke());break}case"line":{const g=c.resolveStroke({...h,borderColor:h.lineColor??h.borderColor});e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),e.beginPath(),e.moveTo(s,i+m/2),e.lineTo(s+d,i+m/2),e.stroke();break}case"ellipse":{const g=c.resolveStroke(h);e.strokeStyle=g.color,e.lineWidth=c.ptToPx(g.widthPt,n),h.backgroundColor&&(e.fillStyle=h.backgroundColor,e.beginPath(),e.ellipse(s+d/2,i+m/2,d/2,m/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(s+d/2,i+m/2,d/2,m/2,0,0,Math.PI*2),e.stroke();break}}}async function Ve(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:r="png",quality:n=.92,...o}=t,{canvases:a}=Te(e,o),s=r==="jpeg"?"image/jpeg":"image/png",i=[];for(const d of a)i.push(await new Promise(m=>d.toBlob(h=>m(h),s,n))??new Blob([],{type:s}));return{blobs:i}}function Te(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,a=t.fontFamily??'"Microsoft YaHei", sans-serif',s=t.measurer??c.heuristicMeasurer,i=Math.max(0,t.start??0),d=Math.min(e.pages.length-1,t.end??e.pages.length-1),m=[];for(let h=i;h<=d;h++){const g=e.pages[h],{canvas:l,ctx:u}=We(g,r,n);for(const f of g.components)ye(u,f,o,n,a,s);m.push(l)}return{canvases:m}}function Ue(e,t={}){const r=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,o=n/96*ee,a=t.fontFamily??'"Microsoft YaHei", sans-serif',s=t.measurer??c.heuristicMeasurer,i=t.overscan??1,d=t.gapPx??18,m=t.pagesPerFrame??1,h=e.pages.map(p=>p.pageHeightMm*o),g=Math.max(1,...e.pages.map(p=>p.pageWidthMm*o)),l={start:0,end:-1};let u=null,f=null,T=null,R=null,v=[],S=0,C=[];function w(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${g}px;margin:0 auto;`,T=document.createElement("div"),R=document.createElement("div"),f.appendChild(T),v=[];const N=Math.min(e.pages.length,3+i*2);for(let B=0;B<N;B++){const y=document.createElement("div");y.style.cssText=`margin:0 auto ${d}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(y),v.push(y)}f.appendChild(R),p.appendChild(f)}function V(p,N){const B=e.pages[N],{widthPx:y,heightPx:$}=te(B,n);let k=p.firstElementChild;(!k||k.tagName!=="CANVAS")&&(k=document.createElement("canvas"),p.innerHTML="",p.appendChild(k)),k.width=Math.round(y*r),k.height=Math.round($*r),k.style.width=`${y}px`,k.style.height=`${$}px`;const D=k.getContext("2d");if(D){D.setTransform(1,0,0,1,0,0),D.scale(r,r),D.fillStyle="#ffffff",D.fillRect(0,0,y,$);for(const J of B.components)ye(D,J,o,n,a,s);k.dataset.canvasPage=String(N),p.style.height=`${$}px`,p.style.width=`${y}px`}}function U(p){l.start=p.start,l.end=p.end,T.style.height=`${p.start*d+h.slice(0,p.start).reduce((y,$)=>y+$,0)}px`;const N=e.pages.length-1-p.end;R.style.height=`${N*d+h.slice(p.end+1).reduce((y,$)=>y+$,0)}px`;const B=p.end-p.start+1;v.forEach((y,$)=>{if($<B){y.style.display="";const k=p.start+$;y.style.height=`${h[k]??0}px`}else y.style.display="none"}),C=[];for(let y=p.start;y<=p.end;y++){const $=v[y-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(y)&&C.push(y)}x()}function x(){S||C.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,m);for(;C.length>0&&p-- >0;){const N=C.shift(),B=v[N-l.start];B&&V(B,N)}C.length>0&&x()}))}function H(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,N=be({pageHeightsPx:h,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:d});N.start!==l.start||N.end!==l.end?U(N):x()}))}let j=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,w(),p.addEventListener("scroll",H,{passive:!0}),typeof ResizeObserver<"u"&&(j=new ResizeObserver(()=>H()),j.observe(p)),H()},destroy(){S&&cancelAnimationFrame(S),S=0,j?.disconnect(),j=null,u?.removeEventListener("scroll",H),C=[],f?.remove(),u=null},window(){return{...l}}}}function A(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function L(e,t=""){return typeof e=="string"?e:t}function O(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Je(e){return e==="Center"?"center":e==="Right"?"right":"left"}function Ye(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function qe(e){const t=parseFloat(L(e.FontSize,"10.5"));return{fontSize:Number.isFinite(t)?t:10.5,fontFamily:L(e.FontFamily,"黑体")||void 0,bold:L(e.FontWeight)==="bold"||void 0,italic:L(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:L(e.FontColor)||void 0,backgroundColor:L(e.BackgroundColor)||void 0,align:Je(L(e.HorAlignment,"Left")),verticalAlign:Ye(L(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(L(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:L(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function Ke(e,t){const r=L(e.uitype),n={kind:"text",leftMm:A(e.left,0),topMm:A(e.top,0),widthMm:A(e.width,40),heightMm:A(e.height,8),nid:L(e.nid)||void 0,style:qe(e)};switch(r){case"text":{n.kind="text";const o=e.Text??e.text??e.Value;n.text=o==null?"":String(o);const a=e.Lines??e.lines;return Array.isArray(a)&&(n.lines=a.map(s=>String(s))),n}case"richtext":return n.kind="text",n.text=L(e.Text),t.push(`富文本 ${n.nid??""} 导入为纯文本(版式细节可能损失)`),n;case"image":case"barcode":case"qrcode":case"chart":return n.kind=r==="image"?"image":r,n.fallbackText=`[${r}]`,t.push(`图片类组件 ${n.nid??""} 需运行时数据(imageData),已导入为占位`),n;case"table":{n.kind="rect";const o=e.Cells??e.cells;if(Array.isArray(o)){const a={cells:o.map(s=>Array.isArray(s)?s.map(i=>({text:O(i)?L(i.Text??i.text):"",colSpan:O(i)?A(i.ColSpan,1):1})):[])};n.grid=a}else n.fallbackText="[table]",t.push(`表格 ${n.nid??""} 缺少 Cells,导入为空框`);return n}case"subreport":return t.push(`子报表 ${n.nid??""} 暂不支持导入,已跳过`),null;default:return L(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(n.kind="line",n):r==="rect"||r==="oval"||r==="shape"?(n.kind=r==="oval"?"ellipse":"rect",n):(t.push(`未知组件类型 ${r},已跳过`),null)}}function Xe(e){const t=[];let r=null;if(typeof e=="string")try{const m=JSON.parse(e);O(m)&&(r=m)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else O(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const n=O(r.GlobalConfig)?r.GlobalConfig:{},o=A(n.paperWidthMm,210),a=A(n.paperHeightMm,297),s={top:A(n.marginTop,10),bottom:A(n.marginBottom,10),left:A(n.marginLeft,10),right:A(n.marginRight,10)},i=Array.isArray(r.children)?r.children.filter(m=>O(m)&&L(m.uitype)==="page"):[];i.length===0&&t.push("content 中没有 uitype=page 的页节点");const d=i.map(m=>{const h=m,g=Array.isArray(h.children)?h.children:[],l=[];for(const u of g){if(!O(u))continue;const f=Ke(u,t);f&&l.push(f)}return{widthMm:A(h.width,o),heightMm:A(h.DesignHeight,a),marginTopMm:A(h.MarginTop,s.top),marginBottomMm:A(h.MarginBottom,s.bottom),marginLeftMm:A(h.MarginLeft,s.left),marginRightMm:A(h.MarginRight,s.right),components:l}});return d.length===0&&(t.push("转换结果为空页,已回退一张空白页"),d.push({widthMm:o,heightMm:a,...s,components:[]})),{template:{pages:d},warnings:t}}function we(e,t,r){let n,o;if(typeof e=="string"){const a=c.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(c.PAPER_SIZES).join("/")})`);n=a.widthMm,o=a.heightMm}else typeof e=="number"?(n=e,o=t??297):(n=e.widthMm,o=e.heightMm);return r?{widthMm:o,heightMm:n}:{widthMm:n,heightMm:o}}class Pe{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",r={},n){this.collect();const a=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:n??{},{widthMm:s,heightMm:i}=we(t,typeof r=="number"?r:void 0,a.landscape),d=a.margins??{};return this.pending=new ve(this,{widthMm:s,heightMm:i,marginTopMm:d.marginTopMm??10,marginBottomMm:d.marginBottomMm??10,marginLeftMm:d.marginLeftMm??10,marginRightMm:d.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class ve{constructor(t,r){this.parent=t,this.page=r,this.components=[]}text(t,r={},n={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:t,style:n}),this}list(t,r,n,o={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:t,columns:n,...o}),this}rect(t,r={}){return this.components.push({kind:"rect",...t,style:r}),this}line(t,r,n,o={}){return this.components.push({kind:"line",leftMm:t,topMm:r,widthMm:n,heightMm:.5,style:o}),this}barcode(t,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:t}),this}qrcode(t,r,n,o){return this.components.push({kind:"qrcode",leftMm:n,topMm:o,widthMm:r,heightMm:r,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function Ze(){return new Pe}exports.CSS_DPI=c.CSS_DPI;exports.DEFAULT_BORDER_PT=c.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=c.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=c.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=c.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=c.LINE_HEIGHT;exports.MM_PER_INCH=c.MM_PER_INCH;exports.PAPER_SIZES=c.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=c.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=c.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=c.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=c.SCHEMA_VERSION_MACH;exports.charWidthEm=c.charWidthEm;exports.createCanvasMeasurer=c.createCanvasMeasurer;exports.createHeuristicMeasurer=c.createHeuristicMeasurer;exports.heuristicMeasurer=c.heuristicMeasurer;exports.isImageBackedComponent=c.isImageBackedComponent;exports.isRichText=c.isRichText;exports.measureTextMm=c.measureTextMm;exports.mmToPx=c.mmToPx;exports.mmToPxFactor=c.mmToPxFactor;exports.ptToPx=c.ptToPx;exports.pxToMm=c.pxToMm;exports.resolveBoxBorders=c.resolveBoxBorders;exports.resolveFontSize=c.resolveFontSize;exports.resolveLineHeight=c.resolveLineHeight;exports.resolveStroke=c.resolveStroke;exports.resolveTextColor=c.resolveTextColor;exports.round=c.round;exports.toRenderPlan=c.toRenderPlan;exports.wrapText=c.wrapText;exports.resolveGridLayout=ce.resolveGridLayout;exports.PageBuilder=ve;exports.TemplateBuilder=Pe;exports.assertRenderPlan=Ne;exports.classOf=_;exports.computePageWindow=be;exports.createCanvasPager=Ue;exports.createTemplate=Ze;exports.evalStyleRule=he;exports.formatValue=X;exports.importJh4jTemplateContent=Xe;exports.measurePageSizePx=te;exports.paginateTemplate=Be;exports.parseDateLocal=me;exports.planFontSizePx=je;exports.renderComponent=Q;exports.renderPage=Me;exports.renderPlan=Oe;exports.renderPlanToCanvas=Te;exports.renderPlanToImages=Ve;exports.resolvePaper=we;exports.toNumber=Y;exports.validateComponent=Z;exports.validatePage=ge;exports.validateRenderPlan=fe;
|
|
5
|
+
`):c.wrapText(t.text??"",t.widthMm,{fontSizePt:m},a).join(`
|
|
6
|
+
`);pe(e,{text:s,fontSizePx:c.resolveFontSize(g,n).fontSizePx,bold:g.bold??!1,color:c.resolveTextColor(g),align:g.align??"left",lineHeight:c.resolveLineHeight(g)},l,i,d,h,r,g.verticalAlign);break}case"rect":{const m=c.resolveStroke(g),s=c.resolveBoxBorders(g);g.backgroundColor&&(e.fillStyle=g.backgroundColor,e.fillRect(l,i,d,h)),s.inner&&(e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),e.beginPath(),s.top&&(e.moveTo(l,i),e.lineTo(l+d,i)),s.right&&(e.moveTo(l+d,i),e.lineTo(l+d,i+h)),s.bottom&&(e.moveTo(l+d,i+h),e.lineTo(l,i+h)),s.left&&(e.moveTo(l,i+h),e.lineTo(l,i)),e.stroke());break}case"line":{const m=c.resolveStroke({...g,borderColor:g.lineColor??g.borderColor});e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),e.beginPath(),e.moveTo(l,i+h/2),e.lineTo(l+d,i+h/2),e.stroke();break}case"ellipse":{const m=c.resolveStroke(g);e.strokeStyle=m.color,e.lineWidth=c.ptToPx(m.widthPt,n),g.backgroundColor&&(e.fillStyle=g.backgroundColor,e.beginPath(),e.ellipse(l+d/2,i+h/2,d/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(l+d/2,i+h/2,d/2,h/2,0,0,Math.PI*2),e.stroke();break}}}async function We(e,t={}){if(typeof document>"u")throw new Error("renderPlanToImages 需要浏览器环境(SSR/Node 请在客户端钩子中调用)");const{format:o="png",quality:n=.92,...r}=t,{canvases:a}=be(e,r),l=o==="jpeg"?"image/jpeg":"image/png",i=[];for(const d of a)i.push(await new Promise(h=>d.toBlob(g=>h(g),l,n))??new Blob([],{type:l}));return{blobs:i}}function be(e,t={}){if(typeof document>"u")throw new Error("renderPlanToCanvas 需要浏览器环境(SSR 请在客户端钩子中调用)");const o=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,r=n/96*X,a=t.fontFamily??'"Microsoft YaHei", sans-serif',l=t.measurer??c.heuristicMeasurer,i=Math.max(0,t.start??0),d=Math.min(e.pages.length-1,t.end??e.pages.length-1),h=[];for(let g=i;g<=d;g++){const m=e.pages[g],{canvas:s,ctx:u}=Ie(m,o,n);for(const f of m.components)Me(u,f,r,n,a,l);h.push(s)}return{canvases:h}}function Ge(e,t={}){const o=t.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),n=t.dpi??96,r=n/96*X,a=t.fontFamily??'"Microsoft YaHei", sans-serif',l=t.measurer??c.heuristicMeasurer,i=t.overscan??1,d=t.gapPx??18,h=t.pagesPerFrame??1,g=e.pages.map(p=>p.pageHeightMm*r),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*r)),s={start:0,end:-1};let u=null,f=null,w=null,A=null,v=[],S=0,k=[];function y(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,w=document.createElement("div"),A=document.createElement("div"),f.appendChild(w),v=[];const H=Math.min(e.pages.length,3+i*2);for(let _=0;_<H;_++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${d}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(T),v.push(T)}f.appendChild(A),p.appendChild(f)}function W(p,H){const _=e.pages[H],{widthPx:T,heightPx:$}=Z(_,n);let C=p.firstElementChild;(!C||C.tagName!=="CANVAS")&&(C=document.createElement("canvas"),p.innerHTML="",p.appendChild(C)),C.width=Math.round(T*o),C.height=Math.round($*o),C.style.width=`${T}px`,C.style.height=`${$}px`;const z=C.getContext("2d");if(z){z.setTransform(1,0,0,1,0,0),z.scale(o,o),z.fillStyle="#ffffff",z.fillRect(0,0,T,$);for(const j of _.components)Me(z,j,r,n,a,l);C.dataset.canvasPage=String(H),p.style.height=`${$}px`,p.style.width=`${T}px`}}function G(p){s.start=p.start,s.end=p.end,w.style.height=`${p.start*d+g.slice(0,p.start).reduce((T,$)=>T+$,0)}px`;const H=e.pages.length-1-p.end;A.style.height=`${H*d+g.slice(p.end+1).reduce((T,$)=>T+$,0)}px`;const _=p.end-p.start+1;v.forEach((T,$)=>{if($<_){T.style.display="";const C=p.start+$;T.style.height=`${g[C]??0}px`}else T.style.display="none"}),k=[];for(let T=p.start;T<=p.end;T++){const $=v[T-p.start];if(!$)continue;$.firstElementChild?.dataset?.canvasPage!==String(T)&&k.push(T)}x()}function x(){S||k.length===0||(S=requestAnimationFrame(()=>{S=0;let p=Math.max(1,h);for(;k.length>0&&p-- >0;){const H=k.shift(),_=v[H-s.start];_&&W(_,H)}k.length>0&&x()}))}function N(){S||(S=requestAnimationFrame(()=>{S=0;const p=u,H=ue({pageHeightsPx:g,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:i,gapPx:d});H.start!==s.start||H.end!==s.end?G(H):x()}))}let D=null;return{attach(p){if(typeof document>"u")throw new Error("createCanvasPager 需要浏览器环境(SSR 请在客户端钩子中调用 attach)");u=p,y(),p.addEventListener("scroll",N,{passive:!0}),typeof ResizeObserver<"u"&&(D=new ResizeObserver(()=>N()),D.observe(p)),N()},destroy(){S&&cancelAnimationFrame(S),S=0,D?.disconnect(),D=null,u?.removeEventListener("scroll",N),k=[],f?.remove(),u=null},window(){return{...s}}}}function Se(e,t,o){let n,r;if(typeof e=="string"){const a=c.PAPER_SIZES[e];if(!a)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(c.PAPER_SIZES).join("/")})`);n=a.widthMm,r=a.heightMm}else typeof e=="number"?(n=e,r=t??297):(n=e.widthMm,r=e.heightMm);return o?{widthMm:r,heightMm:n}:{widthMm:n,heightMm:r}}class Te{constructor(){this.pages=[],this.pending=null,this.templateParams=void 0}params(t){return this.templateParams=t,this}page(t="a4",o={},n){this.collect();const a=n!=null&&!("margins"in n)&&!("landscape"in n)&&("marginTopMm"in n||"marginBottomMm"in n||"marginLeftMm"in n||"marginRightMm"in n)?{margins:n}:n??{},{widthMm:l,heightMm:i}=Se(t,typeof o=="number"?o:void 0,a.landscape),d=a.margins??{};return this.pending=new we(this,{widthMm:l,heightMm:i,marginTopMm:d.marginTopMm??10,marginBottomMm:d.marginBottomMm??10,marginLeftMm:d.marginLeftMm??10,marginRightMm:d.marginRightMm??10}),this.pending}collect(){this.pending&&(this.pages.push(this.pending.buildPage()),this.pending=null)}build(){if(this.collect(),this.pages.length===0)throw new Error("模板至少需要一页:先调用 .page() 添加内容");return this.templateParams?{params:this.templateParams,pages:this.pages}:{pages:this.pages}}}class we{constructor(t,o){this.parent=t,this.page=o,this.components=[]}text(t,o={},n={}){return this.components.push({kind:"text",leftMm:o.leftMm??0,topMm:o.topMm??0,widthMm:o.widthMm??60,heightMm:o.heightMm??8,text:t,style:n}),this}list(t,o,n,r={}){return this.components.push({kind:"list",leftMm:o.leftMm??10,topMm:o.topMm??30,widthMm:o.widthMm??180,dataset:t,columns:n,...r}),this}rect(t,o={}){return this.components.push({kind:"rect",...t,style:o}),this}line(t,o,n,r={}){return this.components.push({kind:"line",leftMm:t,topMm:o,widthMm:n,heightMm:.5,style:r}),this}barcode(t,o){return this.components.push({kind:"barcode",leftMm:o.leftMm??0,topMm:o.topMm??0,widthMm:o.widthMm??40,heightMm:o.heightMm??12,fallbackText:t}),this}qrcode(t,o,n,r){return this.components.push({kind:"qrcode",leftMm:n,topMm:r,widthMm:o,heightMm:o,fallbackText:t}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function je(){return new Te}exports.CSS_DPI=c.CSS_DPI;exports.DEFAULT_BORDER_PT=c.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=c.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=c.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=c.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=c.LINE_HEIGHT;exports.MM_PER_INCH=c.MM_PER_INCH;exports.PAPER_SIZES=c.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=c.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_MACH=c.SCHEMA_VERSION_MACH;exports.charWidthEm=c.charWidthEm;exports.createCanvasMeasurer=c.createCanvasMeasurer;exports.createHeuristicMeasurer=c.createHeuristicMeasurer;exports.heuristicMeasurer=c.heuristicMeasurer;exports.isImageBackedComponent=c.isImageBackedComponent;exports.isRichText=c.isRichText;exports.measureTextMm=c.measureTextMm;exports.mmToPx=c.mmToPx;exports.mmToPxFactor=c.mmToPxFactor;exports.ptToPx=c.ptToPx;exports.pxToMm=c.pxToMm;exports.resolveBoxBorders=c.resolveBoxBorders;exports.resolveFontSize=c.resolveFontSize;exports.resolveLineHeight=c.resolveLineHeight;exports.resolveStroke=c.resolveStroke;exports.resolveTextColor=c.resolveTextColor;exports.round=c.round;exports.wrapText=c.wrapText;exports.resolveGridLayout=ae.resolveGridLayout;exports.PageBuilder=we;exports.TemplateBuilder=Te;exports.assertRenderPlan=Ae;exports.classOf=R;exports.computePageWindow=ue;exports.createCanvasPager=Ge;exports.createTemplate=je;exports.evalStyleRule=de;exports.formatValue=q;exports.measurePageSizePx=Z;exports.paginateTemplate=Re;exports.parseDateLocal=le;exports.planFontSizePx=De;exports.renderComponent=K;exports.renderPage=fe;exports.renderPlan=ze;exports.renderPlanToCanvas=be;exports.renderPlanToImages=We;exports.resolvePaper=Se;exports.toNumber=U;exports.validateComponent=J;exports.validatePage=ce;exports.validateRenderPlan=he;
|
package/dist/index.d.cts
CHANGED