@file-viewer/docx 0.3.33 → 0.3.35

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 (76) hide show
  1. package/README.md +49 -9
  2. package/dist/THIRD_PARTY_NOTICES.txt +1038 -0
  3. package/dist/anchor-layout.d.ts +20 -0
  4. package/dist/comment-layer.d.ts +40 -0
  5. package/dist/comments/comments-extended-part.d.ts +13 -0
  6. package/dist/comments/comments-part.d.ts +11 -0
  7. package/dist/comments/elements.d.ts +23 -0
  8. package/dist/common/content-types.d.ts +7 -0
  9. package/dist/common/open-xml-package.d.ts +25 -0
  10. package/dist/common/part.d.ts +12 -0
  11. package/dist/common/relationship.d.ts +46 -0
  12. package/dist/dark-mode-color.d.ts +29 -0
  13. package/dist/display-address.d.ts +5 -0
  14. package/dist/document/bookmarks.d.ts +13 -0
  15. package/dist/document/border.d.ts +18 -0
  16. package/dist/document/common.d.ts +38 -0
  17. package/dist/document/document-part.d.ts +10 -0
  18. package/dist/document/document.d.ts +9 -0
  19. package/dist/document/dom.d.ts +200 -0
  20. package/dist/document/fields.d.ts +14 -0
  21. package/dist/document/line-spacing.d.ts +9 -0
  22. package/dist/document/page-breaks.d.ts +8 -0
  23. package/dist/document/paragraph.d.ts +54 -0
  24. package/dist/document/run.d.ts +12 -0
  25. package/dist/document/section.d.ts +82 -0
  26. package/dist/document/style.d.ts +21 -0
  27. package/dist/document/symbol-encoding.d.ts +28 -0
  28. package/dist/document-parser.d.ts +156 -0
  29. package/dist/document-props/core-props-part.d.ts +6 -0
  30. package/dist/document-props/core-props.d.ts +12 -0
  31. package/dist/document-props/custom-props-part.d.ts +6 -0
  32. package/dist/document-props/custom-props.d.ts +8 -0
  33. package/dist/document-props/extended-props-part.d.ts +6 -0
  34. package/dist/document-props/extended-props.d.ts +14 -0
  35. package/dist/docx-preview-esm.d.mts +3 -0
  36. package/dist/docx-preview-worker.d.ts +1 -0
  37. package/dist/docx-preview.d.ts +84 -13
  38. package/dist/docx-preview.js +15397 -4
  39. package/dist/docx-preview.min.js +25 -4
  40. package/dist/docx-preview.min.mjs +25 -4
  41. package/dist/docx-preview.mjs +15396 -4
  42. package/dist/docx-preview.worker.js +15473 -4
  43. package/dist/font-table/font-table.d.ts +6 -0
  44. package/dist/font-table/fonts.d.ts +15 -0
  45. package/dist/header-footer/elements.d.ts +7 -0
  46. package/dist/header-footer/parts.d.ts +18 -0
  47. package/dist/html-renderer.d.ts +567 -0
  48. package/dist/html.d.ts +16 -0
  49. package/dist/input-validation.d.ts +2 -0
  50. package/dist/javascript.d.ts +8 -0
  51. package/dist/jszip.min.js +2 -2
  52. package/dist/layout-coordinates.d.ts +23 -0
  53. package/dist/layout-readiness.d.ts +17 -0
  54. package/dist/length.d.ts +11 -0
  55. package/dist/license-gate.d.ts +4 -0
  56. package/dist/metafile/emf-to-svg.d.ts +7 -0
  57. package/dist/metafile/wmf-to-svg.d.ts +7 -0
  58. package/dist/notes/elements.d.ts +12 -0
  59. package/dist/notes/parts.d.ts +17 -0
  60. package/dist/notes/properties.d.ts +33 -0
  61. package/dist/numbering/numbering-part.d.ts +14 -0
  62. package/dist/numbering/numbering.d.ts +49 -0
  63. package/dist/parser/xml-parser.d.ts +27 -0
  64. package/dist/review.d.ts +49 -0
  65. package/dist/security/links.d.ts +6 -0
  66. package/dist/security/trusted-types.d.ts +10 -0
  67. package/dist/settings/settings-part.d.ts +8 -0
  68. package/dist/settings/settings.d.ts +25 -0
  69. package/dist/styles/styles-part.d.ts +10 -0
  70. package/dist/table-diagonals.d.ts +2 -0
  71. package/dist/theme/theme-part.d.ts +8 -0
  72. package/dist/theme/theme.d.ts +25 -0
  73. package/dist/utils.d.ts +17 -0
  74. package/dist/vml/vml.d.ts +19 -0
  75. package/dist/word-document.d.ts +89 -0
  76. package/package.json +33 -26
@@ -0,0 +1,6 @@
1
+ import { Part } from "../common/part";
2
+ import { FontDeclaration } from "./fonts";
3
+ export declare class FontTablePart extends Part {
4
+ fonts: FontDeclaration[];
5
+ parseXml(root: Element): void;
6
+ }
@@ -0,0 +1,15 @@
1
+ import { XmlParser } from "../parser/xml-parser";
2
+ export interface FontDeclaration {
3
+ name: string;
4
+ altName: string;
5
+ family: string;
6
+ embedFontRefs: EmbedFontRef[];
7
+ }
8
+ export interface EmbedFontRef {
9
+ id: string;
10
+ key: string;
11
+ type: 'regular' | 'bold' | 'italic' | 'boldItalic';
12
+ }
13
+ export declare function parseFonts(root: Element, xml: XmlParser): FontDeclaration[];
14
+ export declare function parseFont(elem: Element, xml: XmlParser): FontDeclaration;
15
+ export declare function parseEmbedFontRef(elem: Element, xml: XmlParser): EmbedFontRef;
@@ -0,0 +1,7 @@
1
+ import { OpenXmlElementBase, DomType } from "../document/dom";
2
+ export declare class WmlHeader extends OpenXmlElementBase {
3
+ type: DomType;
4
+ }
5
+ export declare class WmlFooter extends OpenXmlElementBase {
6
+ type: DomType;
7
+ }
@@ -0,0 +1,18 @@
1
+ import { OpenXmlPackage } from "../common/open-xml-package";
2
+ import { Part } from "../common/part";
3
+ import { DocumentParser } from "../document-parser";
4
+ import { OpenXmlElement } from "../document/dom";
5
+ import { WmlHeader, WmlFooter } from "./elements";
6
+ export declare abstract class BaseHeaderFooterPart<T extends OpenXmlElement = OpenXmlElement> extends Part {
7
+ rootElement: T;
8
+ private _documentParser;
9
+ constructor(pkg: OpenXmlPackage, path: string, parser: DocumentParser);
10
+ parseXml(root: Element): void;
11
+ protected abstract createRootElement(): T;
12
+ }
13
+ export declare class HeaderPart extends BaseHeaderFooterPart<WmlHeader> {
14
+ protected createRootElement(): WmlHeader;
15
+ }
16
+ export declare class FooterPart extends BaseHeaderFooterPart<WmlFooter> {
17
+ protected createRootElement(): WmlFooter;
18
+ }
@@ -0,0 +1,567 @@
1
+ import { LayoutGeneration } from './layout-readiness';
2
+ import { AnchorPosition } from './anchor-layout';
3
+ import { WordDocument } from './word-document';
4
+ import { WmlTable, IDomNumbering, WmlHyperlink, IDomImage, IDomShape, OpenXmlElement, WmlTableColumn, WmlTableCell, WmlText, WmlSymbol, WmlBreak, WmlNoteReference, WmlSmartTag, WmlAltChunk, WmlTableRow, IDomChart, IDomSmartArt, IDomInk } from './document/dom';
5
+ import { Options } from './docx-preview';
6
+ import { DocumentElement } from './document/document';
7
+ import { ParagraphTab, WmlParagraph } from './document/paragraph';
8
+ import { FontTablePart } from './font-table/font-table';
9
+ import { FooterHeaderReference, SectionProperties } from './document/section';
10
+ import { WmlRun } from './document/run';
11
+ import { WmlFieldChar, WmlFieldSimple } from './document/fields';
12
+ import { WmlBookmarkStart } from './document/bookmarks';
13
+ import { IDomStyle } from './document/style';
14
+ import { WmlBaseNote, WmlFootnote } from './notes/elements';
15
+ import { ThemePart } from './theme/theme-part';
16
+ import { DmlFormInfo } from './theme/theme';
17
+ import { Part } from './common/part';
18
+ import { VmlElement } from './vml/vml';
19
+ import { WmlCommentRangeStart, WmlCommentReference } from './comments/elements';
20
+ import { h, ns } from './html';
21
+ import { NoteKind, NoteAssignment, NoteNumbering } from './notes/properties';
22
+ interface CellPos {
23
+ col: number;
24
+ row: number;
25
+ }
26
+ interface Section {
27
+ sectProps: SectionProperties;
28
+ elements: OpenXmlElement[];
29
+ pageBreak: boolean;
30
+ columnBreak?: boolean;
31
+ startsAfterExplicitPageBreak?: boolean;
32
+ endsWithExplicitPageBreak?: boolean;
33
+ }
34
+ interface PageHeaderFooterState {
35
+ headerProps: SectionProperties;
36
+ footerProps: SectionProperties;
37
+ headerId?: string;
38
+ footerId?: string;
39
+ }
40
+ interface DynamicNoteState {
41
+ references: HTMLElement[];
42
+ items: HTMLElement[];
43
+ fragments: Map<HTMLElement, HTMLElement[]>;
44
+ owners: Map<HTMLElement, HTMLElement>;
45
+ text: Map<HTMLElement, string>;
46
+ fields: Map<HTMLElement, HTMLElement[]>;
47
+ }
48
+ interface TocEntry {
49
+ level: number;
50
+ text: string;
51
+ id: string;
52
+ }
53
+ interface ChartSeries {
54
+ name: string;
55
+ categories: string[];
56
+ /** Missing or invalid cache points remain NaN so their indexes never shift. */
57
+ values: number[];
58
+ }
59
+ interface ChartAxes {
60
+ category: Element | null;
61
+ value: Element | null;
62
+ date1904: boolean;
63
+ }
64
+ interface ChartPlotOptions {
65
+ type?: string;
66
+ group?: Element;
67
+ seriesNodes?: Element[];
68
+ colorOffset?: number;
69
+ noLegend?: boolean;
70
+ }
71
+ interface VmlRenderContext {
72
+ originX: number;
73
+ originY: number;
74
+ offsetX: number;
75
+ offsetY: number;
76
+ scaleX: number;
77
+ scaleY: number;
78
+ width: number;
79
+ height: number;
80
+ }
81
+ interface VmlBounds {
82
+ x: number;
83
+ y: number;
84
+ width: number;
85
+ height: number;
86
+ }
87
+ /** Release the source-owned layout and comment bindings for this mounted render. */
88
+ export declare function disposeRenderedLayout(container: HTMLElement): void;
89
+ /** Await source-owned tab and drawing layout for nodes produced by renderDocument. */
90
+ export declare function layoutRenderedDocument(container: HTMLElement, generation?: LayoutGeneration): Promise<void>;
91
+ interface CellVerticalMerge {
92
+ cell: HTMLTableCellElement;
93
+ span: number;
94
+ lastRow: number;
95
+ bottomBorder: string;
96
+ bottomBorderPriority: string;
97
+ }
98
+ type CellVerticalMergeType = Record<number, CellVerticalMerge>;
99
+ /**
100
+ * DOCX HTML 渲染器。
101
+ * 负责把 DocumentParser 生成的内部 DOM 转成真实 DOM 节点,并处理样式继承、分页、
102
+ * 页眉页脚、脚注尾注、表格合并、目录字段和浮动对象等 Word 兼容行为。
103
+ */
104
+ export declare class HtmlRenderer {
105
+ /** 根 CSS 类名,所有生成选择器都会以它作为命名空间,避免污染宿主页面。 */
106
+ className: string;
107
+ rootSelector: string;
108
+ /** 当前渲染的 WordDocument,供图片、字体、关系 part 和页眉页脚按需加载。 */
109
+ document: WordDocument;
110
+ options: Options;
111
+ /** styleId 到样式对象的索引,渲染段落/run/表格时用于快速合并继承样式。 */
112
+ styleMap: Record<string, IDomStyle>;
113
+ currentPart: Part;
114
+ currentSectionProps: SectionProperties;
115
+ currentPageNumber: number;
116
+ currentSectionNumber: number;
117
+ currentSectionPageNumber: number;
118
+ totalPages: number;
119
+ sectionPageCount: number;
120
+ /** 表格纵向合并状态栈,用来把 Word 的 vMerge 转换成 HTML rowspan。 */
121
+ tableVerticalMerges: CellVerticalMergeType[];
122
+ currentVerticalMerge: CellVerticalMergeType;
123
+ tableCellPositions: CellPos[];
124
+ currentCellPosition: CellPos;
125
+ currentTableRow: WmlTableRow;
126
+ private repeatedTableHeaderRows;
127
+ footnoteMap: Record<string, WmlFootnote>;
128
+ endnoteMap: Record<string, WmlFootnote>;
129
+ currentFootnoteIds: string[];
130
+ currentEndnoteIds: string[];
131
+ noteNumbering: NoteNumbering;
132
+ renderedNoteIds: Set<string>;
133
+ noteSectionIds: Map<SectionProperties, string>;
134
+ notePageIndex: number;
135
+ dynamicNoteState: WeakMap<HTMLElement, DynamicNoteState>;
136
+ noteContinuationOrigins: WeakMap<HTMLElement, HTMLElement>;
137
+ headerFooterModels: Map<string, OpenXmlElement>;
138
+ pageHeaderFooterState: WeakMap<HTMLElement, PageHeaderFooterState>;
139
+ defaultTabSize: string;
140
+ currentTabs: any[];
141
+ anchorLayouts: Map<string, AnchorPosition>;
142
+ currentParagraph: WmlParagraph;
143
+ currentParagraphTabIndex: number;
144
+ currentParagraphTabCount: number;
145
+ commentHighlight: any;
146
+ commentMap: Record<string, Range>;
147
+ private commentLayer;
148
+ private commentPresentations;
149
+ private renderingComment;
150
+ private hyperlinkDepth;
151
+ private static nextCommentId;
152
+ private layoutGenerations;
153
+ bookmarkTextMap: Record<string, string>;
154
+ bookmarkIdToName: Record<string, string>;
155
+ /** 目录与交叉引用相关的运行时索引,渲染字段时会回填页面锚点和编号。 */
156
+ tocEntries: TocEntry[];
157
+ fieldSeqCounters: Record<string, number>;
158
+ fieldSetValues: Record<string, string>;
159
+ headingIndex: number;
160
+ tasks: Promise<any>[];
161
+ postRenderTasks: any[];
162
+ h: typeof h;
163
+ /**
164
+ * 暗色模式下,任意字面量颜色(非 --docx-*-color 主题/auto 变量)都会被包装成
165
+ * `var(--docx-dm-N, 暗色值)`:正常屏幕下该变量未定义,直接退回暗色值;
166
+ * 打印时统一在 .className 根选择器上把这些变量重新定义为浅色原值(见
167
+ * renderDarkModePrintReset()),这样无论颜色来自内联样式还是 styles.xml/编号
168
+ * 样式表,打印永远还原成 Word 文档本身的颜色,不需要逐元素处理。
169
+ */
170
+ darkModeVarNames: Map<string, string>;
171
+ darkModePrintReset: Record<string, string>;
172
+ /** 渲染入口:生成样式节点、页面节点,并等待异步图片/字体任务完成。 */
173
+ render(document: WordDocument, options: Options): Promise<Node[]>;
174
+ renderTheme(themePart: ThemePart): Node[];
175
+ documentThemeLanguages(): {
176
+ latin: string;
177
+ eastAsia: string;
178
+ bidi: string;
179
+ };
180
+ addThemeScriptFontVariables(variables: Record<string, string>, size: "major" | "minor", font: DmlFormInfo): void;
181
+ themeFontFamily(font: DmlFormInfo, slot: "latin" | "eastAsia" | "complexScript", language: string, scriptOverride?: string): string;
182
+ renderFontTable(fontsPart: FontTablePart): Promise<any[]>;
183
+ processStyleName(className: string): string;
184
+ /** 处理样式继承链,并为每个 styleId 生成稳定 CSS class。 */
185
+ processStyles(styles: IDomStyle[]): Record<any, IDomStyle>;
186
+ prodessNumberings(numberings: IDomNumbering[]): void;
187
+ processElement(element: OpenXmlElement | null | undefined): void;
188
+ /** 预处理表格:补齐首末行/列、奇偶带状样式、继承单元格边框和内边距。 */
189
+ processTable(table: WmlTable): void;
190
+ /** 扫描书签、标题和目录候选项,为 TOC/PAGEREF 等字段建立运行时索引。 */
191
+ collectDocumentMetadata(document: DocumentElement): void;
192
+ collectTocEntries(elem: OpenXmlElement): void;
193
+ findFirstBookmark(elem: OpenXmlElement): WmlBookmarkStart;
194
+ extractText(elem: OpenXmlElement): string;
195
+ appendClassName(elem: OpenXmlElement, className: string): void;
196
+ copyStyleProperties(input: Record<string, string>, output: Record<string, string>, attrs?: string[]): Record<string, string>;
197
+ createPageElement(className: string, props: SectionProperties, docStyle: Record<string, any>): HTMLElement;
198
+ addSize(a: string, b: string): string;
199
+ parseCssLengthValue(value: string): number;
200
+ applyPageBorder(style: Record<string, string>, side: "top" | "right" | "bottom" | "left", border: any): void;
201
+ borderTypeToCss(type: string): "none" | "solid" | "dashed" | "dotted" | "double";
202
+ borderColor(color: string): string;
203
+ createSectionContent(props: SectionProperties): HTMLElement;
204
+ /** 按 Word 节属性拆分页面,并渲染页眉、正文、脚注和页脚。 */
205
+ renderSections(document: DocumentElement): Promise<HTMLElement[]>;
206
+ resolveSectionHeaderFooterReferences(sections: Section[]): void;
207
+ selectHeaderFooterReference(refs: FooterHeaderReference[], props: SectionProperties, page: number, firstOfSection: boolean): FooterHeaderReference;
208
+ renderHeaderFooter(refs: FooterHeaderReference[], props: SectionProperties, page: number, firstOfSection: boolean, into: HTMLElement): void;
209
+ isPageBreakElement(elem: OpenXmlElement): boolean;
210
+ isPageBreakSection(prev: SectionProperties, next: SectionProperties): boolean;
211
+ splitBySection(elements: OpenXmlElement[], defaultProps: SectionProperties): Section[];
212
+ hasPageBreakElement(elem: OpenXmlElement): boolean;
213
+ splitTableByPageBreaks(table: WmlTable): {
214
+ table: WmlTable;
215
+ breakAfter: boolean;
216
+ }[];
217
+ /** Hidden revisions stay in the model/DOM but do not contribute page breaks. */
218
+ isHiddenRevisionForPagination(element: OpenXmlElement): boolean;
219
+ hasOnlyHiddenRevisionTail(elements: OpenXmlElement[]): boolean;
220
+ splitElementByPageBreaks(elem: OpenXmlElement): {
221
+ element?: OpenXmlElement;
222
+ breakAfter?: boolean;
223
+ explicitPageBreak?: boolean;
224
+ }[];
225
+ splitParagraphByPageBreaks(paragraph: WmlParagraph): {
226
+ paragraph: WmlParagraph;
227
+ breakAfter: boolean;
228
+ explicitPageBreak?: boolean;
229
+ }[];
230
+ styleValuesForTarget(style: IDomStyle, target: string): Record<string, string>;
231
+ styleValue(style: IDomStyle, target: string, name: string): string;
232
+ effectiveParagraphCssValue(elem: WmlParagraph, style: IDomStyle, name: string): string;
233
+ isInsideTableCell(elem: OpenXmlElement): boolean;
234
+ paragraphUsesDocumentGrid(elem: WmlParagraph, style: IDomStyle): boolean;
235
+ setCssStyle(element: HTMLElement, name: string, value: string): void;
236
+ applyDocumentGridMinimumHeight(elem: WmlParagraph, style: IDomStyle, result: HTMLElement, linePitch: string): void;
237
+ applyDocumentGridLinePitch(elem: WmlParagraph, style: IDomStyle, result: HTMLElement): void;
238
+ preserveGridInlineMetrics(result: HTMLElement): void;
239
+ groupByPageBreaks(sections: Section[]): Section[][];
240
+ hasPageModelContent(element: OpenXmlElement): boolean;
241
+ yieldDuringRender(current: number, total: number): Promise<void>;
242
+ yieldToBrowser(): Promise<void>;
243
+ renderWrapper(children: HTMLElement[]): HTMLElement;
244
+ shouldRunDynamicPagination(): boolean;
245
+ scheduleDynamicPagination(wrapper: HTMLElement, generation?: LayoutGeneration): void;
246
+ performDynamicPagination(wrapper: HTMLElement, generation?: LayoutGeneration): Promise<void>;
247
+ /** Move a measured, simple block tail in one DOM operation, preserving order. */
248
+ moveOverflowingTail(article: HTMLElement, page: HTMLElement, nextArticle: HTMLElement): boolean;
249
+ pickPaginationChunk(article: HTMLElement): HTMLElement[];
250
+ isKeepWithNext(elem: HTMLElement): boolean;
251
+ isPageOverflowing(page: HTMLElement): boolean;
252
+ createContinuationPage(page: HTMLElement, attach?: boolean): HTMLElement;
253
+ /** Redistribute canonical note bodies and their ordered, content-owning fragments. */
254
+ syncDynamicNotes(wrapper: HTMLElement): void;
255
+ getOrCreateNoteList(page: HTMLElement, kind: string): HTMLElement;
256
+ /** Rejoin only shells split from the same source; preserve authored boundaries. */
257
+ mergeNoteContents(target: HTMLElement, source: HTMLElement): void;
258
+ /** Footer/body boundary in CSS pixels, respecting the section's own margins. */
259
+ getPageNoteBottom(page: HTMLElement): number;
260
+ /** Reserve the measured, non-shrinking note regions above the footer. */
261
+ getPageBodyBottom(page: HTMLElement): number;
262
+ /** Minimum measured body prefix to retain while reserving an oversized note. */
263
+ getMinimumNoteBodyBottom(page: HTMLElement): number;
264
+ /** Try complete endnotes after the body before dividing a valid body paragraph. */
265
+ moveEndnotesAfterBody(page: HTMLElement, nextPage: HTMLElement): boolean;
266
+ /** Split only note space exceeding a page's measured capacity, before body flow. */
267
+ splitDynamicNotes(page: HTMLElement, nextPage: HTMLElement): boolean;
268
+ /** Measure the first retained line/atom, restoring all source nodes afterward. */
269
+ measureNoteMinimum(item: HTMLElement, nextPage: HTMLElement, page: HTMLElement): number;
270
+ moveNoteItemTail(item: HTMLElement, destination: HTMLElement, page: HTMLElement, overflows: () => boolean): boolean;
271
+ /** Identity-aware prefix guard; bookmarks do not count as a visible atom. */
272
+ hasNoteContentOutside(root: HTMLElement, excluded: Node): boolean;
273
+ firstNoteTextBoundary(text: string): number;
274
+ getNoteItemHeight(item: HTMLElement): number;
275
+ hasVisibleNoteContent(item: HTMLElement): boolean;
276
+ /** Notes reuse the inline text search, moving atoms and preserving unique IDs. */
277
+ splitNoteBlock(block: HTMLElement, destination: HTMLElement, page: HTMLElement, overflows: () => boolean, root?: HTMLElement): boolean;
278
+ moveNoteBlockTail(source: HTMLElement, destination: HTMLElement, page: HTMLElement, overflows: () => boolean, root: HTMLElement): boolean;
279
+ moveNoteTailNode(source: HTMLElement, destination: HTMLElement, page: HTMLElement, overflows: () => boolean, root: HTMLElement): boolean;
280
+ isNoteAtomicElement(element: HTMLElement): boolean;
281
+ /** Only the field kinds actually refreshed by evaluateDynamicField may change. */
282
+ isMutableNoteField(element: HTMLElement): boolean;
283
+ noteTextSignature(item: HTMLElement, fields: HTMLElement[]): string;
284
+ /** A completed layout must contain neither overlapping notes nor missing fragments. */
285
+ assertDynamicNotesFit(wrapper: HTMLElement): void;
286
+ refreshDynamicHeaderFooters(pages: HTMLElement[]): Promise<void>;
287
+ splitOverflowBlock(block: HTMLElement, page: HTMLElement, nextArticle: HTMLElement): boolean;
288
+ splitParagraphBlock(paragraph: HTMLElement, page: HTMLElement, nextArticle: HTMLElement): boolean;
289
+ splitTableBlock(table: HTMLTableElement, page: HTMLElement, nextArticle: HTMLElement): boolean;
290
+ cloneBlockShell<T extends HTMLElement>(element: T): T;
291
+ tableContentRows(table: HTMLTableElement): HTMLTableRowElement[];
292
+ firstMovedTableRow(table: HTMLTableElement): HTMLTableRowElement;
293
+ moveTailInlineNode(source: Node, dest: Node, page: HTMLElement): boolean;
294
+ moveTextTail(textNode: Text, dest: Node, page: HTMLElement, overflows?: () => boolean, preserveGraphemes?: boolean, minimumPrefix?: number): boolean;
295
+ adjustSplitToWordBoundary(text: string, moveLength: number): number;
296
+ removeEmptyInlineContainers(element: HTMLElement): void;
297
+ cleanupEmptyNumberedParagraphs(wrapper: HTMLElement): void;
298
+ removeEmptyDynamicPages(wrapper: HTMLElement): void;
299
+ findNextVisiblePaginationBlock(wrapper: HTMLElement, start: HTMLElement): HTMLElement | null;
300
+ hasVisiblePaginationContent(element: HTMLElement): boolean;
301
+ moveAnchorsToBlock(source: HTMLElement, target: HTMLElement): void;
302
+ rebalanceWidowOrphan(source: HTMLElement, continuation: HTMLElement, page: HTMLElement): void;
303
+ visualLineCount(element: HTMLElement): number;
304
+ updateDynamicFieldPages(wrapper: HTMLElement): void;
305
+ evaluateDynamicField(instruction: string, page: number, totalPages: number, pageByAnchor: Record<string, number>, sectionPages?: number, sectionPageNumber?: number, sectionNumber?: number): string;
306
+ renderDefaultStyle(): Node[];
307
+ renderNumbering(numberings: IDomNumbering[]): Promise<Node[]>;
308
+ renderStyles(styles: IDomStyle[]): Node[];
309
+ renderNotes(noteIds: string[], notesMap: Record<string, WmlBaseNote>, part?: Part, kind?: NoteKind): HTMLElement;
310
+ formatNoteAssignment(assignment: NoteAssignment): string;
311
+ applyNoteAssignment(element: HTMLElement, assignment: NoteAssignment, reference: boolean): void;
312
+ /** 按内部 DOM 类型分发到段落、表格、图片、字段等具体渲染函数。 */
313
+ renderElement(elem: OpenXmlElement): Node | Node[];
314
+ renderElements(elems: OpenXmlElement[], into?: Node): Node[];
315
+ private reviewParagraphs;
316
+ isPositionedParagraphFrame(paragraph?: WmlParagraph): boolean;
317
+ paragraphFrameKey(paragraph: WmlParagraph): string;
318
+ paragraphFrameStyle(paragraph: WmlParagraph): Record<string, string>;
319
+ tryRenderComplexField(elems: OpenXmlElement[], startIndex: number): {
320
+ node: Node | Node[];
321
+ nextIndex: number;
322
+ };
323
+ hasFieldChar(elem: OpenXmlElement, charType: WmlFieldChar["charType"]): boolean;
324
+ renderContainer<T extends keyof HTMLElementTagNameMap>(elem: OpenXmlElement, tagName: T): HTMLElementTagNameMap[T];
325
+ renderContainerNS(elem: OpenXmlElement, ns: ns, tagName: string, props?: Record<string, any>): Node;
326
+ effectiveParagraphTabs(directTabs: ParagraphTab[], styleTabs: ParagraphTab[]): ParagraphTab[];
327
+ countParagraphTabs(elem: OpenXmlElement): number;
328
+ isLeaderTabStop(tab: ParagraphTab): boolean;
329
+ resolveRenderedTabStop(effectiveStops: ParagraphTab[], tabIndex: number, tabCount: number): ParagraphTab;
330
+ /** 渲染段落节点,负责段落样式、列表标签、字段和书签锚点。 */
331
+ renderParagraph(elem: WmlParagraph): any;
332
+ /**
333
+ * 对整段比例一致的纯文本保留原生行内排版。混合比例、制表位、图形、
334
+ * 数学式与列表有独立的横向坐标,不能被整段变换误缩放;这些情况保持原渲染。
335
+ * 与页眉、语言或文本内容无关,同样适用于正文、表格单元格及页脚。
336
+ */
337
+ uniformParagraphTextScale(paragraph: WmlParagraph, style: IDomStyle): number | null;
338
+ hasParagraphRelativeAnchor(elem: OpenXmlElement): boolean;
339
+ renderAnchoredElement(model: OpenXmlElement, element: HTMLElement | SVGElement): HTMLElement | SVGElement;
340
+ refreshAnchors(root: HTMLElement): void;
341
+ ownsLayoutElement(element: Element): boolean;
342
+ prepareLayout(root: HTMLElement, generation?: LayoutGeneration): Promise<void>;
343
+ disposeLayout(): void;
344
+ renderHyperlink(elem: WmlHyperlink): HTMLAnchorElement;
345
+ private renderHyperlinkChildren;
346
+ applyHyperlinkTarget(result: HTMLAnchorElement, target: string, external: boolean): void;
347
+ wrapTabLeaderChildren(children: Node[], wrapLine?: boolean): Node[];
348
+ wrapLiteralLeaderChildren(children: Node[], wrapLine?: boolean): Node[] | null;
349
+ findLastTextualNodeIndex(children: Node[]): number;
350
+ literalLeaderKind(leader: string): "dot" | "middleDot";
351
+ cloneTextNodeWithText(node: Node, text: string): Node;
352
+ nodeElementName(node: Node): string;
353
+ nodeStyleObject(node: Node): Record<string, string>;
354
+ nodeTextContent(node: Node): string;
355
+ isTabLeaderNode(node: Node): boolean;
356
+ nodeDatasetValue(node: Node, name: string): string;
357
+ hasCssClass(node: Node, className: string): boolean;
358
+ addCssClass(node: Node, className: string): void;
359
+ nodeClassName(node: any): string;
360
+ renderSmartTag(elem: WmlSmartTag): HTMLSpanElement;
361
+ renderCommentRangeStart(commentStart: WmlCommentRangeStart): Node;
362
+ renderCommentRangeEnd(commentEnd: WmlCommentRangeStart): HTMLElement;
363
+ renderCommentReference(commentRef: WmlCommentReference): HTMLElement;
364
+ /** Mutable layout data belongs to this render, never to the reusable parsed parts. */
365
+ private cloneRenderData;
366
+ private renderCommentContent;
367
+ renderAltChunk(elem: WmlAltChunk): HTMLIFrameElement;
368
+ renderDrawing(elem: OpenXmlElement): any;
369
+ renderImage(elem: IDomImage): any;
370
+ renderShape(elem: IDomShape): any;
371
+ renderDmlTextBox(elem: IDomShape): SVGElement;
372
+ renderDmlSvgShape(elem: IDomShape): SVGSVGElement;
373
+ renderChart(elem: IDomChart): HTMLElement;
374
+ renderSmartArt(elem: IDomSmartArt): HTMLElement;
375
+ renderInk(elem: IDomInk): HTMLElement;
376
+ renderGraphicLoading(label: string): Node;
377
+ renderChartSvg(chartDoc: Document): SVGElement;
378
+ /** Chart lookup is namespace-aware and local to the requested XML level. */
379
+ chartChildren(node: Element | null, name?: string): Element[];
380
+ chartChild(node: Element | null, name: string): Element | null;
381
+ chartDescendant(node: Element | null, name: string): Element | null;
382
+ detectChartType(root: Element): string;
383
+ parseChartSeries(root: Element, chartType: string): ChartSeries[];
384
+ chartCacheValues(elem: Element | null): string[];
385
+ chartText(elem: Element | null): string;
386
+ chartNumber(node: Element | null, name: string): number | null;
387
+ chartBoolean(node: Element | null): boolean;
388
+ chartTitleText(title: Element | null): string;
389
+ extractChartTitle(root: Element): string;
390
+ resolveChartAxes(root: Element, type: string, selectedGroup?: Element): ChartAxes | null;
391
+ chartValueBounds(series: ChartSeries[]): {
392
+ min: number;
393
+ max: number;
394
+ };
395
+ drawCategoryLabels(svg: SVGElement, categories: string[], position: (index: number) => number, y: number): void;
396
+ drawBarChart(svg: SVGElement, series: ChartSeries[]): void;
397
+ drawLineChart(svg: SVGElement, series: ChartSeries[], fillArea?: boolean): void;
398
+ drawPieChart(svg: SVGElement, series: ChartSeries): void;
399
+ drawCombinedChartAxes(svg: SVGElement, root: Element, groups: Element[]): void;
400
+ /** Render linked axes, using serial dates as coordinates rather than category indexes. */
401
+ drawDateLineChart(svg: SVGElement, series: ChartSeries[], axes: ChartAxes, options?: ChartPlotOptions): void;
402
+ drawChartAxisTitles(svg: SVGElement, axes: ChartAxes | null): void;
403
+ syncChartAxisLegend(svg: SVGElement): void;
404
+ chartAxisNumberLabel(value: number, format?: string): string;
405
+ chartDateTicks(axis: Element | null, values: number[], min: number, max: number, date1904: boolean): number[];
406
+ formatChartDateLabel(raw: string, format: string, date1904?: boolean): string;
407
+ pieSlicePath(cx: number, cy: number, r: number, startAngle: number, endAngle: number): string;
408
+ polar(cx: number, cy: number, r: number, angleDeg: number): {
409
+ x: number;
410
+ y: number;
411
+ };
412
+ drawLegend(svg: SVGElement, text: string, colorIndex: number, x: number, y: number): void;
413
+ drawBottomLegend(svg: SVGElement, labels: string[], y: number): void;
414
+ chartLegendTextWidth(text: string): number;
415
+ chartColor(index: number): string;
416
+ renderSmartArtSvg(diagramDoc: Document): SVGElement;
417
+ layoutDiagramNodes(nodes: {
418
+ id: string;
419
+ text: string;
420
+ }[], connections: {
421
+ src: string;
422
+ dst: string;
423
+ }[]): {
424
+ id: string;
425
+ text: string;
426
+ }[][];
427
+ renderInkSvg(inkDoc: Document): SVGElement;
428
+ inkTraceToPoints(trace: string): number[][];
429
+ svgLine(x1: number, y1: number, x2: number, y2: number): SVGLineElement;
430
+ svgText(text: string, x: number, y: number, anchor?: "start" | "middle" | "end", fontSize?: string, weight?: string): SVGTextElement;
431
+ elementsByLocal(root: Element | Document, localName: string): Element[];
432
+ firstByLocal(root: Element | Document, localName: string): Element;
433
+ renderSimpleField(elem: WmlFieldSimple): Node | Node[];
434
+ renderFieldText(value: string, instruction: string): HTMLElement;
435
+ evaluateFieldNode(elem: WmlFieldSimple): string | Node | Node[] | null | undefined;
436
+ shouldPreserveStoredFieldResult(name: string, elem: WmlFieldSimple): boolean;
437
+ tokenizeFieldInstruction(instruction: string): string[];
438
+ fieldSwitch(tokens: string[], switchName: string): string;
439
+ hasFieldSwitch(tokens: string[], switchName: string): boolean;
440
+ firstFieldArgument(tokens: string[], startIndex?: number): string;
441
+ evaluateDateField(tokens: string[], fieldName: string): string;
442
+ formatFieldDate(date: Date, format: string): string;
443
+ evaluateDocPropertyField(tokens: string[]): string;
444
+ evaluateSetField(tokens: string[]): void;
445
+ evaluateDocVariableField(tokens: string[]): string;
446
+ renderHyperlinkField(tokens: string[], elem: WmlFieldSimple): HTMLElement;
447
+ evaluateIfField(tokens: string[]): string;
448
+ resolveFieldValue(value: string): string;
449
+ evaluateRefField(tokens: string[]): string;
450
+ evaluatePageRefField(tokens: string[]): string;
451
+ evaluateSeqField(tokens: string[]): string;
452
+ evaluateListNumField(tokens: string[]): string;
453
+ renderTocField(tokens: string[]): HTMLElement;
454
+ evaluateSymbolField(tokens: string[]): string;
455
+ evaluateFormula(expression: string): number;
456
+ applyFieldFormatting(value: string, instruction: string): string;
457
+ formatNumberPicture(value: number, picture: string): string;
458
+ fieldFormatSwitchToNumFormat(format: string): string;
459
+ formatFieldNumber(value: number, format?: string): string;
460
+ toRoman(value: number): string;
461
+ toLetters(value: number): string;
462
+ renderRuby(elem: OpenXmlElement): HTMLElement;
463
+ hasRenderedContent(nodes: Node[]): boolean;
464
+ renderText(elem: WmlText): Node;
465
+ applyCjkLineBreakGuards(text: string): string;
466
+ renderDeletedText(elem: WmlText): Node;
467
+ renderBreak(elem: WmlBreak): Node;
468
+ renderInserted(elem: OpenXmlElement): Node | Node[];
469
+ renderDeleted(elem: OpenXmlElement): Node;
470
+ renderRevisionContainer(elem: OpenXmlElement, tagName: "ins" | "del"): HTMLElement;
471
+ hasOwnRevisionContent(elem: OpenXmlElement): boolean;
472
+ renderSymbol(elem: WmlSymbol): HTMLElement;
473
+ renderFootnoteReference(elem: WmlNoteReference): HTMLElement;
474
+ renderEndnoteReference(elem: WmlNoteReference): HTMLElement;
475
+ renderNoteReference(elem: WmlNoteReference, kind: NoteKind): HTMLElement;
476
+ /** Only explicit eachPage numbering follows measured page changes. */
477
+ updateDynamicNoteNumbers(wrapper: HTMLElement): void;
478
+ renderTab(elem: OpenXmlElement): HTMLElement;
479
+ renderBookmarkStart(elem: WmlBookmarkStart): HTMLElement;
480
+ renderRun(elem: WmlRun): any;
481
+ /** 渲染表格,并把 Word 表格网格、边框、宽度和带状样式转换为 HTML table。 */
482
+ renderTable(elem: WmlTable): any;
483
+ renderTableColumns(columns: WmlTableColumn[]): Node;
484
+ /** 渲染表格行,同时维护行级样式和垂直合并上下文。 */
485
+ renderTableRow(elem: WmlTableRow): HTMLTableRowElement;
486
+ renderTableCellPlaceholder(colSpan: number): Node;
487
+ /** 渲染表格单元格,处理 colspan/rowspan、单元格宽度、内边距和嵌套内容。 */
488
+ renderTableCell(elem: WmlTableCell): any;
489
+ renderVmlPicture(elem: OpenXmlElement): HTMLDivElement | HTMLSpanElement;
490
+ vmlLengthInPoints(value: string): number | null;
491
+ vmlRenderContext(elem: VmlElement, bounds?: VmlBounds): VmlRenderContext;
492
+ vmlMappedValue(value: string, context: VmlRenderContext, axis: "x" | "y", size: boolean): number;
493
+ vmlBounds(elem: VmlElement, context: VmlRenderContext, inherited?: VmlBounds): VmlBounds;
494
+ vmlCombinedLength(first: string, second: string): string;
495
+ vmlRootStyle(elem: VmlElement): Record<string, string>;
496
+ applyVmlAttributes(result: SVGElement, attrs: Record<string, string>, excluded?: Set<string>): void;
497
+ loadVmlImage(elem: VmlElement, image: SVGImageElement): void;
498
+ renderVmlElement(elem: VmlElement): SVGElement;
499
+ renderVmlChildElement(elem: VmlElement, context: VmlRenderContext, inheritedBounds?: VmlBounds, isRoot?: boolean): SVGElement;
500
+ renderMmlMathParagraph(elem: OpenXmlElement): Node;
501
+ renderMmlPhantom(elem: OpenXmlElement): Node;
502
+ renderMmlAccent(elem: OpenXmlElement): MathMLElement;
503
+ renderMmlRadical(elem: OpenXmlElement): MathMLElement;
504
+ renderMmlDelimiter(elem: OpenXmlElement): MathMLElement;
505
+ renderMmlNary(elem: OpenXmlElement): MathMLElement;
506
+ renderMmlPreSubSuper(elem: OpenXmlElement): MathMLElement;
507
+ renderMmlGroupChar(elem: OpenXmlElement): any;
508
+ renderMmlBar(elem: OpenXmlElement): MathMLElement;
509
+ renderMmlRun(elem: OpenXmlElement): Node | Node[];
510
+ extractMathRunText(elem: OpenXmlElement): string | null;
511
+ renderMathTextTokens(text: string, style?: Record<string, any>): Node[];
512
+ createMathToken(tagName: "mi" | "mn" | "mo" | "mtext", text: string, style?: Record<string, any>): MathMLElement;
513
+ renderMllList(elem: OpenXmlElement): any;
514
+ toH(elem: OpenXmlElement, ns: ns, tagName: string, children?: Node[]): any;
515
+ /**
516
+ * 暗色模式下把一段已解析好的内联样式里的颜色属性换算成 Word 风格暗色颜色
517
+ * (CIE Lab 明度翻转,色相/彩度不变)。浅色模式或没有颜色属性时原样返回,
518
+ * 不产生额外开销。除了 --docx-*-color 主题/auto 变量(它们的打印还原在定义处
519
+ * 单独处理)之外,每个发生变化的值都会包一层 wrapForPrint(),以保证打印结果
520
+ * 不受屏幕暗色模式影响。
521
+ */
522
+ darkenStyle<T extends Record<string, any>>(style: T): T;
523
+ /** darkenStyle() 的单值版本,用于 SVG fill/stroke 等不经过 cssStyle 对象的颜色属性。 */
524
+ darkenColorAttr(color: string): string;
525
+ /**
526
+ * 把一个"浅色值 -> 暗色值"的换算结果包装成 `var(--docx-dm-N, 暗色值)`:
527
+ * 屏幕正常显示时该变量未定义,直接使用暗色值;同一个浅色值始终复用同一个变量名。
528
+ * 具体的打印还原声明由 renderDarkModePrintReset() 统一生成。
529
+ */
530
+ wrapForPrint(lightValue: string, darkValue: string): string;
531
+ /**
532
+ * 暗色模式专用:把所有被 wrapForPrint() 生成的 --docx-dm-N 变量在 @media print
533
+ * 下统一重新定义为浅色原值。因为这些变量只在这里被定义过,屏幕上它们始终未定义、
534
+ * var() 退回暗色值;一旦打印,这里的定义会让文档在纸面上完全还原 Word 原始配色,
535
+ * 且无需对每一个元素单独处理。
536
+ */
537
+ renderDarkModePrintReset(): Node[];
538
+ toHTML(elem: OpenXmlElement, ns: ns, tagName: string, children?: Node[]): any;
539
+ applyElementRevisionMetadata(result: HTMLElement, elem: OpenXmlElement): void;
540
+ findStyle(styleName: string): IDomStyle;
541
+ isTocParagraphStyle(styleName: string, style?: IDomStyle): boolean;
542
+ numberingClass(id: string, lvl: number): string;
543
+ numberingSelector(id: string, lvl: number): string;
544
+ tabStopClass(): string;
545
+ scopeDocumentStyleSelector(selector: string): string;
546
+ styleToString(selectors: string, values: Record<string, string>, cssText?: string): string;
547
+ numberingCounter(id: string, lvl: number): string;
548
+ numberingRestartLevel(num: IDomNumbering): number | null;
549
+ numberingMarkerRunStyle(style: Record<string, string>, normalized: boolean): Record<string, string>;
550
+ normalizeNumberingLevelText(text: string, format: string, runStyle?: Record<string, string>): {
551
+ text: string;
552
+ normalized: boolean;
553
+ };
554
+ symbolBulletMap(): Record<number, string>;
555
+ wingdingsBulletMap(): Record<number, string>;
556
+ levelTextToContent(text: string, suff: string, id: string, numformat: string, levelFormats?: Map<string, string>): string;
557
+ numberingSuffixToCssContent(suff: string): "" | "\"\\000020\"" | "\"\\000009\"";
558
+ escapeCssString(value: string): string;
559
+ numFormatToCssValue(format: string): any;
560
+ refreshTabStops(root?: HTMLElement): void;
561
+ createElementNS(ns: any, tagName: string, props?: Partial<Record<any, any>>, children?: any[]): any;
562
+ createElement<T extends keyof HTMLElementTagNameMap>(tagName: T, props?: Partial<Record<keyof HTMLElementTagNameMap[T], any>>, children?: any[]): HTMLElementTagNameMap[T];
563
+ createMathMLElement<T extends keyof MathMLElementTagNameMap>(tagName: T, props?: Partial<Record<keyof MathMLElementTagNameMap[T], any>>, children?: any[]): MathMLElementTagNameMap[T];
564
+ createSvgElement<T extends keyof SVGElementTagNameMap>(tagName: T, props?: Partial<Record<keyof SVGElementTagNameMap[T], any>>, children?: any[]): SVGElementTagNameMap[T];
565
+ later(func: Function): void;
566
+ }
567
+ export {};
package/dist/html.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ export declare enum ns {
2
+ html = "http://www.w3.org/1999/xhtml",
3
+ svg = "http://www.w3.org/2000/svg",
4
+ mathML = "http://www.w3.org/1998/Math/MathML"
5
+ }
6
+ export type HElement = {
7
+ ns?: ns;
8
+ tagName: "#fragment" | "#comment" | string;
9
+ className?: string;
10
+ style?: string | Record<string, string>;
11
+ children?: (HElement | Node | string)[];
12
+ } & Record<string, any>;
13
+ /** 小型 DOM 工厂,渲染器用它统一创建 HTML/SVG/MathML 节点。 */
14
+ export declare function h(elem: HElement | Node | string): Node;
15
+ /** 合并 className,过滤掉 false/undefined,减少渲染代码里的条件拼接。 */
16
+ export declare function cx(...classNames: (string | false | undefined)[]): string;
@@ -0,0 +1,2 @@
1
+ export declare const EMPTY_DOCX_ERROR_MESSAGE = "\u6587\u4EF6\u4E3A\u7A7A\u6216\u5C1A\u672A\u4FDD\u5B58\uFF0C\u65E0\u6CD5\u4F5C\u4E3A Word \u6587\u6863\u6253\u5F00\u3002\u8BF7\u5728 WPS/Word \u4E2D\u4FDD\u5B58\u540E\u91CD\u65B0\u4E0A\u4F20\u3002";
2
+ export declare function assertNonEmptyDocxInput(input: any): void;
@@ -0,0 +1,8 @@
1
+ import { Length } from "./document/common";
2
+ import { ParagraphTab } from "./document/paragraph";
3
+ export declare function computePixelToPoint(container?: HTMLElement): number;
4
+ export declare function updateTabStop(elem: HTMLElement, tabs: ParagraphTab[], defaultTabSize: Length, pixelToPoint?: number): void;
5
+ /** Strict physical lengths, in points; unsupported relative units stay unresolved. */
6
+ export declare function physicalLengthToPoint(value: string): number | null;
7
+ /** Layout an explicit, non-leader tab using only its following text segment. */
8
+ export declare function updateExplicitTabStop(elem: HTMLElement, tabs: ParagraphTab[]): boolean;