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/dist/tsconfig.tsbuildinfo +1 -0
- package/esm/Word.d.ts +8 -0
- package/esm/Word.js +4 -0
- package/esm/openxml/word/Paragraph.d.ts +2 -0
- package/esm/openxml/word/Paragraph.js +28 -5
- package/esm/word/render/renderBody.js +140 -6
- package/esm/word/render/renderInstrText.js +4 -0
- package/esm/word/render/renderParagraph.js +23 -5
- package/esm/word/render/renderTOC.d.ts +5 -0
- package/esm/word/render/renderTOC.js +34 -0
- package/lib/Word.d.ts +8 -0
- package/lib/Word.js +4 -0
- package/lib/excel/lang/lang.d.ts +1 -1
- package/lib/excel/render/dnd/mousedownColHeader.d.ts +1 -1
- package/lib/excel/render/dnd/mousedownRowHeader.d.ts +1 -1
- package/lib/openxml/word/Paragraph.d.ts +2 -0
- package/lib/openxml/word/Paragraph.js +28 -5
- package/lib/word/parse/jcToTextAlign.d.ts +1 -1
- package/lib/word/render/renderBody.js +140 -6
- package/lib/word/render/renderInstrText.js +4 -0
- package/lib/word/render/renderParagraph.js +23 -5
- package/lib/word/render/renderTOC.d.ts +5 -0
- package/lib/word/render/renderTOC.js +38 -0
- package/package.json +1 -1
|
@@ -9,6 +9,8 @@ var Table = require('../../openxml/word/Table.js');
|
|
|
9
9
|
var renderParagraph = require('./renderParagraph.js');
|
|
10
10
|
var renderSection = require('./renderSection.js');
|
|
11
11
|
var renderTable = require('./renderTable.js');
|
|
12
|
+
var Run = require('../../openxml/word/Run.js');
|
|
13
|
+
var Hyperlink = require('../../openxml/word/Hyperlink.js');
|
|
12
14
|
|
|
13
15
|
/**
|
|
14
16
|
* 渲染 body 节点
|
|
@@ -129,11 +131,143 @@ function renderSectionInPage(word, wDocument, bodyEl, renderOptions, sectionEl,
|
|
|
129
131
|
}
|
|
130
132
|
}, 0);
|
|
131
133
|
}
|
|
134
|
+
/**
|
|
135
|
+
* 获取段落纯文本(用于目录标题显示)
|
|
136
|
+
*/
|
|
137
|
+
function getParagraphText(paragraph) {
|
|
138
|
+
var e_2, _a, e_3, _b, e_4, _c, e_5, _d;
|
|
139
|
+
var text = '';
|
|
140
|
+
try {
|
|
141
|
+
for (var _e = tslib.__values(paragraph.children), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
142
|
+
var child = _f.value;
|
|
143
|
+
if (child instanceof Run.Run) {
|
|
144
|
+
try {
|
|
145
|
+
for (var _g = (e_3 = void 0, tslib.__values(child.children)), _h = _g.next(); !_h.done; _h = _g.next()) {
|
|
146
|
+
var rc = _h.value;
|
|
147
|
+
if (rc instanceof Run.Text) {
|
|
148
|
+
text += rc.text;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
153
|
+
finally {
|
|
154
|
+
try {
|
|
155
|
+
if (_h && !_h.done && (_b = _g.return)) _b.call(_g);
|
|
156
|
+
}
|
|
157
|
+
finally { if (e_3) throw e_3.error; }
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else if (child instanceof Hyperlink.Hyperlink) {
|
|
161
|
+
try {
|
|
162
|
+
for (var _j = (e_4 = void 0, tslib.__values(child.children)), _k = _j.next(); !_k.done; _k = _j.next()) {
|
|
163
|
+
var run = _k.value;
|
|
164
|
+
try {
|
|
165
|
+
for (var _l = (e_5 = void 0, tslib.__values(run.children)), _m = _l.next(); !_m.done; _m = _l.next()) {
|
|
166
|
+
var rc = _m.value;
|
|
167
|
+
if (rc instanceof Run.Text) {
|
|
168
|
+
text += rc.text;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
173
|
+
finally {
|
|
174
|
+
try {
|
|
175
|
+
if (_m && !_m.done && (_d = _l.return)) _d.call(_l);
|
|
176
|
+
}
|
|
177
|
+
finally { if (e_5) throw e_5.error; }
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
182
|
+
finally {
|
|
183
|
+
try {
|
|
184
|
+
if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
|
|
185
|
+
}
|
|
186
|
+
finally { if (e_4) throw e_4.error; }
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
192
|
+
finally {
|
|
193
|
+
try {
|
|
194
|
+
if (_f && !_f.done && (_a = _e.return)) _a.call(_e);
|
|
195
|
+
}
|
|
196
|
+
finally { if (e_2) throw e_2.error; }
|
|
197
|
+
}
|
|
198
|
+
return text;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* 判断段落是否是标题,返回标题级别(1-9),非标题返回 0
|
|
202
|
+
*/
|
|
203
|
+
function getHeadingLevel(word, paragraph) {
|
|
204
|
+
var _a, _b;
|
|
205
|
+
var pStyle = paragraph.properties.pStyle;
|
|
206
|
+
if (!pStyle)
|
|
207
|
+
return 0;
|
|
208
|
+
// 匹配 Heading1~Heading9 或 1~9(中文 Word 直接用数字 styleId)
|
|
209
|
+
var m = pStyle.match(/^[Hh]eading(\d)$/) ||
|
|
210
|
+
(pStyle.match(/^(\d)$/) &&
|
|
211
|
+
((_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)));
|
|
212
|
+
if (m)
|
|
213
|
+
return parseInt(m[1], 10);
|
|
214
|
+
// 通过样式 name 来识别
|
|
215
|
+
var style = word.getStyle(pStyle);
|
|
216
|
+
if (style === null || style === void 0 ? void 0 : style.name) {
|
|
217
|
+
var nm = style.name.match(/^heading\s*(\d)$/i);
|
|
218
|
+
if (nm)
|
|
219
|
+
return parseInt(nm[1], 10);
|
|
220
|
+
}
|
|
221
|
+
return 0;
|
|
222
|
+
}
|
|
223
|
+
var _tocHeadingCounter = 0;
|
|
224
|
+
/**
|
|
225
|
+
* 预扫描文档,收集标题并为 TOC 段落标记
|
|
226
|
+
*/
|
|
227
|
+
function prescanHeadings(word, body) {
|
|
228
|
+
var e_6, _a, e_7, _b;
|
|
229
|
+
_tocHeadingCounter = 0;
|
|
230
|
+
word.tocHeadings = [];
|
|
231
|
+
try {
|
|
232
|
+
for (var _c = tslib.__values(body.sections), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
233
|
+
var section = _d.value;
|
|
234
|
+
try {
|
|
235
|
+
for (var _e = (e_7 = void 0, tslib.__values(section.children)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
236
|
+
var child = _f.value;
|
|
237
|
+
if (!(child instanceof Paragraph.Paragraph))
|
|
238
|
+
continue;
|
|
239
|
+
var level = getHeadingLevel(word, child);
|
|
240
|
+
if (level > 0) {
|
|
241
|
+
var id = "toc-h-".concat(_tocHeadingCounter++);
|
|
242
|
+
child.tocHeadingId = id;
|
|
243
|
+
word.tocHeadings.push({ level: level, text: getParagraphText(child), id: id });
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
catch (e_7_1) { e_7 = { error: e_7_1 }; }
|
|
248
|
+
finally {
|
|
249
|
+
try {
|
|
250
|
+
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
251
|
+
}
|
|
252
|
+
finally { if (e_7) throw e_7.error; }
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch (e_6_1) { e_6 = { error: e_6_1 }; }
|
|
257
|
+
finally {
|
|
258
|
+
try {
|
|
259
|
+
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
260
|
+
}
|
|
261
|
+
finally { if (e_6) throw e_6.error; }
|
|
262
|
+
}
|
|
263
|
+
}
|
|
132
264
|
/**
|
|
133
265
|
* 渲染文档主体
|
|
134
266
|
*/
|
|
135
267
|
function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
|
|
136
|
-
var
|
|
268
|
+
var e_8, _a, e_9, _b;
|
|
269
|
+
// 预扫描标题,为动态目录生成准备数据
|
|
270
|
+
prescanHeadings(word, body);
|
|
137
271
|
var page = renderOptions.page || false;
|
|
138
272
|
var rootWidth = root.getBoundingClientRect().width -
|
|
139
273
|
(renderOptions.pageWrapPadding || 0) * 2;
|
|
@@ -159,7 +293,7 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
|
|
|
159
293
|
}
|
|
160
294
|
else {
|
|
161
295
|
try {
|
|
162
|
-
for (var _c = (
|
|
296
|
+
for (var _c = (e_9 = void 0, tslib.__values(section.children)), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
163
297
|
var child = _d.value;
|
|
164
298
|
if (child instanceof Paragraph.Paragraph) {
|
|
165
299
|
var p = renderParagraph["default"](word, child);
|
|
@@ -174,22 +308,22 @@ function renderBody(root, word, bodyEl, wDocument, body, renderOptions) {
|
|
|
174
308
|
}
|
|
175
309
|
}
|
|
176
310
|
}
|
|
177
|
-
catch (
|
|
311
|
+
catch (e_9_1) { e_9 = { error: e_9_1 }; }
|
|
178
312
|
finally {
|
|
179
313
|
try {
|
|
180
314
|
if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
|
|
181
315
|
}
|
|
182
|
-
finally { if (
|
|
316
|
+
finally { if (e_9) throw e_9.error; }
|
|
183
317
|
}
|
|
184
318
|
}
|
|
185
319
|
}
|
|
186
320
|
}
|
|
187
|
-
catch (
|
|
321
|
+
catch (e_8_1) { e_8 = { error: e_8_1 }; }
|
|
188
322
|
finally {
|
|
189
323
|
try {
|
|
190
324
|
if (sections_1_1 && !sections_1_1.done && (_a = sections_1.return)) _a.call(sections_1);
|
|
191
325
|
}
|
|
192
|
-
finally { if (
|
|
326
|
+
finally { if (e_8) throw e_8.error; }
|
|
193
327
|
}
|
|
194
328
|
setTimeout(function () {
|
|
195
329
|
if (renderOptions.zoom) {
|
|
@@ -16,6 +16,10 @@ function renderInstrText(word, instrText) {
|
|
|
16
16
|
var _b;
|
|
17
17
|
var text = instrText.text;
|
|
18
18
|
var span = dom.createElement('span');
|
|
19
|
+
// TOC 字段指令不渲染原始指令文本,目录条目已作为普通段落存在于文档中
|
|
20
|
+
if (text.trim().startsWith('TOC')) {
|
|
21
|
+
return span;
|
|
22
|
+
}
|
|
19
23
|
var fldSimples = (_b = word.currentParagraph) === null || _b === void 0 ? void 0 : _b.fldSimples;
|
|
20
24
|
if (fldSimples) {
|
|
21
25
|
try {
|
|
@@ -15,6 +15,7 @@ var setElementStyle = require('./setElementStyle.js');
|
|
|
15
15
|
var renderTab = require('./renderTab.js');
|
|
16
16
|
var OMath = require('../../openxml/math/OMath.js');
|
|
17
17
|
var renderMath = require('./renderMath.js');
|
|
18
|
+
var renderTOC = require('./renderTOC.js');
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* 渲染段落
|
|
@@ -25,17 +26,27 @@ function renderParagraph(word, paragraph, renderEmptySpace, inHeader) {
|
|
|
25
26
|
if (renderEmptySpace === void 0) { renderEmptySpace = true; }
|
|
26
27
|
if (inHeader === void 0) { inHeader = false; }
|
|
27
28
|
word.currentParagraph = paragraph;
|
|
29
|
+
// 如果是 TOC 字段段落且文档中有标题,动态生成目录
|
|
30
|
+
if (paragraph.isTOC && word.tocHeadings.length > 0) {
|
|
31
|
+
return renderTOC.renderTOC(word);
|
|
32
|
+
}
|
|
28
33
|
var p = dom.createElement('p');
|
|
29
34
|
word.addClass(p, 'p');
|
|
30
35
|
var properties = paragraph.properties;
|
|
31
36
|
setElementStyle.setElementStyle(word, p, properties);
|
|
32
37
|
// 默认情况下 drawing 是相对段落的
|
|
33
38
|
p.style.position = 'relative';
|
|
39
|
+
// 如果是标题段落,为目录锚点添加 id
|
|
40
|
+
if (paragraph.tocHeadingId) {
|
|
41
|
+
p.id = paragraph.tocHeadingId;
|
|
42
|
+
}
|
|
34
43
|
// 渲染列表前缀
|
|
35
44
|
if (properties.numPr) {
|
|
36
45
|
dom.appendChild(p, renderNumbering.renderNumbering(p, word, properties.numPr));
|
|
37
46
|
}
|
|
38
|
-
|
|
47
|
+
// 复杂字段状态: 'outside' | 'instr' | 'content'
|
|
48
|
+
// begin -> instr, separate -> content, end -> outside
|
|
49
|
+
var fldCharState = 'outside';
|
|
39
50
|
if (properties.tabs && properties.tabs.length) {
|
|
40
51
|
// 目前只支持渲染第一个,因为第二个位置取决于前面内容位置,挺麻烦
|
|
41
52
|
// 虽然目前这个实现很 hack,但可以支持常见情况
|
|
@@ -62,12 +73,19 @@ function renderParagraph(word, paragraph, renderEmptySpace, inHeader) {
|
|
|
62
73
|
var child = _c.value;
|
|
63
74
|
if (child instanceof Run.Run) {
|
|
64
75
|
if (child.fldChar === 'begin') {
|
|
65
|
-
|
|
76
|
+
fldCharState = 'instr';
|
|
77
|
+
}
|
|
78
|
+
else if (child.fldChar === 'separate') {
|
|
79
|
+
fldCharState = 'content';
|
|
80
|
+
}
|
|
81
|
+
else if (child.fldChar === 'end') {
|
|
82
|
+
fldCharState = 'outside';
|
|
66
83
|
}
|
|
67
|
-
|
|
68
|
-
|
|
84
|
+
// 跳过 instrText 所在的 run(字段指令本身不渲染),fldChar 节点本身正常渲染
|
|
85
|
+
if (fldCharState === 'instr' && !child.fldChar) {
|
|
86
|
+
continue;
|
|
69
87
|
}
|
|
70
|
-
dom.appendChild(p, renderRun["default"](word, child, paragraph,
|
|
88
|
+
dom.appendChild(p, renderRun["default"](word, child, paragraph, false, inHeader));
|
|
71
89
|
}
|
|
72
90
|
else if (child instanceof Bookmark.BookmarkStart) {
|
|
73
91
|
dom.appendChild(p, renderBookmark.renderBookmarkStart(word, child));
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib = require('tslib');
|
|
6
|
+
var dom = require('../../util/dom.js');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 动态生成目录 HTML(当文档 TOC 字段没有缓存条目时使用)
|
|
10
|
+
*/
|
|
11
|
+
function renderTOC(word) {
|
|
12
|
+
var e_1, _a;
|
|
13
|
+
var nav = dom.createElement('nav');
|
|
14
|
+
nav.className = 'docx-toc';
|
|
15
|
+
try {
|
|
16
|
+
for (var _b = tslib.__values(word.tocHeadings), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
17
|
+
var heading = _c.value;
|
|
18
|
+
var item = dom.createElement('div');
|
|
19
|
+
item.className = "docx-toc-item docx-toc-level-".concat(heading.level);
|
|
20
|
+
item.style.paddingLeft = "".concat((heading.level - 1) * 2, "em");
|
|
21
|
+
var a = dom.createElement('a');
|
|
22
|
+
a.href = '#' + heading.id;
|
|
23
|
+
a.textContent = heading.text;
|
|
24
|
+
dom.appendChild(item, a);
|
|
25
|
+
dom.appendChild(nav, item);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
29
|
+
finally {
|
|
30
|
+
try {
|
|
31
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
32
|
+
}
|
|
33
|
+
finally { if (e_1) throw e_1.error; }
|
|
34
|
+
}
|
|
35
|
+
return nav;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
exports.renderTOC = renderTOC;
|