docxmlater 0.30.0 → 1.0.0
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/README.md +277 -180
- package/dist/core/Document.d.ts +26 -0
- package/dist/core/Document.d.ts.map +1 -1
- package/dist/core/Document.js +86 -2
- package/dist/core/Document.js.map +1 -1
- package/dist/core/DocumentGenerator.d.ts +3 -2
- package/dist/core/DocumentGenerator.d.ts.map +1 -1
- package/dist/core/DocumentGenerator.js +52 -7
- package/dist/core/DocumentGenerator.js.map +1 -1
- package/dist/core/DocumentParser.d.ts +18 -0
- package/dist/core/DocumentParser.d.ts.map +1 -1
- package/dist/core/DocumentParser.js +1317 -32
- package/dist/core/DocumentParser.js.map +1 -1
- package/dist/elements/Field.d.ts +38 -1
- package/dist/elements/Field.d.ts.map +1 -1
- package/dist/elements/Field.js +264 -1
- package/dist/elements/Field.js.map +1 -1
- package/dist/elements/Image.d.ts +94 -0
- package/dist/elements/Image.d.ts.map +1 -1
- package/dist/elements/Image.js +311 -25
- package/dist/elements/Image.js.map +1 -1
- package/dist/elements/Paragraph.d.ts +109 -31
- package/dist/elements/Paragraph.d.ts.map +1 -1
- package/dist/elements/Paragraph.js +274 -0
- package/dist/elements/Paragraph.js.map +1 -1
- package/dist/elements/Run.d.ts +68 -0
- package/dist/elements/Run.d.ts.map +1 -1
- package/dist/elements/Run.js +243 -39
- package/dist/elements/Run.js.map +1 -1
- package/dist/elements/Section.d.ts +16 -0
- package/dist/elements/Section.d.ts.map +1 -1
- package/dist/elements/Section.js +61 -1
- package/dist/elements/Section.js.map +1 -1
- package/dist/elements/Shape.d.ts +86 -0
- package/dist/elements/Shape.d.ts.map +1 -0
- package/dist/elements/Shape.js +461 -0
- package/dist/elements/Shape.js.map +1 -0
- package/dist/elements/StructuredDocumentTag.d.ts +61 -0
- package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
- package/dist/elements/StructuredDocumentTag.js +235 -0
- package/dist/elements/StructuredDocumentTag.js.map +1 -1
- package/dist/elements/Table.d.ts +33 -0
- package/dist/elements/Table.d.ts.map +1 -1
- package/dist/elements/Table.js +82 -8
- package/dist/elements/Table.js.map +1 -1
- package/dist/elements/TableCell.d.ts +17 -1
- package/dist/elements/TableCell.d.ts.map +1 -1
- package/dist/elements/TableCell.js +61 -8
- package/dist/elements/TableCell.js.map +1 -1
- package/dist/elements/TableRow.d.ts +29 -0
- package/dist/elements/TableRow.d.ts.map +1 -1
- package/dist/elements/TableRow.js +106 -0
- package/dist/elements/TableRow.js.map +1 -1
- package/dist/elements/TextBox.d.ts +77 -0
- package/dist/elements/TextBox.d.ts.map +1 -0
- package/dist/elements/TextBox.js +440 -0
- package/dist/elements/TextBox.js.map +1 -0
- package/dist/formatting/Style.d.ts +100 -0
- package/dist/formatting/Style.d.ts.map +1 -1
- package/dist/formatting/Style.js +396 -1
- package/dist/formatting/Style.js.map +1 -1
- package/dist/formatting/StylesManager.d.ts +6 -0
- package/dist/formatting/StylesManager.d.ts.map +1 -1
- package/dist/formatting/StylesManager.js +50 -0
- package/dist/formatting/StylesManager.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/managers/DrawingManager.d.ts +42 -0
- package/dist/managers/DrawingManager.d.ts.map +1 -0
- package/dist/managers/DrawingManager.js +160 -0
- package/dist/managers/DrawingManager.js.map +1 -0
- package/dist/xml/XMLBuilder.d.ts +2 -0
- package/dist/xml/XMLBuilder.d.ts.map +1 -1
- package/dist/xml/XMLBuilder.js +14 -0
- package/dist/xml/XMLBuilder.js.map +1 -1
- package/dist/xml/XMLParser.d.ts +1 -0
- package/dist/xml/XMLParser.d.ts.map +1 -1
- package/dist/xml/XMLParser.js +30 -0
- package/dist/xml/XMLParser.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,13 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.DocumentParser = void 0;
|
|
4
37
|
const types_1 = require("../zip/types");
|
|
5
38
|
const Paragraph_1 = require("../elements/Paragraph");
|
|
6
39
|
const Run_1 = require("../elements/Run");
|
|
40
|
+
const Field_1 = require("../elements/Field");
|
|
7
41
|
const Hyperlink_1 = require("../elements/Hyperlink");
|
|
8
42
|
const Table_1 = require("../elements/Table");
|
|
9
43
|
const TableRow_1 = require("../elements/TableRow");
|
|
10
44
|
const TableCell_1 = require("../elements/TableCell");
|
|
45
|
+
const ImageRun_1 = require("../elements/ImageRun");
|
|
11
46
|
const Section_1 = require("../elements/Section");
|
|
12
47
|
const XMLBuilder_1 = require("../xml/XMLBuilder");
|
|
13
48
|
const XMLParser_1 = require("../xml/XMLParser");
|
|
@@ -286,6 +321,14 @@ class DocumentParser {
|
|
|
286
321
|
paragraph.addHyperlink(hyperlink);
|
|
287
322
|
}
|
|
288
323
|
}
|
|
324
|
+
const fields = paraObj["w:fldSimple"];
|
|
325
|
+
const fieldChildren = Array.isArray(fields) ? fields : (fields ? [fields] : []);
|
|
326
|
+
for (const fieldObj of fieldChildren) {
|
|
327
|
+
const field = this.parseSimpleFieldFromObject(fieldObj);
|
|
328
|
+
if (field) {
|
|
329
|
+
paragraph.addField(field);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
289
332
|
return paragraph;
|
|
290
333
|
}
|
|
291
334
|
catch (error) {
|
|
@@ -300,6 +343,11 @@ class DocumentParser {
|
|
|
300
343
|
parseParagraphPropertiesFromObject(pPrObj, paragraph) {
|
|
301
344
|
if (!pPrObj)
|
|
302
345
|
return;
|
|
346
|
+
if (pPrObj["w:rPr"]) {
|
|
347
|
+
const tempRun = new Run_1.Run("");
|
|
348
|
+
this.parseRunPropertiesFromObject(pPrObj["w:rPr"], tempRun);
|
|
349
|
+
paragraph.setParagraphMarkFormatting(tempRun.getFormatting());
|
|
350
|
+
}
|
|
303
351
|
if (pPrObj["w:jc"]?.["@_w:val"]) {
|
|
304
352
|
paragraph.setAlignment(pPrObj["w:jc"]["@_w:val"]);
|
|
305
353
|
}
|
|
@@ -341,6 +389,199 @@ class DocumentParser {
|
|
|
341
389
|
paragraph.setNumbering(parseInt(numId, 10), parseInt(ilvl, 10));
|
|
342
390
|
}
|
|
343
391
|
}
|
|
392
|
+
if (pPrObj["w:pBdr"]) {
|
|
393
|
+
const pBdr = pPrObj["w:pBdr"];
|
|
394
|
+
const borders = {};
|
|
395
|
+
const parseBorder = (borderObj) => {
|
|
396
|
+
if (!borderObj)
|
|
397
|
+
return undefined;
|
|
398
|
+
const border = {};
|
|
399
|
+
if (borderObj["@_w:val"])
|
|
400
|
+
border.style = borderObj["@_w:val"];
|
|
401
|
+
if (borderObj["@_w:sz"])
|
|
402
|
+
border.size = parseInt(borderObj["@_w:sz"], 10);
|
|
403
|
+
if (borderObj["@_w:color"])
|
|
404
|
+
border.color = borderObj["@_w:color"];
|
|
405
|
+
if (borderObj["@_w:space"])
|
|
406
|
+
border.space = parseInt(borderObj["@_w:space"], 10);
|
|
407
|
+
return Object.keys(border).length > 0 ? border : undefined;
|
|
408
|
+
};
|
|
409
|
+
if (pBdr["w:top"])
|
|
410
|
+
borders.top = parseBorder(pBdr["w:top"]);
|
|
411
|
+
if (pBdr["w:bottom"])
|
|
412
|
+
borders.bottom = parseBorder(pBdr["w:bottom"]);
|
|
413
|
+
if (pBdr["w:left"])
|
|
414
|
+
borders.left = parseBorder(pBdr["w:left"]);
|
|
415
|
+
if (pBdr["w:right"])
|
|
416
|
+
borders.right = parseBorder(pBdr["w:right"]);
|
|
417
|
+
if (pBdr["w:between"])
|
|
418
|
+
borders.between = parseBorder(pBdr["w:between"]);
|
|
419
|
+
if (pBdr["w:bar"])
|
|
420
|
+
borders.bar = parseBorder(pBdr["w:bar"]);
|
|
421
|
+
if (Object.keys(borders).length > 0) {
|
|
422
|
+
paragraph.setBorder(borders);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (pPrObj["w:shd"]) {
|
|
426
|
+
const shd = pPrObj["w:shd"];
|
|
427
|
+
const shading = {};
|
|
428
|
+
if (shd["@_w:fill"])
|
|
429
|
+
shading.fill = shd["@_w:fill"];
|
|
430
|
+
if (shd["@_w:color"])
|
|
431
|
+
shading.color = shd["@_w:color"];
|
|
432
|
+
if (shd["@_w:val"])
|
|
433
|
+
shading.val = shd["@_w:val"];
|
|
434
|
+
if (Object.keys(shading).length > 0) {
|
|
435
|
+
paragraph.setShading(shading);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
if (pPrObj["w:tabs"]) {
|
|
439
|
+
const tabsObj = pPrObj["w:tabs"];
|
|
440
|
+
const tabs = [];
|
|
441
|
+
const tabElements = Array.isArray(tabsObj["w:tab"])
|
|
442
|
+
? tabsObj["w:tab"]
|
|
443
|
+
: tabsObj["w:tab"] ? [tabsObj["w:tab"]] : [];
|
|
444
|
+
for (const tabObj of tabElements) {
|
|
445
|
+
const tab = {};
|
|
446
|
+
if (tabObj["@_w:pos"])
|
|
447
|
+
tab.position = parseInt(tabObj["@_w:pos"], 10);
|
|
448
|
+
if (tabObj["@_w:val"])
|
|
449
|
+
tab.val = tabObj["@_w:val"];
|
|
450
|
+
if (tabObj["@_w:leader"])
|
|
451
|
+
tab.leader = tabObj["@_w:leader"];
|
|
452
|
+
if (tab.position !== undefined) {
|
|
453
|
+
tabs.push(tab);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
if (tabs.length > 0) {
|
|
457
|
+
paragraph.setTabs(tabs);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
if (pPrObj["w:widowControl"] !== undefined) {
|
|
461
|
+
const widowControlVal = pPrObj["w:widowControl"]?.["@_w:val"];
|
|
462
|
+
if (widowControlVal === "0" || widowControlVal === "false" || widowControlVal === false || widowControlVal === 0) {
|
|
463
|
+
paragraph.setWidowControl(false);
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
paragraph.setWidowControl(true);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
if (pPrObj["w:outlineLvl"] !== undefined && pPrObj["w:outlineLvl"]["@_w:val"] !== undefined) {
|
|
470
|
+
const level = parseInt(pPrObj["w:outlineLvl"]["@_w:val"], 10);
|
|
471
|
+
if (!isNaN(level) && level >= 0 && level <= 9) {
|
|
472
|
+
paragraph.setOutlineLevel(level);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
if (pPrObj["w:suppressLineNumbers"]) {
|
|
476
|
+
paragraph.setSuppressLineNumbers(true);
|
|
477
|
+
}
|
|
478
|
+
if (pPrObj["w:bidi"] !== undefined) {
|
|
479
|
+
const bidiVal = pPrObj["w:bidi"]?.["@_w:val"];
|
|
480
|
+
if (bidiVal === "0" || bidiVal === "false" || bidiVal === false || bidiVal === 0) {
|
|
481
|
+
paragraph.setBidi(false);
|
|
482
|
+
}
|
|
483
|
+
else {
|
|
484
|
+
paragraph.setBidi(true);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
if (pPrObj["w:textDirection"]?.["@_w:val"]) {
|
|
488
|
+
paragraph.setTextDirection(pPrObj["w:textDirection"]["@_w:val"]);
|
|
489
|
+
}
|
|
490
|
+
if (pPrObj["w:textAlignment"]?.["@_w:val"]) {
|
|
491
|
+
paragraph.setTextAlignment(pPrObj["w:textAlignment"]["@_w:val"]);
|
|
492
|
+
}
|
|
493
|
+
if (pPrObj["w:mirrorIndents"]) {
|
|
494
|
+
paragraph.setMirrorIndents(true);
|
|
495
|
+
}
|
|
496
|
+
if (pPrObj["w:adjustRightInd"] !== undefined) {
|
|
497
|
+
const adjustRightIndVal = pPrObj["w:adjustRightInd"]?.["@_w:val"];
|
|
498
|
+
if (adjustRightIndVal === "0" || adjustRightIndVal === "false" || adjustRightIndVal === false || adjustRightIndVal === 0) {
|
|
499
|
+
paragraph.setAdjustRightInd(false);
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
paragraph.setAdjustRightInd(true);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
if (pPrObj["w:framePr"]) {
|
|
506
|
+
const framePr = pPrObj["w:framePr"];
|
|
507
|
+
const frameProps = {};
|
|
508
|
+
if (framePr["@_w:w"])
|
|
509
|
+
frameProps.w = parseInt(framePr["@_w:w"], 10);
|
|
510
|
+
if (framePr["@_w:h"])
|
|
511
|
+
frameProps.h = parseInt(framePr["@_w:h"], 10);
|
|
512
|
+
if (framePr["@_w:hRule"])
|
|
513
|
+
frameProps.hRule = framePr["@_w:hRule"];
|
|
514
|
+
if (framePr["@_w:x"])
|
|
515
|
+
frameProps.x = parseInt(framePr["@_w:x"], 10);
|
|
516
|
+
if (framePr["@_w:y"])
|
|
517
|
+
frameProps.y = parseInt(framePr["@_w:y"], 10);
|
|
518
|
+
if (framePr["@_w:xAlign"])
|
|
519
|
+
frameProps.xAlign = framePr["@_w:xAlign"];
|
|
520
|
+
if (framePr["@_w:yAlign"])
|
|
521
|
+
frameProps.yAlign = framePr["@_w:yAlign"];
|
|
522
|
+
if (framePr["@_w:hAnchor"])
|
|
523
|
+
frameProps.hAnchor = framePr["@_w:hAnchor"];
|
|
524
|
+
if (framePr["@_w:vAnchor"])
|
|
525
|
+
frameProps.vAnchor = framePr["@_w:vAnchor"];
|
|
526
|
+
if (framePr["@_w:hSpace"])
|
|
527
|
+
frameProps.hSpace = parseInt(framePr["@_w:hSpace"], 10);
|
|
528
|
+
if (framePr["@_w:vSpace"])
|
|
529
|
+
frameProps.vSpace = parseInt(framePr["@_w:vSpace"], 10);
|
|
530
|
+
if (framePr["@_w:wrap"])
|
|
531
|
+
frameProps.wrap = framePr["@_w:wrap"];
|
|
532
|
+
if (framePr["@_w:dropCap"])
|
|
533
|
+
frameProps.dropCap = framePr["@_w:dropCap"];
|
|
534
|
+
if (framePr["@_w:lines"])
|
|
535
|
+
frameProps.lines = parseInt(framePr["@_w:lines"], 10);
|
|
536
|
+
if (framePr["@_w:anchorLock"] !== undefined) {
|
|
537
|
+
const anchorLockVal = framePr["@_w:anchorLock"];
|
|
538
|
+
frameProps.anchorLock = (anchorLockVal === "1" || anchorLockVal === "true" || anchorLockVal === true || anchorLockVal === 1);
|
|
539
|
+
}
|
|
540
|
+
if (Object.keys(frameProps).length > 0) {
|
|
541
|
+
paragraph.setFrameProperties(frameProps);
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
if (pPrObj["w:suppressAutoHyphens"]) {
|
|
545
|
+
paragraph.setSuppressAutoHyphens(true);
|
|
546
|
+
}
|
|
547
|
+
if (pPrObj["w:suppressOverlap"]) {
|
|
548
|
+
paragraph.setSuppressOverlap(true);
|
|
549
|
+
}
|
|
550
|
+
if (pPrObj["w:textboxTightWrap"]) {
|
|
551
|
+
const wrapVal = pPrObj["w:textboxTightWrap"]?.["@_w:val"];
|
|
552
|
+
if (wrapVal) {
|
|
553
|
+
paragraph.setTextboxTightWrap(wrapVal);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
if (pPrObj["w:divId"]) {
|
|
557
|
+
const divIdVal = pPrObj["w:divId"]?.["@_w:val"];
|
|
558
|
+
if (divIdVal) {
|
|
559
|
+
paragraph.setDivId(parseInt(divIdVal, 10));
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (pPrObj["w:cnfStyle"]) {
|
|
563
|
+
const cnfStyleVal = pPrObj["w:cnfStyle"]?.["@_w:val"];
|
|
564
|
+
if (cnfStyleVal !== undefined) {
|
|
565
|
+
const bitmask = String(cnfStyleVal).padStart(12, '0');
|
|
566
|
+
paragraph.setConditionalFormatting(bitmask);
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
if (pPrObj["w:pPrChange"]) {
|
|
570
|
+
const changeObj = pPrObj["w:pPrChange"];
|
|
571
|
+
const change = {};
|
|
572
|
+
if (changeObj["@_w:author"])
|
|
573
|
+
change.author = String(changeObj["@_w:author"]);
|
|
574
|
+
if (changeObj["@_w:date"])
|
|
575
|
+
change.date = String(changeObj["@_w:date"]);
|
|
576
|
+
if (changeObj["@_w:id"])
|
|
577
|
+
change.id = String(changeObj["@_w:id"]);
|
|
578
|
+
if (Object.keys(change).length > 0) {
|
|
579
|
+
paragraph.setParagraphPropertiesChange(change);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
if (pPrObj["w:sectPr"]) {
|
|
583
|
+
paragraph.setSectionProperties(pPrObj["w:sectPr"]);
|
|
584
|
+
}
|
|
344
585
|
}
|
|
345
586
|
parseRunFromObject(runObj) {
|
|
346
587
|
try {
|
|
@@ -401,13 +642,100 @@ class DocumentParser {
|
|
|
401
642
|
return null;
|
|
402
643
|
}
|
|
403
644
|
}
|
|
645
|
+
parseSimpleFieldFromObject(fieldObj) {
|
|
646
|
+
try {
|
|
647
|
+
const instruction = fieldObj["@_w:instr"];
|
|
648
|
+
if (!instruction) {
|
|
649
|
+
return null;
|
|
650
|
+
}
|
|
651
|
+
const typeMatch = instruction.trim().match(/^(\w+)/);
|
|
652
|
+
const type = (typeMatch?.[1] || 'PAGE');
|
|
653
|
+
let formatting;
|
|
654
|
+
if (fieldObj["w:rPr"]) {
|
|
655
|
+
const tempRun = new Run_1.Run("");
|
|
656
|
+
this.parseRunPropertiesFromObject(fieldObj["w:rPr"], tempRun);
|
|
657
|
+
formatting = tempRun.getFormatting();
|
|
658
|
+
}
|
|
659
|
+
const field = Field_1.Field.create({
|
|
660
|
+
type,
|
|
661
|
+
instruction,
|
|
662
|
+
formatting,
|
|
663
|
+
});
|
|
664
|
+
return field;
|
|
665
|
+
}
|
|
666
|
+
catch (error) {
|
|
667
|
+
console.warn('[DocumentParser] Failed to parse field:', error);
|
|
668
|
+
return null;
|
|
669
|
+
}
|
|
670
|
+
}
|
|
404
671
|
parseRunPropertiesFromObject(rPrObj, run) {
|
|
405
672
|
if (!rPrObj)
|
|
406
673
|
return;
|
|
674
|
+
if (rPrObj["w:rStyle"]) {
|
|
675
|
+
const styleId = rPrObj["w:rStyle"]["@_w:val"];
|
|
676
|
+
if (styleId) {
|
|
677
|
+
run.setCharacterStyle(styleId);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
if (rPrObj["w:bdr"]) {
|
|
681
|
+
const bdr = rPrObj["w:bdr"];
|
|
682
|
+
const border = {};
|
|
683
|
+
if (bdr["@_w:val"])
|
|
684
|
+
border.style = bdr["@_w:val"];
|
|
685
|
+
if (bdr["@_w:sz"])
|
|
686
|
+
border.size = parseInt(bdr["@_w:sz"], 10);
|
|
687
|
+
if (bdr["@_w:color"])
|
|
688
|
+
border.color = bdr["@_w:color"];
|
|
689
|
+
if (bdr["@_w:space"])
|
|
690
|
+
border.space = parseInt(bdr["@_w:space"], 10);
|
|
691
|
+
if (Object.keys(border).length > 0) {
|
|
692
|
+
run.setBorder(border);
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
if (rPrObj["w:shd"]) {
|
|
696
|
+
const shd = rPrObj["w:shd"];
|
|
697
|
+
const shading = {};
|
|
698
|
+
if (shd["@_w:val"])
|
|
699
|
+
shading.val = shd["@_w:val"];
|
|
700
|
+
if (shd["@_w:fill"])
|
|
701
|
+
shading.fill = shd["@_w:fill"];
|
|
702
|
+
if (shd["@_w:color"])
|
|
703
|
+
shading.color = shd["@_w:color"];
|
|
704
|
+
if (Object.keys(shading).length > 0) {
|
|
705
|
+
run.setShading(shading);
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (rPrObj["w:em"]) {
|
|
709
|
+
const val = rPrObj["w:em"]["@_w:val"];
|
|
710
|
+
if (val)
|
|
711
|
+
run.setEmphasis(val);
|
|
712
|
+
}
|
|
713
|
+
if (rPrObj["w:outline"])
|
|
714
|
+
run.setOutline(true);
|
|
715
|
+
if (rPrObj["w:shadow"])
|
|
716
|
+
run.setShadow(true);
|
|
717
|
+
if (rPrObj["w:emboss"])
|
|
718
|
+
run.setEmboss(true);
|
|
719
|
+
if (rPrObj["w:imprint"])
|
|
720
|
+
run.setImprint(true);
|
|
721
|
+
if (rPrObj["w:noProof"])
|
|
722
|
+
run.setNoProof(true);
|
|
723
|
+
if (rPrObj["w:snapToGrid"])
|
|
724
|
+
run.setSnapToGrid(true);
|
|
725
|
+
if (rPrObj["w:vanish"])
|
|
726
|
+
run.setVanish(true);
|
|
727
|
+
if (rPrObj["w:specVanish"])
|
|
728
|
+
run.setSpecVanish(true);
|
|
729
|
+
if (rPrObj["w:rtl"])
|
|
730
|
+
run.setRTL(true);
|
|
407
731
|
if (rPrObj["w:b"])
|
|
408
732
|
run.setBold(true);
|
|
733
|
+
if (rPrObj["w:bCs"])
|
|
734
|
+
run.setComplexScriptBold(true);
|
|
409
735
|
if (rPrObj["w:i"])
|
|
410
736
|
run.setItalic(true);
|
|
737
|
+
if (rPrObj["w:iCs"])
|
|
738
|
+
run.setComplexScriptItalic(true);
|
|
411
739
|
if (rPrObj["w:strike"])
|
|
412
740
|
run.setStrike(true);
|
|
413
741
|
if (rPrObj["w:smallCaps"])
|
|
@@ -418,6 +746,58 @@ class DocumentParser {
|
|
|
418
746
|
const uVal = rPrObj["w:u"]["@_w:val"];
|
|
419
747
|
run.setUnderline(uVal || true);
|
|
420
748
|
}
|
|
749
|
+
if (rPrObj["w:spacing"]) {
|
|
750
|
+
const val = rPrObj["w:spacing"]["@_w:val"];
|
|
751
|
+
if (val)
|
|
752
|
+
run.setCharacterSpacing(parseInt(val, 10));
|
|
753
|
+
}
|
|
754
|
+
if (rPrObj["w:w"]) {
|
|
755
|
+
const val = rPrObj["w:w"]["@_w:val"];
|
|
756
|
+
if (val)
|
|
757
|
+
run.setScaling(parseInt(val, 10));
|
|
758
|
+
}
|
|
759
|
+
if (rPrObj["w:position"]) {
|
|
760
|
+
const val = rPrObj["w:position"]["@_w:val"];
|
|
761
|
+
if (val)
|
|
762
|
+
run.setPosition(parseInt(val, 10));
|
|
763
|
+
}
|
|
764
|
+
if (rPrObj["w:kern"]) {
|
|
765
|
+
const val = rPrObj["w:kern"]["@_w:val"];
|
|
766
|
+
if (val)
|
|
767
|
+
run.setKerning(parseInt(val, 10));
|
|
768
|
+
}
|
|
769
|
+
if (rPrObj["w:lang"]) {
|
|
770
|
+
const val = rPrObj["w:lang"]["@_w:val"];
|
|
771
|
+
if (val)
|
|
772
|
+
run.setLanguage(val);
|
|
773
|
+
}
|
|
774
|
+
if (rPrObj["w:eastAsianLayout"]) {
|
|
775
|
+
const layoutObj = rPrObj["w:eastAsianLayout"];
|
|
776
|
+
const layout = {};
|
|
777
|
+
if (layoutObj["@_w:id"] !== undefined)
|
|
778
|
+
layout.id = Number(layoutObj["@_w:id"]);
|
|
779
|
+
if (layoutObj["@_w:vert"])
|
|
780
|
+
layout.vert = true;
|
|
781
|
+
if (layoutObj["@_w:vertCompress"])
|
|
782
|
+
layout.vertCompress = true;
|
|
783
|
+
if (layoutObj["@_w:combine"])
|
|
784
|
+
layout.combine = true;
|
|
785
|
+
if (layoutObj["@_w:combineBrackets"])
|
|
786
|
+
layout.combineBrackets = layoutObj["@_w:combineBrackets"];
|
|
787
|
+
if (Object.keys(layout).length > 0) {
|
|
788
|
+
run.setEastAsianLayout(layout);
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
if (rPrObj["w:fitText"]) {
|
|
792
|
+
const val = rPrObj["w:fitText"]["@_w:val"];
|
|
793
|
+
if (val !== undefined)
|
|
794
|
+
run.setFitText(Number(val));
|
|
795
|
+
}
|
|
796
|
+
if (rPrObj["w:effect"]) {
|
|
797
|
+
const val = rPrObj["w:effect"]["@_w:val"];
|
|
798
|
+
if (val)
|
|
799
|
+
run.setEffect(val);
|
|
800
|
+
}
|
|
421
801
|
if (rPrObj["w:vertAlign"]) {
|
|
422
802
|
const val = rPrObj["w:vertAlign"]["@_w:val"];
|
|
423
803
|
if (val === "subscript")
|
|
@@ -438,12 +818,235 @@ class DocumentParser {
|
|
|
438
818
|
run.setHighlight(rPrObj["w:highlight"]["@_w:val"]);
|
|
439
819
|
}
|
|
440
820
|
}
|
|
441
|
-
async parseDrawingFromObject(
|
|
442
|
-
|
|
821
|
+
async parseDrawingFromObject(drawingObj, zipHandler, relationshipManager, imageManager) {
|
|
822
|
+
try {
|
|
823
|
+
const inlineObj = drawingObj["wp:inline"];
|
|
824
|
+
const anchorObj = drawingObj["wp:anchor"];
|
|
825
|
+
const imageObj = inlineObj || anchorObj;
|
|
826
|
+
if (!imageObj) {
|
|
827
|
+
return null;
|
|
828
|
+
}
|
|
829
|
+
const isFloating = !!anchorObj;
|
|
830
|
+
const extentObj = imageObj["wp:extent"];
|
|
831
|
+
let width = 0;
|
|
832
|
+
let height = 0;
|
|
833
|
+
if (extentObj) {
|
|
834
|
+
width = parseInt(extentObj["@_cx"] || "0", 10);
|
|
835
|
+
height = parseInt(extentObj["@_cy"] || "0", 10);
|
|
836
|
+
}
|
|
837
|
+
const effectExtentObj = imageObj["wp:effectExtent"];
|
|
838
|
+
let effectExtent = undefined;
|
|
839
|
+
if (effectExtentObj) {
|
|
840
|
+
effectExtent = {
|
|
841
|
+
left: parseInt(effectExtentObj["@_l"] || "0", 10),
|
|
842
|
+
top: parseInt(effectExtentObj["@_t"] || "0", 10),
|
|
843
|
+
right: parseInt(effectExtentObj["@_r"] || "0", 10),
|
|
844
|
+
bottom: parseInt(effectExtentObj["@_b"] || "0", 10),
|
|
845
|
+
};
|
|
846
|
+
}
|
|
847
|
+
const docPrObj = imageObj["wp:docPr"];
|
|
848
|
+
let name = "image";
|
|
849
|
+
let description = "Image";
|
|
850
|
+
if (docPrObj) {
|
|
851
|
+
name = docPrObj["@_name"] || "image";
|
|
852
|
+
description = docPrObj["@_descr"] || "Image";
|
|
853
|
+
}
|
|
854
|
+
let wrap = undefined;
|
|
855
|
+
if (isFloating) {
|
|
856
|
+
wrap = this.parseWrapSettings(anchorObj);
|
|
857
|
+
}
|
|
858
|
+
let position = undefined;
|
|
859
|
+
if (isFloating) {
|
|
860
|
+
position = this.parseImagePosition(anchorObj);
|
|
861
|
+
}
|
|
862
|
+
let anchor = undefined;
|
|
863
|
+
if (isFloating && anchorObj) {
|
|
864
|
+
const toBool = (val) => val === "1" || val === 1 || val === true;
|
|
865
|
+
anchor = {
|
|
866
|
+
behindDoc: toBool(anchorObj["@_behindDoc"]),
|
|
867
|
+
locked: toBool(anchorObj["@_locked"]),
|
|
868
|
+
layoutInCell: toBool(anchorObj["@_layoutInCell"]),
|
|
869
|
+
allowOverlap: toBool(anchorObj["@_allowOverlap"]),
|
|
870
|
+
relativeHeight: parseInt(anchorObj["@_relativeHeight"] || "251658240", 10),
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
const graphicObj = imageObj["a:graphic"];
|
|
874
|
+
if (!graphicObj) {
|
|
875
|
+
return null;
|
|
876
|
+
}
|
|
877
|
+
const graphicDataObj = graphicObj["a:graphicData"];
|
|
878
|
+
if (!graphicDataObj) {
|
|
879
|
+
return null;
|
|
880
|
+
}
|
|
881
|
+
const picPicObj = graphicDataObj["pic:pic"];
|
|
882
|
+
if (!picPicObj) {
|
|
883
|
+
return null;
|
|
884
|
+
}
|
|
885
|
+
const blipFillObj = picPicObj["pic:blipFill"];
|
|
886
|
+
if (!blipFillObj) {
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
const blipObj = blipFillObj["a:blip"];
|
|
890
|
+
if (!blipObj) {
|
|
891
|
+
return null;
|
|
892
|
+
}
|
|
893
|
+
const crop = this.parseImageCrop(blipObj);
|
|
894
|
+
const effects = this.parseImageEffects(blipObj);
|
|
895
|
+
const relationshipId = blipObj["@_r:embed"];
|
|
896
|
+
if (!relationshipId) {
|
|
897
|
+
return null;
|
|
898
|
+
}
|
|
899
|
+
const relationship = relationshipManager.getRelationship(relationshipId);
|
|
900
|
+
if (!relationship) {
|
|
901
|
+
console.warn(`[DocumentParser] Image relationship not found: ${relationshipId}`);
|
|
902
|
+
return null;
|
|
903
|
+
}
|
|
904
|
+
const imageTarget = relationship.getTarget();
|
|
905
|
+
if (!imageTarget) {
|
|
906
|
+
console.warn(`[DocumentParser] Image relationship has no target: ${relationshipId}`);
|
|
907
|
+
return null;
|
|
908
|
+
}
|
|
909
|
+
const imagePath = `word/${imageTarget}`;
|
|
910
|
+
const imageData = zipHandler.getFileAsBuffer(imagePath);
|
|
911
|
+
if (!imageData) {
|
|
912
|
+
console.warn(`[DocumentParser] Image file not found: ${imagePath}`);
|
|
913
|
+
return null;
|
|
914
|
+
}
|
|
915
|
+
const extension = imagePath.split('.').pop()?.toLowerCase() || 'png';
|
|
916
|
+
const { Image: ImageClass } = await Promise.resolve().then(() => __importStar(require('../elements/Image')));
|
|
917
|
+
const image = await ImageClass.create({
|
|
918
|
+
source: imageData,
|
|
919
|
+
width,
|
|
920
|
+
height,
|
|
921
|
+
name,
|
|
922
|
+
description,
|
|
923
|
+
effectExtent,
|
|
924
|
+
wrap,
|
|
925
|
+
position,
|
|
926
|
+
anchor,
|
|
927
|
+
crop,
|
|
928
|
+
effects,
|
|
929
|
+
});
|
|
930
|
+
imageManager.registerImage(image, relationshipId);
|
|
931
|
+
image.setRelationshipId(relationshipId);
|
|
932
|
+
return new ImageRun_1.ImageRun(image);
|
|
933
|
+
}
|
|
934
|
+
catch (error) {
|
|
935
|
+
console.warn('[DocumentParser] Failed to parse drawing:', error);
|
|
936
|
+
return null;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
parseWrapSettings(anchorObj) {
|
|
940
|
+
const wrapSquare = anchorObj["wp:wrapSquare"];
|
|
941
|
+
const wrapTight = anchorObj["wp:wrapTight"];
|
|
942
|
+
const wrapThrough = anchorObj["wp:wrapThrough"];
|
|
943
|
+
const wrapTopBottom = anchorObj["wp:wrapTopAndBottom"];
|
|
944
|
+
const wrapNone = anchorObj["wp:wrapNone"];
|
|
945
|
+
const wrapObj = wrapSquare || wrapTight || wrapThrough || wrapTopBottom || wrapNone;
|
|
946
|
+
if (!wrapObj) {
|
|
947
|
+
return undefined;
|
|
948
|
+
}
|
|
949
|
+
let type = 'square';
|
|
950
|
+
if (wrapTight)
|
|
951
|
+
type = 'tight';
|
|
952
|
+
else if (wrapThrough)
|
|
953
|
+
type = 'through';
|
|
954
|
+
else if (wrapTopBottom)
|
|
955
|
+
type = 'topAndBottom';
|
|
956
|
+
else if (wrapNone)
|
|
957
|
+
type = 'none';
|
|
958
|
+
return {
|
|
959
|
+
type,
|
|
960
|
+
side: wrapObj["@_wrapText"] || 'bothSides',
|
|
961
|
+
distanceTop: anchorObj["@_distT"] ? parseInt(anchorObj["@_distT"], 10) : undefined,
|
|
962
|
+
distanceBottom: anchorObj["@_distB"] ? parseInt(anchorObj["@_distB"], 10) : undefined,
|
|
963
|
+
distanceLeft: anchorObj["@_distL"] ? parseInt(anchorObj["@_distL"], 10) : undefined,
|
|
964
|
+
distanceRight: anchorObj["@_distR"] ? parseInt(anchorObj["@_distR"], 10) : undefined,
|
|
965
|
+
};
|
|
966
|
+
}
|
|
967
|
+
parseImagePosition(anchorObj) {
|
|
968
|
+
const posH = anchorObj["wp:positionH"];
|
|
969
|
+
const posV = anchorObj["wp:positionV"];
|
|
970
|
+
if (!posH || !posV) {
|
|
971
|
+
return undefined;
|
|
972
|
+
}
|
|
973
|
+
const horizontal = {
|
|
974
|
+
anchor: posH["@_relativeFrom"] || 'page',
|
|
975
|
+
};
|
|
976
|
+
if (posH["wp:posOffset"]) {
|
|
977
|
+
const offsetText = Array.isArray(posH["wp:posOffset"])
|
|
978
|
+
? posH["wp:posOffset"][0]
|
|
979
|
+
: posH["wp:posOffset"];
|
|
980
|
+
horizontal.offset = parseInt(typeof offsetText === 'string' ? offsetText : offsetText?.["#text"] || "0", 10);
|
|
981
|
+
}
|
|
982
|
+
else if (posH["wp:align"]) {
|
|
983
|
+
const alignText = Array.isArray(posH["wp:align"])
|
|
984
|
+
? posH["wp:align"][0]
|
|
985
|
+
: posH["wp:align"];
|
|
986
|
+
horizontal.alignment = typeof alignText === 'string' ? alignText : alignText?.["#text"];
|
|
987
|
+
}
|
|
988
|
+
const vertical = {
|
|
989
|
+
anchor: posV["@_relativeFrom"] || 'page',
|
|
990
|
+
};
|
|
991
|
+
if (posV["wp:posOffset"]) {
|
|
992
|
+
const offsetText = Array.isArray(posV["wp:posOffset"])
|
|
993
|
+
? posV["wp:posOffset"][0]
|
|
994
|
+
: posV["wp:posOffset"];
|
|
995
|
+
vertical.offset = parseInt(typeof offsetText === 'string' ? offsetText : offsetText?.["#text"] || "0", 10);
|
|
996
|
+
}
|
|
997
|
+
else if (posV["wp:align"]) {
|
|
998
|
+
const alignText = Array.isArray(posV["wp:align"])
|
|
999
|
+
? posV["wp:align"][0]
|
|
1000
|
+
: posV["wp:align"];
|
|
1001
|
+
vertical.alignment = typeof alignText === 'string' ? alignText : alignText?.["#text"];
|
|
1002
|
+
}
|
|
1003
|
+
return { horizontal, vertical };
|
|
1004
|
+
}
|
|
1005
|
+
parseImageCrop(blipObj) {
|
|
1006
|
+
const srcRect = blipObj["a:srcRect"];
|
|
1007
|
+
if (!srcRect) {
|
|
1008
|
+
return undefined;
|
|
1009
|
+
}
|
|
1010
|
+
return {
|
|
1011
|
+
left: parseInt(srcRect["@_l"] || "0", 10) / 1000,
|
|
1012
|
+
top: parseInt(srcRect["@_t"] || "0", 10) / 1000,
|
|
1013
|
+
right: parseInt(srcRect["@_r"] || "0", 10) / 1000,
|
|
1014
|
+
bottom: parseInt(srcRect["@_b"] || "0", 10) / 1000,
|
|
1015
|
+
};
|
|
1016
|
+
}
|
|
1017
|
+
parseImageEffects(blipObj) {
|
|
1018
|
+
const effects = {};
|
|
1019
|
+
const lum = blipObj["a:lum"];
|
|
1020
|
+
if (lum) {
|
|
1021
|
+
if (lum["@_bright"]) {
|
|
1022
|
+
effects.brightness = parseInt(lum["@_bright"], 10) / 1000;
|
|
1023
|
+
}
|
|
1024
|
+
if (lum["@_contrast"]) {
|
|
1025
|
+
effects.contrast = parseInt(lum["@_contrast"], 10) / 1000;
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
if (blipObj["a:grayscl"]) {
|
|
1029
|
+
effects.grayscale = true;
|
|
1030
|
+
}
|
|
1031
|
+
return Object.keys(effects).length > 0 ? effects : undefined;
|
|
443
1032
|
}
|
|
444
1033
|
async parseTableFromObject(tableObj, relationshipManager, zipHandler, imageManager) {
|
|
445
1034
|
try {
|
|
446
1035
|
const table = new Table_1.Table();
|
|
1036
|
+
if (tableObj["w:tblPr"]) {
|
|
1037
|
+
this.parseTablePropertiesFromObject(tableObj["w:tblPr"], table);
|
|
1038
|
+
}
|
|
1039
|
+
if (tableObj["w:tblGrid"] && tableObj["w:tblGrid"]["w:gridCol"]) {
|
|
1040
|
+
const gridCols = tableObj["w:tblGrid"]["w:gridCol"];
|
|
1041
|
+
const gridColArray = Array.isArray(gridCols) ? gridCols : [gridCols];
|
|
1042
|
+
const widths = gridColArray.map((col) => {
|
|
1043
|
+
const w = col["@_w:w"];
|
|
1044
|
+
return w ? parseInt(w, 10) : 2880;
|
|
1045
|
+
});
|
|
1046
|
+
if (widths.length > 0) {
|
|
1047
|
+
table.setTableGrid(widths);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
447
1050
|
const rows = tableObj["w:tr"];
|
|
448
1051
|
const rowChildren = Array.isArray(rows) ? rows : (rows ? [rows] : []);
|
|
449
1052
|
for (const rowObj of rowChildren) {
|
|
@@ -459,9 +1062,84 @@ class DocumentParser {
|
|
|
459
1062
|
return null;
|
|
460
1063
|
}
|
|
461
1064
|
}
|
|
1065
|
+
parseTablePropertiesFromObject(tblPrObj, table) {
|
|
1066
|
+
if (!tblPrObj)
|
|
1067
|
+
return;
|
|
1068
|
+
if (tblPrObj["w:tblpPr"]) {
|
|
1069
|
+
const tblpPr = tblPrObj["w:tblpPr"];
|
|
1070
|
+
const position = {};
|
|
1071
|
+
if (tblpPr["@_w:tblpX"])
|
|
1072
|
+
position.x = parseInt(tblpPr["@_w:tblpX"], 10);
|
|
1073
|
+
if (tblpPr["@_w:tblpY"])
|
|
1074
|
+
position.y = parseInt(tblpPr["@_w:tblpY"], 10);
|
|
1075
|
+
if (tblpPr["@_w:tblpXSpec"])
|
|
1076
|
+
position.horizontalAnchor = tblpPr["@_w:tblpXSpec"];
|
|
1077
|
+
if (tblpPr["@_w:tblpYSpec"])
|
|
1078
|
+
position.verticalAnchor = tblpPr["@_w:tblpYSpec"];
|
|
1079
|
+
if (tblpPr["@_w:tblpXAlign"])
|
|
1080
|
+
position.horizontalAlignment = tblpPr["@_w:tblpXAlign"];
|
|
1081
|
+
if (tblpPr["@_w:tblpYAlign"])
|
|
1082
|
+
position.verticalAlignment = tblpPr["@_w:tblpYAlign"];
|
|
1083
|
+
if (tblpPr["@_w:leftFromText"])
|
|
1084
|
+
position.leftFromText = parseInt(tblpPr["@_w:leftFromText"], 10);
|
|
1085
|
+
if (tblpPr["@_w:rightFromText"])
|
|
1086
|
+
position.rightFromText = parseInt(tblpPr["@_w:rightFromText"], 10);
|
|
1087
|
+
if (tblpPr["@_w:topFromText"])
|
|
1088
|
+
position.topFromText = parseInt(tblpPr["@_w:topFromText"], 10);
|
|
1089
|
+
if (tblpPr["@_w:bottomFromText"])
|
|
1090
|
+
position.bottomFromText = parseInt(tblpPr["@_w:bottomFromText"], 10);
|
|
1091
|
+
if (Object.keys(position).length > 0) {
|
|
1092
|
+
table.setPosition(position);
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
if (tblPrObj["w:tblOverlap"]) {
|
|
1096
|
+
const val = tblPrObj["w:tblOverlap"]["@_w:val"];
|
|
1097
|
+
table.setOverlap(val === "overlap");
|
|
1098
|
+
}
|
|
1099
|
+
if (tblPrObj["w:bidiVisual"]) {
|
|
1100
|
+
table.setBidiVisual(true);
|
|
1101
|
+
}
|
|
1102
|
+
if (tblPrObj["w:tblW"]) {
|
|
1103
|
+
const width = parseInt(tblPrObj["w:tblW"]["@_w:w"] || "0", 10);
|
|
1104
|
+
const widthType = tblPrObj["w:tblW"]["@_w:type"] || "dxa";
|
|
1105
|
+
if (width > 0) {
|
|
1106
|
+
table.setWidth(width);
|
|
1107
|
+
table.setWidthType(widthType);
|
|
1108
|
+
}
|
|
1109
|
+
}
|
|
1110
|
+
if (tblPrObj["w:tblCaption"]) {
|
|
1111
|
+
const caption = tblPrObj["w:tblCaption"]["@_w:val"];
|
|
1112
|
+
if (caption)
|
|
1113
|
+
table.setCaption(caption);
|
|
1114
|
+
}
|
|
1115
|
+
if (tblPrObj["w:tblDescription"]) {
|
|
1116
|
+
const description = tblPrObj["w:tblDescription"]["@_w:val"];
|
|
1117
|
+
if (description)
|
|
1118
|
+
table.setDescription(description);
|
|
1119
|
+
}
|
|
1120
|
+
if (tblPrObj["w:tblCellSpacing"]) {
|
|
1121
|
+
const spacing = parseInt(tblPrObj["w:tblCellSpacing"]["@_w:w"] || "0", 10);
|
|
1122
|
+
const spacingType = tblPrObj["w:tblCellSpacing"]["@_w:type"] || "dxa";
|
|
1123
|
+
if (spacing > 0) {
|
|
1124
|
+
table.setCellSpacing(spacing);
|
|
1125
|
+
table.setCellSpacingType(spacingType);
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
}
|
|
462
1129
|
async parseTableRowFromObject(rowObj, relationshipManager, zipHandler, imageManager) {
|
|
463
1130
|
try {
|
|
464
1131
|
const row = new TableRow_1.TableRow();
|
|
1132
|
+
const trPr = rowObj["w:trPr"];
|
|
1133
|
+
if (trPr) {
|
|
1134
|
+
this.parseTableRowPropertiesFromObject(trPr, row);
|
|
1135
|
+
}
|
|
1136
|
+
const tblPrEx = rowObj["w:tblPrEx"];
|
|
1137
|
+
if (tblPrEx) {
|
|
1138
|
+
const exceptions = this.parseTablePropertyExceptionsFromObject(tblPrEx);
|
|
1139
|
+
if (exceptions) {
|
|
1140
|
+
row.setTablePropertyExceptions(exceptions);
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
465
1143
|
const cells = rowObj["w:tc"];
|
|
466
1144
|
const cellChildren = Array.isArray(cells) ? cells : (cells ? [cells] : []);
|
|
467
1145
|
for (const cellObj of cellChildren) {
|
|
@@ -477,9 +1155,218 @@ class DocumentParser {
|
|
|
477
1155
|
return null;
|
|
478
1156
|
}
|
|
479
1157
|
}
|
|
1158
|
+
parseTableRowPropertiesFromObject(trPrObj, row) {
|
|
1159
|
+
if (!trPrObj)
|
|
1160
|
+
return;
|
|
1161
|
+
if (trPrObj["w:trHeight"]) {
|
|
1162
|
+
const heightVal = parseInt(trPrObj["w:trHeight"]["@_w:val"] || "0", 10);
|
|
1163
|
+
const heightRule = trPrObj["w:trHeight"]["@_w:hRule"] || "atLeast";
|
|
1164
|
+
if (heightVal > 0) {
|
|
1165
|
+
row.setHeight(heightVal, heightRule);
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
if (trPrObj["w:tblHeader"]) {
|
|
1169
|
+
row.setHeader(true);
|
|
1170
|
+
}
|
|
1171
|
+
if (trPrObj["w:cantSplit"]) {
|
|
1172
|
+
row.setCantSplit(true);
|
|
1173
|
+
}
|
|
1174
|
+
if (trPrObj["w:jc"]) {
|
|
1175
|
+
const val = trPrObj["w:jc"]["@_w:val"];
|
|
1176
|
+
if (val) {
|
|
1177
|
+
row.setJustification(val);
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
if (trPrObj["w:hidden"]) {
|
|
1181
|
+
row.setHidden(true);
|
|
1182
|
+
}
|
|
1183
|
+
if (trPrObj["w:gridBefore"]) {
|
|
1184
|
+
const val = parseInt(trPrObj["w:gridBefore"]["@_w:val"] || "0", 10);
|
|
1185
|
+
if (val > 0) {
|
|
1186
|
+
row.setGridBefore(val);
|
|
1187
|
+
}
|
|
1188
|
+
}
|
|
1189
|
+
if (trPrObj["w:gridAfter"]) {
|
|
1190
|
+
const val = parseInt(trPrObj["w:gridAfter"]["@_w:val"] || "0", 10);
|
|
1191
|
+
if (val > 0) {
|
|
1192
|
+
row.setGridAfter(val);
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
1196
|
+
parseTablePropertyExceptionsFromObject(tblPrExObj) {
|
|
1197
|
+
if (!tblPrExObj)
|
|
1198
|
+
return undefined;
|
|
1199
|
+
const exceptions = {};
|
|
1200
|
+
if (tblPrExObj["w:tblW"]) {
|
|
1201
|
+
const widthVal = parseInt(tblPrExObj["w:tblW"]["@_w:w"] || "0", 10);
|
|
1202
|
+
if (widthVal > 0) {
|
|
1203
|
+
exceptions.width = widthVal;
|
|
1204
|
+
}
|
|
1205
|
+
}
|
|
1206
|
+
if (tblPrExObj["w:jc"]) {
|
|
1207
|
+
const val = tblPrExObj["w:jc"]["@_w:val"];
|
|
1208
|
+
if (val) {
|
|
1209
|
+
exceptions.justification = val;
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
if (tblPrExObj["w:tblCellSpacing"]) {
|
|
1213
|
+
const val = parseInt(tblPrExObj["w:tblCellSpacing"]["@_w:w"] || "0", 10);
|
|
1214
|
+
if (val > 0) {
|
|
1215
|
+
exceptions.cellSpacing = val;
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
if (tblPrExObj["w:tblInd"]) {
|
|
1219
|
+
const val = parseInt(tblPrExObj["w:tblInd"]["@_w:w"] || "0", 10);
|
|
1220
|
+
if (val > 0) {
|
|
1221
|
+
exceptions.indentation = val;
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
if (tblPrExObj["w:tblBorders"]) {
|
|
1225
|
+
exceptions.borders = this.parseTableBordersFromObject(tblPrExObj["w:tblBorders"]);
|
|
1226
|
+
}
|
|
1227
|
+
if (tblPrExObj["w:shd"]) {
|
|
1228
|
+
const shdObj = tblPrExObj["w:shd"];
|
|
1229
|
+
exceptions.shading = {};
|
|
1230
|
+
if (shdObj["@_w:fill"])
|
|
1231
|
+
exceptions.shading.fill = shdObj["@_w:fill"];
|
|
1232
|
+
if (shdObj["@_w:color"])
|
|
1233
|
+
exceptions.shading.color = shdObj["@_w:color"];
|
|
1234
|
+
if (shdObj["@_w:val"])
|
|
1235
|
+
exceptions.shading.pattern = shdObj["@_w:val"];
|
|
1236
|
+
}
|
|
1237
|
+
return Object.keys(exceptions).length > 0 ? exceptions : undefined;
|
|
1238
|
+
}
|
|
1239
|
+
parseTableBordersFromObject(bordersObj) {
|
|
1240
|
+
if (!bordersObj)
|
|
1241
|
+
return undefined;
|
|
1242
|
+
const borders = {};
|
|
1243
|
+
const borderNames = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];
|
|
1244
|
+
for (const name of borderNames) {
|
|
1245
|
+
const borderKey = `w:${name}`;
|
|
1246
|
+
if (bordersObj[borderKey]) {
|
|
1247
|
+
const borderObj = bordersObj[borderKey];
|
|
1248
|
+
borders[name] = {};
|
|
1249
|
+
if (borderObj["@_w:val"])
|
|
1250
|
+
borders[name].style = borderObj["@_w:val"];
|
|
1251
|
+
if (borderObj["@_w:sz"])
|
|
1252
|
+
borders[name].size = parseInt(borderObj["@_w:sz"], 10);
|
|
1253
|
+
if (borderObj["@_w:space"])
|
|
1254
|
+
borders[name].space = parseInt(borderObj["@_w:space"], 10);
|
|
1255
|
+
if (borderObj["@_w:color"])
|
|
1256
|
+
borders[name].color = borderObj["@_w:color"];
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
return Object.keys(borders).length > 0 ? borders : undefined;
|
|
1260
|
+
}
|
|
480
1261
|
async parseTableCellFromObject(cellObj, relationshipManager, zipHandler, imageManager) {
|
|
481
1262
|
try {
|
|
482
1263
|
const cell = new TableCell_1.TableCell();
|
|
1264
|
+
const tcPr = cellObj["w:tcPr"];
|
|
1265
|
+
if (tcPr) {
|
|
1266
|
+
if (tcPr["w:tcW"]) {
|
|
1267
|
+
const widthVal = parseInt(tcPr["w:tcW"]["@_w:w"] || "0", 10);
|
|
1268
|
+
const widthType = tcPr["w:tcW"]["@_w:type"] || "dxa";
|
|
1269
|
+
if (widthVal > 0 || widthType === "auto") {
|
|
1270
|
+
cell.setWidthType(widthVal, widthType);
|
|
1271
|
+
}
|
|
1272
|
+
}
|
|
1273
|
+
if (tcPr["w:cnfStyle"]) {
|
|
1274
|
+
const cnfStyle = tcPr["w:cnfStyle"]["@_w:val"];
|
|
1275
|
+
if (cnfStyle) {
|
|
1276
|
+
cell.setConditionalStyle(cnfStyle);
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
if (tcPr["w:tcBorders"]) {
|
|
1280
|
+
const bordersObj = tcPr["w:tcBorders"];
|
|
1281
|
+
const borders = {};
|
|
1282
|
+
const parseBorder = (borderObj) => {
|
|
1283
|
+
if (!borderObj)
|
|
1284
|
+
return undefined;
|
|
1285
|
+
return {
|
|
1286
|
+
style: borderObj["@_w:val"] || "single",
|
|
1287
|
+
size: borderObj["@_w:sz"] ? parseInt(borderObj["@_w:sz"], 10) : undefined,
|
|
1288
|
+
color: borderObj["@_w:color"] || undefined,
|
|
1289
|
+
};
|
|
1290
|
+
};
|
|
1291
|
+
if (bordersObj["w:top"])
|
|
1292
|
+
borders.top = parseBorder(bordersObj["w:top"]);
|
|
1293
|
+
if (bordersObj["w:bottom"])
|
|
1294
|
+
borders.bottom = parseBorder(bordersObj["w:bottom"]);
|
|
1295
|
+
if (bordersObj["w:left"])
|
|
1296
|
+
borders.left = parseBorder(bordersObj["w:left"]);
|
|
1297
|
+
if (bordersObj["w:right"])
|
|
1298
|
+
borders.right = parseBorder(bordersObj["w:right"]);
|
|
1299
|
+
if (Object.keys(borders).length > 0) {
|
|
1300
|
+
cell.setBorders(borders);
|
|
1301
|
+
}
|
|
1302
|
+
}
|
|
1303
|
+
if (tcPr["w:shd"]) {
|
|
1304
|
+
const shd = tcPr["w:shd"];
|
|
1305
|
+
const shading = {};
|
|
1306
|
+
if (shd["@_w:fill"])
|
|
1307
|
+
shading.fill = shd["@_w:fill"];
|
|
1308
|
+
if (shd["@_w:color"])
|
|
1309
|
+
shading.color = shd["@_w:color"];
|
|
1310
|
+
if (Object.keys(shading).length > 0) {
|
|
1311
|
+
cell.setShading(shading);
|
|
1312
|
+
}
|
|
1313
|
+
}
|
|
1314
|
+
if (tcPr["w:tcMar"]) {
|
|
1315
|
+
const tcMar = tcPr["w:tcMar"];
|
|
1316
|
+
const margins = {};
|
|
1317
|
+
if (tcMar["w:top"]) {
|
|
1318
|
+
margins.top = parseInt(tcMar["w:top"]["@_w:w"] || "0", 10);
|
|
1319
|
+
}
|
|
1320
|
+
if (tcMar["w:bottom"]) {
|
|
1321
|
+
margins.bottom = parseInt(tcMar["w:bottom"]["@_w:w"] || "0", 10);
|
|
1322
|
+
}
|
|
1323
|
+
if (tcMar["w:left"]) {
|
|
1324
|
+
margins.left = parseInt(tcMar["w:left"]["@_w:w"] || "0", 10);
|
|
1325
|
+
}
|
|
1326
|
+
if (tcMar["w:right"]) {
|
|
1327
|
+
margins.right = parseInt(tcMar["w:right"]["@_w:w"] || "0", 10);
|
|
1328
|
+
}
|
|
1329
|
+
if (Object.keys(margins).length > 0) {
|
|
1330
|
+
cell.setMargins(margins);
|
|
1331
|
+
}
|
|
1332
|
+
}
|
|
1333
|
+
if (tcPr["w:vAlign"]) {
|
|
1334
|
+
const valign = tcPr["w:vAlign"]["@_w:val"];
|
|
1335
|
+
if (valign && (valign === "top" || valign === "center" || valign === "bottom")) {
|
|
1336
|
+
cell.setVerticalAlignment(valign);
|
|
1337
|
+
}
|
|
1338
|
+
}
|
|
1339
|
+
if (tcPr["w:gridSpan"]) {
|
|
1340
|
+
const span = parseInt(tcPr["w:gridSpan"]["@_w:val"] || "1", 10);
|
|
1341
|
+
if (span > 1) {
|
|
1342
|
+
cell.setColumnSpan(span);
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
if (tcPr["w:textDirection"]) {
|
|
1346
|
+
const direction = tcPr["w:textDirection"]["@_w:val"];
|
|
1347
|
+
if (direction) {
|
|
1348
|
+
cell.setTextDirection(direction);
|
|
1349
|
+
}
|
|
1350
|
+
}
|
|
1351
|
+
if (tcPr["w:noWrap"]) {
|
|
1352
|
+
cell.setNoWrap(true);
|
|
1353
|
+
}
|
|
1354
|
+
if (tcPr["w:hideMark"]) {
|
|
1355
|
+
cell.setHideMark(true);
|
|
1356
|
+
}
|
|
1357
|
+
if (tcPr["w:tcFitText"]) {
|
|
1358
|
+
cell.setFitText(true);
|
|
1359
|
+
}
|
|
1360
|
+
if (tcPr["w:vMerge"]) {
|
|
1361
|
+
const vMergeVal = tcPr["w:vMerge"]["@_w:val"];
|
|
1362
|
+
if (vMergeVal === "restart") {
|
|
1363
|
+
cell.setVerticalMerge("restart");
|
|
1364
|
+
}
|
|
1365
|
+
else {
|
|
1366
|
+
cell.setVerticalMerge("continue");
|
|
1367
|
+
}
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
483
1370
|
const paragraphs = cellObj["w:p"];
|
|
484
1371
|
const paraChildren = Array.isArray(paragraphs) ? paragraphs : (paragraphs ? [paragraphs] : []);
|
|
485
1372
|
for (const paraObj of paraChildren) {
|
|
@@ -507,36 +1394,86 @@ class DocumentParser {
|
|
|
507
1394
|
return relationshipManager;
|
|
508
1395
|
}
|
|
509
1396
|
parseProperties(zipHandler) {
|
|
510
|
-
const coreXml = zipHandler.getFileAsString(types_1.DOCX_PATHS.CORE_PROPS);
|
|
511
|
-
if (!coreXml) {
|
|
512
|
-
return {};
|
|
513
|
-
}
|
|
514
1397
|
const extractTag = (xml, tag) => {
|
|
515
1398
|
const tagContent = XMLParser_1.XMLParser.extractBetweenTags(xml, `<${tag}`, `</${tag}>`);
|
|
516
1399
|
return tagContent ? XMLBuilder_1.XMLBuilder.unescapeXml(tagContent) : undefined;
|
|
517
1400
|
};
|
|
518
|
-
const properties = {
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
properties.
|
|
1401
|
+
const properties = {};
|
|
1402
|
+
const coreXml = zipHandler.getFileAsString(types_1.DOCX_PATHS.CORE_PROPS);
|
|
1403
|
+
if (coreXml) {
|
|
1404
|
+
properties.title = extractTag(coreXml, "dc:title");
|
|
1405
|
+
properties.subject = extractTag(coreXml, "dc:subject");
|
|
1406
|
+
properties.creator = extractTag(coreXml, "dc:creator");
|
|
1407
|
+
properties.keywords = extractTag(coreXml, "cp:keywords");
|
|
1408
|
+
properties.description = extractTag(coreXml, "dc:description");
|
|
1409
|
+
properties.lastModifiedBy = extractTag(coreXml, "cp:lastModifiedBy");
|
|
1410
|
+
properties.category = extractTag(coreXml, "cp:category");
|
|
1411
|
+
properties.contentStatus = extractTag(coreXml, "cp:contentStatus");
|
|
1412
|
+
properties.language = extractTag(coreXml, "dc:language");
|
|
1413
|
+
const revisionStr = extractTag(coreXml, "cp:revision");
|
|
1414
|
+
if (revisionStr) {
|
|
1415
|
+
properties.revision = parseInt(revisionStr, 10);
|
|
1416
|
+
}
|
|
1417
|
+
const createdStr = extractTag(coreXml, "dcterms:created");
|
|
1418
|
+
if (createdStr) {
|
|
1419
|
+
properties.created = new Date(createdStr);
|
|
1420
|
+
}
|
|
1421
|
+
const modifiedStr = extractTag(coreXml, "dcterms:modified");
|
|
1422
|
+
if (modifiedStr) {
|
|
1423
|
+
properties.modified = new Date(modifiedStr);
|
|
1424
|
+
}
|
|
529
1425
|
}
|
|
530
|
-
const
|
|
531
|
-
if (
|
|
532
|
-
properties.
|
|
1426
|
+
const appXml = zipHandler.getFileAsString(types_1.DOCX_PATHS.APP_PROPS);
|
|
1427
|
+
if (appXml) {
|
|
1428
|
+
properties.application = extractTag(appXml, "Application");
|
|
1429
|
+
properties.appVersion = extractTag(appXml, "AppVersion");
|
|
1430
|
+
properties.company = extractTag(appXml, "Company");
|
|
1431
|
+
properties.manager = extractTag(appXml, "Manager");
|
|
1432
|
+
if (!properties.appVersion) {
|
|
1433
|
+
properties.version = extractTag(appXml, "Version");
|
|
1434
|
+
}
|
|
533
1435
|
}
|
|
534
|
-
const
|
|
535
|
-
if (
|
|
536
|
-
properties.
|
|
1436
|
+
const customXml = zipHandler.getFileAsString("docProps/custom.xml");
|
|
1437
|
+
if (customXml) {
|
|
1438
|
+
properties.customProperties = this.parseCustomProperties(customXml);
|
|
537
1439
|
}
|
|
538
1440
|
return properties;
|
|
539
1441
|
}
|
|
1442
|
+
parseCustomProperties(xml) {
|
|
1443
|
+
const customProps = {};
|
|
1444
|
+
const propertyElements = XMLParser_1.XMLParser.extractElements(xml, "property");
|
|
1445
|
+
for (const propXml of propertyElements) {
|
|
1446
|
+
const nameMatch = propXml.match(/name="([^"]+)"/);
|
|
1447
|
+
if (!nameMatch || !nameMatch[1])
|
|
1448
|
+
continue;
|
|
1449
|
+
const name = XMLBuilder_1.XMLBuilder.unescapeXml(nameMatch[1]);
|
|
1450
|
+
if (propXml.includes("<vt:lpwstr>")) {
|
|
1451
|
+
const value = XMLParser_1.XMLParser.extractBetweenTags(propXml, "<vt:lpwstr>", "</vt:lpwstr>");
|
|
1452
|
+
if (value !== undefined) {
|
|
1453
|
+
customProps[name] = XMLBuilder_1.XMLBuilder.unescapeXml(value);
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
else if (propXml.includes("<vt:r8>")) {
|
|
1457
|
+
const value = XMLParser_1.XMLParser.extractBetweenTags(propXml, "<vt:r8>", "</vt:r8>");
|
|
1458
|
+
if (value !== undefined) {
|
|
1459
|
+
customProps[name] = parseFloat(value);
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
else if (propXml.includes("<vt:bool>")) {
|
|
1463
|
+
const value = XMLParser_1.XMLParser.extractBetweenTags(propXml, "<vt:bool>", "</vt:bool>");
|
|
1464
|
+
if (value !== undefined) {
|
|
1465
|
+
customProps[name] = value === "true";
|
|
1466
|
+
}
|
|
1467
|
+
}
|
|
1468
|
+
else if (propXml.includes("<vt:filetime>")) {
|
|
1469
|
+
const value = XMLParser_1.XMLParser.extractBetweenTags(propXml, "<vt:filetime>", "</vt:filetime>");
|
|
1470
|
+
if (value !== undefined) {
|
|
1471
|
+
customProps[name] = new Date(value);
|
|
1472
|
+
}
|
|
1473
|
+
}
|
|
1474
|
+
}
|
|
1475
|
+
return customProps;
|
|
1476
|
+
}
|
|
540
1477
|
parseStyles(zipHandler) {
|
|
541
1478
|
const styles = [];
|
|
542
1479
|
const stylesXml = zipHandler.getFileAsString(types_1.DOCX_PATHS.STYLES);
|
|
@@ -682,11 +1619,23 @@ class DocumentParser {
|
|
|
682
1619
|
const num = XMLParser_1.XMLParser.extractAttribute(cols, "w:num");
|
|
683
1620
|
const space = XMLParser_1.XMLParser.extractAttribute(cols, "w:space");
|
|
684
1621
|
const equalWidth = XMLParser_1.XMLParser.extractAttribute(cols, "w:equalWidth");
|
|
1622
|
+
const sep = XMLParser_1.XMLParser.extractAttribute(cols, "w:sep");
|
|
1623
|
+
const colElements = XMLParser_1.XMLParser.extractElements(cols, "w:col");
|
|
1624
|
+
const columnWidths = [];
|
|
1625
|
+
for (const col of colElements) {
|
|
1626
|
+
const width = XMLParser_1.XMLParser.extractAttribute(col, "w:w");
|
|
1627
|
+
if (width) {
|
|
1628
|
+
columnWidths.push(parseInt(width.toString(), 10));
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
const toBool = (val) => val === "1" || val === 1 || val === "true" || val === true;
|
|
685
1632
|
if (num) {
|
|
686
1633
|
sectionProps.columns = {
|
|
687
|
-
count: parseInt(num, 10),
|
|
688
|
-
space: space ? parseInt(space, 10) : undefined,
|
|
689
|
-
equalWidth: equalWidth
|
|
1634
|
+
count: parseInt(num.toString(), 10),
|
|
1635
|
+
space: space ? parseInt(space.toString(), 10) : undefined,
|
|
1636
|
+
equalWidth: equalWidth ? toBool(equalWidth) : undefined,
|
|
1637
|
+
separator: sep ? toBool(sep) : undefined,
|
|
1638
|
+
columnWidths: columnWidths.length > 0 ? columnWidths : undefined,
|
|
690
1639
|
};
|
|
691
1640
|
}
|
|
692
1641
|
}
|
|
@@ -748,6 +1697,40 @@ class DocumentParser {
|
|
|
748
1697
|
}
|
|
749
1698
|
}
|
|
750
1699
|
}
|
|
1700
|
+
const vAlignElements = XMLParser_1.XMLParser.extractElements(sectPr, "w:vAlign");
|
|
1701
|
+
if (vAlignElements.length > 0) {
|
|
1702
|
+
const vAlign = vAlignElements[0];
|
|
1703
|
+
if (vAlign) {
|
|
1704
|
+
const val = XMLParser_1.XMLParser.extractAttribute(vAlign, "w:val");
|
|
1705
|
+
if (val) {
|
|
1706
|
+
sectionProps.verticalAlignment = val;
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
const paperSrcElements = XMLParser_1.XMLParser.extractElements(sectPr, "w:paperSrc");
|
|
1711
|
+
if (paperSrcElements.length > 0) {
|
|
1712
|
+
const paperSrc = paperSrcElements[0];
|
|
1713
|
+
if (paperSrc) {
|
|
1714
|
+
const first = XMLParser_1.XMLParser.extractAttribute(paperSrc, "w:first");
|
|
1715
|
+
const other = XMLParser_1.XMLParser.extractAttribute(paperSrc, "w:other");
|
|
1716
|
+
if (first || other) {
|
|
1717
|
+
sectionProps.paperSource = {
|
|
1718
|
+
first: first ? parseInt(first.toString(), 10) : undefined,
|
|
1719
|
+
other: other ? parseInt(other.toString(), 10) : undefined,
|
|
1720
|
+
};
|
|
1721
|
+
}
|
|
1722
|
+
}
|
|
1723
|
+
}
|
|
1724
|
+
const textDirElements = XMLParser_1.XMLParser.extractElements(sectPr, "w:textDirection");
|
|
1725
|
+
if (textDirElements.length > 0) {
|
|
1726
|
+
const textDir = textDirElements[0];
|
|
1727
|
+
if (textDir) {
|
|
1728
|
+
const val = XMLParser_1.XMLParser.extractAttribute(textDir, "w:val");
|
|
1729
|
+
if (val) {
|
|
1730
|
+
sectionProps.textDirection = val;
|
|
1731
|
+
}
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
751
1734
|
return new Section_1.Section(sectionProps);
|
|
752
1735
|
}
|
|
753
1736
|
catch (error) {
|
|
@@ -789,6 +1772,46 @@ class DocumentParser {
|
|
|
789
1772
|
if (rPrXml) {
|
|
790
1773
|
runFormatting = this.parseRunFormattingFromXml(rPrXml);
|
|
791
1774
|
}
|
|
1775
|
+
const qFormat = styleXml.includes("<w:qFormat/>") || styleXml.includes("<w:qFormat ");
|
|
1776
|
+
const semiHidden = styleXml.includes("<w:semiHidden/>") || styleXml.includes("<w:semiHidden ");
|
|
1777
|
+
const unhideWhenUsed = styleXml.includes("<w:unhideWhenUsed/>") || styleXml.includes("<w:unhideWhenUsed ");
|
|
1778
|
+
const locked = styleXml.includes("<w:locked/>") || styleXml.includes("<w:locked ");
|
|
1779
|
+
const personal = styleXml.includes("<w:personal/>") || styleXml.includes("<w:personal ");
|
|
1780
|
+
const autoRedefine = styleXml.includes("<w:autoRedefine/>") || styleXml.includes("<w:autoRedefine ");
|
|
1781
|
+
let uiPriority;
|
|
1782
|
+
if (styleXml.includes("<w:uiPriority")) {
|
|
1783
|
+
const uiPriorityStart = styleXml.indexOf("<w:uiPriority");
|
|
1784
|
+
const uiPriorityEnd = styleXml.indexOf("/>", uiPriorityStart);
|
|
1785
|
+
if (uiPriorityEnd !== -1) {
|
|
1786
|
+
const uiPriorityTag = styleXml.substring(uiPriorityStart, uiPriorityEnd + 2);
|
|
1787
|
+
const valStr = XMLParser_1.XMLParser.extractAttribute(uiPriorityTag, "w:val");
|
|
1788
|
+
if (valStr) {
|
|
1789
|
+
uiPriority = parseInt(valStr, 10);
|
|
1790
|
+
}
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
let link;
|
|
1794
|
+
if (styleXml.includes("<w:link")) {
|
|
1795
|
+
const linkStart = styleXml.indexOf("<w:link");
|
|
1796
|
+
const linkEnd = styleXml.indexOf("/>", linkStart);
|
|
1797
|
+
if (linkEnd !== -1) {
|
|
1798
|
+
const linkTag = styleXml.substring(linkStart, linkEnd + 2);
|
|
1799
|
+
link = XMLParser_1.XMLParser.extractAttribute(linkTag, "w:val") || undefined;
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
let aliases;
|
|
1803
|
+
if (styleXml.includes("<w:aliases")) {
|
|
1804
|
+
const aliasesStart = styleXml.indexOf("<w:aliases");
|
|
1805
|
+
const aliasesEnd = styleXml.indexOf("/>", aliasesStart);
|
|
1806
|
+
if (aliasesEnd !== -1) {
|
|
1807
|
+
const aliasesTag = styleXml.substring(aliasesStart, aliasesEnd + 2);
|
|
1808
|
+
aliases = XMLParser_1.XMLParser.extractAttribute(aliasesTag, "w:val") || undefined;
|
|
1809
|
+
}
|
|
1810
|
+
}
|
|
1811
|
+
let tableStyle;
|
|
1812
|
+
if (typeAttr === 'table') {
|
|
1813
|
+
tableStyle = this.parseTableStyleProperties(styleXml);
|
|
1814
|
+
}
|
|
792
1815
|
const properties = {
|
|
793
1816
|
styleId,
|
|
794
1817
|
name,
|
|
@@ -799,6 +1822,16 @@ class DocumentParser {
|
|
|
799
1822
|
customStyle: customStyleAttr === "1" || customStyleAttr === "true",
|
|
800
1823
|
paragraphFormatting,
|
|
801
1824
|
runFormatting,
|
|
1825
|
+
tableStyle,
|
|
1826
|
+
qFormat: qFormat || undefined,
|
|
1827
|
+
semiHidden: semiHidden || undefined,
|
|
1828
|
+
unhideWhenUsed: unhideWhenUsed || undefined,
|
|
1829
|
+
locked: locked || undefined,
|
|
1830
|
+
personal: personal || undefined,
|
|
1831
|
+
autoRedefine: autoRedefine || undefined,
|
|
1832
|
+
uiPriority,
|
|
1833
|
+
link,
|
|
1834
|
+
aliases,
|
|
802
1835
|
};
|
|
803
1836
|
return Style_1.Style.create(properties);
|
|
804
1837
|
}
|
|
@@ -873,7 +1906,7 @@ class DocumentParser {
|
|
|
873
1906
|
if (rPrXml.includes("<w:caps/>") || rPrXml.includes("<w:caps ")) {
|
|
874
1907
|
formatting.allCaps = true;
|
|
875
1908
|
}
|
|
876
|
-
const uElement = XMLParser_1.XMLParser.
|
|
1909
|
+
const uElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:u");
|
|
877
1910
|
if (uElement) {
|
|
878
1911
|
const uVal = XMLParser_1.XMLParser.extractAttribute(`<w:u${uElement}`, "w:val");
|
|
879
1912
|
if (uVal === "single" ||
|
|
@@ -887,7 +1920,7 @@ class DocumentParser {
|
|
|
887
1920
|
formatting.underline = true;
|
|
888
1921
|
}
|
|
889
1922
|
}
|
|
890
|
-
const vertAlignElement = XMLParser_1.XMLParser.
|
|
1923
|
+
const vertAlignElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:vertAlign");
|
|
891
1924
|
if (vertAlignElement) {
|
|
892
1925
|
const val = XMLParser_1.XMLParser.extractAttribute(`<w:vertAlign${vertAlignElement}`, "w:val");
|
|
893
1926
|
if (val === "subscript") {
|
|
@@ -897,28 +1930,28 @@ class DocumentParser {
|
|
|
897
1930
|
formatting.superscript = true;
|
|
898
1931
|
}
|
|
899
1932
|
}
|
|
900
|
-
const rFontsElement = XMLParser_1.XMLParser.
|
|
1933
|
+
const rFontsElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:rFonts");
|
|
901
1934
|
if (rFontsElement) {
|
|
902
1935
|
const ascii = XMLParser_1.XMLParser.extractAttribute(`<w:rFonts${rFontsElement}`, "w:ascii");
|
|
903
1936
|
if (ascii) {
|
|
904
1937
|
formatting.font = ascii;
|
|
905
1938
|
}
|
|
906
1939
|
}
|
|
907
|
-
const szElement = XMLParser_1.XMLParser.
|
|
1940
|
+
const szElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:sz");
|
|
908
1941
|
if (szElement) {
|
|
909
1942
|
const val = XMLParser_1.XMLParser.extractAttribute(`<w:sz${szElement}`, "w:val");
|
|
910
1943
|
if (val) {
|
|
911
1944
|
formatting.size = parseInt(val, 10) / 2;
|
|
912
1945
|
}
|
|
913
1946
|
}
|
|
914
|
-
const colorElement = XMLParser_1.XMLParser.
|
|
1947
|
+
const colorElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:color");
|
|
915
1948
|
if (colorElement) {
|
|
916
1949
|
const val = XMLParser_1.XMLParser.extractAttribute(`<w:color${colorElement}`, "w:val");
|
|
917
1950
|
if (val && val !== "auto") {
|
|
918
1951
|
formatting.color = val;
|
|
919
1952
|
}
|
|
920
1953
|
}
|
|
921
|
-
const highlightElement = XMLParser_1.XMLParser.
|
|
1954
|
+
const highlightElement = XMLParser_1.XMLParser.extractSelfClosingTag(rPrXml, "w:highlight");
|
|
922
1955
|
if (highlightElement) {
|
|
923
1956
|
const val = XMLParser_1.XMLParser.extractAttribute(`<w:highlight${highlightElement}`, "w:val");
|
|
924
1957
|
if (val) {
|
|
@@ -947,6 +1980,258 @@ class DocumentParser {
|
|
|
947
1980
|
}
|
|
948
1981
|
return formatting;
|
|
949
1982
|
}
|
|
1983
|
+
parseTableStyleProperties(styleXml) {
|
|
1984
|
+
const tableStyle = {};
|
|
1985
|
+
const tblPrXml = XMLParser_1.XMLParser.extractBetweenTags(styleXml, "<w:tblPr>", "</w:tblPr>");
|
|
1986
|
+
if (tblPrXml) {
|
|
1987
|
+
tableStyle.table = this.parseTableFormattingFromXml(tblPrXml);
|
|
1988
|
+
if (tblPrXml.includes("<w:tblStyleRowBandSize")) {
|
|
1989
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tblPrXml, "w:tblStyleRowBandSize");
|
|
1990
|
+
if (tag) {
|
|
1991
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:tblStyleRowBandSize${tag}`, "w:val");
|
|
1992
|
+
if (val) {
|
|
1993
|
+
tableStyle.rowBandSize = parseInt(val, 10);
|
|
1994
|
+
}
|
|
1995
|
+
}
|
|
1996
|
+
}
|
|
1997
|
+
if (tblPrXml.includes("<w:tblStyleColBandSize")) {
|
|
1998
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tblPrXml, "w:tblStyleColBandSize");
|
|
1999
|
+
if (tag) {
|
|
2000
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:tblStyleColBandSize${tag}`, "w:val");
|
|
2001
|
+
if (val) {
|
|
2002
|
+
tableStyle.colBandSize = parseInt(val, 10);
|
|
2003
|
+
}
|
|
2004
|
+
}
|
|
2005
|
+
}
|
|
2006
|
+
}
|
|
2007
|
+
const tcPrXml = XMLParser_1.XMLParser.extractBetweenTags(styleXml, "<w:tcPr>", "</w:tcPr>");
|
|
2008
|
+
if (tcPrXml) {
|
|
2009
|
+
tableStyle.cell = this.parseTableCellFormattingFromXml(tcPrXml);
|
|
2010
|
+
}
|
|
2011
|
+
const trPrXml = XMLParser_1.XMLParser.extractBetweenTags(styleXml, "<w:trPr>", "</w:trPr>");
|
|
2012
|
+
if (trPrXml) {
|
|
2013
|
+
tableStyle.row = this.parseTableRowFormattingFromXml(trPrXml);
|
|
2014
|
+
}
|
|
2015
|
+
tableStyle.conditionalFormatting = this.parseConditionalFormattingFromXml(styleXml);
|
|
2016
|
+
return tableStyle;
|
|
2017
|
+
}
|
|
2018
|
+
parseTableFormattingFromXml(tblPrXml) {
|
|
2019
|
+
const formatting = {};
|
|
2020
|
+
if (tblPrXml.includes("<w:tblInd")) {
|
|
2021
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tblPrXml, "w:tblInd");
|
|
2022
|
+
if (tag) {
|
|
2023
|
+
const w = XMLParser_1.XMLParser.extractAttribute(`<w:tblInd${tag}`, "w:w");
|
|
2024
|
+
if (w) {
|
|
2025
|
+
formatting.indent = parseInt(w, 10);
|
|
2026
|
+
}
|
|
2027
|
+
}
|
|
2028
|
+
}
|
|
2029
|
+
if (tblPrXml.includes("<w:jc")) {
|
|
2030
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tblPrXml, "w:jc");
|
|
2031
|
+
if (tag) {
|
|
2032
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:jc${tag}`, "w:val");
|
|
2033
|
+
if (val === 'left' || val === 'center' || val === 'right') {
|
|
2034
|
+
formatting.alignment = val;
|
|
2035
|
+
}
|
|
2036
|
+
}
|
|
2037
|
+
}
|
|
2038
|
+
if (tblPrXml.includes("<w:tblCellSpacing")) {
|
|
2039
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tblPrXml, "w:tblCellSpacing");
|
|
2040
|
+
if (tag) {
|
|
2041
|
+
const w = XMLParser_1.XMLParser.extractAttribute(`<w:tblCellSpacing${tag}`, "w:w");
|
|
2042
|
+
if (w) {
|
|
2043
|
+
formatting.cellSpacing = parseInt(w, 10);
|
|
2044
|
+
}
|
|
2045
|
+
}
|
|
2046
|
+
}
|
|
2047
|
+
const bordersXml = XMLParser_1.XMLParser.extractBetweenTags(tblPrXml, "<w:tblBorders>", "</w:tblBorders>");
|
|
2048
|
+
if (bordersXml) {
|
|
2049
|
+
formatting.borders = this.parseBordersFromXml(bordersXml, false);
|
|
2050
|
+
}
|
|
2051
|
+
if (tblPrXml.includes("<w:shd")) {
|
|
2052
|
+
formatting.shading = this.parseShadingFromXml(tblPrXml);
|
|
2053
|
+
}
|
|
2054
|
+
const marginXml = XMLParser_1.XMLParser.extractBetweenTags(tblPrXml, "<w:tblCellMar>", "</w:tblCellMar>");
|
|
2055
|
+
if (marginXml) {
|
|
2056
|
+
formatting.cellMargins = this.parseCellMarginsFromXml(marginXml);
|
|
2057
|
+
}
|
|
2058
|
+
return formatting;
|
|
2059
|
+
}
|
|
2060
|
+
parseTableCellFormattingFromXml(tcPrXml) {
|
|
2061
|
+
const formatting = {};
|
|
2062
|
+
const bordersXml = XMLParser_1.XMLParser.extractBetweenTags(tcPrXml, "<w:tcBorders>", "</w:tcBorders>");
|
|
2063
|
+
if (bordersXml) {
|
|
2064
|
+
formatting.borders = this.parseBordersFromXml(bordersXml, true);
|
|
2065
|
+
}
|
|
2066
|
+
if (tcPrXml.includes("<w:shd")) {
|
|
2067
|
+
formatting.shading = this.parseShadingFromXml(tcPrXml);
|
|
2068
|
+
}
|
|
2069
|
+
const marginXml = XMLParser_1.XMLParser.extractBetweenTags(tcPrXml, "<w:tcMar>", "</w:tcMar>");
|
|
2070
|
+
if (marginXml) {
|
|
2071
|
+
formatting.margins = this.parseCellMarginsFromXml(marginXml);
|
|
2072
|
+
}
|
|
2073
|
+
if (tcPrXml.includes("<w:vAlign")) {
|
|
2074
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(tcPrXml, "w:vAlign");
|
|
2075
|
+
if (tag) {
|
|
2076
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:vAlign${tag}`, "w:val");
|
|
2077
|
+
if (val === 'top' || val === 'center' || val === 'bottom') {
|
|
2078
|
+
formatting.verticalAlignment = val;
|
|
2079
|
+
}
|
|
2080
|
+
}
|
|
2081
|
+
}
|
|
2082
|
+
return formatting;
|
|
2083
|
+
}
|
|
2084
|
+
parseTableRowFormattingFromXml(trPrXml) {
|
|
2085
|
+
const formatting = {};
|
|
2086
|
+
if (trPrXml.includes("<w:trHeight")) {
|
|
2087
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(trPrXml, "w:trHeight");
|
|
2088
|
+
if (tag) {
|
|
2089
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:trHeight${tag}`, "w:val");
|
|
2090
|
+
const hRule = XMLParser_1.XMLParser.extractAttribute(`<w:trHeight${tag}`, "w:hRule");
|
|
2091
|
+
if (val) {
|
|
2092
|
+
formatting.height = parseInt(val, 10);
|
|
2093
|
+
}
|
|
2094
|
+
if (hRule === 'auto' || hRule === 'exact' || hRule === 'atLeast') {
|
|
2095
|
+
formatting.heightRule = hRule;
|
|
2096
|
+
}
|
|
2097
|
+
}
|
|
2098
|
+
}
|
|
2099
|
+
if (trPrXml.includes("<w:cantSplit/>") || trPrXml.includes("<w:cantSplit ")) {
|
|
2100
|
+
formatting.cantSplit = true;
|
|
2101
|
+
}
|
|
2102
|
+
if (trPrXml.includes("<w:tblHeader/>") || trPrXml.includes("<w:tblHeader ")) {
|
|
2103
|
+
formatting.isHeader = true;
|
|
2104
|
+
}
|
|
2105
|
+
return formatting;
|
|
2106
|
+
}
|
|
2107
|
+
parseConditionalFormattingFromXml(styleXml) {
|
|
2108
|
+
const conditionalFormatting = [];
|
|
2109
|
+
let searchFrom = 0;
|
|
2110
|
+
while (true) {
|
|
2111
|
+
const startIdx = styleXml.indexOf("<w:tblStylePr", searchFrom);
|
|
2112
|
+
if (startIdx === -1)
|
|
2113
|
+
break;
|
|
2114
|
+
const endIdx = styleXml.indexOf("</w:tblStylePr>", startIdx);
|
|
2115
|
+
if (endIdx === -1)
|
|
2116
|
+
break;
|
|
2117
|
+
const tblStylePrXml = styleXml.substring(startIdx, endIdx + 15);
|
|
2118
|
+
const typeAttr = XMLParser_1.XMLParser.extractAttribute(tblStylePrXml, "w:type");
|
|
2119
|
+
if (typeAttr) {
|
|
2120
|
+
const conditional = {
|
|
2121
|
+
type: typeAttr,
|
|
2122
|
+
};
|
|
2123
|
+
const pPrXml = XMLParser_1.XMLParser.extractBetweenTags(tblStylePrXml, "<w:pPr>", "</w:pPr>");
|
|
2124
|
+
if (pPrXml) {
|
|
2125
|
+
conditional.paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);
|
|
2126
|
+
}
|
|
2127
|
+
const rPrXml = XMLParser_1.XMLParser.extractBetweenTags(tblStylePrXml, "<w:rPr>", "</w:rPr>");
|
|
2128
|
+
if (rPrXml) {
|
|
2129
|
+
conditional.runFormatting = this.parseRunFormattingFromXml(rPrXml);
|
|
2130
|
+
}
|
|
2131
|
+
const tblPrXml = XMLParser_1.XMLParser.extractBetweenTags(tblStylePrXml, "<w:tblPr>", "</w:tblPr>");
|
|
2132
|
+
if (tblPrXml) {
|
|
2133
|
+
conditional.tableFormatting = this.parseTableFormattingFromXml(tblPrXml);
|
|
2134
|
+
}
|
|
2135
|
+
const tcPrXml = XMLParser_1.XMLParser.extractBetweenTags(tblStylePrXml, "<w:tcPr>", "</w:tcPr>");
|
|
2136
|
+
if (tcPrXml) {
|
|
2137
|
+
conditional.cellFormatting = this.parseTableCellFormattingFromXml(tcPrXml);
|
|
2138
|
+
}
|
|
2139
|
+
const trPrXml = XMLParser_1.XMLParser.extractBetweenTags(tblStylePrXml, "<w:trPr>", "</w:trPr>");
|
|
2140
|
+
if (trPrXml) {
|
|
2141
|
+
conditional.rowFormatting = this.parseTableRowFormattingFromXml(trPrXml);
|
|
2142
|
+
}
|
|
2143
|
+
conditionalFormatting.push(conditional);
|
|
2144
|
+
}
|
|
2145
|
+
searchFrom = endIdx + 15;
|
|
2146
|
+
}
|
|
2147
|
+
return conditionalFormatting.length > 0 ? conditionalFormatting : undefined;
|
|
2148
|
+
}
|
|
2149
|
+
parseBordersFromXml(bordersXml, includeDiagonals) {
|
|
2150
|
+
const borders = {};
|
|
2151
|
+
const borderTypes = ['top', 'bottom', 'left', 'right', 'insideH', 'insideV'];
|
|
2152
|
+
for (const type of borderTypes) {
|
|
2153
|
+
if (bordersXml.includes(`<w:${type}`)) {
|
|
2154
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);
|
|
2155
|
+
if (tag) {
|
|
2156
|
+
const style = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:val");
|
|
2157
|
+
const size = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:sz");
|
|
2158
|
+
const space = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:space");
|
|
2159
|
+
const color = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:color");
|
|
2160
|
+
const border = {};
|
|
2161
|
+
if (style)
|
|
2162
|
+
border.style = style;
|
|
2163
|
+
if (size)
|
|
2164
|
+
border.size = parseInt(size, 10);
|
|
2165
|
+
if (space)
|
|
2166
|
+
border.space = parseInt(space, 10);
|
|
2167
|
+
if (color)
|
|
2168
|
+
border.color = color;
|
|
2169
|
+
if (Object.keys(border).length > 0) {
|
|
2170
|
+
borders[type] = border;
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
}
|
|
2174
|
+
}
|
|
2175
|
+
if (includeDiagonals) {
|
|
2176
|
+
const diagonalTypes = ['tl2br', 'tr2bl'];
|
|
2177
|
+
for (const type of diagonalTypes) {
|
|
2178
|
+
if (bordersXml.includes(`<w:${type}`)) {
|
|
2179
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(bordersXml, `w:${type}`);
|
|
2180
|
+
if (tag) {
|
|
2181
|
+
const style = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:val");
|
|
2182
|
+
const size = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:sz");
|
|
2183
|
+
const space = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:space");
|
|
2184
|
+
const color = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:color");
|
|
2185
|
+
const border = {};
|
|
2186
|
+
if (style)
|
|
2187
|
+
border.style = style;
|
|
2188
|
+
if (size)
|
|
2189
|
+
border.size = parseInt(size, 10);
|
|
2190
|
+
if (space)
|
|
2191
|
+
border.space = parseInt(space, 10);
|
|
2192
|
+
if (color)
|
|
2193
|
+
border.color = color;
|
|
2194
|
+
if (Object.keys(border).length > 0) {
|
|
2195
|
+
borders[type] = border;
|
|
2196
|
+
}
|
|
2197
|
+
}
|
|
2198
|
+
}
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
return borders;
|
|
2202
|
+
}
|
|
2203
|
+
parseShadingFromXml(xml) {
|
|
2204
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(xml, "w:shd");
|
|
2205
|
+
if (!tag)
|
|
2206
|
+
return undefined;
|
|
2207
|
+
const shading = {};
|
|
2208
|
+
const val = XMLParser_1.XMLParser.extractAttribute(`<w:shd${tag}`, "w:val");
|
|
2209
|
+
const color = XMLParser_1.XMLParser.extractAttribute(`<w:shd${tag}`, "w:color");
|
|
2210
|
+
const fill = XMLParser_1.XMLParser.extractAttribute(`<w:shd${tag}`, "w:fill");
|
|
2211
|
+
if (val)
|
|
2212
|
+
shading.val = val;
|
|
2213
|
+
if (color)
|
|
2214
|
+
shading.color = color;
|
|
2215
|
+
if (fill)
|
|
2216
|
+
shading.fill = fill;
|
|
2217
|
+
return Object.keys(shading).length > 0 ? shading : undefined;
|
|
2218
|
+
}
|
|
2219
|
+
parseCellMarginsFromXml(marginXml) {
|
|
2220
|
+
const margins = {};
|
|
2221
|
+
const marginTypes = ['top', 'bottom', 'left', 'right'];
|
|
2222
|
+
for (const type of marginTypes) {
|
|
2223
|
+
if (marginXml.includes(`<w:${type}`)) {
|
|
2224
|
+
const tag = XMLParser_1.XMLParser.extractSelfClosingTag(marginXml, `w:${type}`);
|
|
2225
|
+
if (tag) {
|
|
2226
|
+
const w = XMLParser_1.XMLParser.extractAttribute(`<w:${type}${tag}`, "w:w");
|
|
2227
|
+
if (w) {
|
|
2228
|
+
margins[type] = parseInt(w, 10);
|
|
2229
|
+
}
|
|
2230
|
+
}
|
|
2231
|
+
}
|
|
2232
|
+
}
|
|
2233
|
+
return Object.keys(margins).length > 0 ? margins : undefined;
|
|
2234
|
+
}
|
|
950
2235
|
static getRawXml(zipHandler, partName) {
|
|
951
2236
|
try {
|
|
952
2237
|
const file = zipHandler.getFile(partName);
|