office-viewer 0.3.16 → 0.3.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm/Word.d.ts CHANGED
@@ -168,6 +168,14 @@ export default class Word implements OfficeViewer {
168
168
  * 当前渲染的段落,主要用于获取 fldSimple
169
169
  */
170
170
  currentParagraph: Paragraph;
171
+ /**
172
+ * 文档中所有标题段落(用于动态生成目录),在 renderBody 预扫描时填充
173
+ */
174
+ tocHeadings: Array<{
175
+ level: number;
176
+ text: string;
177
+ id: string;
178
+ }>;
171
179
  footNotes: Record<string, Note>;
172
180
  endNotes: Record<string, Note>;
173
181
  /**
package/esm/Word.js CHANGED
@@ -75,6 +75,10 @@ var Word = /** @class */ (function () {
75
75
  */
76
76
  this.styleIdNum = 0;
77
77
  this.wrapClassName = 'docx-viewer-wrapper';
78
+ /**
79
+ * 文档中所有标题段落(用于动态生成目录),在 renderBody 预扫描时填充
80
+ */
81
+ this.tocHeadings = [];
78
82
  this.footNotes = {};
79
83
  this.endNotes = {};
80
84
  /**
@@ -28,6 +28,8 @@ export declare class Paragraph {
28
28
  properties: ParagraphPr;
29
29
  children: ParagraphChild[];
30
30
  fldSimples: FldSimple[];
31
+ isTOC: boolean;
32
+ tocHeadingId?: string;
31
33
  addChild(child: ParagraphChild): void;
32
34
  static parseParagraphPr(word: Word, element: Element): ParagraphPr;
33
35
  static fromXML(word: Word, element: Element): Paragraph;
@@ -7,6 +7,7 @@ import { NumberPr } from './numbering/NumberProperties.js';
7
7
  import { Run } from './Run.js';
8
8
  import { Tab } from './Tab.js';
9
9
  import { FldSimple } from './FldSimple.js';
10
+ import { InstrText } from './InstrText.js';
10
11
  import { OMath } from '../math/OMath.js';
11
12
  import { mergeSdt } from '../../word/parse/mergeSdt.js';
12
13
 
@@ -38,6 +39,8 @@ var Paragraph = /** @class */ (function () {
38
39
  this.properties = {};
39
40
  this.children = [];
40
41
  this.fldSimples = [];
42
+ // 是否是 TOC 字段段落(包含 TOC 指令)
43
+ this.isTOC = false;
41
44
  }
42
45
  Paragraph.prototype.addChild = function (child) {
43
46
  this.children.push(child);
@@ -74,20 +77,40 @@ var Paragraph = /** @class */ (function () {
74
77
  return { cssStyle: cssStyle, pStyle: pStyle, numPr: numPr, tabs: tabs, autoSpace: autoSpace };
75
78
  };
76
79
  Paragraph.fromXML = function (word, element) {
77
- var e_2, _a;
80
+ var e_2, _a, e_3, _b;
78
81
  var paragraph = new Paragraph();
79
82
  paragraph.fldSimples = [];
80
83
  paragraph.paraId = element.getAttribute('w14:paraId') || '';
81
84
  try {
82
- for (var _b = __values(mergeSdt(element)), _c = _b.next(); !_c.done; _c = _b.next()) {
83
- var child = _c.value;
85
+ for (var _c = __values(mergeSdt(element)), _d = _c.next(); !_d.done; _d = _c.next()) {
86
+ var child = _d.value;
84
87
  var tagName = child.tagName;
85
88
  switch (tagName) {
86
89
  case 'w:pPr':
87
90
  paragraph.properties = Paragraph.parseParagraphPr(word, child);
88
91
  break;
89
92
  case 'w:r':
90
- paragraph.addChild(Run.fromXML(word, child));
93
+ var run = Run.fromXML(word, child);
94
+ paragraph.addChild(run);
95
+ // 检测 TOC 字段指令
96
+ if (!paragraph.isTOC) {
97
+ try {
98
+ for (var _e = (e_3 = void 0, __values(run.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
99
+ var rc = _f.value;
100
+ if (rc instanceof InstrText && rc.text.trim().startsWith('TOC')) {
101
+ paragraph.isTOC = true;
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
107
+ finally {
108
+ try {
109
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
110
+ }
111
+ finally { if (e_3) throw e_3.error; }
112
+ }
113
+ }
91
114
  break;
92
115
  case 'w:hyperlink':
93
116
  paragraph.addChild(Hyperlink.fromXML(word, child));
@@ -122,7 +145,7 @@ var Paragraph = /** @class */ (function () {
122
145
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
123
146
  finally {
124
147
  try {
125
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
148
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
126
149
  }
127
150
  finally { if (e_2) throw e_2.error; }
128
151
  }
@@ -5,6 +5,8 @@ import { Table } from '../../openxml/word/Table.js';
5
5
  import renderParagraph from './renderParagraph.js';
6
6
  import { renderSection } from './renderSection.js';
7
7
  import renderTable from './renderTable.js';
8
+ import { Run, Text } from '../../openxml/word/Run.js';
9
+ import { Hyperlink } from '../../openxml/word/Hyperlink.js';
8
10
 
9
11
  /**
10
12
  * 渲染 body 节点
@@ -125,11 +127,143 @@ function renderSectionInPage(word, wDocument, bodyEl, renderOptions, sectionEl,
125
127
  }
126
128
  }, 0);
127
129
  }
130
+ /**
131
+ * 获取段落纯文本(用于目录标题显示)
132
+ */
133
+ function getParagraphText(paragraph) {
134
+ var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
135
+ var text = '';
136
+ try {
137
+ for (var _e = __values(paragraph.children), _f = _e.next(); !_f.done; _f = _e.next()) {
138
+ var child = _f.value;
139
+ if (child instanceof Run) {
140
+ try {
141
+ for (var _g = (e_3 = void 0, __values(child.children)), _h = _g.next(); !_h.done; _h = _g.next()) {
142
+ var rc = _h.value;
143
+ if (rc instanceof Text) {
144
+ text += rc.text;
145
+ }
146
+ }
147
+ }
148
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
149
+ finally {
150
+ try {
151
+ if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
152
+ }
153
+ finally { if (e_3) throw e_3.error; }
154
+ }
155
+ }
156
+ else if (child instanceof Hyperlink) {
157
+ try {
158
+ for (var _j = (e_4 = void 0, __values(child.children)), _k = _j.next(); !_k.done; _k = _j.next()) {
159
+ var run = _k.value;
160
+ try {
161
+ for (var _l = (e_5 = void 0, __values(run.children)), _m = _l.next(); !_m.done; _m = _l.next()) {
162
+ var rc = _m.value;
163
+ if (rc instanceof Text) {
164
+ text += rc.text;
165
+ }
166
+ }
167
+ }
168
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
169
+ finally {
170
+ try {
171
+ if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
172
+ }
173
+ finally { if (e_5) throw e_5.error; }
174
+ }
175
+ }
176
+ }
177
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
178
+ finally {
179
+ try {
180
+ if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
181
+ }
182
+ finally { if (e_4) throw e_4.error; }
183
+ }
184
+ }
185
+ }
186
+ }
187
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
188
+ finally {
189
+ try {
190
+ if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
191
+ }
192
+ finally { if (e_2) throw e_2.error; }
193
+ }
194
+ return text;
195
+ }
196
+ /**
197
+ * 判断段落是否是标题,返回标题级别(1-9),非标题返回 0
198
+ */
199
+ function getHeadingLevel(word, paragraph) {
200
+ var _a, _b;
201
+ var pStyle = paragraph.properties.pStyle;
202
+ if (!pStyle)
203
+ return 0;
204
+ // 匹配 Heading1~Heading9 或 1~9(中文 Word 直接用数字 styleId)
205
+ var m = pStyle.match(/^[Hh]eading(\d)$/) ||
206
+ (pStyle.match(/^(\d)$/) &&
207
+ ((_b = (_a = word.getStyle(pStyle)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.match(/^heading\s*(\d)$/i)));
208
+ if (m)
209
+ return parseInt(m[1], 10);
210
+ // 通过样式 name 来识别
211
+ var style = word.getStyle(pStyle);
212
+ if (style === null || style === void 0 ? void 0 : style.name) {
213
+ var nm = style.name.match(/^heading\s*(\d)$/i);
214
+ if (nm)
215
+ return parseInt(nm[1], 10);
216
+ }
217
+ return 0;
218
+ }
219
+ var _tocHeadingCounter = 0;
220
+ /**
221
+ * 预扫描文档,收集标题并为 TOC 段落标记
222
+ */
223
+ function prescanHeadings(word, body) {
224
+ var e_6, _a, e_7, _b;
225
+ _tocHeadingCounter = 0;
226
+ word.tocHeadings = [];
227
+ try {
228
+ for (var _c = __values(body.sections), _d = _c.next(); !_d.done; _d = _c.next()) {
229
+ var section = _d.value;
230
+ try {
231
+ for (var _e = (e_7 = void 0, __values(section.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
232
+ var child = _f.value;
233
+ if (!(child instanceof Paragraph))
234
+ continue;
235
+ var level = getHeadingLevel(word, child);
236
+ if (level > 0) {
237
+ var id = "toc-h-".concat(_tocHeadingCounter++);
238
+ child.tocHeadingId = id;
239
+ word.tocHeadings.push({ level: level, text: getParagraphText(child), id: id });
240
+ }
241
+ }
242
+ }
243
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
244
+ finally {
245
+ try {
246
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
247
+ }
248
+ finally { if (e_7) throw e_7.error; }
249
+ }
250
+ }
251
+ }
252
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
253
+ finally {
254
+ try {
255
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
256
+ }
257
+ finally { if (e_6) throw e_6.error; }
258
+ }
259
+ }
128
260
  /**
129
261
  * 渲染文档主体
130
262
  */
131
263
  function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
132
- var e_2, _a, e_3, _b;
264
+ var e_8, _a, e_9, _b;
265
+ // 预扫描标题,为动态目录生成准备数据
266
+ prescanHeadings(word, body);
133
267
  var page = renderOptions.page || false;
134
268
  var rootWidth = root.getBoundingClientRect().width -
135
269
  (renderOptions.pageWrapPadding || 0) * 2;
@@ -155,7 +289,7 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
155
289
  }
156
290
  else {
157
291
  try {
158
- for (var _c = (e_3 = void 0, __values(section.children)), _d = _c.next(); !_d.done; _d = _c.next()) {
292
+ for (var _c = (e_9 = void 0, __values(section.children)), _d = _c.next(); !_d.done; _d = _c.next()) {
159
293
  var child = _d.value;
160
294
  if (child instanceof Paragraph) {
161
295
  var p = renderParagraph(word, child);
@@ -170,22 +304,22 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
170
304
  }
171
305
  }
172
306
  }
173
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
307
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
174
308
  finally {
175
309
  try {
176
310
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
177
311
  }
178
- finally { if (e_3) throw e_3.error; }
312
+ finally { if (e_9) throw e_9.error; }
179
313
  }
180
314
  }
181
315
  }
182
316
  }
183
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
317
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
184
318
  finally {
185
319
  try {
186
320
  if (sections_1_1 && !sections_1_1.done && (_a = sections_1.return)) _a.call(sections_1);
187
321
  }
188
- finally { if (e_2) throw e_2.error; }
322
+ finally { if (e_8) throw e_8.error; }
189
323
  }
190
324
  setTimeout(function () {
191
325
  if (renderOptions.zoom) {
@@ -12,6 +12,10 @@ function renderInstrText(word, instrText) {
12
12
  var _b;
13
13
  var text = instrText.text;
14
14
  var span = createElement('span');
15
+ // TOC 字段指令不渲染原始指令文本,目录条目已作为普通段落存在于文档中
16
+ if (text.trim().startsWith('TOC')) {
17
+ return span;
18
+ }
15
19
  var fldSimples = (_b = word.currentParagraph) === null || _b === void 0 ? void 0 : _b.fldSimples;
16
20
  if (fldSimples) {
17
21
  try {
@@ -11,6 +11,7 @@ import { setElementStyle } from './setElementStyle.js';
11
11
  import { renderTab } from './renderTab.js';
12
12
  import { OMath } from '../../openxml/math/OMath.js';
13
13
  import { renderOMath } from './renderMath.js';
14
+ import { renderTOC } from './renderTOC.js';
14
15
 
15
16
  /**
16
17
  * 渲染段落
@@ -21,17 +22,27 @@ function renderParagraph(word, paragraph, renderEmptySpace, inHeader) {
21
22
  if (renderEmptySpace === void 0) { renderEmptySpace = true; }
22
23
  if (inHeader === void 0) { inHeader = false; }
23
24
  word.currentParagraph = paragraph;
25
+ // 如果是 TOC 字段段落且文档中有标题,动态生成目录
26
+ if (paragraph.isTOC && word.tocHeadings.length > 0) {
27
+ return renderTOC(word);
28
+ }
24
29
  var p = createElement('p');
25
30
  word.addClass(p, 'p');
26
31
  var properties = paragraph.properties;
27
32
  setElementStyle(word, p, properties);
28
33
  // 默认情况下 drawing 是相对段落的
29
34
  p.style.position = 'relative';
35
+ // 如果是标题段落,为目录锚点添加 id
36
+ if (paragraph.tocHeadingId) {
37
+ p.id = paragraph.tocHeadingId;
38
+ }
30
39
  // 渲染列表前缀
31
40
  if (properties.numPr) {
32
41
  appendChild(p, renderNumbering(p, word, properties.numPr));
33
42
  }
34
- var inFldChar = false;
43
+ // 复杂字段状态: 'outside' | 'instr' | 'content'
44
+ // begin -> instr, separate -> content, end -> outside
45
+ var fldCharState = 'outside';
35
46
  if (properties.tabs && properties.tabs.length) {
36
47
  // 目前只支持渲染第一个,因为第二个位置取决于前面内容位置,挺麻烦
37
48
  // 虽然目前这个实现很 hack,但可以支持常见情况
@@ -58,12 +69,19 @@ function renderParagraph(word, paragraph, renderEmptySpace, inHeader) {
58
69
  var child = _c.value;
59
70
  if (child instanceof Run) {
60
71
  if (child.fldChar === 'begin') {
61
- inFldChar = true;
72
+ fldCharState = 'instr';
73
+ }
74
+ else if (child.fldChar === 'separate') {
75
+ fldCharState = 'content';
76
+ }
77
+ else if (child.fldChar === 'end') {
78
+ fldCharState = 'outside';
62
79
  }
63
- else if (child) {
64
- inFldChar = false;
80
+ // 跳过 instrText 所在的 run(字段指令本身不渲染),fldChar 节点本身正常渲染
81
+ if (fldCharState === 'instr' && !child.fldChar) {
82
+ continue;
65
83
  }
66
- appendChild(p, renderRun(word, child, paragraph, inFldChar, inHeader));
84
+ appendChild(p, renderRun(word, child, paragraph, false, inHeader));
67
85
  }
68
86
  else if (child instanceof BookmarkStart) {
69
87
  appendChild(p, renderBookmarkStart(word, child));
@@ -0,0 +1,5 @@
1
+ import Word from '../../Word';
2
+ /**
3
+ * 动态生成目录 HTML(当文档 TOC 字段没有缓存条目时使用)
4
+ */
5
+ export declare function renderTOC(word: Word): HTMLElement;
@@ -0,0 +1,34 @@
1
+ import { __values } from 'tslib';
2
+ import { createElement, appendChild } from '../../util/dom.js';
3
+
4
+ /**
5
+ * 动态生成目录 HTML(当文档 TOC 字段没有缓存条目时使用)
6
+ */
7
+ function renderTOC(word) {
8
+ var e_1, _a;
9
+ var nav = createElement('nav');
10
+ nav.className = 'docx-toc';
11
+ try {
12
+ for (var _b = __values(word.tocHeadings), _c = _b.next(); !_c.done; _c = _b.next()) {
13
+ var heading = _c.value;
14
+ var item = createElement('div');
15
+ item.className = "docx-toc-item docx-toc-level-".concat(heading.level);
16
+ item.style.paddingLeft = "".concat((heading.level - 1) * 2, "em");
17
+ var a = createElement('a');
18
+ a.href = '#' + heading.id;
19
+ a.textContent = heading.text;
20
+ appendChild(item, a);
21
+ appendChild(nav, item);
22
+ }
23
+ }
24
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
25
+ finally {
26
+ try {
27
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
28
+ }
29
+ finally { if (e_1) throw e_1.error; }
30
+ }
31
+ return nav;
32
+ }
33
+
34
+ export { renderTOC };
package/lib/Word.d.ts CHANGED
@@ -168,6 +168,14 @@ export default class Word implements OfficeViewer {
168
168
  * 当前渲染的段落,主要用于获取 fldSimple
169
169
  */
170
170
  currentParagraph: Paragraph;
171
+ /**
172
+ * 文档中所有标题段落(用于动态生成目录),在 renderBody 预扫描时填充
173
+ */
174
+ tocHeadings: Array<{
175
+ level: number;
176
+ text: string;
177
+ id: string;
178
+ }>;
171
179
  footNotes: Record<string, Note>;
172
180
  endNotes: Record<string, Note>;
173
181
  /**
package/lib/Word.js CHANGED
@@ -79,6 +79,10 @@ var Word = /** @class */ (function () {
79
79
  */
80
80
  this.styleIdNum = 0;
81
81
  this.wrapClassName = 'docx-viewer-wrapper';
82
+ /**
83
+ * 文档中所有标题段落(用于动态生成目录),在 renderBody 预扫描时填充
84
+ */
85
+ this.tocHeadings = [];
82
86
  this.footNotes = {};
83
87
  this.endNotes = {};
84
88
  /**
@@ -23,7 +23,7 @@ declare const languages: {
23
23
  count: string;
24
24
  sum: string;
25
25
  };
26
- zh_CN: Record<"autoFilter.sortAscending" | "autoFilter.sortDescending" | "checkBox.selectAll" | "checkBox.search" | "customFilter.equal" | "customFilter.notEqual" | "customFilter.greaterThan" | "customFilter.greaterThanOrEqual" | "customFilter.lessThan" | "customFilter.lessThanOrEqual" | "customFilter.beginsWith" | "customFilter.notBeginsWith" | "customFilter.endsWith" | "customFilter.notEndsWith" | "customFilter.contains" | "customFilter.notContains" | "customFilter.and" | "customFilter.or" | "average" | "count" | "sum", string>;
26
+ zh_CN: Record<"average" | "autoFilter.sortAscending" | "autoFilter.sortDescending" | "checkBox.selectAll" | "checkBox.search" | "customFilter.equal" | "customFilter.notEqual" | "customFilter.greaterThan" | "customFilter.greaterThanOrEqual" | "customFilter.lessThan" | "customFilter.lessThanOrEqual" | "customFilter.beginsWith" | "customFilter.notBeginsWith" | "customFilter.endsWith" | "customFilter.notEndsWith" | "customFilter.contains" | "customFilter.notContains" | "customFilter.and" | "customFilter.or" | "count" | "sum", string>;
27
27
  };
28
28
  export type Language = keyof typeof languages;
29
29
  export declare function getTranslate(language: string): (key: EnKeys) => string;
@@ -10,7 +10,7 @@ import { HitTestResult } from '../selection/hitTest';
10
10
  export declare function mousedownColHeader(workbook: Workbook, hitTestResult: HitTestResult): {
11
11
  user: string;
12
12
  region: import("../../sheet/ViewRange").Region;
13
- selectType: "drawing" | "corner" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
13
+ selectType: "corner" | "drawing" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
14
14
  activeCell: RangeRef;
15
15
  sheetIndex: number;
16
16
  cellRanges: {
@@ -10,7 +10,7 @@ import { HitTestResult } from '../selection/hitTest';
10
10
  export declare function mousedownRowHeader(workbook: Workbook, hitTestResult: HitTestResult): {
11
11
  user: string;
12
12
  region: import("../../sheet/ViewRange").Region;
13
- selectType: "drawing" | "corner" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
13
+ selectType: "corner" | "drawing" | "cell" | "row-header" | "col-header" | "row-grid" | "col-grid";
14
14
  activeCell: RangeRef;
15
15
  sheetIndex: number;
16
16
  cellRanges: {
@@ -28,6 +28,8 @@ export declare class Paragraph {
28
28
  properties: ParagraphPr;
29
29
  children: ParagraphChild[];
30
30
  fldSimples: FldSimple[];
31
+ isTOC: boolean;
32
+ tocHeadingId?: string;
31
33
  addChild(child: ParagraphChild): void;
32
34
  static parseParagraphPr(word: Word, element: Element): ParagraphPr;
33
35
  static fromXML(word: Word, element: Element): Paragraph;
@@ -11,6 +11,7 @@ var NumberProperties = require('./numbering/NumberProperties.js');
11
11
  var Run = require('./Run.js');
12
12
  var Tab = require('./Tab.js');
13
13
  var FldSimple = require('./FldSimple.js');
14
+ var InstrText = require('./InstrText.js');
14
15
  var OMath = require('../math/OMath.js');
15
16
  var mergeSdt = require('../../word/parse/mergeSdt.js');
16
17
 
@@ -42,6 +43,8 @@ var Paragraph = /** @class */ (function () {
42
43
  this.properties = {};
43
44
  this.children = [];
44
45
  this.fldSimples = [];
46
+ // 是否是 TOC 字段段落(包含 TOC 指令)
47
+ this.isTOC = false;
45
48
  }
46
49
  Paragraph.prototype.addChild = function (child) {
47
50
  this.children.push(child);
@@ -78,20 +81,40 @@ var Paragraph = /** @class */ (function () {
78
81
  return { cssStyle: cssStyle, pStyle: pStyle, numPr: numPr, tabs: tabs, autoSpace: autoSpace };
79
82
  };
80
83
  Paragraph.fromXML = function (word, element) {
81
- var e_2, _a;
84
+ var e_2, _a, e_3, _b;
82
85
  var paragraph = new Paragraph();
83
86
  paragraph.fldSimples = [];
84
87
  paragraph.paraId = element.getAttribute('w14:paraId') || '';
85
88
  try {
86
- for (var _b = tslib.__values(mergeSdt.mergeSdt(element)), _c = _b.next(); !_c.done; _c = _b.next()) {
87
- var child = _c.value;
89
+ for (var _c = tslib.__values(mergeSdt.mergeSdt(element)), _d = _c.next(); !_d.done; _d = _c.next()) {
90
+ var child = _d.value;
88
91
  var tagName = child.tagName;
89
92
  switch (tagName) {
90
93
  case 'w:pPr':
91
94
  paragraph.properties = Paragraph.parseParagraphPr(word, child);
92
95
  break;
93
96
  case 'w:r':
94
- paragraph.addChild(Run.Run.fromXML(word, child));
97
+ var run = Run.Run.fromXML(word, child);
98
+ paragraph.addChild(run);
99
+ // 检测 TOC 字段指令
100
+ if (!paragraph.isTOC) {
101
+ try {
102
+ for (var _e = (e_3 = void 0, tslib.__values(run.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
103
+ var rc = _f.value;
104
+ if (rc instanceof InstrText.InstrText && rc.text.trim().startsWith('TOC')) {
105
+ paragraph.isTOC = true;
106
+ break;
107
+ }
108
+ }
109
+ }
110
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
111
+ finally {
112
+ try {
113
+ if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
114
+ }
115
+ finally { if (e_3) throw e_3.error; }
116
+ }
117
+ }
95
118
  break;
96
119
  case 'w:hyperlink':
97
120
  paragraph.addChild(Hyperlink.Hyperlink.fromXML(word, child));
@@ -126,7 +149,7 @@ var Paragraph = /** @class */ (function () {
126
149
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
127
150
  finally {
128
151
  try {
129
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
152
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
130
153
  }
131
154
  finally { if (e_2) throw e_2.error; }
132
155
  }
@@ -2,4 +2,4 @@
2
2
  *
3
3
  * http://webapp.docx4java.org/OnlineDemo/ecma376/WordML/ST_Jc.html
4
4
  */
5
- export declare function jcToTextAlign(jc: string): "center" | "justify" | "left" | "right";
5
+ export declare function jcToTextAlign(jc: string): "center" | "left" | "right" | "justify";