@eternalheart/angular-file-preview 1.6.5

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 (119) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +879 -0
  3. package/README.zh-CN.md +876 -0
  4. package/lib/LICENSE +22 -0
  5. package/lib/README.md +879 -0
  6. package/lib/components/preview/file-preview-toolbar.d.ts +19 -0
  7. package/lib/components/preview/nav-arrows.d.ts +25 -0
  8. package/lib/components/preview/renderer-outlet.d.ts +23 -0
  9. package/lib/components/preview/toolbar-button.d.ts +12 -0
  10. package/lib/components/resizable-split.d.ts +32 -0
  11. package/lib/di/locale.service.d.ts +12 -0
  12. package/lib/di/request.service.d.ts +20 -0
  13. package/lib/di/theme-mode.d.ts +6 -0
  14. package/lib/di/theme.service.d.ts +9 -0
  15. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs +55 -0
  16. package/lib/fesm2022/eternalheart-angular-file-preview-avifLoader-BP3fgcMm-CZsJ9svm.mjs.map +1 -0
  17. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs +58 -0
  18. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs.map +1 -0
  19. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs +5835 -0
  20. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs.map +1 -0
  21. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs +17 -0
  22. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs.map +1 -0
  23. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs +284 -0
  24. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs.map +1 -0
  25. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs +703 -0
  26. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-6dZS_Cfs-B1itLV5R.mjs.map +1 -0
  27. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs +231 -0
  28. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-B1ANUCTy-BRs7TMLn.mjs.map +1 -0
  29. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs +552 -0
  30. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BEaqpRV8-BidVIVlO.mjs.map +1 -0
  31. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs +688 -0
  32. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-BGqTRZbm-CAOLRw20.mjs.map +1 -0
  33. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs +273 -0
  34. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Bv3JRXKn-B4Wewc-4.mjs.map +1 -0
  35. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs +288 -0
  36. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C0McUoqT-DJ35bhIz.mjs.map +1 -0
  37. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs +550 -0
  38. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-C518mdUd-B5SCzrzU.mjs.map +1 -0
  39. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs +102 -0
  40. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CDjKPqyW-CmX5sdkL.mjs.map +1 -0
  41. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs +516 -0
  42. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CHi9tOe0-NOeQYAnM.mjs.map +1 -0
  43. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs +823 -0
  44. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CQwhffym-DAGw4Xy_.mjs.map +1 -0
  45. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs +164 -0
  46. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-CSCTj7ft-BfqruUyY.mjs.map +1 -0
  47. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs +655 -0
  48. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cb1RLXeO-Bj9gjS1Z.mjs.map +1 -0
  49. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs +207 -0
  50. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-Cw90Kdyg-BzrW_cyx.mjs.map +1 -0
  51. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs +199 -0
  52. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D35x1nwM-CugEEXjg.mjs.map +1 -0
  53. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs +194 -0
  54. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-D9jJNzeM-mWX59Aj2.mjs.map +1 -0
  55. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs +94 -0
  56. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DbmuvdvN-C29uLyt2.mjs.map +1 -0
  57. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs +468 -0
  58. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DsNNZ59Q-C8MaSME6.mjs.map +1 -0
  59. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs +193 -0
  60. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-DufW2Fuc-CTosCut6.mjs.map +1 -0
  61. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs +184 -0
  62. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-TSTa_Q7E-DBhkL6pV.mjs.map +1 -0
  63. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs +492 -0
  64. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-index-pG0Ko5mI-DthQJg-X.mjs.map +1 -0
  65. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs +68 -0
  66. package/lib/fesm2022/eternalheart-angular-file-preview-eternalheart-angular-file-preview-shiki-highlight-CL9cG481-BKfwdOpN.mjs.map +1 -0
  67. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs +36 -0
  68. package/lib/fesm2022/eternalheart-angular-file-preview-heicLoader-CH_raQNn-BSXHd_oi.mjs.map +1 -0
  69. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs +121 -0
  70. package/lib/fesm2022/eternalheart-angular-file-preview-jp2Loader-ldvCSsvm-DJEhfimG.mjs.map +1 -0
  71. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs +78 -0
  72. package/lib/fesm2022/eternalheart-angular-file-preview-psdLoader-D5CkupyY-D5Gegcdg.mjs.map +1 -0
  73. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs +81 -0
  74. package/lib/fesm2022/eternalheart-angular-file-preview-rawLoader-0mLvxCNp-CCXn9Rdp.mjs.map +1 -0
  75. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs +59 -0
  76. package/lib/fesm2022/eternalheart-angular-file-preview-tiffLoader-CmUAD1vO-0JqIws9t.mjs.map +1 -0
  77. package/lib/fesm2022/eternalheart-angular-file-preview.mjs +2 -0
  78. package/lib/fesm2022/eternalheart-angular-file-preview.mjs.map +1 -0
  79. package/lib/file-preview-content.d.ts +65 -0
  80. package/lib/file-preview-embed.d.ts +30 -0
  81. package/lib/file-preview-modal.d.ts +34 -0
  82. package/lib/fp-core.d.ts +1 -0
  83. package/lib/index.css +2119 -0
  84. package/lib/index.d.ts +11 -0
  85. package/lib/renderers/Audio/index.d.ts +74 -0
  86. package/lib/renderers/Cad/index.d.ts +45 -0
  87. package/lib/renderers/Cad/toolbar.d.ts +15 -0
  88. package/lib/renderers/Csv/index.d.ts +26 -0
  89. package/lib/renderers/Doc/index.d.ts +19 -0
  90. package/lib/renderers/Docx/index.d.ts +42 -0
  91. package/lib/renderers/Epub/index.d.ts +57 -0
  92. package/lib/renderers/Font/font-preview-line.d.ts +26 -0
  93. package/lib/renderers/Font/index.d.ts +52 -0
  94. package/lib/renderers/Image/index.d.ts +79 -0
  95. package/lib/renderers/Json/index.d.ts +61 -0
  96. package/lib/renderers/Markdown/index.d.ts +35 -0
  97. package/lib/renderers/Mobi/index.d.ts +51 -0
  98. package/lib/renderers/Msg/index.d.ts +47 -0
  99. package/lib/renderers/Pdf/index.d.ts +55 -0
  100. package/lib/renderers/Ppt/index.d.ts +19 -0
  101. package/lib/renderers/Pptx/index.d.ts +29 -0
  102. package/lib/renderers/RendererError.d.ts +9 -0
  103. package/lib/renderers/RendererLoading.d.ts +7 -0
  104. package/lib/renderers/Subtitle/index.d.ts +25 -0
  105. package/lib/renderers/Text/index.d.ts +29 -0
  106. package/lib/renderers/Unsupported/index.d.ts +15 -0
  107. package/lib/renderers/Video/index.d.ts +28 -0
  108. package/lib/renderers/Xlsx/index.d.ts +25 -0
  109. package/lib/renderers/Xml/index.d.ts +26 -0
  110. package/lib/renderers/Zip/index.d.ts +58 -0
  111. package/lib/renderers/Zip/tree-item.d.ts +29 -0
  112. package/lib/renderers/base.types.d.ts +10 -0
  113. package/lib/renderers/lazy.d.ts +23 -0
  114. package/lib/renderers/registry.d.ts +13 -0
  115. package/lib/renderers/toolbar.types.d.ts +19 -0
  116. package/lib/types.d.ts +26 -0
  117. package/lib/utils/audio-player.d.ts +20 -0
  118. package/lib/utils/shiki-highlight.d.ts +7 -0
  119. package/package.json +119 -0
@@ -0,0 +1,17 @@
1
+ class ToolbarEventEmitter {
2
+ constructor() {
3
+ this.listeners = new Set();
4
+ }
5
+ subscribe(listener) {
6
+ this.listeners.add(listener);
7
+ return () => {
8
+ this.listeners.delete(listener);
9
+ };
10
+ }
11
+ notify() {
12
+ this.listeners.forEach((fn) => fn());
13
+ }
14
+ }
15
+
16
+ export { ToolbarEventEmitter as T };
17
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-base.types-D5x7QPey-D5x7QPey.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-base.types-D5x7QPey.mjs"],"sourcesContent":["class ToolbarEventEmitter {\n constructor() {\n this.listeners = new Set();\n }\n subscribe(listener) {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n notify() {\n this.listeners.forEach((fn) => fn());\n }\n}\n\nexport { ToolbarEventEmitter as T };\n//# sourceMappingURL=eternalheart-angular-file-preview-base.types-D5x7QPey.mjs.map\n"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,CAAC;AAC1B,IAAI,WAAW,GAAG;AAClB,QAAQ,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE;AAClC,IAAI;AACJ,IAAI,SAAS,CAAC,QAAQ,EAAE;AACxB,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AACpC,QAAQ,OAAO,MAAM;AACrB,YAAY,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC3C,QAAQ,CAAC;AACT,IAAI;AACJ,IAAI,MAAM,GAAG;AACb,QAAQ,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAC5C,IAAI;AACJ;;;;"}
@@ -0,0 +1,284 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, inject, DestroyRef, signal, viewChild, afterNextRender, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { init } from 'pptx-preview';
4
+ import { L as LocaleService, R as RequestService, g as getFallbackTranslator, D as Dg } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-UobTf36G.mjs';
5
+ import { R as RendererError } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-RendererError-DtNihCIX-DtNihCIX.mjs';
6
+
7
+ class PptxRenderer {
8
+ constructor() {
9
+ this.url = input.required();
10
+ this.tiled = input(true);
11
+ this.locale = inject(LocaleService, { optional: true });
12
+ this.request = inject(RequestService, { optional: true });
13
+ this.destroyRef = inject(DestroyRef);
14
+ this.t = this.locale?.t() ?? getFallbackTranslator();
15
+ this.loading = signal(true);
16
+ this.error = signal(null);
17
+ this.slideCount = signal(0);
18
+ this.containerRef = viewChild('containerRef');
19
+ this.previewer = null;
20
+ this.resizeObserver = null;
21
+ this.arrayBufferRef = null;
22
+ this.resizeTimeout = null;
23
+ this.lastDimensions = { width: 0, height: 0 };
24
+ this.slideRatio = 9 / 16;
25
+ this.urlWatchReady = false;
26
+ this.getToolbarGroups = () => [];
27
+ afterNextRender(() => {
28
+ const el = this.containerRef()?.nativeElement;
29
+ if (!el)
30
+ return;
31
+ let isInitialRender = true;
32
+ this.resizeObserver = new ResizeObserver(() => {
33
+ if (isInitialRender) {
34
+ isInitialRender = false;
35
+ this.lastDimensions = this.calculateDimensions();
36
+ return;
37
+ }
38
+ const newDimensions = this.calculateDimensions();
39
+ const widthDiff = Math.abs(this.lastDimensions.width - newDimensions.width);
40
+ const heightDiff = Math.abs(this.lastDimensions.height - newDimensions.height);
41
+ if (widthDiff < 10 && heightDiff < 10)
42
+ return;
43
+ this.lastDimensions = newDimensions;
44
+ if (this.resizeTimeout !== null)
45
+ clearTimeout(this.resizeTimeout);
46
+ this.resizeTimeout = window.setTimeout(() => {
47
+ if (this.previewer && this.arrayBufferRef)
48
+ void this.reinitializePreviewer();
49
+ }, 800);
50
+ });
51
+ this.resizeObserver.observe(el);
52
+ this.urlWatchReady = true;
53
+ window.setTimeout(() => {
54
+ requestAnimationFrame(() => requestAnimationFrame(() => void this.loadPptx()));
55
+ }, 150);
56
+ });
57
+ this.destroyRef.onDestroy(() => {
58
+ if (this.resizeObserver)
59
+ this.resizeObserver.disconnect();
60
+ if (this.resizeTimeout !== null)
61
+ clearTimeout(this.resizeTimeout);
62
+ this.arrayBufferRef = null;
63
+ this.slideCount.set(0);
64
+ if (this.previewer) {
65
+ try {
66
+ this.previewer.destroy();
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ }
72
+ this.previewer = null;
73
+ });
74
+ effect(() => {
75
+ const newUrl = this.url();
76
+ if (!this.urlWatchReady)
77
+ return;
78
+ if (newUrl) {
79
+ untracked(() => {
80
+ void this.loadPptx();
81
+ });
82
+ }
83
+ });
84
+ }
85
+ calculateDimensions() {
86
+ const el = this.containerRef()?.nativeElement;
87
+ if (!el)
88
+ return { width: 960, height: 540 };
89
+ const rawWidth = el.clientWidth;
90
+ const parentWidth = el.parentElement?.clientWidth || 0;
91
+ const containerWidth = rawWidth > 100 ? rawWidth : parentWidth > 100 ? parentWidth : 300;
92
+ const height = Math.floor(containerWidth * this.slideRatio);
93
+ return { width: containerWidth, height };
94
+ }
95
+ async reinitializePreviewer() {
96
+ const el = this.containerRef()?.nativeElement;
97
+ if (!el || !this.arrayBufferRef || this.slideCount() === 0)
98
+ return;
99
+ try {
100
+ if (this.previewer) {
101
+ try {
102
+ this.previewer.destroy();
103
+ }
104
+ catch {
105
+ // ignore
106
+ }
107
+ }
108
+ el.innerHTML = '';
109
+ const currentDimensions = this.calculateDimensions();
110
+ this.previewer = init(el, {
111
+ width: currentDimensions.width,
112
+ height: this.tiled() ? currentDimensions.height * this.slideCount() : currentDimensions.height,
113
+ mode: this.tiled() ? 'list' : 'slide',
114
+ });
115
+ await this.previewer.preview(this.arrayBufferRef);
116
+ }
117
+ catch {
118
+ // 静默处理
119
+ }
120
+ }
121
+ async loadPptx() {
122
+ if (!this.containerRef()?.nativeElement)
123
+ return;
124
+ this.loading.set(true);
125
+ this.error.set(null);
126
+ let timeoutId = window.setTimeout(() => {
127
+ this.error.set(this.t('pptx.timeout'));
128
+ this.loading.set(false);
129
+ }, 30000);
130
+ try {
131
+ const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));
132
+ const response = await fetcher(this.url(), {
133
+ mode: 'cors',
134
+ credentials: 'omit',
135
+ redirect: 'follow',
136
+ });
137
+ if (!response.ok) {
138
+ if (response.status === 404)
139
+ throw new Error(this.t('pptx.not_found'));
140
+ if (response.status === 403)
141
+ throw new Error('无权限访问此文件');
142
+ if (response.status >= 500)
143
+ throw new Error('服务器错误,请稍后重试');
144
+ throw new Error(`文件加载失败 (${response.status})`);
145
+ }
146
+ const arrayBuffer = await response.arrayBuffer();
147
+ if (arrayBuffer.byteLength === 0)
148
+ throw new Error('文件为空');
149
+ this.arrayBufferRef = arrayBuffer;
150
+ this.slideRatio = (await Dg(arrayBuffer)).ratio;
151
+ const hiddenContainer = document.createElement('div');
152
+ hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';
153
+ document.body.appendChild(hiddenContainer);
154
+ try {
155
+ const tempPreviewer = init(hiddenContainer, {
156
+ width: 100,
157
+ height: 100,
158
+ mode: 'slide',
159
+ });
160
+ try {
161
+ await tempPreviewer.preview(arrayBuffer);
162
+ }
163
+ catch {
164
+ throw new Error(this.t('pptx.invalid_format'));
165
+ }
166
+ const count = tempPreviewer.slideCount;
167
+ if (!count || count === 0)
168
+ throw new Error(this.t('pptx.no_pages'));
169
+ tempPreviewer.destroy();
170
+ this.slideCount.set(count);
171
+ const el = this.containerRef()?.nativeElement;
172
+ if (el) {
173
+ el.innerHTML = '';
174
+ }
175
+ const currentDimensions = this.calculateDimensions();
176
+ this.previewer = init(el, {
177
+ width: currentDimensions.width,
178
+ height: this.tiled() ? currentDimensions.height * count : currentDimensions.height,
179
+ mode: this.tiled() ? 'list' : 'slide',
180
+ });
181
+ await this.previewer.preview(arrayBuffer);
182
+ if (timeoutId !== null) {
183
+ clearTimeout(timeoutId);
184
+ timeoutId = null;
185
+ }
186
+ this.loading.set(false);
187
+ }
188
+ finally {
189
+ if (document.body.contains(hiddenContainer)) {
190
+ document.body.removeChild(hiddenContainer);
191
+ }
192
+ }
193
+ }
194
+ catch (err) {
195
+ if (timeoutId !== null)
196
+ clearTimeout(timeoutId);
197
+ let errorMsg = this.t('pptx.parse_failed');
198
+ if (err instanceof Error)
199
+ errorMsg = err.message;
200
+ else if (typeof err === 'string')
201
+ errorMsg = err;
202
+ this.error.set(errorMsg);
203
+ this.loading.set(false);
204
+ }
205
+ }
206
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PptxRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
207
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.25", type: PptxRenderer, isStandalone: true, selector: "afp-pptx-renderer", inputs: { url: { classPropertyName: "url", publicName: "url", isSignal: true, isRequired: true, transformFunction: null }, tiled: { classPropertyName: "tiled", publicName: "tiled", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "afp-block afp-w-full afp-h-full" }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true, isSignal: true }], ngImport: i0, template: `
208
+ <div class="afp-relative afp-flex afp-flex-col afp-items-center afp-w-full afp-h-full">
209
+ @if (loading()) {
210
+ <div
211
+ class="afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10"
212
+ >
213
+ <div class="afp-text-center">
214
+ <div
215
+ class="afp-w-10 afp-h-10 md:afp-w-12 md:afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
216
+ ></div>
217
+ <p class="afp-text-xs md:afp-text-sm afp-text-fg-secondary afp-font-medium">{{ t('pptx.loading') }}</p>
218
+ </div>
219
+ </div>
220
+ }
221
+
222
+ @if (error() && !loading()) {
223
+ <afp-renderer-error
224
+ [message]="t('pptx.load_failed')"
225
+ [detail]="error()!"
226
+ class="afp-absolute afp-inset-0 afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10"
227
+ />
228
+ }
229
+
230
+ @if (!error()) {
231
+ <div
232
+ #containerRef
233
+ class="pptx-wrapper afp-w-full afp-max-w-full md:afp-max-w-6xl"
234
+ [style.opacity]="loading() ? 0 : 1"
235
+ ></div>
236
+ }
237
+ </div>
238
+ `, isInline: true, dependencies: [{ kind: "component", type: RendererError, selector: "afp-renderer-error", inputs: ["message", "detail", "showIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
239
+ }
240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.25", ngImport: i0, type: PptxRenderer, decorators: [{
241
+ type: Component,
242
+ args: [{
243
+ selector: 'afp-pptx-renderer',
244
+ standalone: true,
245
+ imports: [RendererError],
246
+ changeDetection: ChangeDetectionStrategy.OnPush,
247
+ host: { class: 'afp-block afp-w-full afp-h-full' },
248
+ template: `
249
+ <div class="afp-relative afp-flex afp-flex-col afp-items-center afp-w-full afp-h-full">
250
+ @if (loading()) {
251
+ <div
252
+ class="afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10"
253
+ >
254
+ <div class="afp-text-center">
255
+ <div
256
+ class="afp-w-10 afp-h-10 md:afp-w-12 md:afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin"
257
+ ></div>
258
+ <p class="afp-text-xs md:afp-text-sm afp-text-fg-secondary afp-font-medium">{{ t('pptx.loading') }}</p>
259
+ </div>
260
+ </div>
261
+ }
262
+
263
+ @if (error() && !loading()) {
264
+ <afp-renderer-error
265
+ [message]="t('pptx.load_failed')"
266
+ [detail]="error()!"
267
+ class="afp-absolute afp-inset-0 afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10"
268
+ />
269
+ }
270
+
271
+ @if (!error()) {
272
+ <div
273
+ #containerRef
274
+ class="pptx-wrapper afp-w-full afp-max-w-full md:afp-max-w-6xl"
275
+ [style.opacity]="loading() ? 0 : 1"
276
+ ></div>
277
+ }
278
+ </div>
279
+ `,
280
+ }]
281
+ }], ctorParameters: () => [] });
282
+
283
+ export { PptxRenderer };
284
+ //# sourceMappingURL=eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eternalheart-angular-file-preview-eternalheart-angular-file-preview-index--7d8Hgi0-D-sg24Qs.mjs","sources":["../fesm2022/eternalheart-angular-file-preview-index--7d8Hgi0.mjs"],"sourcesContent":["import * as i0 from '@angular/core';\nimport { input, inject, DestroyRef, signal, viewChild, afterNextRender, effect, untracked, ChangeDetectionStrategy, Component } from '@angular/core';\nimport { init } from 'pptx-preview';\nimport { L as LocaleService, R as RequestService, g as getFallbackTranslator } from './eternalheart-angular-file-preview-eternalheart-angular-file-preview-DXwNhxAB.mjs';\nimport { R as RendererError } from './eternalheart-angular-file-preview-RendererError-DtNihCIX.mjs';\nimport { readPptxSlideSize } from '@eternalheart/file-preview-core';\n\nclass PptxRenderer {\n constructor() {\n this.url = input.required();\n this.tiled = input(true);\n this.locale = inject(LocaleService, { optional: true });\n this.request = inject(RequestService, { optional: true });\n this.destroyRef = inject(DestroyRef);\n this.t = this.locale?.t() ?? getFallbackTranslator();\n this.loading = signal(true);\n this.error = signal(null);\n this.slideCount = signal(0);\n this.containerRef = viewChild('containerRef');\n this.previewer = null;\n this.resizeObserver = null;\n this.arrayBufferRef = null;\n this.resizeTimeout = null;\n this.lastDimensions = { width: 0, height: 0 };\n this.slideRatio = 9 / 16;\n this.urlWatchReady = false;\n this.getToolbarGroups = () => [];\n afterNextRender(() => {\n const el = this.containerRef()?.nativeElement;\n if (!el)\n return;\n let isInitialRender = true;\n this.resizeObserver = new ResizeObserver(() => {\n if (isInitialRender) {\n isInitialRender = false;\n this.lastDimensions = this.calculateDimensions();\n return;\n }\n const newDimensions = this.calculateDimensions();\n const widthDiff = Math.abs(this.lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(this.lastDimensions.height - newDimensions.height);\n if (widthDiff < 10 && heightDiff < 10)\n return;\n this.lastDimensions = newDimensions;\n if (this.resizeTimeout !== null)\n clearTimeout(this.resizeTimeout);\n this.resizeTimeout = window.setTimeout(() => {\n if (this.previewer && this.arrayBufferRef)\n void this.reinitializePreviewer();\n }, 800);\n });\n this.resizeObserver.observe(el);\n this.urlWatchReady = true;\n window.setTimeout(() => {\n requestAnimationFrame(() => requestAnimationFrame(() => void this.loadPptx()));\n }, 150);\n });\n this.destroyRef.onDestroy(() => {\n if (this.resizeObserver)\n this.resizeObserver.disconnect();\n if (this.resizeTimeout !== null)\n clearTimeout(this.resizeTimeout);\n this.arrayBufferRef = null;\n this.slideCount.set(0);\n if (this.previewer) {\n try {\n this.previewer.destroy();\n }\n catch {\n // ignore\n }\n }\n this.previewer = null;\n });\n effect(() => {\n const newUrl = this.url();\n if (!this.urlWatchReady)\n return;\n if (newUrl) {\n untracked(() => {\n void this.loadPptx();\n });\n }\n });\n }\n calculateDimensions() {\n const el = this.containerRef()?.nativeElement;\n if (!el)\n return { width: 960, height: 540 };\n const rawWidth = el.clientWidth;\n const parentWidth = el.parentElement?.clientWidth || 0;\n const containerWidth = rawWidth > 100 ? rawWidth : parentWidth > 100 ? parentWidth : 300;\n const height = Math.floor(containerWidth * this.slideRatio);\n return { width: containerWidth, height };\n }\n async reinitializePreviewer() {\n const el = this.containerRef()?.nativeElement;\n if (!el || !this.arrayBufferRef || this.slideCount() === 0)\n return;\n try {\n if (this.previewer) {\n try {\n this.previewer.destroy();\n }\n catch {\n // ignore\n }\n }\n el.innerHTML = '';\n const currentDimensions = this.calculateDimensions();\n this.previewer = init(el, {\n width: currentDimensions.width,\n height: this.tiled() ? currentDimensions.height * this.slideCount() : currentDimensions.height,\n mode: this.tiled() ? 'list' : 'slide',\n });\n await this.previewer.preview(this.arrayBufferRef);\n }\n catch {\n // 静默处理\n }\n }\n async loadPptx() {\n if (!this.containerRef()?.nativeElement)\n return;\n this.loading.set(true);\n this.error.set(null);\n let timeoutId = window.setTimeout(() => {\n this.error.set(this.t('pptx.timeout'));\n this.loading.set(false);\n }, 30000);\n try {\n const fetcher = this.request?.fetcher() ?? ((u, init) => fetch(u, init));\n const response = await fetcher(this.url(), {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n if (!response.ok) {\n if (response.status === 404)\n throw new Error(this.t('pptx.not_found'));\n if (response.status === 403)\n throw new Error('无权限访问此文件');\n if (response.status >= 500)\n throw new Error('服务器错误,请稍后重试');\n throw new Error(`文件加载失败 (${response.status})`);\n }\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength === 0)\n throw new Error('文件为空');\n this.arrayBufferRef = arrayBuffer;\n this.slideRatio = (await readPptxSlideSize(arrayBuffer)).ratio;\n const hiddenContainer = document.createElement('div');\n hiddenContainer.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';\n document.body.appendChild(hiddenContainer);\n try {\n const tempPreviewer = init(hiddenContainer, {\n width: 100,\n height: 100,\n mode: 'slide',\n });\n try {\n await tempPreviewer.preview(arrayBuffer);\n }\n catch {\n throw new Error(this.t('pptx.invalid_format'));\n }\n const count = tempPreviewer.slideCount;\n if (!count || count === 0)\n throw new Error(this.t('pptx.no_pages'));\n tempPreviewer.destroy();\n this.slideCount.set(count);\n const el = this.containerRef()?.nativeElement;\n if (el) {\n el.innerHTML = '';\n }\n const currentDimensions = this.calculateDimensions();\n this.previewer = init(el, {\n width: currentDimensions.width,\n height: this.tiled() ? currentDimensions.height * count : currentDimensions.height,\n mode: this.tiled() ? 'list' : 'slide',\n });\n await this.previewer.preview(arrayBuffer);\n if (timeoutId !== null) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n this.loading.set(false);\n }\n finally {\n if (document.body.contains(hiddenContainer)) {\n document.body.removeChild(hiddenContainer);\n }\n }\n }\n catch (err) {\n if (timeoutId !== null)\n clearTimeout(timeoutId);\n let errorMsg = this.t('pptx.parse_failed');\n if (err instanceof Error)\n errorMsg = err.message;\n else if (typeof err === 'string')\n errorMsg = err;\n this.error.set(errorMsg);\n this.loading.set(false);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: PptxRenderer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"19.2.25\", type: PptxRenderer, isStandalone: true, selector: \"afp-pptx-renderer\", inputs: { url: { classPropertyName: \"url\", publicName: \"url\", isSignal: true, isRequired: true, transformFunction: null }, tiled: { classPropertyName: \"tiled\", publicName: \"tiled\", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: \"afp-block afp-w-full afp-h-full\" }, viewQueries: [{ propertyName: \"containerRef\", first: true, predicate: [\"containerRef\"], descendants: true, isSignal: true }], ngImport: i0, template: `\n <div class=\"afp-relative afp-flex afp-flex-col afp-items-center afp-w-full afp-h-full\">\n @if (loading()) {\n <div\n class=\"afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10\"\n >\n <div class=\"afp-text-center\">\n <div\n class=\"afp-w-10 afp-h-10 md:afp-w-12 md:afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n <p class=\"afp-text-xs md:afp-text-sm afp-text-fg-secondary afp-font-medium\">{{ t('pptx.loading') }}</p>\n </div>\n </div>\n }\n\n @if (error() && !loading()) {\n <afp-renderer-error\n [message]=\"t('pptx.load_failed')\"\n [detail]=\"error()!\"\n class=\"afp-absolute afp-inset-0 afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10\"\n />\n }\n\n @if (!error()) {\n <div\n #containerRef\n class=\"pptx-wrapper afp-w-full afp-max-w-full md:afp-max-w-6xl\"\n [style.opacity]=\"loading() ? 0 : 1\"\n ></div>\n }\n </div>\n `, isInline: true, dependencies: [{ kind: \"component\", type: RendererError, selector: \"afp-renderer-error\", inputs: [\"message\", \"detail\", \"showIcon\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"19.2.25\", ngImport: i0, type: PptxRenderer, decorators: [{\n type: Component,\n args: [{\n selector: 'afp-pptx-renderer',\n standalone: true,\n imports: [RendererError],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { class: 'afp-block afp-w-full afp-h-full' },\n template: `\n <div class=\"afp-relative afp-flex afp-flex-col afp-items-center afp-w-full afp-h-full\">\n @if (loading()) {\n <div\n class=\"afp-absolute afp-inset-0 afp-flex afp-items-center afp-justify-center afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10\"\n >\n <div class=\"afp-text-center\">\n <div\n class=\"afp-w-10 afp-h-10 md:afp-w-12 md:afp-h-12 afp-mx-auto afp-mb-3 afp-border-4 afp-border-line-strong afp-border-t-spinner-head afp-rounded-full afp-animate-spin\"\n ></div>\n <p class=\"afp-text-xs md:afp-text-sm afp-text-fg-secondary afp-font-medium\">{{ t('pptx.loading') }}</p>\n </div>\n </div>\n }\n\n @if (error() && !loading()) {\n <afp-renderer-error\n [message]=\"t('pptx.load_failed')\"\n [detail]=\"error()!\"\n class=\"afp-absolute afp-inset-0 afp-bg-surface-toolbar afp-backdrop-blur-sm afp-z-10\"\n />\n }\n\n @if (!error()) {\n <div\n #containerRef\n class=\"pptx-wrapper afp-w-full afp-max-w-full md:afp-max-w-6xl\"\n [style.opacity]=\"loading() ? 0 : 1\"\n ></div>\n }\n </div>\n `,\n }]\n }], ctorParameters: () => [] });\n\nexport { PptxRenderer };\n//# sourceMappingURL=eternalheart-angular-file-preview-index--7d8Hgi0.mjs.map\n"],"names":["readPptxSlideSize"],"mappings":"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"}