@agile-team/mach-report 0.4.0 → 0.6.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.
Files changed (111) hide show
  1. package/dist/ReportPreview-DWLjYi_p.js +527 -0
  2. package/dist/ReportPreview-rBtmbu3W.cjs +6 -0
  3. package/dist/_commonjsHelpers-DKOUU3wS.cjs +1 -0
  4. package/dist/_commonjsHelpers-DaMA6jEr.js +8 -0
  5. package/dist/builder/template-builder.d.ts +3 -3
  6. package/dist/compat/jh4j-template.d.ts +1 -1
  7. package/dist/index.cjs +6 -0
  8. package/dist/index.d.cts +13 -0
  9. package/dist/index.d.ts +13 -13
  10. package/dist/index.js +919 -14
  11. package/dist/layout/paginate.d.ts +2 -2
  12. package/dist/manager/api.d.ts +1 -1
  13. package/dist/manager/index.d.ts +2 -2
  14. package/dist/manager.cjs +1 -0
  15. package/dist/manager.d.cts +5 -0
  16. package/dist/manager.d.ts +1 -1
  17. package/dist/manager.js +104 -6
  18. package/dist/pdf/index.d.ts +2 -2
  19. package/dist/pdf/render-pdf.d.ts +10 -4
  20. package/dist/pdf.cjs +84 -0
  21. package/dist/pdf.d.cts +6 -0
  22. package/dist/pdf.d.ts +1 -1
  23. package/dist/pdf.js +36152 -7
  24. package/dist/plugin-BIJxGHZX.cjs +1 -0
  25. package/dist/plugin-DrV67_VW.js +89 -0
  26. package/dist/render/canvas.d.ts +2 -2
  27. package/dist/render/dom.d.ts +1 -1
  28. package/dist/render/grid-geometry.d.ts +1 -1
  29. package/dist/render/style.d.ts +1 -8
  30. package/dist/schema/validate.d.ts +1 -1
  31. package/dist/sql/compile.d.ts +1 -1
  32. package/dist/sql/index.d.ts +4 -4
  33. package/dist/sql.cjs +68 -0
  34. package/dist/sql.d.cts +5 -0
  35. package/dist/sql.d.ts +1 -1
  36. package/dist/sql.js +40794 -6
  37. package/dist/style-B3vxGDZd.cjs +3 -0
  38. package/dist/style-B7Xfo5I-.js +255 -0
  39. package/dist/style.css +1 -0
  40. package/dist/vue/ReportPreview.d.ts +141 -0
  41. package/dist/vue/ReportToolbar.d.ts +25 -0
  42. package/dist/vue/adapters.d.ts +37 -0
  43. package/dist/vue/async.d.cts +146 -0
  44. package/dist/vue/async.d.ts +146 -0
  45. package/dist/vue/composables/usePageWindow.d.ts +28 -0
  46. package/dist/vue/composables/usePrintExport.d.ts +19 -0
  47. package/dist/vue/composables/useZoom.d.ts +15 -0
  48. package/dist/vue/config.d.ts +79 -0
  49. package/dist/vue/index.d.cts +11 -0
  50. package/dist/vue/index.d.ts +11 -0
  51. package/dist/vue/injection-keys.d.ts +12 -0
  52. package/dist/vue/local-adapter.d.ts +12 -0
  53. package/dist/vue/pdf-exporter.d.ts +13 -0
  54. package/dist/vue/plugin.d.ts +34 -0
  55. package/dist/vue-async.cjs +1 -0
  56. package/dist/vue-async.js +17 -0
  57. package/dist/vue.cjs +1 -0
  58. package/dist/vue.js +44 -0
  59. package/package.json +84 -17
  60. package/dist/builder/template-builder.js +0 -153
  61. package/dist/builder/template-builder.js.map +0 -1
  62. package/dist/compat/jh4j-template.js +0 -196
  63. package/dist/compat/jh4j-template.js.map +0 -1
  64. package/dist/defaults.js +0 -28
  65. package/dist/defaults.js.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/layout/paginate.js +0 -197
  68. package/dist/layout/paginate.js.map +0 -1
  69. package/dist/layout/textwrap.js +0 -173
  70. package/dist/layout/textwrap.js.map +0 -1
  71. package/dist/manager/api.js +0 -101
  72. package/dist/manager/api.js.map +0 -1
  73. package/dist/manager/index.js +0 -3
  74. package/dist/manager/index.js.map +0 -1
  75. package/dist/manager/types.js +0 -8
  76. package/dist/manager/types.js.map +0 -1
  77. package/dist/manager.js.map +0 -1
  78. package/dist/pdf/font-loader.js +0 -84
  79. package/dist/pdf/font-loader.js.map +0 -1
  80. package/dist/pdf/index.js +0 -3
  81. package/dist/pdf/index.js.map +0 -1
  82. package/dist/pdf/render-pdf.js +0 -284
  83. package/dist/pdf/render-pdf.js.map +0 -1
  84. package/dist/pdf.js.map +0 -1
  85. package/dist/render/canvas.js +0 -402
  86. package/dist/render/canvas.js.map +0 -1
  87. package/dist/render/dom.js +0 -311
  88. package/dist/render/dom.js.map +0 -1
  89. package/dist/render/grid-geometry.js +0 -131
  90. package/dist/render/grid-geometry.js.map +0 -1
  91. package/dist/render/style.js +0 -39
  92. package/dist/render/style.js.map +0 -1
  93. package/dist/render/window.js +0 -58
  94. package/dist/render/window.js.map +0 -1
  95. package/dist/schema/render-plan.js +0 -25
  96. package/dist/schema/render-plan.js.map +0 -1
  97. package/dist/schema/validate.js +0 -129
  98. package/dist/schema/validate.js.map +0 -1
  99. package/dist/sql/ast-check.js +0 -44
  100. package/dist/sql/ast-check.js.map +0 -1
  101. package/dist/sql/compile.js +0 -145
  102. package/dist/sql/compile.js.map +0 -1
  103. package/dist/sql/expr.js +0 -123
  104. package/dist/sql/expr.js.map +0 -1
  105. package/dist/sql/index.js +0 -5
  106. package/dist/sql/index.js.map +0 -1
  107. package/dist/sql/tokenizer.js +0 -124
  108. package/dist/sql/tokenizer.js.map +0 -1
  109. package/dist/sql.js.map +0 -1
  110. package/dist/units.js +0 -26
  111. package/dist/units.js.map +0 -1
package/dist/index.cjs ADDED
@@ -0,0 +1,6 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./style-B3vxGDZd.cjs"),ne=new Set(["text","image","barcode","qrcode","chart","line","rect","ellipse"]);function B(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e,n,r,t){const i=e[n];i!=null&&(typeof i!="number"||!Number.isFinite(i))&&t.push({path:`${r}.${n}`,message:`应为有限数字,实际 ${JSON.stringify(i)}`})}function I(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"组件应为对象"});return}const i=e.kind;typeof i!="string"?r.push({path:`${n}.kind`,message:"组件缺少 kind 字符串"}):ne.has(i)||t.push({path:`${n}.kind`,message:`未知组件类型 ${JSON.stringify(i)},将以兜底方式渲染`});for(const o of["leftMm","topMm","widthMm","heightMm"])re(e,o,n,r);e.leftMm!=null&&e.widthMm!=null&&(e.leftMm<-100||e.widthMm<0)&&r.push({path:n,message:"几何数值异常(leftMm<-100 或 widthMm<0)"});const d=e.grid;d!==void 0&&(!B(d)||!Array.isArray(d.cells)?r.push({path:`${n}.grid.cells`,message:"grid.cells 应为二维数组"}):d.cells.forEach((o,l)=>{if(!Array.isArray(o)){r.push({path:`${n}.grid.cells.${l}`,message:"行应为数组"});return}o.forEach((h,c)=>{h!=null&&B(h)&&Array.isArray(h.children)&&h.children.forEach((m,g)=>{I(m,`${n}.grid.cells.${l}.${c}.children.${g}`,r,t)})})}));const a=e.richParagraphs;a!==void 0&&(Array.isArray(a)?a.forEach((o,l)=>{(!B(o)||!Array.isArray(o.segments))&&r.push({path:`${n}.richParagraphs.${l}`,message:"段落缺少 segments 数组"})}):r.push({path:`${n}.richParagraphs`,message:"richParagraphs 应为数组"}))}function V(e,n,r,t=[]){if(!B(e)){r.push({path:n,message:"页应为对象"});return}const i=e.pageWidthMm,d=e.pageHeightMm;(typeof i!="number"||!(i>0&&i<3e3))&&r.push({path:`${n}.pageWidthMm`,message:`页宽非法: ${JSON.stringify(i)}`}),(typeof d!="number"||!(d>0&&d<5e3))&&r.push({path:`${n}.pageHeightMm`,message:`页高非法: ${JSON.stringify(d)}`});const a=e.components;a!==void 0&&!Array.isArray(a)?r.push({path:`${n}.components`,message:"components 应为数组"}):Array.isArray(a)&&a.forEach((o,l)=>I(o,`${n}.components.${l}`,r,t))}function U(e){const n=[],r=[],t=B(e)?e.pages:void 0;return Array.isArray(t)?t.forEach((i,d)=>V(i,`$.pages.${d}`,n,r)):n.push({path:"$.pages",message:e==null?"渲染计划为空":"渲染计划缺少 pages 数组"}),{ok:n.length===0,errors:n,warnings:r}}function ie(e){const n=U(e);if(!n.ok){const r=n.errors.slice(0,3).map(t=>`${t.path}: ${t.message}`).join("; ");throw new Error(`渲染计划校验失败(${n.errors.length} 处): ${r}`)}return e.pages}function G(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 oe(e,n){return n.heightMm-(e.marginBottomMm??n.marginBottomMm)}function ae(e,n){const t=(e.fontSizePt??s.DEFAULT_FONT_PT)*s.LINE_HEIGHT*25.4/72,i=(e.paddingMm??1)*2;return Math.max(e.rowHeightMm??0,n*t+i)}function se(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 le(e,n){const r=e.fontSizePt??s.DEFAULT_FONT_PT,t=e.paddingMm??1,i=e.columns.map(g=>g.style?{align:"left",verticalAlign:"middle",...g.style}:{align:"left",verticalAlign:"middle"}),d=e.columns.map(g=>({bold:e.headerBold??!0,align:"center",verticalAlign:"middle",backgroundColor:e.headerBackgroundColor,...g.style||{}})),a=e.columns.map(g=>g.header),o=a.map((g,u)=>s.wrapText(g,e.columns[u].widthMm-t*2,{fontSizePt:r,bold:e.headerBold??!0},n)),l=Math.max(...o.map(g=>g.length),1),h=ae(e,l),c=a.map((g,u)=>({text:g,style:d[u]})),m=e.border===!1?{borderTop:!1,borderRight:!1,borderBottom:!1,borderLeft:!1}:{borderBottom:!0,borderLeft:!0,borderRight:!0,borderTop:!0};return{fontSizePt:r,paddingMm:t,cellStyles:i,borderStyle:m,headerHeightMm:h,headerGrid:{cells:[c],rowHeightsMm:[h]},columns:e.columns}}function de(e,n,r){const t=e.columns,i=new Array(t.length);let d=1;for(let c=0;c<t.length;c++)i[c]=se(n[t[c].field]);const a=new Array(t.length);for(let c=0;c<t.length;c++){const m=s.wrapText(i[c],t[c].widthMm-e.paddingMm*2,{fontSizePt:e.fontSizePt},r);a[c]=m,m.length>d&&(d=m.length)}const o=e.fontSizePt*s.LINE_HEIGHT*25.4/72,l=Math.max(e.rowHeightFloorMm,d*o+e.paddingMm*2),h=new Array(t.length);for(let c=0;c<t.length;c++)h[c]={text:i[c],style:e.cellStyles[c]};return{grid:{cells:[h],rowHeightsMm:[l]},heightMm:l}}function he(e,n,r={}){const t=typeof r=="number"?{mmPerRow:r}:r,i=t.mmPerRow??0,d=t.measurer??s.heuristicMeasurer,a=[],o=[];let l=0;const h=c=>`${c}_${(++l).toString(36)}`;for(const c of e.pages){const m=G(c),g=()=>oe(c,m),u=m.marginTopMm,f=()=>{o.push({pageWidthMm:m.widthMm,pageHeightMm:m.heightMm,marginTopMm:m.marginTopMm,marginBottomMm:m.marginBottomMm,marginLeftMm:m.marginLeftMm,marginRightMm:m.marginRightMm,components:m.components})};for(const b of c.components){if(b.kind!=="list"){m.components.push(b);continue}const M=b,C=n[M.dataset];Array.isArray(C)||a.push(`数据集 ${M.dataset} 未提供数据,列表 ${M.id??""} 输出为空`);const P=Array.isArray(C)?C:[],H=M.columns.reduce((y,w)=>y+w.widthMm,0),S=H>M.widthMm?M.widthMm/H:1,F=S===1?M:{...M,columns:M.columns.map(y=>({...y,widthMm:y.widthMm*S}))},_={...le(F,d),rowHeightFloorMm:F.rowHeightMm??0},z={kind:"rect",leftMm:M.leftMm,topMm:0,widthMm:M.widthMm,heightMm:_.headerHeightMm,grid:_.headerGrid,nid:h("listh"),style:_.borderStyle};let $=M.topMm;const p=(y,w)=>{y.components.push({...z,topMm:w})};p(m,$),$+=_.headerHeightMm+i;for(let y=0;y<P.length;y++){const w=de(_,P[y],d);if($+w.heightMm>g()){f();const T=G(c);m.components=T.components,m.heightMm=T.heightMm,F.headerEveryPage!==!1?(p(m,M.topMm),$=M.topMm+_.headerHeightMm):$=u}m.components.push({kind:"rect",leftMm:M.leftMm,topMm:$,widthMm:M.widthMm,heightMm:w.heightMm,grid:w.grid,nid:h("listr"),style:_.borderStyle}),$+=w.heightMm}}f()}return{plan:{schemaVersion:s.RENDER_PLAN_SCHEMA_VERSION,pages:o},warnings:a}}const ce={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 x(e,n){return n?.classNames?.[e]??ce[e]}class R{constructor(){this.props=[]}add(n,r){return r==null||r===!1||r===""?this:(this.props.push([n,String(r)]),this)}mm(n,r,t,i=2){return this.add(n,`${s.round(s.mmToPx(r,t),i)}px`)}toString(){let n="";for(const[r,t]of this.props)n+=`${r}:${t};`;return n}applyTo(n){const r=this.toString();r&&(n.style.cssText=r)}}function J(e,n,r){const t=n.style||{};e.add("color",t.color).add("background-color",t.backgroundColor).add("font-family",t.fontFamily).add("font-weight",t.bold?"700":void 0).add("font-style",t.italic?"italic":void 0).add("text-decoration",t.underline?"underline":void 0).add("letter-spacing",t.letterSpacing!=null?`${t.letterSpacing}pt`:void 0).add("opacity",t.opacity!=null?String(t.opacity):void 0).add("transform",t.rotateDeg?`rotate(${t.rotateDeg}deg)`:void 0);const i=s.resolveFontSize(t,r);e.add("font-size",`${s.round(i.fontSizePx,2)}px`)}function me(e,n,r,t,i){const d=i.createElement("table");if(d.className=x("grid",t),new R().add("width","100%").add("height","100%").add("border-collapse","collapse").add("table-layout",e.colWidthsMm?"fixed":"auto").applyTo(d),e.colWidthsMm){const h=i.createElement("colgroup");for(const c of e.colWidthsMm){const m=i.createElement("col");new R().mm("width",c,r).applyTo(m),h.appendChild(m)}d.appendChild(h)}const a=s.resolveBoxBorders(n.style),o=s.resolveStroke(n.style),l=a.inner?`${s.round(o.widthPt*r/72,2)}px solid ${o.color}`:"";return e.cells.forEach((h,c)=>{const m=i.createElement("tr");m.className=x("row",t),e.rowHeightsMm?.[c]!=null&&new R().mm("height",e.rowHeightsMm[c],r).applyTo(m),(h||[]).forEach(g=>{const u=i.createElement("td");u.className=x("cell",t),g?.colSpan&&(u.colSpan=g.colSpan),g?.rowSpan&&(u.rowSpan=g.rowSpan);const f=new R;if(l&&f.add("border",l),g?.style){const b=g.style;f.add("text-align",b.align).add("vertical-align",b.verticalAlign).add("background-color",b.backgroundColor).add("color",b.color).add("font-weight",b.bold?"700":void 0),f.add("font-size",`${s.round(s.resolveFontSize(b,r).fontSizePx,2)}px`)}if(f.applyTo(u),g?.text!=null&&(u.textContent=g.text),g?.children?.length)for(const b of g.children)u.appendChild(O(b,r,t,i));m.appendChild(u)}),d.appendChild(m)}),d}function ge(e,n,r,t){const i=t.createElement("div");i.className=x("text",r);const d=e.style||{},a=new R().add("text-align",d.align).add("display","flex").add("flex-direction","column").add("justify-content",d.verticalAlign==="middle"?"center":d.verticalAlign==="bottom"?"flex-end":"flex-start").add("overflow","hidden");if(J(a,e,n),a.applyTo(i),s.isRichText(e)){const o=t.createElement("div");o.className=x("rich",r);for(const l of e.richParagraphs){const h=t.createElement("div");h.className=x("paragraph",r),new R().add("text-align",l.align).add("line-height",l.lineHeight!=null?String(l.lineHeight):void 0).mm("margin-top",l.spaceBeforeMm??0,n).mm("margin-bottom",l.spaceAfterMm??0,n).mm("text-indent",l.indentMm??0,n).applyTo(h);for(const m of l.segments||[]){const g=t.createElement("span");if(g.className=x("segment",r),g.textContent=m.kind==="field"?m.field??"":m.text??"",m.style){const u=new R().add("color",m.style.color).add("font-weight",m.style.bold?"700":void 0);u.add("font-size",`${s.round(s.resolveFontSize(m.style,n).fontSizePx,2)}px`),u.applyTo(g)}h.appendChild(g)}o.appendChild(h)}return i.appendChild(o),i}if(Array.isArray(e.lines)&&e.lines.length>0){const o=t.createElement("div");o.className=x("lines",r),d.lineHeight!=null&&new R().add("line-height",String(d.lineHeight)).applyTo(o);for(const l of e.lines){const h=t.createElement("div");h.className=x("line",r),h.textContent=l,o.appendChild(h)}return i.appendChild(o),i}return i.textContent=e.text??"",i}function fe(e,n,r){const t=r.createElement("img");return t.className=x("image",n),t.src=e.imageData,new R().add("width","100%").add("height","100%").add("object-fit","contain").add("display","block").applyTo(t),t.alt=e.kind,t}function j(e,n,r,t){const i=t.createElement("div");i.className=x("shape",r);const d=e.style||{},a=s.resolveStroke(d),o=s.resolveBoxBorders(d),l=`${s.round(a.widthPt*n/72,2)}px solid ${a.color}`,h=new R;return e.grid||e.kind==="rect"?(o.top&&h.add("border-top",l),o.right&&h.add("border-right",l),o.bottom&&h.add("border-bottom",l),o.left&&h.add("border-left",l)):e.kind==="ellipse"?(o.inner&&h.add("border",l).add("border-radius","50%"),d.backgroundColor&&h.add("background-color",d.backgroundColor)):e.kind==="line"&&h.add("height","0").add("border-top",l),h.add("box-sizing","border-box").add("width","100%").add("height","100%"),h.applyTo(i),i}function O(e,n,r,t){const i=t.createElement("div");i.className=`${x("comp",r)} mr-kind-${e.kind}`;const d=new R().add("position","absolute").mm("left",e.leftMm,n).mm("top",e.topMm,n).mm("width",e.widthMm,n).mm("height",e.heightMm,n).add("box-sizing","border-box");if(J(d,e,n),d.applyTo(i),s.isImageBackedComponent(e))return i.appendChild(fe(e,r,t)),i;if(e.kind==="text")return i.appendChild(ge(e,n,r,t)),i;if(e.grid){const o=j(e,n,r,t);return o.appendChild(me(e.grid,e,n,r,t)),i.appendChild(o),i}if(e.kind==="line"||e.kind==="rect"||e.kind==="ellipse"||e.kind==="chart")return i.appendChild(j(e,n,r,t)),i;const a=t.createElement("div");return a.className=x("unknown",r),a.textContent=e.fallbackText??"",i.appendChild(a),i}function q(e,n,r,t){const i=t.createElement("div");i.className=x("page",r),new R().add("position","relative").mm("width",e.pageWidthMm,n).mm("height",e.pageHeightMm,n).add("background-color","#fff").add("overflow","hidden").add("box-sizing","border-box").applyTo(i);for(const d of e.components)i.appendChild(O(d,n,r,t));return i}function ue(e,n,r={}){const t=r.dpi??96,i=n.createElement("div");return i.className=x("root",r),i.dataset.schemaVersion=e.schemaVersion,e.pages.forEach(d=>{i.appendChild(q(d,t,r,n))}),i}function K(e){const{pageHeightsPx:n,viewportHeightPx:r,scrollTopPx:t,overscan:i=1,gapPx:d=0}=e,a=n.length;if(a===0)return{start:0,end:-1,padTopPx:0,padBottomPx:0};const o=Math.max(0,d),l=new Array(a+1);l[0]=0;for(let S=0;S<a;S++)l[S+1]=l[S]+Math.max(0,n[S]??0)+o;const h=l[a],c=Math.max(0,t);let m=0,g=0,u=a-1;for(;g<=u;){const S=g+u>>1;l[S]<=c?(m=S,g=S+1):u=S-1}const f=Math.max(0,Math.min(a-1,m-i)),b=l[m]+Math.max(0,r);let M=a-1;for(g=0,u=a-1;g<=u;){const S=g+u>>1;l[S+1]<b?g=S+1:(M=S,u=S-1)}const C=Math.min(a-1,M+i),P=l[f],H=Math.max(0,h-l[C+1]);return{start:f,end:C,padTopPx:P,padBottomPx:H}}const D=96/25.4;function W(e,n=96){const r=n/96*D;return{widthPx:Math.max(1,Math.round(e.pageWidthMm*r)),heightPx:Math.max(1,Math.round(e.pageHeightMm*r))}}function pe(e,n,r){const t=document.createElement("canvas"),{widthPx:i,heightPx:d}=W(e,r);t.width=Math.round(i*n),t.height=Math.round(d*n),t.style.width=`${i}px`,t.style.height=`${d}px`;const a=t.getContext("2d");if(!a)throw new Error("当前环境不支持 Canvas 2D(测试需真浏览器,见 e2e/canvas.spec.ts)");return a.scale(n,n),a.fillStyle="#ffffff",a.fillRect(0,0,i,d),{canvas:t,ctx:a}}function Me(e,n=96){return s.resolveFontSize(e,n).fontSizePx}function X(e,n,r,t,i,d,a,o="top"){e.font=`${n.bold?"bold ":""}${n.fontSizePx}px ${a}`,e.fillStyle=n.color,e.textBaseline="alphabetic";const l=n.fontSizePx*n.lineHeight,h=n.text===""?[""]:n.text.split(`
2
+ `),c=h.length*l;let m=t;o==="middle"?m=t+(d-c)/2:o==="bottom"&&(m=t+d-c),h.forEach((g,u)=>{e.textAlign=n.align==="center"?"center":n.align==="right"?"right":"left";const f=n.align==="center"?r+i/2:n.align==="right"?r+i:r;e.fillText(g,f,m+u*l+n.fontSizePx*.8,i)}),e.textAlign="left"}function Te(e,n,r,t,i,d,a,o,l,h,c){const m=s.resolveGridLayout(n,d/o,a/o),g=s.resolveBoxBorders(r.style),u=s.resolveStroke(r.style);for(const f of m.cells){const b=f.cell.style?.backgroundColor;b&&(e.fillStyle=b,e.fillRect(t+f.xMm*o,i+f.yMm*o,f.widthMm*o,f.heightMm*o))}if(g.inner){e.strokeStyle=u.color,e.lineWidth=s.ptToPx(u.widthPt,l);for(const f of m.edges)e.beginPath(),f.kind==="v"?(e.moveTo(t+f.pos*o,i+f.from*o),e.lineTo(t+f.pos*o,i+f.to*o)):(e.moveTo(t+f.from*o,i+f.pos*o),e.lineTo(t+f.to*o,i+f.pos*o)),e.stroke();e.beginPath(),g.top&&(e.moveTo(t,i),e.lineTo(t+d,i)),g.right&&(e.moveTo(t+d,i),e.lineTo(t+d,i+a)),g.bottom&&(e.moveTo(t+d,i+a),e.lineTo(t,i+a)),g.left&&(e.moveTo(t,i+a),e.lineTo(t,i)),e.stroke()}for(const f of m.cells){const b=typeof f.cell.text=="string"?f.cell.text:"";if(!b)continue;const M=f.cell.style,C=M?.fontSize??s.DEFAULT_FONT_PT,P=s.wrapText(b,f.widthMm-1,{fontSizePt:C},c).join(`
3
+ `);X(e,{text:P,fontSizePx:s.resolveFontSize(M,l).fontSizePx,bold:M?.bold??!1,color:M?.color??s.resolveTextColor(r.style,s.DEFAULT_TEXT_COLOR),align:M?.align??"left",lineHeight:s.LINE_HEIGHT},t+(f.xMm+.5)*o,i+f.yMm*o,Math.max(0,(f.widthMm-1)*o),f.heightMm*o,h,M?.verticalAlign??"middle")}}function Z(e,n,r,t,i,d){const a=n.leftMm*r,o=n.topMm*r,l=n.widthMm*r,h=n.heightMm*r,c=n.style??{};if(n.grid){Te(e,n.grid,n,a,o,l,h,r,t,i,d);return}switch(n.kind){case"text":{const m=c.fontSize??s.DEFAULT_FONT_PT,g=s.isRichText(n)?n.richParagraphs.map(u=>(u.segments??[]).map(f=>f.text??f.field??"").join("")).join(`
4
+ `):Array.isArray(n.lines)&&n.lines.length>0?n.lines.join(`
5
+ `):s.wrapText(n.text??"",n.widthMm,{fontSizePt:m},d).join(`
6
+ `);X(e,{text:g,fontSizePx:s.resolveFontSize(c,t).fontSizePx,bold:c.bold??!1,color:s.resolveTextColor(c),align:c.align??"left",lineHeight:s.resolveLineHeight(c)},a,o,l,h,i,c.verticalAlign);break}case"rect":{const m=s.resolveStroke(c),g=s.resolveBoxBorders(c);c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.fillRect(a,o,l,h)),g.inner&&(e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),g.top&&(e.moveTo(a,o),e.lineTo(a+l,o)),g.right&&(e.moveTo(a+l,o),e.lineTo(a+l,o+h)),g.bottom&&(e.moveTo(a+l,o+h),e.lineTo(a,o+h)),g.left&&(e.moveTo(a,o+h),e.lineTo(a,o)),e.stroke());break}case"line":{const m=s.resolveStroke({...c,borderColor:c.lineColor??c.borderColor});e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),e.beginPath(),e.moveTo(a,o+h/2),e.lineTo(a+l,o+h/2),e.stroke();break}case"ellipse":{const m=s.resolveStroke(c);e.strokeStyle=m.color,e.lineWidth=s.ptToPx(m.widthPt,t),c.backgroundColor&&(e.fillStyle=c.backgroundColor,e.beginPath(),e.ellipse(a+l/2,o+h/2,l/2,h/2,0,0,Math.PI*2),e.fill()),e.beginPath(),e.ellipse(a+l/2,o+h/2,l/2,h/2,0,0,Math.PI*2),e.stroke();break}}}function be(e,n={}){const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*D,d=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=Math.max(0,n.start??0),l=Math.min(e.pages.length-1,n.end??e.pages.length-1),h=[];for(let c=o;c<=l;c++){const m=e.pages[c],{canvas:g,ctx:u}=pe(m,r,t);for(const f of m.components)Z(u,f,i,t,d,a);h.push(g)}return{canvases:h}}function ye(e,n={}){const r=n.dpr??(typeof devicePixelRatio=="number"?devicePixelRatio:1),t=n.dpi??96,i=t/96*D,d=n.fontFamily??'"Microsoft YaHei", sans-serif',a=n.measurer??s.heuristicMeasurer,o=n.overscan??1,l=n.gapPx??18,h=n.pagesPerFrame??1,c=e.pages.map(p=>p.pageHeightMm*i),m=Math.max(1,...e.pages.map(p=>p.pageWidthMm*i)),g={start:0,end:-1};let u=null,f=null,b=null,M=null,C=[],P=0,H=[];function S(){const p=u;p.innerHTML="",f=document.createElement("div"),f.style.cssText=`width:${m}px;margin:0 auto;`,b=document.createElement("div"),M=document.createElement("div"),f.appendChild(b),C=[];const y=Math.min(e.pages.length,3+o*2);for(let w=0;w<y;w++){const T=document.createElement("div");T.style.cssText=`margin:0 auto ${l}px;box-shadow:0 2px 8px rgba(0,0,0,.35);background:#fff;`,f.appendChild(T),C.push(T)}f.appendChild(M),p.appendChild(f)}function F(p,y){const w=e.pages[y],{widthPx:T,heightPx:k}=W(w,t);let A=p.firstElementChild;(!A||A.tagName!=="CANVAS")&&(A=document.createElement("canvas"),p.innerHTML="",p.appendChild(A)),A.width=Math.round(T*r),A.height=Math.round(k*r),A.style.width=`${T}px`,A.style.height=`${k}px`;const N=A.getContext("2d");if(N){N.setTransform(1,0,0,1,0,0),N.scale(r,r),N.fillStyle="#ffffff",N.fillRect(0,0,T,k);for(const te of w.components)Z(N,te,i,t,d,a);A.dataset.canvasPage=String(y),p.style.height=`${k}px`,p.style.width=`${T}px`}}function _(p){g.start=p.start,g.end=p.end,b.style.height=`${p.start*l+c.slice(0,p.start).reduce((T,k)=>T+k,0)}px`;const y=e.pages.length-1-p.end;M.style.height=`${y*l+c.slice(p.end+1).reduce((T,k)=>T+k,0)}px`;const w=p.end-p.start+1;C.forEach((T,k)=>{if(k<w){T.style.display="";const A=p.start+k;T.style.height=`${c[A]??0}px`}else T.style.display="none"}),H=[];for(let T=p.start;T<=p.end;T++){const k=C[T-p.start];if(!k)continue;k.firstElementChild?.dataset?.canvasPage!==String(T)&&H.push(T)}z()}function z(){P||H.length===0||(P=requestAnimationFrame(()=>{P=0;let p=Math.max(1,h);for(;H.length>0&&p-- >0;){const y=H.shift(),w=C[y-g.start];w&&F(w,y)}H.length>0&&z()}))}function $(){P||(P=requestAnimationFrame(()=>{P=0;const p=u,y=K({pageHeightsPx:c,viewportHeightPx:p.clientHeight,scrollTopPx:p.scrollTop,overscan:o,gapPx:l});y.start!==g.start||y.end!==g.end?_(y):z()}))}return{attach(p){u=p,S(),p.addEventListener("scroll",$,{passive:!0}),$()},destroy(){P&&cancelAnimationFrame(P),P=0,u?.removeEventListener("scroll",$),H=[],f?.remove(),u=null},window(){return{...g}}}}function v(e,n){return typeof e=="number"&&Number.isFinite(e)?e:n}function E(e,n=""){return typeof e=="string"?e:n}function L(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Se(e){return e==="Center"?"center":e==="Right"?"right":"left"}function we(e){return e==="Center"?"middle":e==="Bottom"?"bottom":"top"}function ve(e){const n=parseFloat(E(e.FontSize,"10.5"));return{fontSize:Number.isFinite(n)?n:10.5,fontFamily:E(e.FontFamily,"黑体")||void 0,bold:E(e.FontWeight)==="bold"||void 0,italic:E(e.FontStyle)==="italic"||void 0,underline:e.Underline===!0||void 0,color:E(e.FontColor)||void 0,backgroundColor:E(e.BackgroundColor)||void 0,align:Se(E(e.HorAlignment,"Left")),verticalAlign:we(E(e.VertAlignment,"Top")),lineHeight:(()=>{const r=parseFloat(E(e.RowSpace,"1"));return Number.isFinite(r)&&r!==1?r:void 0})(),borderColor:E(e.BorderColor)||void 0,borderTop:e.BorderTop!==!1,borderRight:e.BorderRight!==!1,borderBottom:e.BorderBottom!==!1,borderLeft:e.BorderLeft!==!1}}function Pe(e,n){const r=E(e.uitype),t={kind:"text",leftMm:v(e.left,0),topMm:v(e.top,0),widthMm:v(e.width,40),heightMm:v(e.height,8),nid:E(e.nid)||void 0,style:ve(e)};switch(r){case"text":{t.kind="text";const i=e.Text??e.text??e.Value;t.text=i==null?"":String(i);const d=e.Lines??e.lines;return Array.isArray(d)&&(t.lines=d.map(a=>String(a))),t}case"richtext":return t.kind="text",t.text=E(e.Text),n.push(`富文本 ${t.nid??""} 导入为纯文本(版式细节可能损失)`),t;case"image":case"barcode":case"qrcode":case"chart":return t.kind=r==="image"?"image":r,t.fallbackText=`[${r}]`,n.push(`图片类组件 ${t.nid??""} 需运行时数据(imageData),已导入为占位`),t;case"table":{t.kind="rect";const i=e.Cells??e.cells;if(Array.isArray(i)){const d={cells:i.map(a=>Array.isArray(a)?a.map(o=>({text:L(o)?E(o.Text??o.text):"",colSpan:L(o)?v(o.ColSpan,1):1})):[])};t.grid=d}else t.fallbackText="[table]",n.push(`表格 ${t.nid??""} 缺少 Cells,导入为空框`);return t}case"subreport":return n.push(`子报表 ${t.nid??""} 暂不支持导入,已跳过`),null;default:return E(e.ShapeType)==="hline"||r==="hline"||r==="vline"?(t.kind="line",t):r==="rect"||r==="oval"||r==="shape"?(t.kind=r==="oval"?"ellipse":"rect",t):(n.push(`未知组件类型 ${r},已跳过`),null)}}function Ee(e){const n=[];let r=null;if(typeof e=="string")try{const h=JSON.parse(e);L(h)&&(r=h)}catch{return{template:{pages:[]},warnings:["content 不是合法 JSON"]}}else L(e)&&(r=e);if(!r)return{template:{pages:[]},warnings:["content 为空"]};const t=L(r.GlobalConfig)?r.GlobalConfig:{},i=v(t.paperWidthMm,210),d=v(t.paperHeightMm,297),a={top:v(t.marginTop,10),bottom:v(t.marginBottom,10),left:v(t.marginLeft,10),right:v(t.marginRight,10)},o=Array.isArray(r.children)?r.children.filter(h=>L(h)&&E(h.uitype)==="page"):[];o.length===0&&n.push("content 中没有 uitype=page 的页节点");const l=o.map(h=>{const c=h,m=Array.isArray(c.children)?c.children:[],g=[];for(const u of m){if(!L(u))continue;const f=Pe(u,n);f&&g.push(f)}return{widthMm:v(c.width,i),heightMm:v(c.DesignHeight,d),marginTopMm:v(c.MarginTop,a.top),marginBottomMm:v(c.MarginBottom,a.bottom),marginLeftMm:v(c.MarginLeft,a.left),marginRightMm:v(c.MarginRight,a.right),components:g}});return l.length===0&&(n.push("转换结果为空页,已回退一张空白页"),l.push({widthMm:i,heightMm:d,...a,components:[]})),{template:{pages:l},warnings:n}}function Y(e,n,r){let t,i;if(typeof e=="string"){const d=s.PAPER_SIZES[e];if(!d)throw new Error(`未知纸张预设 "${e}"(可用:${Object.keys(s.PAPER_SIZES).join("/")})`);t=d.widthMm,i=d.heightMm}else typeof e=="number"?(t=e,i=n??297):(t=e.widthMm,i=e.heightMm);return r?{widthMm:i,heightMm:t}:{widthMm:t,heightMm:i}}class Q{constructor(){this.pages=[],this.pending=null}page(n="a4",r={},t){this.collect();const d=t!=null&&!("margins"in t)&&!("landscape"in t)&&("marginTopMm"in t||"marginBottomMm"in t||"marginLeftMm"in t||"marginRightMm"in t)?{margins:t}:t??{},{widthMm:a,heightMm:o}=Y(n,typeof r=="number"?r:void 0,d.landscape),l=d.margins??{};return this.pending=new ee(this,{widthMm:a,heightMm:o,marginTopMm:l.marginTopMm??10,marginBottomMm:l.marginBottomMm??10,marginLeftMm:l.marginLeftMm??10,marginRightMm:l.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{pages:this.pages}}}class ee{constructor(n,r){this.parent=n,this.page=r,this.components=[]}text(n,r={},t={}){return this.components.push({kind:"text",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??60,heightMm:r.heightMm??8,text:n,style:t}),this}list(n,r,t,i={}){return this.components.push({kind:"list",leftMm:r.leftMm??10,topMm:r.topMm??30,widthMm:r.widthMm??180,dataset:n,columns:t,...i}),this}rect(n,r={}){return this.components.push({kind:"rect",...n,style:r}),this}line(n,r,t,i={}){return this.components.push({kind:"line",leftMm:n,topMm:r,widthMm:t,heightMm:.5,style:i}),this}barcode(n,r){return this.components.push({kind:"barcode",leftMm:r.leftMm??0,topMm:r.topMm??0,widthMm:r.widthMm??40,heightMm:r.heightMm??12,fallbackText:n}),this}qrcode(n,r,t,i){return this.components.push({kind:"qrcode",leftMm:t,topMm:i,widthMm:r,heightMm:r,fallbackText:n}),this}buildPage(){return{...this.page,components:this.components}}done(){return this.parent}build(){return this.done().build()}}function xe(){return new Q}exports.CSS_DPI=s.CSS_DPI;exports.DEFAULT_BORDER_PT=s.DEFAULT_BORDER_PT;exports.DEFAULT_FONT_PT=s.DEFAULT_FONT_PT;exports.DEFAULT_STROKE_COLOR=s.DEFAULT_STROKE_COLOR;exports.DEFAULT_TEXT_COLOR=s.DEFAULT_TEXT_COLOR;exports.LINE_HEIGHT=s.LINE_HEIGHT;exports.MM_PER_INCH=s.MM_PER_INCH;exports.PAPER_SIZES=s.PAPER_SIZES;exports.RENDER_PLAN_SCHEMA_VERSION=s.RENDER_PLAN_SCHEMA_VERSION;exports.SCHEMA_VERSION_JH4J=s.SCHEMA_VERSION_JH4J;exports.SCHEMA_VERSION_LOCAL=s.SCHEMA_VERSION_LOCAL;exports.SCHEMA_VERSION_MACH=s.SCHEMA_VERSION_MACH;exports.charWidthEm=s.charWidthEm;exports.createCanvasMeasurer=s.createCanvasMeasurer;exports.createHeuristicMeasurer=s.createHeuristicMeasurer;exports.heuristicMeasurer=s.heuristicMeasurer;exports.isImageBackedComponent=s.isImageBackedComponent;exports.isRichText=s.isRichText;exports.measureTextMm=s.measureTextMm;exports.mmToPx=s.mmToPx;exports.mmToPxFactor=s.mmToPxFactor;exports.ptToPx=s.ptToPx;exports.pxToMm=s.pxToMm;exports.resolveBoxBorders=s.resolveBoxBorders;exports.resolveFontSize=s.resolveFontSize;exports.resolveGridLayout=s.resolveGridLayout;exports.resolveLineHeight=s.resolveLineHeight;exports.resolveStroke=s.resolveStroke;exports.resolveTextColor=s.resolveTextColor;exports.round=s.round;exports.toRenderPlan=s.toRenderPlan;exports.wrapText=s.wrapText;exports.PageBuilder=ee;exports.TemplateBuilder=Q;exports.assertRenderPlan=ie;exports.classOf=x;exports.computePageWindow=K;exports.createCanvasPager=ye;exports.createTemplate=xe;exports.importJh4jTemplateContent=Ee;exports.measurePageSizePx=W;exports.paginateTemplate=he;exports.planFontSizePx=Me;exports.renderComponent=O;exports.renderPage=q;exports.renderPlan=ue;exports.renderPlanToCanvas=be;exports.resolvePaper=Y;exports.validateComponent=I;exports.validatePage=V;exports.validateRenderPlan=U;
@@ -0,0 +1,13 @@
1
+ export * from './defaults';
2
+ export * from './units';
3
+ export * from './schema/render-plan';
4
+ export * from './schema/validate';
5
+ export * from './layout/textwrap';
6
+ export * from './layout/paginate';
7
+ export * from './render/grid-geometry';
8
+ export * from './render/style';
9
+ export * from './render/dom';
10
+ export * from './render/canvas';
11
+ export * from './render/window';
12
+ export * from './compat/jh4j-template';
13
+ export * from './builder/template-builder';
package/dist/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- export * from "./defaults";
2
- export * from "./units";
3
- export * from "./schema/render-plan";
4
- export * from "./schema/validate";
5
- export * from "./layout/textwrap";
6
- export * from "./layout/paginate";
7
- export * from "./render/grid-geometry";
8
- export * from "./render/style";
9
- export * from "./render/dom";
10
- export * from "./render/canvas";
11
- export * from "./render/window";
12
- export * from "./compat/jh4j-template";
13
- export * from "./builder/template-builder";
1
+ export * from './defaults';
2
+ export * from './units';
3
+ export * from './schema/render-plan';
4
+ export * from './schema/validate';
5
+ export * from './layout/textwrap';
6
+ export * from './layout/paginate';
7
+ export * from './render/grid-geometry';
8
+ export * from './render/style';
9
+ export * from './render/dom';
10
+ export * from './render/canvas';
11
+ export * from './render/window';
12
+ export * from './compat/jh4j-template';
13
+ export * from './builder/template-builder';