@hailin-zheng/editor-core 1.0.15 → 1.0.22

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 (149) hide show
  1. package/README.md +1613 -0
  2. package/lib/framework/element-props.d.ts +2 -2
  3. package/lib/framework/impl/index.d.ts +36 -0
  4. package/lib/index.d.ts +34 -0
  5. package/lib/index.js +15672 -0
  6. package/lib/texteditor.d.ts +3 -3
  7. package/package.json +27 -26
  8. package/lib/doc-ruler.js +0 -313
  9. package/lib/doc-ruler.js.map +0 -1
  10. package/lib/framework/common-util.js +0 -178
  11. package/lib/framework/common-util.js.map +0 -1
  12. package/lib/framework/document-change.js +0 -1342
  13. package/lib/framework/document-change.js.map +0 -1
  14. package/lib/framework/document-combine.js +0 -40
  15. package/lib/framework/document-combine.js.map +0 -1
  16. package/lib/framework/document-comment.js +0 -148
  17. package/lib/framework/document-comment.js.map +0 -1
  18. package/lib/framework/document-context.js +0 -330
  19. package/lib/framework/document-context.js.map +0 -1
  20. package/lib/framework/document-eval-func.js +0 -48
  21. package/lib/framework/document-eval-func.js.map +0 -1
  22. package/lib/framework/document-event.js +0 -1054
  23. package/lib/framework/document-event.js.map +0 -1
  24. package/lib/framework/document-history.js +0 -65
  25. package/lib/framework/document-history.js.map +0 -1
  26. package/lib/framework/document-images-loader.js +0 -66
  27. package/lib/framework/document-images-loader.js.map +0 -1
  28. package/lib/framework/document-input-cursor.js +0 -239
  29. package/lib/framework/document-input-cursor.js.map +0 -1
  30. package/lib/framework/document-paint.js +0 -103
  31. package/lib/framework/document-paint.js.map +0 -1
  32. package/lib/framework/document-print-offscreen.js +0 -128
  33. package/lib/framework/document-print-offscreen.js.map +0 -1
  34. package/lib/framework/document-print.js +0 -203
  35. package/lib/framework/document-print.js.map +0 -1
  36. package/lib/framework/document-segmenter.js +0 -106
  37. package/lib/framework/document-segmenter.js.map +0 -1
  38. package/lib/framework/document-selection.js +0 -358
  39. package/lib/framework/document-selection.js.map +0 -1
  40. package/lib/framework/document-template.js +0 -20
  41. package/lib/framework/document-template.js.map +0 -1
  42. package/lib/framework/document-textline-mode.js +0 -30
  43. package/lib/framework/document-textline-mode.js.map +0 -1
  44. package/lib/framework/element-define.js +0 -579
  45. package/lib/framework/element-define.js.map +0 -1
  46. package/lib/framework/element-event-define.js +0 -108
  47. package/lib/framework/element-event-define.js.map +0 -1
  48. package/lib/framework/element-measure.js +0 -551
  49. package/lib/framework/element-measure.js.map +0 -1
  50. package/lib/framework/element-paint.js +0 -170
  51. package/lib/framework/element-paint.js.map +0 -1
  52. package/lib/framework/element-props.js +0 -809
  53. package/lib/framework/element-props.js.map +0 -1
  54. package/lib/framework/element-reader.js +0 -151
  55. package/lib/framework/element-reader.js.map +0 -1
  56. package/lib/framework/element-render-cut.js +0 -449
  57. package/lib/framework/element-render-cut.js.map +0 -1
  58. package/lib/framework/element-serialize.js +0 -113
  59. package/lib/framework/element-serialize.js.map +0 -1
  60. package/lib/framework/element-util.js +0 -1463
  61. package/lib/framework/element-util.js.map +0 -1
  62. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  63. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  64. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  65. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  66. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  67. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  68. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  69. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  70. package/lib/framework/impl/comments/comments-util.js +0 -67
  71. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  72. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  73. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  74. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  75. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  76. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  77. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  78. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  79. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  80. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  81. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  82. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  83. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  84. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  85. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  86. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  87. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  88. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  89. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  90. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  91. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  92. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  93. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  94. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  95. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  96. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  97. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  98. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  99. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  100. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  101. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  102. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  103. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  104. package/lib/framework/impl/document/doc-impl.js +0 -209
  105. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  106. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  107. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  108. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  109. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  110. package/lib/framework/impl/picture/image-impl.js +0 -124
  111. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  112. package/lib/framework/impl/radio/radio-impl.js +0 -72
  113. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  114. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  115. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  116. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  117. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  118. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  119. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  120. package/lib/framework/impl/table/table-impl.js +0 -363
  121. package/lib/framework/impl/table/table-impl.js.map +0 -1
  122. package/lib/framework/impl/table/table-row-impl.js +0 -75
  123. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  124. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  125. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  126. package/lib/framework/impl/table/table-split-cell.js +0 -464
  127. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  128. package/lib/framework/impl/table/table-util.js +0 -678
  129. package/lib/framework/impl/table/table-util.js.map +0 -1
  130. package/lib/framework/impl/text/text-impl.js +0 -149
  131. package/lib/framework/impl/text/text-impl.js.map +0 -1
  132. package/lib/framework/impl/text/track-run-impl.js +0 -112
  133. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  134. package/lib/framework/notify.js +0 -116
  135. package/lib/framework/notify.js.map +0 -1
  136. package/lib/framework/range-util.js +0 -312
  137. package/lib/framework/range-util.js.map +0 -1
  138. package/lib/framework/render-context.js +0 -384
  139. package/lib/framework/render-context.js.map +0 -1
  140. package/lib/framework/render-define.js +0 -195
  141. package/lib/framework/render-define.js.map +0 -1
  142. package/lib/framework/selection-overlays.js +0 -124
  143. package/lib/framework/selection-overlays.js.map +0 -1
  144. package/lib/texteditor.js +0 -913
  145. package/lib/texteditor.js.map +0 -1
  146. package/lib/util/subject.js +0 -88
  147. package/lib/util/subject.js.map +0 -1
  148. package/lib/util/table-bind.js +0 -6
  149. package/lib/util/table-bind.js.map +0 -1
@@ -1,103 +0,0 @@
1
- import { ElementMeasure } from "./element-measure";
2
- import { ElementPaint } from "./element-paint";
3
- import { ElementRenderCut } from "./element-render-cut";
4
- import { DocumentContainerRender } from "./impl/document/doc-container-impl";
5
- import { ElementUtil } from "./element-util";
6
- import { DocumentSelection } from "./document-selection";
7
- import { RangeUtil } from "./range-util";
8
- import { SelectionOverlays } from "./selection-overlays";
9
- export class DocumentPaint {
10
- viewOptions;
11
- renderContext;
12
- docCtx;
13
- selectedSets;
14
- elementMeasure;
15
- elementRenderCut;
16
- elementPaint;
17
- docPages;
18
- docContainer;
19
- commsContainer;
20
- constructor(viewOptions, renderContext, docCtx, selectedSets) {
21
- this.viewOptions = viewOptions;
22
- this.renderContext = renderContext;
23
- this.docCtx = docCtx;
24
- this.selectedSets = selectedSets;
25
- this.elementMeasure = new ElementMeasure(this.viewOptions, this.renderContext);
26
- this.elementRenderCut = new ElementRenderCut(this.viewOptions, this.renderContext);
27
- this.elementPaint = new ElementPaint(this.viewOptions, this.renderContext);
28
- }
29
- rePages() {
30
- // const destroyItems = [this.docContainer, this.commsContainer];
31
- // destroyItems.forEach(item => item?.destroy())
32
- //Promise.resolve().then(() => { destroyItems.forEach(item => item?.destroy()) });
33
- if (!this.docCtx.document.length) {
34
- return;
35
- }
36
- this.docContainer = new DocumentContainerRender();
37
- this.docCtx.selectionState.renderContainer = this.docContainer;
38
- this.docContainer.rect.width = this.viewOptions.docPageSettings.width;
39
- // console.time('排版计时');
40
- const documentRender = this.elementMeasure.measureDocument(this.docCtx.document);
41
- this.commsContainer = documentRender.getChild(3);
42
- if (this.commsContainer) {
43
- this.commsContainer = this.commsContainer.clone();
44
- }
45
- //console.timeEnd('排版计时');
46
- //console.time('断页计时');
47
- const docPages = this.elementRenderCut.cutPage(documentRender, this.docCtx.document);
48
- //console.timeEnd('断页计时');
49
- this.docContainer.addPages(docPages);
50
- ElementUtil.remeasure(this.docContainer);
51
- this.setCommRangeMark();
52
- this.docPages = docPages;
53
- }
54
- /**
55
- * 获取设置文档容器的总高度
56
- */
57
- getDocumentContainerHeight() {
58
- if (this.docPages.length > 0) {
59
- const lastPage = this.docPages[this.docPages.length - 1];
60
- const lastPageY = lastPage.rect.y + lastPage.rect.height + this.viewOptions.docSpace;
61
- return lastPageY + (this.viewOptions.viewSettings.height * (this.viewOptions.scale - 1));
62
- }
63
- else {
64
- return 0;
65
- }
66
- }
67
- refreshView(rePaint = false) {
68
- //console.time('计时');
69
- this.elementPaint.drawPages(this.docContainer, this.selectedSets, this.commsContainer, rePaint);
70
- //console.timeEnd('计时');
71
- }
72
- getDocPages() {
73
- return this.docPages;
74
- }
75
- getDocContainer() {
76
- return this.docContainer;
77
- }
78
- /***
79
- * 设置审阅区间样式痕迹
80
- */
81
- setCommRangeMark() {
82
- if (!this.viewOptions.showReviewWindow) {
83
- return;
84
- }
85
- const cce = this.docCtx.document.commentsContainerElement;
86
- const set = new Map();
87
- const commentRangeStatus = [];
88
- for (let i = 0; i < cce.length; i++) {
89
- const commContent = cce.getChild(i);
90
- const { startMark, endMark, props: { id }, focus } = commContent;
91
- const ancestorCommonControl = DocumentSelection.getAncestorCommonControl(startMark, endMark);
92
- const commonRange = RangeUtil.getSelctionRange(startMark, 0, endMark, 1, ancestorCommonControl);
93
- SelectionOverlays.addToCommentSets(commonRange, set);
94
- commentRangeStatus.push({
95
- commContent,
96
- range: commonRange
97
- });
98
- }
99
- this.commsContainer.selectedSet = set;
100
- this.commsContainer.commentRangeStatus = commentRangeStatus;
101
- }
102
- }
103
- //# sourceMappingURL=document-paint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-paint.js","sourceRoot":"lib/","sources":["framework/document-paint.ts"],"names":[],"mappings":"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","sourcesContent":["import { ElementMeasure } from \"./element-measure\";\nimport { ElementPaint } from \"./element-paint\";\nimport { ElementRenderCut } from \"./element-render-cut\";\nimport { DocumentRenderObject } from \"./impl/document/doc-impl\";\nimport { RenderContenxtType } from \"./render-context\";\nimport { Element, SelectionContentRange, ViewOptions } from \"./element-define\";\nimport { DocumentContainerRender } from \"./impl/document/doc-container-impl\";\nimport { ElementUtil } from \"./element-util\";\nimport { DocumentSelection } from \"./document-selection\";\nimport { CommsContainerRenderObject } from \"./impl/comments/comments-container-impl\";\nimport { RangeUtil } from \"./range-util\";\nimport { SelectionOverlays } from \"./selection-overlays\";\nimport { EditorContext } from \"./document-context\";\nimport { CommContentElement, CommentRangeStatus } from \"./impl/comments/comment-content-impl\";\n\nexport class DocumentPaint {\n elementMeasure: ElementMeasure;\n elementRenderCut: ElementRenderCut;\n elementPaint: ElementPaint;\n docPages!: Array<DocumentRenderObject>;\n docContainer!: DocumentContainerRender;\n commsContainer!: CommsContainerRenderObject;\n constructor(private viewOptions: ViewOptions, private renderContext: RenderContenxtType, private docCtx: EditorContext, private selectedSets: Map<Element, SelectionContentRange>) {\n this.elementMeasure = new ElementMeasure(this.viewOptions, this.renderContext);\n this.elementRenderCut = new ElementRenderCut(this.viewOptions, this.renderContext);\n this.elementPaint = new ElementPaint(this.viewOptions, this.renderContext);\n }\n\n rePages(): void {\n // const destroyItems = [this.docContainer, this.commsContainer];\n // destroyItems.forEach(item => item?.destroy())\n //Promise.resolve().then(() => { destroyItems.forEach(item => item?.destroy()) });\n if (!this.docCtx.document.length) {\n return;\n }\n this.docContainer = new DocumentContainerRender();\n this.docCtx.selectionState.renderContainer = this.docContainer;\n this.docContainer.rect.width = this.viewOptions.docPageSettings.width;\n // console.time('排版计时');\n const documentRender = this.elementMeasure.measureDocument(this.docCtx.document);\n this.commsContainer = documentRender.getChild(3) as CommsContainerRenderObject;\n if (this.commsContainer) {\n this.commsContainer = this.commsContainer.clone() as CommsContainerRenderObject;\n }\n //console.timeEnd('排版计时');\n //console.time('断页计时');\n const docPages = this.elementRenderCut.cutPage(documentRender, this.docCtx.document);\n //console.timeEnd('断页计时');\n this.docContainer.addPages(docPages);\n ElementUtil.remeasure(this.docContainer);\n this.setCommRangeMark();\n this.docPages = docPages;\n\n\n }\n\n /**\n * 获取设置文档容器的总高度\n */\n getDocumentContainerHeight(): number {\n if (this.docPages.length > 0) {\n const lastPage = this.docPages[this.docPages.length - 1];\n const lastPageY = lastPage.rect.y + lastPage.rect.height + this.viewOptions.docSpace;\n return lastPageY + (this.viewOptions.viewSettings.height * (this.viewOptions.scale - 1));\n }\n else {\n return 0;\n }\n }\n\n refreshView(rePaint = false): void {\n //console.time('计时');\n this.elementPaint.drawPages(this.docContainer, this.selectedSets, this.commsContainer, rePaint);\n //console.timeEnd('计时');\n\n }\n\n getDocPages(): Array<DocumentRenderObject> {\n return this.docPages;\n }\n\n getDocContainer(): DocumentContainerRender {\n return this.docContainer;\n }\n\n /***\n * 设置审阅区间样式痕迹\n */\n setCommRangeMark(): void {\n if (!this.viewOptions.showReviewWindow) {\n return;\n }\n const cce = this.docCtx.document.commentsContainerElement;\n const set = new Map<Element, SelectionContentRange>();\n const commentRangeStatus: Array<CommentRangeStatus> = [];\n for (let i = 0; i < cce.length; i++) {\n const commContent = cce.getChild(i) as CommContentElement;\n const { startMark, endMark, props: { id }, focus } = commContent;\n const ancestorCommonControl = DocumentSelection.getAncestorCommonControl(startMark, endMark);\n const commonRange = RangeUtil.getSelctionRange(startMark, 0, endMark, 1, ancestorCommonControl);\n SelectionOverlays.addToCommentSets(commonRange, set);\n commentRangeStatus.push({\n commContent,\n range: commonRange\n })\n }\n this.commsContainer.selectedSet = set;\n this.commsContainer.commentRangeStatus = commentRangeStatus;\n }\n}\n"]}
@@ -1,128 +0,0 @@
1
- import { EditorContext } from "./document-context";
2
- import { DocumentPaint } from "./document-paint";
3
- import { exportCanvasToPDF, printNodes } from "./document-print";
4
- import { SelectionState } from "./document-selection";
5
- import { ViewOptions } from "./element-define";
6
- import { ElementPaint } from "./element-paint";
7
- import { ElementReader } from "./element-reader";
8
- import { ElementUtil } from "./element-util";
9
- import { RenderContenxt } from "./render-context";
10
- /**
11
- * 离屏打印
12
- */
13
- export class DocumentPrintOffscreen {
14
- documentPaint;
15
- viewOptions;
16
- docCtx;
17
- renderCtx;
18
- elementReader;
19
- ctx;
20
- constructor() {
21
- this.viewOptions = new ViewOptions();
22
- this.viewOptions.copyRightInfo = '万达信息电子病历编辑器,www.wondersgroup.com';
23
- this.viewOptions.showCharRect = true;
24
- this.viewOptions.drawCharRectColor = 'green';
25
- this.viewOptions.showLineRect = true;
26
- this.viewOptions.docSpace = 20;
27
- this.viewOptions.reviewWindowWidth = 200;
28
- this.viewOptions.mmToPixelsRatio = 3.7795001220703126;
29
- //整个画布的尺寸
30
- this.viewOptions.viewSettings = {
31
- width: 1000,
32
- height: 800
33
- };
34
- this.viewOptions.editUser = {
35
- id: '6666',
36
- name: '管理员'
37
- };
38
- const canvas = document.createElement('canvas');
39
- this.ctx = canvas.getContext('2d');
40
- const ss = new SelectionState();
41
- this.docCtx = new EditorContext(ss, this.viewOptions);
42
- this.renderCtx = new RenderContenxt(this.ctx, this.viewOptions, this.docCtx);
43
- this.documentPaint = new DocumentPaint(this.viewOptions, this.renderCtx, this.docCtx, new Map());
44
- this.elementReader = new ElementReader(this.docCtx, this.viewOptions, this.renderCtx);
45
- this.docCtx.syncRefresh = () => {
46
- };
47
- }
48
- async print(data, ranges = null) {
49
- await this.prepare(data);
50
- const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);
51
- if (!canvasNodes.length) {
52
- console.warn('无可打印页');
53
- return;
54
- }
55
- const docProps = this.docCtx.document.props;
56
- printNodes(canvasNodes, { ...docProps });
57
- }
58
- /**
59
- * 导出PDF
60
- * @param fileName
61
- * @param ss
62
- * @param viewOptions
63
- * @param docCtx
64
- * @param ranges
65
- */
66
- async exportToPDF(data, fileName, ranges = null) {
67
- await this.prepare(data);
68
- const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);
69
- if (!canvasNodes.length) {
70
- console.warn('无可导出页');
71
- return;
72
- }
73
- exportCanvasToPDF(fileName, canvasNodes, this.docCtx.document.props);
74
- }
75
- /**
76
- * 获取绘制的图片,格式为Base64编码
77
- */
78
- async getImagesContent(data, ranges = null) {
79
- await this.prepare(data);
80
- const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);
81
- if (!canvasNodes.length) {
82
- console.warn('无可导出页');
83
- return [];
84
- }
85
- return canvasNodes.map(node => node.toDataURL());
86
- }
87
- /**
88
- * 读取数据,排版
89
- * @param data
90
- */
91
- async prepare(data) {
92
- this.elementReader.read(data);
93
- this.documentPaint.rePages();
94
- await Promise.all(this.docCtx.imageLoader.getLoadTasks());
95
- this.renderCtx.setCanvasProps(this.viewOptions.docPageSettings);
96
- }
97
- getCanvasNodes(printPages, printRanges = null) {
98
- const { width, height } = this.viewOptions.docPageSettings;
99
- const canvasList = [];
100
- for (let i = 0; i < printPages.length; i++) {
101
- if (printRanges && printRanges.indexOf(i) === -1) {
102
- continue;
103
- }
104
- const canvasNode = document.createElement('canvas');
105
- canvasNode.style.cursor = 'text';
106
- canvasNode.style.width = width + 'px';
107
- canvasNode.style.height = height + 'px';
108
- const ctx = canvasNode.getContext('2d');
109
- ElementUtil.setCanvasProps(canvasNode, ctx, this.viewOptions.docPageSettings);
110
- const renderCtx = new RenderContenxt(ctx, this.viewOptions, this.docCtx);
111
- renderCtx.setCanvasProps(this.viewOptions.docPageSettings);
112
- renderCtx.drawMode = 'print';
113
- const doc = printPages[i];
114
- const tmp = ElementUtil.cloneRect(doc.rect);
115
- doc.rect.x = 0;
116
- doc.rect.y = 0;
117
- ElementPaint.drawPage(renderCtx, doc, { x: 0, y: 0 });
118
- renderCtx.overlaysContext.clear();
119
- renderCtx.mainCtx.fillStyle = 'white';
120
- renderCtx.mainCtx.fillRect(0, 0, width, height);
121
- renderCtx.commit(this.viewOptions.docPageSettings);
122
- doc.rect = tmp;
123
- canvasList.push(canvasNode);
124
- }
125
- return canvasList;
126
- }
127
- }
128
- //# sourceMappingURL=document-print-offscreen.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-print-offscreen.js","sourceRoot":"lib/","sources":["framework/document-print-offscreen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAE,cAAc,EAAsB,MAAM,kBAAkB,CAAC;AAEtE;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAC/B,aAAa,CAAgB;IAC7B,WAAW,CAAc;IACzB,MAAM,CAAgB;IACtB,SAAS,CAAiB;IAC1B,aAAa,CAAgB;IAC7B,GAAG,CAA2B;IAC9B;QACI,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,aAAa,GAAG,kCAAkC,CAAC;QACpE,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,OAAO,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC/B,IAAI,CAAC,WAAW,CAAC,iBAAiB,GAAG,GAAG,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG,kBAAkB,CAAC;QACtD,SAAS;QACT,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG;YAC5B,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,GAAG;SACd,CAAC;QACF,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG;YACxB,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,KAAK;SACd,CAAC;QACF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAA6B,CAAC;QAC/D,MAAM,EAAE,GAAG,IAAI,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,IAAI,CAAC,SAAS,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACjG,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACtF,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE;QAC/B,CAAC,CAAC;IACN,CAAC;IACD,KAAK,CAAC,KAAK,CAAC,IAA2B,EAAE,SAA+B,IAAI;QACxE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO;SACV;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC5C,UAAU,CAAC,WAAW,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CAAC,IAA2B,EAAE,QAAgB,EAAE,SAA+B,IAAI;QAChG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO;SACV;QACD,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC;IAGD;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAA2B,EAAE,SAA+B,IAAI;QACnF,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7E,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YACrB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrB,OAAO,EAAE,CAAC;SACb;QACD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,OAAO,CAAC,IAA2B;QAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACpE,CAAC;IAEO,cAAc,CAAC,UAAuC,EAAE,cAAoC,IAAI;QACpG,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC;QAC3D,MAAM,UAAU,GAA6B,EAAE,CAAC;QAChD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxC,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gBAC9C,SAAS;aACZ;YACD,MAAM,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YACpD,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YACjC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;YACtC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YACxC,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,CAA6B,CAAC;YACpE,WAAW,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAC9E,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YACzE,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YAC3D,SAAS,CAAC,QAAQ,GAAG,OAAO,CAAC;YAC7B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACf,YAAY,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACtD,SAAS,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;YAClC,SAAS,CAAC,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;YACtC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YAChD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;YACnD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC;YACf,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAC/B;QACD,OAAO,UAAU,CAAC;IACtB,CAAC;CACJ","sourcesContent":["import { EditorContext } from \"./document-context\";\nimport { DocumentPaint } from \"./document-paint\";\nimport { exportCanvasToPDF, printNodes } from \"./document-print\";\nimport { SelectionState } from \"./document-selection\";\nimport { ViewOptions } from \"./element-define\";\nimport { ElementPaint } from \"./element-paint\";\nimport { ElementReader } from \"./element-reader\";\nimport { ElementUtil } from \"./element-util\";\nimport { DocumentElement, DocumentRenderObject } from \"./impl/document/doc-impl\";\nimport { RenderContenxt, RenderContenxtType } from \"./render-context\";\n\n/**\n * 离屏打印\n */\nexport class DocumentPrintOffscreen {\n documentPaint: DocumentPaint;\n viewOptions: ViewOptions;\n docCtx: EditorContext;\n renderCtx: RenderContenxt;\n elementReader: ElementReader;\n ctx: CanvasRenderingContext2D;\n constructor() {\n this.viewOptions = new ViewOptions();\n this.viewOptions.copyRightInfo = '万达信息电子病历编辑器,www.wondersgroup.com';\n this.viewOptions.showCharRect = true;\n this.viewOptions.drawCharRectColor = 'green';\n this.viewOptions.showLineRect = true;\n this.viewOptions.docSpace = 20;\n this.viewOptions.reviewWindowWidth = 200;\n this.viewOptions.mmToPixelsRatio = 3.7795001220703126;\n //整个画布的尺寸\n this.viewOptions.viewSettings = {\n width: 1000,\n height: 800\n };\n this.viewOptions.editUser = {\n id: '6666',\n name: '管理员'\n };\n const canvas = document.createElement('canvas');\n this.ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n const ss = new SelectionState();\n this.docCtx = new EditorContext(ss, this.viewOptions);\n this.renderCtx = new RenderContenxt(this.ctx, this.viewOptions, this.docCtx);\n this.documentPaint = new DocumentPaint(this.viewOptions, this.renderCtx, this.docCtx, new Map());\n this.elementReader = new ElementReader(this.docCtx, this.viewOptions, this.renderCtx);\n this.docCtx.syncRefresh = () => {\n };\n }\n async print(data: any | DocumentElement, ranges: Array<number> | null = null): Promise<void> {\n await this.prepare(data);\n const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);\n if (!canvasNodes.length) {\n console.warn('无可打印页')\n return;\n }\n const docProps = this.docCtx.document.props;\n printNodes(canvasNodes, { ...docProps });\n }\n\n /**\n * 导出PDF\n * @param fileName\n * @param ss\n * @param viewOptions\n * @param docCtx\n * @param ranges\n */\n async exportToPDF(data: any | DocumentElement, fileName: string, ranges: Array<number> | null = null): Promise<void> {\n await this.prepare(data);\n const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);\n if (!canvasNodes.length) {\n console.warn('无可导出页')\n return;\n }\n exportCanvasToPDF(fileName, canvasNodes, this.docCtx.document.props);\n }\n\n\n /**\n * 获取绘制的图片,格式为Base64编码\n */\n async getImagesContent(data: any | DocumentElement, ranges: Array<number> | null = null): Promise<Array<string>> {\n await this.prepare(data);\n const canvasNodes = this.getCanvasNodes(this.documentPaint.docPages, ranges);\n if (!canvasNodes.length) {\n console.warn('无可导出页')\n return [];\n }\n return canvasNodes.map(node => node.toDataURL());\n }\n\n /**\n * 读取数据,排版\n * @param data\n */\n private async prepare(data: any | DocumentElement,): Promise<void> {\n this.elementReader.read(data);\n this.documentPaint.rePages();\n await Promise.all(this.docCtx.imageLoader.getLoadTasks());\n this.renderCtx.setCanvasProps(this.viewOptions.docPageSettings);\n }\n\n private getCanvasNodes(printPages: Array<DocumentRenderObject>, printRanges: Array<number> | null = null): Array<HTMLCanvasElement> {\n const { width, height } = this.viewOptions.docPageSettings;\n const canvasList: Array<HTMLCanvasElement> = [];\n for (let i = 0; i < printPages.length; i++) {\n if (printRanges && printRanges.indexOf(i) === -1) {\n continue;\n }\n const canvasNode = document.createElement('canvas');\n canvasNode.style.cursor = 'text';\n canvasNode.style.width = width + 'px';\n canvasNode.style.height = height + 'px';\n const ctx = canvasNode.getContext('2d') as CanvasRenderingContext2D;\n ElementUtil.setCanvasProps(canvasNode, ctx, this.viewOptions.docPageSettings);\n const renderCtx = new RenderContenxt(ctx, this.viewOptions, this.docCtx);\n renderCtx.setCanvasProps(this.viewOptions.docPageSettings);\n renderCtx.drawMode = 'print';\n const doc = printPages[i];\n const tmp = ElementUtil.cloneRect(doc.rect);\n doc.rect.x = 0;\n doc.rect.y = 0;\n ElementPaint.drawPage(renderCtx, doc, { x: 0, y: 0 });\n renderCtx.overlaysContext.clear();\n renderCtx.mainCtx.fillStyle = 'white';\n renderCtx.mainCtx.fillRect(0, 0, width, height);\n renderCtx.commit(this.viewOptions.docPageSettings);\n doc.rect = tmp;\n canvasList.push(canvasNode);\n }\n return canvasList;\n }\n}\n"]}
@@ -1,203 +0,0 @@
1
- import { PageOptions } from "./element-define";
2
- import { ElementPaint } from "./element-paint";
3
- import { ElementUtil } from "./element-util";
4
- import { DocumentRenderObject } from "./impl/document/doc-impl";
5
- import { RenderContenxt } from "./render-context";
6
- import { jsPDF } from 'jspdf';
7
- export class documentPrint {
8
- static print(ss, viewOptions, docCtx, printRanges = null) {
9
- const renderCanvasNodes = this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);
10
- if (!renderCanvasNodes.length) {
11
- console.warn('无可打印节点');
12
- return;
13
- }
14
- printNodes(renderCanvasNodes, { ...docCtx.document.props });
15
- }
16
- /**
17
- * 获取绘制的canvas节点
18
- * @param ss
19
- * @param viewOptions
20
- * @param docCtx
21
- * @param printRanges
22
- * @returns
23
- */
24
- static getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges = null) {
25
- const { width, height } = viewOptions.docPageSettings;
26
- const dc = ss.renderContainer;
27
- const canvasList = [];
28
- const printPages = [];
29
- for (let i = 0; i < dc.length; i++) {
30
- if (!printRanges || printRanges.some(pageIndex => pageIndex === i)) {
31
- printPages.push(dc.getChild(i));
32
- }
33
- }
34
- for (let i = 0; i < printPages.length; i++) {
35
- const canvasNode = document.createElement('canvas');
36
- canvasNode.style.cursor = 'text';
37
- canvasNode.style.width = width + 'px';
38
- canvasNode.style.height = height + 'px';
39
- const ctx = canvasNode.getContext('2d');
40
- ElementUtil.setCanvasProps(canvasNode, ctx, viewOptions.docPageSettings);
41
- const renderCtx = new RenderContenxt(ctx, viewOptions, docCtx);
42
- renderCtx.setCanvasProps(viewOptions.docPageSettings);
43
- renderCtx.drawMode = 'print';
44
- const doc = printPages[i];
45
- const tmp = ElementUtil.cloneRect(doc.rect);
46
- doc.rect.x = 0;
47
- doc.rect.y = 0;
48
- ElementPaint.drawPage(renderCtx, doc, { x: 0, y: 0 });
49
- renderCtx.overlaysContext.clear();
50
- renderCtx.mainCtx.fillStyle = 'white';
51
- renderCtx.mainCtx.fillRect(0, 0, width, height);
52
- renderCtx.commit(viewOptions.docPageSettings);
53
- doc.rect = tmp;
54
- canvasList.push(canvasNode);
55
- }
56
- return canvasList;
57
- }
58
- /**
59
- * 导出base64
60
- * @param ss
61
- * @param viewOptions
62
- * @param docCtx
63
- * @param printRanges
64
- * @returns
65
- */
66
- static exportCanvasNodes(ss, viewOptions, docCtx, printRanges = null) {
67
- return this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);
68
- }
69
- /**
70
- * 导出PDF
71
- * @param fileName
72
- * @param ss
73
- * @param viewOptions
74
- * @param docCtx
75
- * @param printRanges
76
- */
77
- static exportPDF(fileName, ss, viewOptions, docCtx, printRanges = null) {
78
- const nodes = this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);
79
- exportCanvasToPDF(fileName, nodes, { ...docCtx.document.props });
80
- }
81
- /**
82
- * 当前当前页
83
- * @param ss
84
- * @param viewOptions
85
- */
86
- static printCurrPage(ss, viewOptions, docCtx) {
87
- const { startHitInfo } = ss;
88
- if (!startHitInfo) {
89
- return;
90
- }
91
- const docPage = ElementUtil.getParentRender(startHitInfo.render, DocumentRenderObject);
92
- if (!docPage) {
93
- return;
94
- }
95
- this.print(ss, viewOptions, docCtx, [docPage.getIndex()]);
96
- }
97
- }
98
- export function createPrintTemplate({ width, height, orient }) {
99
- const str = `
100
- <!DOCTYPE html>
101
- <html lang="zh">
102
- <head>
103
- <meta charset="UTF-8">
104
- <title></title>
105
- <style >
106
- html,
107
- body {
108
- margin: 0;
109
- padding: 0;
110
- }
111
- * {
112
- box-sizing: border-box;
113
- -moz-box-sizing: border-box;
114
- }
115
- @page {
116
- size: ${orient};
117
- margin: 0;
118
- }
119
- div {
120
- width: ${width}mm;
121
- min-height: ${height}mm;
122
- font-size: 0;
123
- }
124
- @media print {
125
- html,
126
- body {
127
- width: ${width}mm;
128
- height: ${height}mm;
129
- }
130
- div {
131
- width: initial;
132
- min-height: initial;
133
- }
134
- }
135
- </style>
136
- </head>
137
- <body></body>
138
- </html>
139
- `.replace(/\n/g, '').replace(/\s+/g, ' ').replace(/'/g, '\\\'');
140
- return str;
141
- }
142
- /**
143
- * 打印DOM
144
- * @param printNodes
145
- * @param options
146
- * @returns
147
- */
148
- export function printNodes(printNodes, options) {
149
- const printIFrame = document.createElement("iframe");
150
- printIFrame.src = 'about:blank';
151
- printIFrame.style.borderWidth = '0';
152
- printIFrame.style.height = "0";
153
- printIFrame.style.display = 'none';
154
- document.body.appendChild(printIFrame);
155
- printIFrame.contentWindow?.document.open("text/html", "printer");
156
- if (!printNodes.length) {
157
- console.warn('无可打印节点');
158
- return;
159
- }
160
- const printSize = new PageOptions(options.width, options.height, options.orient);
161
- const iframeHTML = createPrintTemplate(printSize);
162
- printIFrame.contentWindow?.document.write(iframeHTML);
163
- printIFrame.contentWindow?.document.close();
164
- for (let i = 0; i < printNodes.length; i++) {
165
- const item = printNodes[i];
166
- const div = document.createElement('div');
167
- div.appendChild(item);
168
- printIFrame.contentWindow?.document.body.appendChild(div);
169
- }
170
- printIFrame.contentWindow?.document.body.focus();
171
- setTimeout(() => {
172
- printIFrame.contentWindow?.print();
173
- printIFrame.parentNode?.removeChild(printIFrame);
174
- }, 0);
175
- }
176
- /**
177
- * canvas节点导出到PDF
178
- * @param fileName
179
- * @param nodes
180
- * @param options
181
- */
182
- export function exportCanvasToPDF(fileName, nodes, options) {
183
- if (!fileName) {
184
- fileName = 'document.pdf';
185
- }
186
- else {
187
- fileName = fileName.replace(/[\/\\:*?"<>|]/g, '_');
188
- if (!fileName.endsWith('.pdf')) {
189
- fileName += '.pdf';
190
- }
191
- }
192
- const pdf = new jsPDF(options.orient, 'px', [options.width, options.height]);
193
- for (let i = 0; i < nodes.length; i++) {
194
- const canvas = nodes[i];
195
- const imgData = canvas.toDataURL('image/jpeg', 1.0);
196
- pdf.addImage(imgData, 'JPEG', 0, 0, options.width, options.height);
197
- if (i < nodes.length - 1) {
198
- pdf.addPage();
199
- }
200
- }
201
- pdf.save(fileName);
202
- }
203
- //# sourceMappingURL=document-print.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-print.js","sourceRoot":"lib/","sources":["framework/document-print.ts"],"names":[],"mappings":"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","sourcesContent":["import { EditorContext } from \"./document-context\";\nimport { SelectionState } from \"./document-selection\";\nimport { OrientType, PageOptions, ViewOptions } from \"./element-define\";\nimport { ElementPaint } from \"./element-paint\";\nimport { ElementUtil } from \"./element-util\";\nimport { DocumentRenderObject } from \"./impl/document/doc-impl\";\nimport { RenderContenxt } from \"./render-context\";\nimport { jsPDF } from 'jspdf'\n\nexport class documentPrint {\n static print(ss: SelectionState, viewOptions: ViewOptions, docCtx: EditorContext, printRanges: Array<number> | null = null): void {\n const renderCanvasNodes = this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);\n if (!renderCanvasNodes.length) {\n console.warn('无可打印节点');\n return;\n }\n printNodes(renderCanvasNodes, { ...docCtx.document.props });\n }\n\n /**\n * 获取绘制的canvas节点\n * @param ss \n * @param viewOptions \n * @param docCtx \n * @param printRanges \n * @returns \n */\n private static getRenderCanvasNodes(ss: SelectionState, viewOptions: ViewOptions, docCtx: EditorContext, printRanges: Array<number> | null = null): Array<HTMLCanvasElement> {\n const { width, height } = viewOptions.docPageSettings;\n const dc = ss.renderContainer;\n const canvasList: Array<HTMLCanvasElement> = [];\n const printPages: Array<DocumentRenderObject> = [];\n for (let i = 0; i < dc.length; i++) {\n if (!printRanges || printRanges.some(pageIndex => pageIndex === i)) {\n printPages.push(<DocumentRenderObject>dc.getChild(i));\n }\n }\n for (let i = 0; i < printPages.length; i++) {\n const canvasNode = document.createElement('canvas');\n canvasNode.style.cursor = 'text';\n canvasNode.style.width = width + 'px';\n canvasNode.style.height = height + 'px';\n const ctx = canvasNode.getContext('2d') as CanvasRenderingContext2D;\n ElementUtil.setCanvasProps(canvasNode, ctx, viewOptions.docPageSettings);\n const renderCtx = new RenderContenxt(ctx, viewOptions, docCtx);\n renderCtx.setCanvasProps(viewOptions.docPageSettings);\n renderCtx.drawMode = 'print';\n const doc = printPages[i];\n const tmp = ElementUtil.cloneRect(doc.rect);\n doc.rect.x = 0;\n doc.rect.y = 0;\n ElementPaint.drawPage(renderCtx, doc, { x: 0, y: 0 });\n renderCtx.overlaysContext.clear();\n renderCtx.mainCtx.fillStyle = 'white';\n renderCtx.mainCtx.fillRect(0, 0, width, height);\n renderCtx.commit(viewOptions.docPageSettings);\n doc.rect = tmp;\n canvasList.push(canvasNode);\n }\n return canvasList\n }\n\n /**\n * 导出base64\n * @param ss \n * @param viewOptions \n * @param docCtx \n * @param printRanges \n * @returns \n */\n static exportCanvasNodes(ss: SelectionState, viewOptions: ViewOptions, docCtx: EditorContext, printRanges: Array<number> | null = null): Array<HTMLCanvasElement> {\n return this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);\n }\n\n /**\n * 导出PDF\n * @param fileName\n * @param ss\n * @param viewOptions\n * @param docCtx\n * @param printRanges\n */\n static exportPDF(fileName: string, ss: SelectionState, viewOptions: ViewOptions, docCtx: EditorContext, printRanges: Array<number> | null = null): void {\n const nodes = this.getRenderCanvasNodes(ss, viewOptions, docCtx, printRanges);\n exportCanvasToPDF(fileName, nodes, { ...docCtx.document.props })\n }\n\n /**\n * 当前当前页\n * @param ss \n * @param viewOptions \n */\n static printCurrPage(ss: SelectionState, viewOptions: ViewOptions, docCtx: EditorContext,): void {\n const { startHitInfo } = ss;\n if (!startHitInfo) {\n return;\n }\n const docPage = ElementUtil.getParentRender(startHitInfo.render, DocumentRenderObject);\n if (!docPage) {\n return;\n }\n this.print(ss, viewOptions, docCtx, [docPage.getIndex()]);\n }\n}\n\n\nexport function createPrintTemplate({ width, height, orient }: PageOptions): string {\n const str = `\n <!DOCTYPE html>\n <html lang=\"zh\">\n <head>\n <meta charset=\"UTF-8\">\n <title></title>\n <style >\n html,\n body {\n margin: 0;\n padding: 0;\n }\n * {\n box-sizing: border-box;\n -moz-box-sizing: border-box;\n }\n @page {\n size: ${orient};\n margin: 0;\n }\n div {\n width: ${width}mm;\n min-height: ${height}mm;\n font-size: 0;\n }\n @media print {\n html,\n body {\n width: ${width}mm;\n height: ${height}mm;\n }\n div {\n width: initial;\n min-height: initial;\n }\n }\n </style>\n </head>\n <body></body>\n </html>\n `.replace(/\\n/g, '').replace(/\\s+/g, ' ').replace(/'/g, '\\\\\\'');\n return str;\n}\n\n\ntype PrintPaperOptions = {\n width: number;\n height: number;\n orient: OrientType;\n};\n\n/**\n * 打印DOM\n * @param printNodes \n * @param options \n * @returns \n */\nexport function printNodes(printNodes: Array<Node>, options: PrintPaperOptions): void {\n const printIFrame = document.createElement(\"iframe\") as HTMLIFrameElement;\n printIFrame.src = 'about:blank';\n printIFrame.style.borderWidth = '0';\n printIFrame.style.height = \"0\";\n printIFrame.style.display = 'none';\n document.body.appendChild(printIFrame);\n printIFrame.contentWindow?.document.open(\"text/html\", \"printer\");\n if (!printNodes.length) {\n console.warn('无可打印节点');\n return;\n }\n const printSize: PageOptions = new PageOptions(options.width, options.height, options.orient);\n const iframeHTML = createPrintTemplate(printSize);\n printIFrame.contentWindow?.document.write(iframeHTML);\n printIFrame.contentWindow?.document.close();\n for (let i = 0; i < printNodes.length; i++) {\n const item = printNodes[i];\n const div = document.createElement('div');\n div.appendChild(item);\n printIFrame.contentWindow?.document.body.appendChild(div)\n }\n printIFrame.contentWindow?.document.body.focus();\n setTimeout(() => {\n printIFrame.contentWindow?.print();\n printIFrame.parentNode?.removeChild(printIFrame);\n }, 0);\n}\n\n/**\n * canvas节点导出到PDF\n * @param fileName \n * @param nodes \n * @param options \n */\nexport function exportCanvasToPDF(fileName: string, nodes: Array<HTMLCanvasElement>, options: PrintPaperOptions): void {\n if (!fileName) {\n fileName = 'document.pdf';\n } else {\n fileName = fileName.replace(/[\\/\\\\:*?\"<>|]/g, '_');\n if (!fileName.endsWith('.pdf')) {\n fileName += '.pdf';\n }\n }\n const pdf = new jsPDF(options.orient, 'px', [options.width, options.height]);\n for (let i = 0; i < nodes.length; i++) {\n const canvas = nodes[i];\n const imgData = canvas.toDataURL('image/jpeg', 1.0);\n pdf.addImage(imgData, 'JPEG', 0, 0, options.width, options.height);\n if (i < nodes.length - 1) {\n pdf.addPage();\n }\n }\n pdf.save(fileName);\n}"]}
@@ -1,106 +0,0 @@
1
- import { TextGroupElement } from "./impl/text/text-impl";
2
- import { ElementUtil } from "./element-util";
3
- import { SelectionRange } from "./document-selection";
4
- export function getFocusTextSegment(selection) {
5
- let { startControl: element, startOffset: offset } = selection;
6
- if (!(element instanceof TextGroupElement))
7
- return false;
8
- if (!supportSegment())
9
- return false;
10
- const focusEle = element;
11
- offset = offset + 1;
12
- offset = offset > focusEle.textMeasures.length ? focusEle.textMeasures.length : offset;
13
- //获取连续的字符
14
- const items = [...getConsecutiveTextsByDirection(element), element, ...getConsecutiveTextsByDirection(element, false)];
15
- const sortItems = getTextSortData(items);
16
- const { index, text } = sortItems.reduce((prev, curr) => {
17
- prev.text += curr.text;
18
- if (prev.completed) {
19
- return prev;
20
- }
21
- if (curr.item === focusEle) {
22
- prev.index += offset;
23
- prev.completed = true;
24
- }
25
- else {
26
- prev.index += curr.item.textMeasures.length;
27
- }
28
- return prev;
29
- }, { completed: false, index: 0, text: '' });
30
- const { index: hitIndex, len: hitLen } = getHitSegment(text, index);
31
- const matchSegment = sortItems.filter(item => (item.index <= hitIndex && item.endIndex > hitIndex) || (item.index <= hitIndex + hitLen && item.endIndex > hitIndex + hitLen));
32
- const startSegment = matchSegment[0];
33
- const endSegment = matchSegment[matchSegment.length - 1];
34
- const startOffset = hitIndex - startSegment.index;
35
- const endOffset = hitIndex + hitLen - endSegment.index;
36
- const newRange = new SelectionRange();
37
- newRange.setStart(startSegment.item, startOffset);
38
- newRange.setEnd(endSegment.item, endOffset);
39
- selection.addRange(newRange);
40
- return true;
41
- }
42
- /**
43
- * 进行分词
44
- * @param text
45
- * @param focusOffset
46
- */
47
- function getHitSegment(text, focusOffset) {
48
- const segmenter = new Intl.Segmenter("zh-CN", { granularity: "word" });
49
- const iterator1 = segmenter.segment(text)[Symbol.iterator]();
50
- const segItems = Array.from(iterator1);
51
- let index = 0;
52
- for (let i = 0; i < segItems.length; i++) {
53
- const segItem = segItems[i];
54
- const currIndex = segItem.index;
55
- const currLen = segItem.segment.length;
56
- if (focusOffset > currIndex && focusOffset <= currLen + currIndex) {
57
- return {
58
- index,
59
- len: currLen
60
- };
61
- }
62
- index += currLen;
63
- }
64
- throw new Error('未获取到对应的分词词组');
65
- }
66
- function supportSegment() {
67
- return typeof Intl.Segmenter === 'function';
68
- }
69
- /**
70
- * 根据前后顺序标识索引位
71
- * @param texts
72
- */
73
- function getTextSortData(texts) {
74
- let index = 0;
75
- const sortItems = [];
76
- for (let i = 0; i < texts.length; i++) {
77
- const item = texts[i];
78
- const sortData = {
79
- len: item.textMeasures.length,
80
- index,
81
- endIndex: index + item.textMeasures.length,
82
- item,
83
- text: item.text
84
- };
85
- sortItems.push(sortData);
86
- index += sortData.len;
87
- }
88
- return sortItems;
89
- }
90
- /**
91
- * 获取指定方向上连续的字符
92
- * @param element
93
- * @param prev
94
- */
95
- function getConsecutiveTextsByDirection(element, prev = true) {
96
- let prevText = element;
97
- const prevTexts = [];
98
- const func = prev ? ElementUtil.getPrevSiblingElement : ElementUtil.getNextSiblingElement;
99
- const addItem = prev ? prevTexts.unshift : prevTexts.push;
100
- while ((prevText = func(prevText)) && prevText instanceof TextGroupElement) {
101
- //addItem(prevText);
102
- addItem.apply(prevTexts, [prevText]);
103
- }
104
- return prevTexts;
105
- }
106
- //# sourceMappingURL=document-segmenter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-segmenter.js","sourceRoot":"lib/","sources":["framework/document-segmenter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Element, LeafElement } from \"./element-define\";\nimport { TextGroupElement } from \"./impl/text/text-impl\";\nimport { ElementUtil } from \"./element-util\";\nimport { SelectionRange, SelectionState } from \"./document-selection\";\n\ndeclare namespace Intl {\n\n type BCP47LanguageTag = string;\n\n /**\n * An object with some or all properties of the `Intl.Segmenter` constructor `options` parameter.\n *\n * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters)\n */\n interface SegmenterOptions {\n /** The locale matching algorithm to use. For information about this option, see [Intl page](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_negotiation). */\n localeMatcher?: \"best fit\" | \"lookup\" | undefined;\n /** The type of input to be split */\n granularity?: \"grapheme\" | \"word\" | \"sentence\" | undefined;\n }\n\n interface Segmenter {\n /**\n * Returns `Segments` object containing the segments of the input string, using the segmenter's locale and granularity.\n *\n * @param input - The text to be segmented as a `string`.\n *\n * @returns A new iterable Segments object containing the segments of the input string, using the segmenter's locale and granularity.\n */\n segment(input: string): Segments;\n\n resolvedOptions(): ResolvedSegmenterOptions;\n }\n\n interface ResolvedSegmenterOptions {\n locale: string;\n granularity: \"grapheme\" | \"word\" | \"sentence\";\n }\n\n interface Segments {\n /**\n * Returns an object describing the segment in the original string that includes the code unit at a specified index.\n *\n * @param codeUnitIndex - A number specifying the index of the code unit in the original input string. If the value is omitted, it defaults to `0`.\n */\n containing(codeUnitIndex?: number): SegmentData;\n\n /** Returns an iterator to iterate over the segments. */\n [Symbol.iterator](): IterableIterator<SegmentData>;\n }\n\n interface SegmentData {\n /** A string containing the segment extracted from the original input string. */\n segment: string;\n /** The code unit index in the original input string at which the segment begins. */\n index: number;\n /** The complete input string that was segmented. */\n input: string;\n /**\n * A boolean value only if granularity is \"word\"; otherwise, undefined.\n * If granularity is \"word\", then isWordLike is true when the segment is word-like (i.e., consists of letters/numbers/ideographs/etc.); otherwise, false.\n */\n isWordLike?: boolean;\n }\n\n const Segmenter: {\n prototype: Segmenter;\n\n /**\n * Creates a new `Intl.Segmenter` object.\n *\n * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.\n * For the general form and interpretation of the `locales` argument,\n * see the [`Intl` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).\n *\n * @param options - An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters)\n * with some or all options of `SegmenterOptions`.\n *\n * @returns [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segments) object.\n *\n * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter).\n */\n new(locales?: BCP47LanguageTag | BCP47LanguageTag[], options?: SegmenterOptions): Segmenter;\n\n /**\n * Returns an array containing those of the provided locales that are supported without having to fall back to the runtime's default locale.\n *\n * @param locales - A string with a [BCP 47 language tag](http://tools.ietf.org/html/rfc5646), or an array of such strings.\n * For the general form and interpretation of the `locales` argument,\n * see the [`Intl` page](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#Locale_identification_and_negotiation).\n *\n * @param options An [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/supportedLocalesOf#parameters).\n * with some or all possible options.\n *\n * [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/supportedLocalesOf)\n */\n supportedLocalesOf(locales: BCP47LanguageTag | BCP47LanguageTag[], options?: Pick<SegmenterOptions, \"localeMatcher\">): BCP47LanguageTag[];\n };\n}\n\nexport function getFocusTextSegment(selection: SelectionState): boolean {\n let { startControl: element, startOffset: offset } = selection;\n if (!(element instanceof TextGroupElement)) return false;\n if (!supportSegment()) return false;\n const focusEle = element as TextGroupElement;\n offset = offset + 1;\n offset = offset > focusEle.textMeasures.length ? focusEle.textMeasures.length : offset;\n //获取连续的字符\n const items = [...getConsecutiveTextsByDirection(element), element, ...getConsecutiveTextsByDirection(element, false)];\n const sortItems = getTextSortData(items);\n const { index, text } = sortItems.reduce((prev, curr) => {\n prev.text += curr.text;\n if (prev.completed) {\n return prev;\n }\n if (curr.item === focusEle) {\n prev.index += offset;\n prev.completed = true;\n } else {\n prev.index += curr.item.textMeasures.length;\n }\n return prev\n }, { completed: false, index: 0, text: '' });\n const { index: hitIndex, len: hitLen } = getHitSegment(text, index);\n const matchSegment = sortItems.filter(item => (item.index <= hitIndex && item.endIndex > hitIndex) || (item.index <= hitIndex + hitLen && item.endIndex > hitIndex + hitLen));\n const startSegment = matchSegment[0];\n const endSegment = matchSegment[matchSegment.length - 1];\n const startOffset = hitIndex - startSegment.index;\n const endOffset = hitIndex + hitLen - endSegment.index;\n const newRange = new SelectionRange();\n newRange.setStart(startSegment.item, startOffset);\n newRange.setEnd(endSegment.item, endOffset);\n selection.addRange(newRange);\n return true;\n}\n\ninterface TextSegmentData {\n item: TextGroupElement,\n len: number,\n index: number,\n endIndex: number,\n text: string\n}\n\n/**\n * 进行分词\n * @param text\n * @param focusOffset\n */\nfunction getHitSegment(text: string, focusOffset): { index: number, len: number } {\n const segmenter = new Intl.Segmenter(\"zh-CN\", { granularity: \"word\" });\n const iterator1 = segmenter.segment(text)[Symbol.iterator]();\n const segItems = Array.from(iterator1);\n let index = 0;\n for (let i = 0; i < segItems.length; i++) {\n const segItem = segItems[i];\n const currIndex = segItem.index;\n const currLen = segItem.segment.length;\n if (focusOffset > currIndex && focusOffset <= currLen + currIndex) {\n return {\n index,\n len: currLen\n }\n }\n index += currLen;\n }\n throw new Error('未获取到对应的分词词组');\n}\n\nfunction supportSegment(): boolean {\n return typeof Intl.Segmenter === 'function';\n}\n\n/**\n * 根据前后顺序标识索引位\n * @param texts\n */\nfunction getTextSortData(texts: Array<TextGroupElement>): Array<TextSegmentData> {\n let index = 0;\n const sortItems: Array<TextSegmentData> = [];\n for (let i = 0; i < texts.length; i++) {\n const item = texts[i];\n const sortData = {\n len: item.textMeasures.length,\n index,\n endIndex: index + item.textMeasures.length,\n item,\n text: item.text\n };\n sortItems.push(sortData);\n index += sortData.len;\n }\n return sortItems;\n}\n\n/**\n * 获取指定方向上连续的字符\n * @param element\n * @param prev\n */\nfunction getConsecutiveTextsByDirection(element: TextGroupElement, prev = true): Array<TextGroupElement> {\n let prevText: Element | null = element;\n const prevTexts: Array<TextGroupElement> = [];\n const func = prev ? ElementUtil.getPrevSiblingElement : ElementUtil.getNextSiblingElement;\n const addItem = prev ? prevTexts.unshift : prevTexts.push;\n while ((prevText = func(prevText)) && prevText instanceof TextGroupElement) {\n //addItem(prevText);\n addItem.apply(prevTexts, [prevText]);\n }\n return prevTexts;\n}\n"]}