Compare commits
169 Commits
Author | SHA1 | Date | |
---|---|---|---|
3006f4d2c1 | |||
7f88a38219 | |||
a481518470 | |||
2435ebf16e | |||
62d0767ceb | |||
8024c01a82 | |||
1b380c3fdb | |||
06b67bd292 | |||
8a1087f601 | |||
ff09d6515c | |||
ebe85d8e14 | |||
5dc27ac46a | |||
1dcc8ee761 | |||
f789f60e22 | |||
32e3f07d57 | |||
9ea41ab3ce | |||
4b8d062862 | |||
d9408029f3 | |||
9fe0406078 | |||
3ea453a07f | |||
984e762a53 | |||
1592aa7117 | |||
62b4522c94 | |||
8b86751c95 | |||
afa380e336 | |||
feebff9077 | |||
028b50ff99 | |||
559e81c3fe | |||
4da6b98437 | |||
5b2409c76f | |||
ff027d172e | |||
3f23290a46 | |||
f1a10d32e6 | |||
a71f40e873 | |||
7f449319cd | |||
ab5c8ea698 | |||
68cfa9360b | |||
f627e3d994 | |||
7c870548d9 | |||
57ccc41547 | |||
988ba45197 | |||
df6606041b | |||
3ae27b466f | |||
69f5e21435 | |||
6da73c612a | |||
e1b1c1492f | |||
6ca13c4fce | |||
b474567d20 | |||
c07170902e | |||
0f201d2f4b | |||
b875d6f183 | |||
831b92239d | |||
66b91c22dd | |||
1242c0689f | |||
4386d02526 | |||
3ba521f8cc | |||
85bb818ae6 | |||
be7e2aa8fe | |||
7f71f6e3f1 | |||
a94d23e2ae | |||
133c255ce2 | |||
863e27ff9b | |||
5c63e6ae12 | |||
10dd36569d | |||
be5985fb6a | |||
0d7f169613 | |||
eaddcb83ab | |||
9a6885f124 | |||
7284ee818b | |||
20964454c4 | |||
d7670929d1 | |||
58f0761423 | |||
3f28bc09bc | |||
6efa734e81 | |||
47d64af737 | |||
4a2b91ce07 | |||
080a77cc73 | |||
9b874b0061 | |||
ff8a2ed538 | |||
251eafe103 | |||
64b604c9ac | |||
72fc5f9874 | |||
71dcdf0ca2 | |||
e23fc987a7 | |||
36dba1a36f | |||
1b1547d4b6 | |||
8008482592 | |||
6d1a7fe438 | |||
90c58b0498 | |||
c91bb71700 | |||
3d09c45205 | |||
f1e41d883c | |||
4f783ec8e4 | |||
3d35e84953 | |||
e80bc8b584 | |||
2848b39479 | |||
7ee9be200c | |||
94cdd740ad | |||
9130687164 | |||
2f52f47463 | |||
01866f4802 | |||
fa8ac0f2e4 | |||
e9a909ed20 | |||
8808447963 | |||
056b496189 | |||
11b374ea75 | |||
f8f9744786 | |||
6f6888d638 | |||
995430b76f | |||
d4a5ec4e14 | |||
c7dce059f8 | |||
2f4e3f2153 | |||
a37c5646b6 | |||
ddc9c8f62f | |||
1b06fc71cf | |||
e65a3bfeab | |||
b9ceabcc07 | |||
35be3bfb9b | |||
572c8efbc7 | |||
b1b3e2369b | |||
dc72bb629e | |||
a724706817 | |||
84989116ef | |||
6c4efe4a1c | |||
8596d70b79 | |||
db6c9b2700 | |||
a33602ccf6 | |||
988987ddbe | |||
309e66a6de | |||
7d8cfc0382 | |||
5cbae5d3f7 | |||
9b630c4ef7 | |||
befcbabe27 | |||
4cfb0ade88 | |||
a6f528537b | |||
dfc82a517d | |||
29f421686f | |||
c11299076f | |||
1cb2ef565e | |||
2de07d04a8 | |||
75e064dd1d | |||
5f0091ee25 | |||
d2c0e656d0 | |||
522b21862b | |||
ccf66dbd50 | |||
6e30ab0355 | |||
568c764e3c | |||
d508e8ae31 | |||
ded346e34a | |||
edb8eddce1 | |||
abd3641da4 | |||
7e1165d012 | |||
461754e591 | |||
e649330dbc | |||
baec324811 | |||
91c430d9e2 | |||
efd853d519 | |||
f717b0eae4 | |||
d76d21a1f2 | |||
712450d717 | |||
b9d93c9d33 | |||
c7ca51cd65 | |||
20b793620a | |||
9bed303d34 | |||
f4ed171f85 | |||
8a3ccdb196 | |||
41765d133f | |||
482ea1b186 | |||
3bba7f9d23 |
29
.github/workflows/demos.yml
vendored
29
.github/workflows/demos.yml
vendored
@ -688,4 +688,31 @@ jobs:
|
||||
uses: ChristophWurst/xmllint-action@v1
|
||||
with:
|
||||
xml-file: build/extracted-doc/word/document.xml
|
||||
xml-schema-file: ooxml-schemas/microsoft/wml-2010.xsd
|
||||
xml-schema-file: ooxml-schemas/microsoft/wml-2010.xsd
|
||||
- name: Run Demo
|
||||
run: npm run ts-node -- ./demo/72-word-wrap.ts
|
||||
- name: Extract Word Document
|
||||
run: npm run extract
|
||||
- name: Validate XML
|
||||
uses: ChristophWurst/xmllint-action@v1
|
||||
with:
|
||||
xml-file: build/extracted-doc/word/document.xml
|
||||
xml-schema-file: ooxml-schemas/microsoft/wml-2010.xsd
|
||||
- name: Run Demo
|
||||
run: npm run ts-node -- ./demo/73-comments.ts
|
||||
- name: Extract Word Document
|
||||
run: npm run extract
|
||||
- name: Validate XML
|
||||
uses: ChristophWurst/xmllint-action@v1
|
||||
with:
|
||||
xml-file: build/extracted-doc/word/document.xml
|
||||
xml-schema-file: ooxml-schemas/microsoft/wml-2010.xsd
|
||||
- name: Run Demo
|
||||
run: npm run ts-node -- ./demo/73-comments.ts
|
||||
- name: Extract Word Document
|
||||
run: npm run extract
|
||||
- name: Validate XML
|
||||
uses: ChristophWurst/xmllint-action@v1
|
||||
with:
|
||||
xml-file: build/extracted-doc/word/document.xml
|
||||
xml-schema-file: ooxml-schemas/microsoft/wml-2010.xsd
|
||||
|
8
.nycrc
8
.nycrc
@ -1,9 +1,9 @@
|
||||
{
|
||||
"check-coverage": true,
|
||||
"statements": 99.72,
|
||||
"branches": 97.95,
|
||||
"functions": 99.82,
|
||||
"lines": 99.71,
|
||||
"statements": 99.79,
|
||||
"branches": 98.41,
|
||||
"functions": 100,
|
||||
"lines": 99.73,
|
||||
"include": [
|
||||
"src/**/*.ts"
|
||||
],
|
||||
|
@ -29,11 +29,12 @@ Here are examples of `docx` being used with basic `HTML/JS` in a browser environ
|
||||
- https://codepen.io/dolanmiu/pen/RwNeObg
|
||||
- https://jsfiddle.net/dolanmiu/onadx1gu/
|
||||
|
||||
Here is an example of `docx` working in `Angular`:
|
||||
Here are examples of `docx` working in `Angular`:
|
||||
|
||||
- https://stackblitz.com/edit/angular-docx
|
||||
- https://stackblitz.com/edit/angular-wmd6k3
|
||||
|
||||
Here is an example of `docx` working in `React`:
|
||||
Here are examples of `docx` working in `React`:
|
||||
|
||||
- https://stackblitz.com/edit/react-docx
|
||||
- https://stackblitz.com/edit/react-docx-images (adding images to Word Document)
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Simple example to add text to a document
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
@ -14,9 +14,10 @@ const doc = new Document({
|
||||
new TextRun({
|
||||
text: "Foo Bar",
|
||||
bold: true,
|
||||
size: 40,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Generate a CV
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { AlignmentType, Document, HeadingLevel, Packer, Paragraph, TabStopPosition, TabStopType, TextRun } from "../build";
|
||||
import { AlignmentType, Document, HeadingLevel, Packer, Paragraph, Tab, TabStopPosition, TabStopType, TextRun } from "../build";
|
||||
|
||||
// tslint:disable:no-shadowed-variable
|
||||
|
||||
@ -284,7 +284,7 @@ class DocumentCreator {
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: `\t${dateText}`,
|
||||
children: [new Tab(), dateText],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Export to base64 string - Useful in a browser environment.
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
@ -15,7 +15,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tBar",
|
||||
children: [new Tab(), "Bar"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -82,6 +82,32 @@ const doc = new Document({
|
||||
spacing: { line: 276, before: 20 * 72 * 0.1, after: 20 * 72 * 0.05 },
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "strikeUnderline",
|
||||
name: "Strike Underline",
|
||||
basedOn: "Normal",
|
||||
quickFormat: true,
|
||||
run: {
|
||||
strike: true,
|
||||
underline: {
|
||||
type: UnderlineType.SINGLE,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
characterStyles: [
|
||||
{
|
||||
id: "strikeUnderlineCharacter",
|
||||
name: "Strike Underline",
|
||||
basedOn: "Normal",
|
||||
quickFormat: true,
|
||||
run: {
|
||||
strike: true,
|
||||
underline: {
|
||||
type: UnderlineType.SINGLE,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
numbering: {
|
||||
@ -169,6 +195,14 @@ const doc = new Document({
|
||||
new TextRun({
|
||||
text: "and back to normal.",
|
||||
}),
|
||||
new TextRun({
|
||||
text: "This text will be invisible!",
|
||||
vanish: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "This text will be VERY invisible! Word processors cannot override this!",
|
||||
specVanish: true,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
@ -182,6 +216,49 @@ const doc = new Document({
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
style: "strikeUnderline",
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Underline and Strike",
|
||||
}),
|
||||
new TextRun({
|
||||
text: " Override Underline ",
|
||||
underline: {
|
||||
type: UnderlineType.NONE,
|
||||
},
|
||||
}),
|
||||
new TextRun({
|
||||
text: "Strike and Underline",
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Hello World ",
|
||||
}),
|
||||
new TextRun({
|
||||
style: "strikeUnderlineCharacter",
|
||||
text: "Underline and Strike",
|
||||
}),
|
||||
new TextRun({
|
||||
text: " Another Hello World",
|
||||
}),
|
||||
new TextRun({
|
||||
scale: 50,
|
||||
text: " Scaled text",
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
scale: 200,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Scaled paragraph",
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Example of making content of section vertically aligned
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, VerticalAlign, TextRun } from "../build";
|
||||
import { Document, Packer, Paragraph, VerticalAlign, TextRun, Tab } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
@ -18,7 +18,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -25,6 +25,11 @@ const doc = new Document({
|
||||
width: 100,
|
||||
height: 100,
|
||||
},
|
||||
altText: {
|
||||
title: "This is an ultimate title",
|
||||
description: "This is an ultimate image",
|
||||
name: "My Ultimate Image",
|
||||
},
|
||||
}),
|
||||
],
|
||||
}),
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Change background colour of whole document
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
background: {
|
||||
@ -19,7 +19,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Example of how to change page borders
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, HeadingLevel, Packer, Paragraph, TextRun } from "../build";
|
||||
import { Document, HeadingLevel, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
@ -25,7 +25,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -12,6 +12,7 @@ import {
|
||||
PageNumber,
|
||||
Paragraph,
|
||||
ShadingType,
|
||||
Tab,
|
||||
TextRun,
|
||||
} from "../build";
|
||||
|
||||
@ -111,7 +112,7 @@ const doc = new Document({
|
||||
}),
|
||||
new TextRun({
|
||||
bold: true,
|
||||
children: ["\tuse Inserted and Deleted TextRuns.", new FootnoteReferenceRun(1)],
|
||||
children: [new Tab(), "use Inserted and Deleted TextRuns.", new FootnoteReferenceRun(1)],
|
||||
}),
|
||||
new TextRun({
|
||||
bold: true,
|
||||
|
@ -8,6 +8,7 @@ import {
|
||||
HorizontalPositionAlign,
|
||||
Packer,
|
||||
Paragraph,
|
||||
Tab,
|
||||
TextRun,
|
||||
VerticalPositionAlign,
|
||||
} from "../build";
|
||||
@ -67,7 +68,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -7,12 +7,31 @@ const doc = new Document({
|
||||
sections: [
|
||||
{
|
||||
children: [
|
||||
new Paragraph({
|
||||
wordWrap: true,
|
||||
children: [
|
||||
new TextRun("我今天遛狗去公园"),
|
||||
new TextRun({
|
||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
wordWrap: true,
|
||||
children: [
|
||||
new TextRun(
|
||||
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
|
||||
),
|
||||
new TextRun({
|
||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new Paragraph({
|
||||
children: [
|
||||
new TextRun("我今天遛狗去公园"),
|
||||
new TextRun({
|
||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||
space: SpaceType.PRESERVE,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
@ -23,7 +42,6 @@ const doc = new Document({
|
||||
),
|
||||
new TextRun({
|
||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||
space: SpaceType.PRESERVE,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Exporting the document as a stream
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
@ -16,7 +16,7 @@ const doc = new Document({
|
||||
bold: true,
|
||||
}),
|
||||
new TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
87
demo/76-compatibility.ts
Normal file
87
demo/76-compatibility.ts
Normal file
@ -0,0 +1,87 @@
|
||||
// Add compatibility options
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
compatibility: {
|
||||
useSingleBorderforContiguousCells: true,
|
||||
wordPerfectJustification: true,
|
||||
noTabStopForHangingIndent: true,
|
||||
noLeading: true,
|
||||
spaceForUnderline: true,
|
||||
noColumnBalance: true,
|
||||
balanceSingleByteDoubleByteWidth: true,
|
||||
noExtraLineSpacing: true,
|
||||
doNotLeaveBackslashAlone: true,
|
||||
underlineTrailingSpaces: true,
|
||||
doNotExpandShiftReturn: true,
|
||||
spacingInWholePoints: true,
|
||||
lineWrapLikeWord6: true,
|
||||
printBodyTextBeforeHeader: true,
|
||||
printColorsBlack: true,
|
||||
spaceWidth: true,
|
||||
showBreaksInFrames: true,
|
||||
subFontBySize: true,
|
||||
suppressBottomSpacing: true,
|
||||
suppressTopSpacing: true,
|
||||
suppressSpacingAtTopOfPage: true,
|
||||
suppressTopSpacingWP: true,
|
||||
suppressSpBfAfterPgBrk: true,
|
||||
swapBordersFacingPages: true,
|
||||
convertMailMergeEsc: true,
|
||||
truncateFontHeightsLikeWP6: true,
|
||||
macWordSmallCaps: true,
|
||||
usePrinterMetrics: true,
|
||||
doNotSuppressParagraphBorders: true,
|
||||
wrapTrailSpaces: true,
|
||||
footnoteLayoutLikeWW8: true,
|
||||
shapeLayoutLikeWW8: true,
|
||||
alignTablesRowByRow: true,
|
||||
forgetLastTabAlignment: true,
|
||||
adjustLineHeightInTable: true,
|
||||
autoSpaceLikeWord95: true,
|
||||
noSpaceRaiseLower: true,
|
||||
doNotUseHTMLParagraphAutoSpacing: true,
|
||||
layoutRawTableWidth: true,
|
||||
layoutTableRowsApart: true,
|
||||
useWord97LineBreakRules: true,
|
||||
doNotBreakWrappedTables: true,
|
||||
doNotSnapToGridInCell: true,
|
||||
selectFieldWithFirstOrLastCharacter: true,
|
||||
applyBreakingRules: true,
|
||||
doNotWrapTextWithPunctuation: true,
|
||||
doNotUseEastAsianBreakRules: true,
|
||||
useWord2002TableStyleRules: true,
|
||||
growAutofit: true,
|
||||
useFELayout: true,
|
||||
useNormalStyleForList: true,
|
||||
doNotUseIndentAsNumberingTabStop: true,
|
||||
useAlternateEastAsianLineBreakRules: true,
|
||||
allowSpaceOfSameStyleInTable: true,
|
||||
doNotSuppressIndentation: true,
|
||||
doNotAutofitConstrainedTables: true,
|
||||
autofitToFirstFixedWidthCell: true,
|
||||
underlineTabInNumberingList: true,
|
||||
displayHangulFixedWidth: true,
|
||||
splitPgBreakAndParaMark: true,
|
||||
doNotVerticallyAlignCellWithSp: true,
|
||||
doNotBreakConstrainedForcedTable: true,
|
||||
ignoreVerticalAlignmentInTextboxes: true,
|
||||
useAnsiKerningPairs: true,
|
||||
cachedColumnBalance: true,
|
||||
},
|
||||
sections: [
|
||||
{
|
||||
children: [
|
||||
new Paragraph({
|
||||
children: [new TextRun("Hello World")],
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
Packer.toBuffer(doc).then((buffer) => {
|
||||
fs.writeFileSync("My Document.docx", buffer);
|
||||
});
|
116
demo/77-side-by-side-tables.ts
Normal file
116
demo/77-side-by-side-tables.ts
Normal file
@ -0,0 +1,116 @@
|
||||
// Exporting the document as a stream
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { Document, Packer, Paragraph, Table, TableBorders, TableCell, TableRow, WidthType } from "../build";
|
||||
|
||||
const table1 = new Table({
|
||||
columnWidths: [3505, 5505],
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 3505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [new Paragraph("Hello")],
|
||||
}),
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 5505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 3505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [],
|
||||
}),
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 5505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [new Paragraph("World")],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
const table2 = new Table({
|
||||
columnWidths: [3505, 5505],
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 3505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [new Paragraph("Foo")],
|
||||
}),
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 5505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 3505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [],
|
||||
}),
|
||||
new TableCell({
|
||||
width: {
|
||||
size: 5505,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
children: [new Paragraph("Bar")],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
const noBorderTable = new Table({
|
||||
borders: TableBorders.NONE,
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
children: [table1],
|
||||
}),
|
||||
new TableCell({
|
||||
children: [table2],
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
});
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
{
|
||||
properties: {},
|
||||
children: [noBorderTable],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
const stream = Packer.toStream(doc);
|
||||
stream.pipe(fs.createWriteStream("My Document.docx"));
|
27
demo/78-thai-distributed.ts
Normal file
27
demo/78-thai-distributed.ts
Normal file
@ -0,0 +1,27 @@
|
||||
// Simple example to add text to a document
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { AlignmentType, Document, Packer, Paragraph, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
{
|
||||
properties: {},
|
||||
children: [
|
||||
new Paragraph({
|
||||
alignment: AlignmentType.THAI_DISTRIBUTE,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "บริษัท บิสกิด จำกัด (บริษัทฯ) ได้จดทะเบียนจัดตั้งขึ้นเป็นบริษัทจำกัดตามประมวลกฎหมายแพ่งและพาณิชย์ของประเทศไทย เมื่อวันที่ 30 พฤษภาคม 2561 ทะเบียนนิติบุคคลเลขที่ 0845561005665",
|
||||
size: 36,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
Packer.toBuffer(doc).then((buffer) => {
|
||||
fs.writeFileSync("My Document.docx", buffer);
|
||||
});
|
193
demo/79-table-from-data-source.ts
Normal file
193
demo/79-table-from-data-source.ts
Normal file
@ -0,0 +1,193 @@
|
||||
// Example of how you would create a table and add data to it from a data source
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import {
|
||||
Document,
|
||||
HeadingLevel,
|
||||
Packer,
|
||||
Paragraph,
|
||||
Table,
|
||||
TableCell,
|
||||
TableRow,
|
||||
VerticalAlign,
|
||||
TextDirection,
|
||||
TextRun,
|
||||
WidthType,
|
||||
} from "../build";
|
||||
|
||||
interface StockPrice {
|
||||
readonly date: Date;
|
||||
readonly ticker: string;
|
||||
readonly price: number;
|
||||
}
|
||||
|
||||
const DATA: StockPrice[] = [
|
||||
{
|
||||
date: new Date("2007-08-28"),
|
||||
ticker: "Apple",
|
||||
price: 18.12,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-08-29"),
|
||||
ticker: "Apple",
|
||||
price: 19.15,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-08-30"),
|
||||
ticker: "Apple",
|
||||
price: 19.46,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-08-31"),
|
||||
ticker: "Apple",
|
||||
price: 19.78,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-04"),
|
||||
ticker: "Apple",
|
||||
price: 20.59,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-05"),
|
||||
ticker: "Apple",
|
||||
price: 19.54,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-06"),
|
||||
ticker: "Apple",
|
||||
price: 19.29,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-07"),
|
||||
ticker: "Apple",
|
||||
price: 18.82,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-10"),
|
||||
ticker: "Apple",
|
||||
price: 19.53,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-11"),
|
||||
ticker: "Apple",
|
||||
price: 19.36,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-12"),
|
||||
ticker: "Apple",
|
||||
price: 19.55,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-13"),
|
||||
ticker: "Apple",
|
||||
price: 19.6,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-14"),
|
||||
ticker: "Apple",
|
||||
price: 19.83,
|
||||
},
|
||||
{
|
||||
date: new Date("2007-09-17"),
|
||||
ticker: "Apple",
|
||||
price: 19.77,
|
||||
},
|
||||
];
|
||||
|
||||
const generateRows = (prices: StockPrice[]): TableRow[] =>
|
||||
prices.map(
|
||||
({ date, ticker, price }) =>
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
children: [new Paragraph(date.toString())],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.LEFT_TO_RIGHT_TOP_TO_BOTTOM,
|
||||
}),
|
||||
new TableCell({
|
||||
children: [new Paragraph(ticker)],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.LEFT_TO_RIGHT_TOP_TO_BOTTOM,
|
||||
}),
|
||||
new TableCell({
|
||||
children: [new Paragraph(price.toString())],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.TOP_TO_BOTTOM_RIGHT_TO_LEFT,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
);
|
||||
|
||||
const doc = new Document({
|
||||
sections: [
|
||||
{
|
||||
children: [
|
||||
new Table({
|
||||
width: {
|
||||
size: 9070,
|
||||
type: WidthType.DXA,
|
||||
},
|
||||
rows: [
|
||||
new TableRow({
|
||||
children: [
|
||||
new TableCell({
|
||||
children: [
|
||||
new Paragraph({
|
||||
heading: HeadingLevel.HEADING_2,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Date",
|
||||
bold: true,
|
||||
size: 40,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.LEFT_TO_RIGHT_TOP_TO_BOTTOM,
|
||||
}),
|
||||
new TableCell({
|
||||
children: [
|
||||
new Paragraph({
|
||||
heading: HeadingLevel.HEADING_2,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Ticker",
|
||||
bold: true,
|
||||
size: 40,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.LEFT_TO_RIGHT_TOP_TO_BOTTOM,
|
||||
}),
|
||||
new TableCell({
|
||||
children: [
|
||||
new Paragraph({
|
||||
heading: HeadingLevel.HEADING_2,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "Price",
|
||||
bold: true,
|
||||
size: 40,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
verticalAlign: VerticalAlign.CENTER,
|
||||
textDirection: TextDirection.TOP_TO_BOTTOM_RIGHT_TO_LEFT,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
...generateRows(DATA),
|
||||
],
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
Packer.toBuffer(doc).then((buffer) => {
|
||||
fs.writeFileSync("My Document.docx", buffer);
|
||||
});
|
49
demo/79-thai-distributed.ts
Normal file
49
demo/79-thai-distributed.ts
Normal file
@ -0,0 +1,49 @@
|
||||
// Simple example to add text to a document
|
||||
// Import from 'docx' rather than '../build' if you install from npm
|
||||
import * as fs from "fs";
|
||||
import { AlignmentType, convertMillimetersToTwip, Document, Packer, Paragraph, TextRun } from "../build";
|
||||
|
||||
const doc = new Document({
|
||||
styles: {
|
||||
paragraphStyles: [
|
||||
{
|
||||
id: "test",
|
||||
name: "Test",
|
||||
basedOn: "Normal",
|
||||
next: "Normal",
|
||||
paragraph: {
|
||||
indent: { left: convertMillimetersToTwip(6.4) },
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
sections: [
|
||||
{
|
||||
properties: {
|
||||
page: {
|
||||
margin: {
|
||||
top: 0,
|
||||
right: convertMillimetersToTwip(24),
|
||||
bottom: convertMillimetersToTwip(24),
|
||||
left: convertMillimetersToTwip(24),
|
||||
},
|
||||
},
|
||||
},
|
||||
children: [
|
||||
new Paragraph({
|
||||
alignment: AlignmentType.THAI_DISTRIBUTE,
|
||||
children: [
|
||||
new TextRun({
|
||||
text: "บริษัทฯ มีเงินสด 41,985.00 บาท และ 25,855.66 บาทตามลำดับ เงินสดทั้งจำนวนอยู่ในความดูแลและรับผิดชอบของกรรมการ บริษัทฯบันทึกการรับชำระเงินและการจ่ายชำระเงินผ่านบัญชีเงินสดเพียงเท่านั้น ซึ่งอาจกระทบต่อความถูกต้องครบถ้วนของการบันทึกบัญชี ทั้งนี้ขึ้นอยู่กับระบบการควบคุมภายในของบริษัท",
|
||||
size: 28,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
Packer.toBuffer(doc).then((buffer) => {
|
||||
fs.writeFileSync("My Document.docx", buffer);
|
||||
});
|
@ -24,7 +24,7 @@
|
||||
bold: true,
|
||||
}),
|
||||
new docx.TextRun({
|
||||
text: "\tGithub is the best",
|
||||
children: [new docx.Tab(), "Github is the best"],
|
||||
bold: true,
|
||||
}),
|
||||
],
|
||||
|
@ -11,8 +11,10 @@
|
||||
- [Document](usage/document.md)
|
||||
- [Sections](usage/sections.md)
|
||||
- [Paragraph](usage/paragraph.md)
|
||||
- [Text Frames](usage/text-frames.md)
|
||||
- [Symbols](usage/symbols.md)
|
||||
- [Text](usage/text.md)
|
||||
- [Image](usage/images.md)
|
||||
- [Images](usage/images.md)
|
||||
- [Headers & Footers](usage/headers-and-footers.md)
|
||||
- [Bullet Points](usage/bullet-points.md)
|
||||
- [Hyperlinks](usage/hyperlinks.md)
|
||||
@ -23,10 +25,12 @@
|
||||
- [Page Numbers](usage/page-numbers.md)
|
||||
- [Change Tracking](usage/change-tracking.md)
|
||||
- [Math](usage/math.md)
|
||||
- [Text Frames](usage/text-frames.md)
|
||||
- [Comments](usage/comments.md)
|
||||
- [Footnotes](usage/footnotes.md)
|
||||
- [Fields](usage/fields.md)
|
||||
- Styling
|
||||
_ [Styling with JS](usage/styling-with-js.md)
|
||||
_ [Styling with XML](usage/styling-with-xml.md)
|
||||
- [Styling with JS](usage/styling-with-js.md)
|
||||
- [Styling with XML](usage/styling-with-xml.md)
|
||||
|
||||
- Exporting
|
||||
|
||||
|
@ -22,20 +22,19 @@ const doc = new docx.Document({
|
||||
|
||||
### Full list of options:
|
||||
|
||||
|
||||
* creator
|
||||
* description
|
||||
* title
|
||||
* subject
|
||||
* keywords
|
||||
* lastModifiedBy
|
||||
* revision
|
||||
* externalStyles
|
||||
* styles
|
||||
* numbering
|
||||
* footnotes
|
||||
* hyperlinks
|
||||
* background
|
||||
- creator
|
||||
- description
|
||||
- title
|
||||
- subject
|
||||
- keywords
|
||||
- lastModifiedBy
|
||||
- revision
|
||||
- externalStyles
|
||||
- styles
|
||||
- numbering
|
||||
- footnotes
|
||||
- hyperlinks
|
||||
- background
|
||||
|
||||
### Change background color of Document
|
||||
|
||||
@ -55,3 +54,87 @@ You can mix and match whatever properties you want, or provide no properties.
|
||||
|
||||
Various parts of the API require positioning arguments. The units are "20ths of a point" from the [OOXML](http://officeopenxml.com/index.php) specification.
|
||||
See [Lars Corneliussen's blog post](https://startbigthinksmall.wordpress.com/2010/01/04/points-inches-and-emus-measuring-units-in-office-open-xml/) for more information and how to convert units.
|
||||
|
||||
## Compatibility
|
||||
|
||||
Compatibility Settings are optional settings used to preserve visual fidelity of documents created in earlier word processing applications. Some of these settings provide ability for specific behaviors, described in detail below; and others simply instruct applications to mimic the behavior of an existing word processing application.
|
||||
|
||||
```ts
|
||||
const doc = new docx.Document({
|
||||
compatibility: {
|
||||
version: 15,
|
||||
doNotExpandShiftReturn: true,
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Compatibility Options
|
||||
|
||||
| Property | Type | Notes | Possible Values |
|
||||
| ----------------------------------- | --------- | -------- | ---------------------------- |
|
||||
| version | `number` | Optional | `15`, `16`, `17` |
|
||||
| useSingleBorderforContiguousCells | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| wordPerfectJustification | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| noTabStopForHangingIndent | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| noLeading | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| spaceForUnderline | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| noColumnBalance | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| balanceSingleByteDoubleByteWidth | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| noExtraLineSpacing | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotLeaveBackslashAlone | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| underlineTrailingSpaces | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotExpandShiftReturn | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| spacingInWholePoints | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| lineWrapLikeWord6 | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| printBodyTextBeforeHeader | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| printColorsBlack | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| spaceWidth | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| showBreaksInFrames | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| subFontBySize | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| suppressBottomSpacing | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| suppressTopSpacing | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| suppressSpacingAtTopOfPage | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| suppressTopSpacingWP | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| suppressSpBfAfterPgBrk | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| swapBordersFacingPages | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| convertMailMergeEsc | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| truncateFontHeightsLikeWP6 | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| macWordSmallCaps | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| usePrinterMetrics | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotSuppressParagraphBorders | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| wrapTrailSpaces | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| footnoteLayoutLikeWW8 | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| shapeLayoutLikeWW8 | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| alignTablesRowByRow | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| forgetLastTabAlignment | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| adjustLineHeightInTable | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| autoSpaceLikeWord95 | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| noSpaceRaiseLower | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotUseHTMLParagraphAutoSpacing | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| layoutRawTableWidth | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| layoutTableRowsApart | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useWord97LineBreakRules | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotBreakWrappedTables | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotSnapToGridInCell | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| selectFieldWithFirstOrLastCharacter | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| applyBreakingRules | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotWrapTextWithPunctuation | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotUseEastAsianBreakRules | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useWord2002TableStyleRules | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| growAutofit | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useFELayout | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useNormalStyleForList | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotUseIndentAsNumberingTabStop | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useAlternateEastAsianLineBreakRules | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| allowSpaceOfSameStyleInTable | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotSuppressIndentation | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotAutofitConstrainedTables | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| autofitToFirstFixedWidthCell | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| underlineTabInNumberingList | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| displayHangulFixedWidth | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| splitPgBreakAndParaMark | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotVerticallyAlignCellWithSp | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| doNotBreakConstrainedForcedTable | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| ignoreVerticalAlignmentInTextboxes | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| useAnsiKerningPairs | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
| cachedColumnBalance | `boolean` | Optional | `true`, `false`, `undefined` |
|
||||
|
@ -252,13 +252,36 @@ const image = new ImageRun({
|
||||
});
|
||||
```
|
||||
|
||||
## Alternative Text
|
||||
|
||||
Specifies common non-visual DrawingML properties. A name, title and description for a picture can be specified.
|
||||
|
||||
```ts
|
||||
const image = new ImageRun({
|
||||
data: fs.readFileSync("./demo/images/pizza.gif"),
|
||||
altText: {
|
||||
title: "This is an ultimate title",
|
||||
description: "This is an ultimate image",
|
||||
name: "My Ultimate Image",
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Options
|
||||
|
||||
| Property | Type | Notes | Possible Values |
|
||||
| ----------- | -------- | -------- | ------------------------------------ |
|
||||
| name | `string` | Required | `Specimen A` |
|
||||
| title | `string` | Required | `My awesome title of my image` |
|
||||
| description | `string` | Required | `My awesome description of my image` |
|
||||
|
||||
## Examples
|
||||
|
||||
### Add image to the document
|
||||
|
||||
Importing Images from file system path
|
||||
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/5-images.ts ':include')
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/5-images.ts ":include")
|
||||
|
||||
_Source: https://github.com/dolanmiu/docx/blob/master/demo/5-images.ts_
|
||||
|
||||
@ -266,7 +289,7 @@ _Source: https://github.com/dolanmiu/docx/blob/master/demo/5-images.ts_
|
||||
|
||||
Example showing how to add image to headers and footers
|
||||
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/9-images-in-header-and-footer.ts ':include')
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/9-images-in-header-and-footer.ts ":include")
|
||||
|
||||
_Source: https://github.com/dolanmiu/docx/blob/master/demo/9-images-in-header-and-footer.ts_
|
||||
|
||||
@ -274,6 +297,6 @@ _Source: https://github.com/dolanmiu/docx/blob/master/demo/9-images-in-header-an
|
||||
|
||||
Example showing how to float images on top of text and optimally give a `margin`
|
||||
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/38-text-wrapping.ts ':include')
|
||||
[Example](https://raw.githubusercontent.com/dolanmiu/docx/master/demo/38-text-wrapping.ts ":include")
|
||||
|
||||
_Source: https://github.com/dolanmiu/docx/blob/master/demo/38-text-wrapping.ts_
|
||||
|
@ -60,29 +60,29 @@ const doc = new Document({
|
||||
|
||||
This is the list of options for a paragraph. A detailed explanation is below:
|
||||
|
||||
| Property | Type | Mandatory? | Possible Values |
|
||||
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------------- |
|
||||
| [text](#text) | `string` | Optional | |
|
||||
| [heading](#heading) | `HeadingLevel` | Optional | `HEADING_1`, `HEADING_2`, `HEADING_3`, `HEADING_4`, `HEADING_5`, `HEADING_6`, `TITLE` |
|
||||
| [border](#border) | `IBorderOptions` | Optional | `top`, `bottom`, `left`, `right`. Each of these are of type IBorderPropertyOptions. Click here for Example |
|
||||
| [spacing](#spacing) | `ISpacingProperties` | Optional | See below for ISpacingProperties |
|
||||
| [outlineLevel](#outline-level) | `number` | Optional | |
|
||||
| alignment | `AlignmentType` | Optional | |
|
||||
| heading | `HeadingLevel` | Optional | |
|
||||
| bidirectional | `boolean` | Optional | |
|
||||
| thematicBreak | `boolean` | Optional | |
|
||||
| pageBreakBefore | `boolean` | Optional | |
|
||||
| contextualSpacing | `boolean` | Optional | |
|
||||
| indent | `IIndentAttributesProperties` | Optional | |
|
||||
| keepLines | `boolean` | Optional | |
|
||||
| keepNext | `boolean` | Optional | |
|
||||
| children | `(TextRun or ImageRun or Hyperlink)[]` | Optional | |
|
||||
| style | `string` | Optional | |
|
||||
| [tabStop](usage/tab-stops) | `{ left?: ITabStopOptions; right?: ITabStopOptions; maxRight?: { leader: LeaderType; }; center?: ITabStopOptions }` | Optional | |
|
||||
| [bullet](usage/bullet-points) | `{ level: number }` | Optional | |
|
||||
| [numbering](usage/numbering) | `{ num: ConcreteNumbering; level: number; custom?: boolean }` | Optional | |
|
||||
| [widowControl](#widow-control) | `boolean` | Optional | |
|
||||
| [frame](usage/text-frames.md) | `IFrameOptions` | Optional | |
|
||||
| Property | Type | Mandatory? | Possible Values |
|
||||
| ------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [text](#text) | `string` | Optional | |
|
||||
| [heading](#heading) | `HeadingLevel` | Optional | `HEADING_1`, `HEADING_2`, `HEADING_3`, `HEADING_4`, `HEADING_5`, `HEADING_6`, `TITLE` |
|
||||
| [border](#border) | `IBorderOptions` | Optional | `top`, `bottom`, `left`, `right`. Each of these are of type IBorderPropertyOptions. Click here for Example |
|
||||
| [spacing](#spacing) | `ISpacingProperties` | Optional | See below for ISpacingProperties |
|
||||
| [outlineLevel](#outline-level) | `number` | Optional | |
|
||||
| alignment | `AlignmentType` | Optional | `START`, `CENTER`, `END`, `BOTH`, `MEDIUM_KASHIDA`, `DISTRIBUTE`, `NUM_TAB`, `HIGH_KASHIDA`, `LOW_KASHIDA`, `THAI_DISTRIBUTE`, `LEFT`, `RIGHT`, `JUSTIFIED` |
|
||||
| heading | `HeadingLevel` | Optional | |
|
||||
| bidirectional | `boolean` | Optional | |
|
||||
| thematicBreak | `boolean` | Optional | |
|
||||
| pageBreakBefore | `boolean` | Optional | |
|
||||
| contextualSpacing | `boolean` | Optional | |
|
||||
| indent | `IIndentAttributesProperties` | Optional | |
|
||||
| keepLines | `boolean` | Optional | |
|
||||
| keepNext | `boolean` | Optional | |
|
||||
| children | `(TextRun or ImageRun or Hyperlink)[]` | Optional | |
|
||||
| style | `string` | Optional | |
|
||||
| [tabStop](usage/tab-stops) | `{ left?: ITabStopOptions; right?: ITabStopOptions; maxRight?: { leader: LeaderType; }; center?: ITabStopOptions }` | Optional | |
|
||||
| [bullet](usage/bullet-points) | `{ level: number }` | Optional | |
|
||||
| [numbering](usage/numbering) | `{ num: ConcreteNumbering; level: number; custom?: boolean }` | Optional | |
|
||||
| [widowControl](#widow-control) | `boolean` | Optional | |
|
||||
| [frame](usage/text-frames.md) | `IFrameOptions` | Optional | |
|
||||
|
||||
## Text
|
||||
|
||||
@ -180,12 +180,14 @@ Adding spacing between paragraphs
|
||||
|
||||
### ISpacingProperties
|
||||
|
||||
| Property | Type | Notes | Possible Values |
|
||||
| -------- | -------------- | -------- | ----------------------------- |
|
||||
| after | `number` | Optional | |
|
||||
| before | `number` | Optional | |
|
||||
| line | `number` | Optional | |
|
||||
| lineRule | `LineRuleType` | Optional | `AT_LEAST`, `EXACTLY`, `AUTO` |
|
||||
| Property | Type | Notes | Possible Values |
|
||||
| -------- | -------------- | -------- | -------------------------------------- |
|
||||
| after | `number` | Optional | |
|
||||
| before | `number` | Optional | |
|
||||
| line | `number` | Optional | |
|
||||
| lineRule | `LineRuleType` | Optional | `AT_LEAST`, `EXACTLY`, `EXACT`, `AUTO` |
|
||||
|
||||
Note: The `lineRule` property has different values depending on the version of Word you are using. The `EXACTLY` value is only available in Word 2016 and above. Use `EXACT` for greater support, including LibreOffice etc. Read this issue for more information: https://github.com/dolanmiu/docx/issues/1773.
|
||||
|
||||
**Example:**
|
||||
|
||||
|
@ -151,6 +151,28 @@ const text = new TextRun({
|
||||
});
|
||||
```
|
||||
|
||||
### Vanish and SpecVanish
|
||||
|
||||
You may want to hide your text in your document.
|
||||
|
||||
`Vanish` should affect the normal display of text, but an application may have settings to force hidden text to be displayed.
|
||||
|
||||
```ts
|
||||
const text = new TextRun({
|
||||
text: "This text will be hidden",
|
||||
vanish: true,
|
||||
});
|
||||
```
|
||||
|
||||
`SpecVanish` was typically used to ensure that a paragraph style can be applied to a part of a paragraph, and still appear as in the Table of Contents (which in previous word processors would ignore the use of the style if it were being used as a character style).
|
||||
|
||||
```ts
|
||||
const text = new TextRun({
|
||||
text: "This text will be hidden forever.",
|
||||
specVanish: true,
|
||||
});
|
||||
```
|
||||
|
||||
## Break
|
||||
|
||||
Sometimes you would want to put text underneath another line of text but inside the same paragraph.
|
||||
|
3186
package-lock.json
generated
3186
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
12
package.json
12
package.json
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "docx",
|
||||
"version": "7.6.0",
|
||||
"version": "7.8.2",
|
||||
"description": "Easily generate .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.",
|
||||
"main": "build/index.js",
|
||||
"scripts": {
|
||||
@ -75,7 +75,7 @@
|
||||
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
||||
"@typescript-eslint/parser": "^5.36.1",
|
||||
"buffer": "^6.0.3",
|
||||
"chai": "^3.5.0",
|
||||
"chai": "^4.3.6",
|
||||
"cspell": "^6.2.2",
|
||||
"docsify-cli": "^4.3.0",
|
||||
"eslint": "^8.23.0",
|
||||
@ -84,7 +84,7 @@
|
||||
"eslint-plugin-jsdoc": "^39.3.6",
|
||||
"eslint-plugin-no-null": "^1.0.2",
|
||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||
"eslint-plugin-unicorn": "^44.0.0",
|
||||
"eslint-plugin-unicorn": "^45.0.0",
|
||||
"glob": "^8.0.1",
|
||||
"jszip": "^3.1.5",
|
||||
"mocha": "^10.0.0",
|
||||
@ -98,17 +98,17 @@
|
||||
"request-promise": "^4.2.2",
|
||||
"rimraf": "^3.0.2",
|
||||
"shelljs": "^0.8.4",
|
||||
"sinon": "^14.0.0",
|
||||
"sinon": "^15.0.0",
|
||||
"stream-browserify": "^3.0.0",
|
||||
"ts-loader": "^9.0.0",
|
||||
"ts-node": "^10.2.1",
|
||||
"tsconfig-paths": "^4.0.0",
|
||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||
"typedoc": "^0.23.2",
|
||||
"typescript": "4.8.4",
|
||||
"typescript": "4.9.4",
|
||||
"unzipper": "^0.10.11",
|
||||
"webpack": "^5.28.0",
|
||||
"webpack-cli": "^4.6.0"
|
||||
"webpack-cli": "^5.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { ICommentsOptions } from "@file/paragraph/run/comment-run";
|
||||
import { ICompatibilityOptions } from "@file/settings/compatibility";
|
||||
import { StringContainer, XmlComponent } from "@file/xml-components";
|
||||
import { dateTimeValue } from "@util/values";
|
||||
|
||||
@ -35,6 +36,7 @@ export interface IPropertiesOptions {
|
||||
readonly updateFields?: boolean;
|
||||
};
|
||||
readonly compatabilityModeVersion?: number;
|
||||
readonly compatibility?: ICompatibilityOptions;
|
||||
readonly customProperties?: readonly ICustomPropertyOptions[];
|
||||
readonly evenAndOddHeaderAndFooters?: boolean;
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ export class PageBorders extends IgnoreIfEmptyXmlComponent {
|
||||
super("w:pgBorders");
|
||||
|
||||
if (!options) {
|
||||
return;
|
||||
return this;
|
||||
}
|
||||
|
||||
if (options.pageBorders) {
|
||||
|
@ -8,7 +8,7 @@ import { DocumentAttributes } from "./document-attributes";
|
||||
import { DocumentBackground, IDocumentBackgroundOptions } from "./document-background";
|
||||
|
||||
export interface IDocumentOptions {
|
||||
readonly background: IDocumentBackgroundOptions;
|
||||
readonly background?: IDocumentBackgroundOptions;
|
||||
}
|
||||
|
||||
// <xsd:element name="document" type="CT_Document"/>
|
||||
@ -73,7 +73,9 @@ export class Document extends XmlComponent {
|
||||
}),
|
||||
);
|
||||
this.body = new Body();
|
||||
this.root.push(new DocumentBackground(options.background));
|
||||
if (options.background) {
|
||||
this.root.push(new DocumentBackground(options.background));
|
||||
}
|
||||
this.root.push(this.body);
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,8 @@
|
||||
import { assert } from "chai";
|
||||
import { assert, expect } from "chai";
|
||||
import { SinonStub, stub } from "sinon";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
import * as convenienceFunctions from "@util/convenience-functions";
|
||||
|
||||
import { Utility } from "tests/utility";
|
||||
|
||||
@ -36,6 +40,14 @@ const createAnchor = (drawingOptions: IDrawingOptions): Anchor =>
|
||||
);
|
||||
|
||||
describe("Anchor", () => {
|
||||
before(() => {
|
||||
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||
});
|
||||
|
||||
let anchor: Anchor;
|
||||
|
||||
describe("#constructor()", () => {
|
||||
@ -362,5 +374,236 @@ describe("Anchor", () => {
|
||||
relativeHeight: 120,
|
||||
});
|
||||
});
|
||||
|
||||
it("should create a Drawing with doc properties", () => {
|
||||
anchor = createAnchor({
|
||||
floating: {
|
||||
verticalPosition: {
|
||||
offset: 0,
|
||||
},
|
||||
horizontalPosition: {
|
||||
offset: 0,
|
||||
},
|
||||
zIndex: 120,
|
||||
},
|
||||
docProperties: {
|
||||
name: "test",
|
||||
description: "test",
|
||||
title: "test",
|
||||
},
|
||||
});
|
||||
const tree = new Formatter().format(anchor);
|
||||
expect(tree).to.deep.equal({
|
||||
"wp:anchor": [
|
||||
{
|
||||
_attr: {
|
||||
allowOverlap: "1",
|
||||
behindDoc: "0",
|
||||
distB: 0,
|
||||
distL: 0,
|
||||
distR: 0,
|
||||
distT: 0,
|
||||
layoutInCell: "1",
|
||||
locked: "0",
|
||||
relativeHeight: 120,
|
||||
simplePos: "0",
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:simplePos": {
|
||||
_attr: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:positionH": [
|
||||
{
|
||||
_attr: {
|
||||
relativeFrom: "page",
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:posOffset": ["0"],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"wp:positionV": [
|
||||
{
|
||||
_attr: {
|
||||
relativeFrom: "page",
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:posOffset": ["0"],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"wp:extent": {
|
||||
_attr: {
|
||||
cx: 952500,
|
||||
cy: 952500,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:effectExtent": {
|
||||
_attr: {
|
||||
b: 0,
|
||||
l: 0,
|
||||
r: 0,
|
||||
t: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:wrapNone": {},
|
||||
},
|
||||
{
|
||||
"wp:docPr": {
|
||||
_attr: {
|
||||
descr: "test",
|
||||
id: 0,
|
||||
name: "test",
|
||||
title: "test",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"wp:cNvGraphicFramePr": [
|
||||
{
|
||||
"a:graphicFrameLocks": {
|
||||
_attr: {
|
||||
noChangeAspect: 1,
|
||||
"xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"a:graphic": [
|
||||
{
|
||||
_attr: {
|
||||
"xmlns:a": "http://schemas.openxmlformats.org/drawingml/2006/main",
|
||||
},
|
||||
},
|
||||
{
|
||||
"a:graphicData": [
|
||||
{
|
||||
_attr: {
|
||||
uri: "http://schemas.openxmlformats.org/drawingml/2006/picture",
|
||||
},
|
||||
},
|
||||
{
|
||||
"pic:pic": [
|
||||
{
|
||||
_attr: {
|
||||
"xmlns:pic": "http://schemas.openxmlformats.org/drawingml/2006/picture",
|
||||
},
|
||||
},
|
||||
{
|
||||
"pic:nvPicPr": [
|
||||
{
|
||||
"pic:cNvPr": {
|
||||
_attr: {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"pic:cNvPicPr": [
|
||||
{
|
||||
"a:picLocks": {
|
||||
_attr: {
|
||||
noChangeArrowheads: 1,
|
||||
noChangeAspect: 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"pic:blipFill": [
|
||||
{
|
||||
"a:blip": {
|
||||
_attr: {
|
||||
cstate: "none",
|
||||
"r:embed": "rId{test.png}",
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"a:srcRect": {},
|
||||
},
|
||||
{
|
||||
"a:stretch": [
|
||||
{
|
||||
"a:fillRect": {},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"pic:spPr": [
|
||||
{
|
||||
_attr: {
|
||||
bwMode: "auto",
|
||||
},
|
||||
},
|
||||
{
|
||||
"a:xfrm": [
|
||||
{
|
||||
_attr: {},
|
||||
},
|
||||
{
|
||||
"a:off": {
|
||||
_attr: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"a:ext": {
|
||||
_attr: {
|
||||
cx: 952500,
|
||||
cy: 952500,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"a:prstGeom": [
|
||||
{
|
||||
_attr: {
|
||||
prst: "rect",
|
||||
},
|
||||
},
|
||||
{
|
||||
"a:avLst": {},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -90,7 +90,7 @@ export class Anchor extends XmlComponent {
|
||||
this.root.push(new WrapNone());
|
||||
}
|
||||
|
||||
this.root.push(new DocProperties());
|
||||
this.root.push(new DocProperties(drawingOptions.docProperties));
|
||||
this.root.push(new GraphicFrameProperties());
|
||||
this.root.push(new Graphic(mediaData, transform));
|
||||
}
|
||||
|
@ -1,13 +0,0 @@
|
||||
import { XmlAttributeComponent } from "@file/xml-components";
|
||||
|
||||
export class DocPropertiesAttributes extends XmlAttributeComponent<{
|
||||
readonly id?: number;
|
||||
readonly name?: string;
|
||||
readonly descr?: string;
|
||||
}> {
|
||||
protected readonly xmlKeys = {
|
||||
id: "id",
|
||||
name: "name",
|
||||
descr: "descr",
|
||||
};
|
||||
}
|
@ -1,15 +1,36 @@
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
import { DocPropertiesAttributes } from "./doc-properties-attributes";
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
import { uniqueNumericId } from "@util/convenience-functions";
|
||||
|
||||
class DocPropertiesAttributes extends XmlAttributeComponent<{
|
||||
readonly id?: number;
|
||||
readonly name?: string;
|
||||
readonly description?: string;
|
||||
readonly title?: string;
|
||||
}> {
|
||||
protected readonly xmlKeys = {
|
||||
id: "id",
|
||||
name: "name",
|
||||
description: "descr",
|
||||
title: "title",
|
||||
};
|
||||
}
|
||||
|
||||
export interface DocPropertiesOptions {
|
||||
readonly name: string;
|
||||
readonly description: string;
|
||||
readonly title: string;
|
||||
}
|
||||
|
||||
export class DocProperties extends XmlComponent {
|
||||
public constructor() {
|
||||
public constructor({ name, description, title }: DocPropertiesOptions = { name: "", description: "", title: "" }) {
|
||||
super("wp:docPr");
|
||||
|
||||
this.root.push(
|
||||
new DocPropertiesAttributes({
|
||||
id: 0,
|
||||
name: "",
|
||||
descr: "",
|
||||
id: uniqueNumericId(),
|
||||
name,
|
||||
description,
|
||||
title,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
@ -1,6 +1,8 @@
|
||||
import { expect } from "chai";
|
||||
import { SinonStub, stub } from "sinon";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
import * as convenienceFunctions from "@util/convenience-functions";
|
||||
|
||||
import { Drawing, IDrawingOptions } from "./drawing";
|
||||
|
||||
@ -26,6 +28,14 @@ const createDrawing = (drawingOptions?: IDrawingOptions): Drawing =>
|
||||
);
|
||||
|
||||
describe("Drawing", () => {
|
||||
before(() => {
|
||||
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||
});
|
||||
|
||||
let currentBreak: Drawing;
|
||||
|
||||
describe("#constructor()", () => {
|
||||
@ -68,6 +78,7 @@ describe("Drawing", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -298,6 +309,7 @@ describe("Drawing", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -1,6 +1,8 @@
|
||||
import { IMediaData } from "@file/media";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { Anchor } from "./anchor";
|
||||
import { DocPropertiesOptions } from "./doc-properties/doc-properties";
|
||||
import { IFloating } from "./floating";
|
||||
import { Inline } from "./inline";
|
||||
|
||||
@ -13,6 +15,7 @@ export interface IDistance {
|
||||
|
||||
export interface IDrawingOptions {
|
||||
readonly floating?: IFloating;
|
||||
readonly docProperties?: DocPropertiesOptions;
|
||||
}
|
||||
|
||||
// <xsd:complexType name="CT_Drawing">
|
||||
@ -29,7 +32,11 @@ export class Drawing extends XmlComponent {
|
||||
super("w:drawing");
|
||||
|
||||
if (!drawingOptions.floating) {
|
||||
this.inline = new Inline(imageData, imageData.transformation);
|
||||
this.inline = new Inline({
|
||||
mediaData: imageData,
|
||||
transform: imageData.transformation,
|
||||
docProperties: drawingOptions.docProperties,
|
||||
});
|
||||
this.root.push(this.inline);
|
||||
} else {
|
||||
this.root.push(new Anchor(imageData, imageData.transformation, drawingOptions));
|
||||
|
@ -1,13 +1,19 @@
|
||||
// http://officeopenxml.com/drwPicInline.php
|
||||
import { IMediaData, IMediaDataTransformation } from "@file/media";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
import { DocProperties } from "./../doc-properties/doc-properties";
|
||||
import { DocProperties, DocPropertiesOptions } from "./../doc-properties/doc-properties";
|
||||
import { EffectExtent } from "./../effect-extent/effect-extent";
|
||||
import { Extent } from "./../extent/extent";
|
||||
import { GraphicFrameProperties } from "./../graphic-frame/graphic-frame-properties";
|
||||
import { Graphic } from "./../inline/graphic";
|
||||
import { InlineAttributes } from "./inline-attributes";
|
||||
|
||||
interface InlineOptions {
|
||||
readonly mediaData: IMediaData;
|
||||
readonly transform: IMediaDataTransformation;
|
||||
readonly docProperties?: DocPropertiesOptions;
|
||||
}
|
||||
|
||||
// <xsd:complexType name="CT_Inline">
|
||||
// <xsd:sequence>
|
||||
// <xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||
@ -26,7 +32,7 @@ export class Inline extends XmlComponent {
|
||||
private readonly extent: Extent;
|
||||
private readonly graphic: Graphic;
|
||||
|
||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
||||
public constructor({ mediaData, transform, docProperties }: InlineOptions) {
|
||||
super("wp:inline");
|
||||
|
||||
this.root.push(
|
||||
@ -43,7 +49,7 @@ export class Inline extends XmlComponent {
|
||||
|
||||
this.root.push(this.extent);
|
||||
this.root.push(new EffectExtent());
|
||||
this.root.push(new DocProperties());
|
||||
this.root.push(new DocProperties(docProperties));
|
||||
this.root.push(new GraphicFrameProperties());
|
||||
this.root.push(this.graphic);
|
||||
}
|
||||
|
@ -73,9 +73,10 @@ export class File {
|
||||
this.appProperties = new AppProperties();
|
||||
this.footnotesWrapper = new FootnotesWrapper();
|
||||
this.contentTypes = new ContentTypes();
|
||||
this.documentWrapper = new DocumentWrapper({ background: options.background || {} });
|
||||
this.documentWrapper = new DocumentWrapper({ background: options.background });
|
||||
this.settings = new Settings({
|
||||
compatabilityModeVersion: options.compatabilityModeVersion,
|
||||
compatibilityModeVersion: options.compatabilityModeVersion,
|
||||
compatibility: options.compatibility,
|
||||
evenAndOddHeaders: options.evenAndOddHeaderAndFooters ? true : false,
|
||||
trackRevisions: options.features?.trackRevisions,
|
||||
updateFields: options.features?.updateFields,
|
||||
|
@ -18,4 +18,3 @@ export * from "./track-revision";
|
||||
export * from "./shared";
|
||||
export * from "./border";
|
||||
export * from "./vertical-align";
|
||||
export * from "./space-type";
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -56,20 +56,36 @@ describe("ConcreteNumbering", () => {
|
||||
},
|
||||
});
|
||||
const tree = new Formatter().format(concreteNumbering);
|
||||
expect(tree["w:num"]).to.include({
|
||||
"w:lvlOverride": [
|
||||
expect(tree).to.deep.equal({
|
||||
"w:num": [
|
||||
{
|
||||
_attr: {
|
||||
"w:ilvl": 1,
|
||||
"w:numId": 0,
|
||||
},
|
||||
},
|
||||
{
|
||||
"w:startOverride": {
|
||||
"w:abstractNumId": {
|
||||
_attr: {
|
||||
"w:val": 9,
|
||||
"w:val": 1,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
"w:lvlOverride": [
|
||||
{
|
||||
_attr: {
|
||||
"w:ilvl": 1,
|
||||
},
|
||||
},
|
||||
{
|
||||
"w:startOverride": {
|
||||
_attr: {
|
||||
"w:val": 9,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
@ -1,4 +1,5 @@
|
||||
// http://officeopenxml.com/WPnumbering-numFmt.php
|
||||
// http://www.datypic.com/sc/ooxml/a-w_val-57.html
|
||||
import { Attributes, NumberValueElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
import { decimalNumber } from "@util/values";
|
||||
|
||||
@ -6,21 +7,138 @@ import { AlignmentType } from "../paragraph/formatting";
|
||||
import { ILevelParagraphStylePropertiesOptions, ParagraphProperties } from "../paragraph/properties";
|
||||
import { IRunStylePropertiesOptions, RunProperties } from "../paragraph/run/properties";
|
||||
|
||||
// TODO: Breaking change - consolidate with number-format
|
||||
// <xsd:simpleType name="ST_NumberFormat">
|
||||
// <xsd:restriction base="xsd:string">
|
||||
// <xsd:enumeration value="decimal"/>
|
||||
// <xsd:enumeration value="upperRoman"/>
|
||||
// <xsd:enumeration value="lowerRoman"/>
|
||||
// <xsd:enumeration value="upperLetter"/>
|
||||
// <xsd:enumeration value="lowerLetter"/>
|
||||
// <xsd:enumeration value="ordinal"/>
|
||||
// <xsd:enumeration value="cardinalText"/>
|
||||
// <xsd:enumeration value="ordinalText"/>
|
||||
// <xsd:enumeration value="hex"/>
|
||||
// <xsd:enumeration value="chicago"/>
|
||||
// <xsd:enumeration value="ideographDigital"/>
|
||||
// <xsd:enumeration value="japaneseCounting"/>
|
||||
// <xsd:enumeration value="aiueo"/>
|
||||
// <xsd:enumeration value="iroha"/>
|
||||
// <xsd:enumeration value="decimalFullWidth"/>
|
||||
// <xsd:enumeration value="decimalHalfWidth"/>
|
||||
// <xsd:enumeration value="japaneseLegal"/>
|
||||
// <xsd:enumeration value="japaneseDigitalTenThousand"/>
|
||||
// <xsd:enumeration value="decimalEnclosedCircle"/>
|
||||
// <xsd:enumeration value="decimalFullWidth2"/>
|
||||
// <xsd:enumeration value="aiueoFullWidth"/>
|
||||
// <xsd:enumeration value="irohaFullWidth"/>
|
||||
// <xsd:enumeration value="decimalZero"/>
|
||||
// <xsd:enumeration value="bullet"/>
|
||||
// <xsd:enumeration value="ganada"/>
|
||||
// <xsd:enumeration value="chosung"/>
|
||||
// <xsd:enumeration value="decimalEnclosedFullstop"/>
|
||||
// <xsd:enumeration value="decimalEnclosedParen"/>
|
||||
// <xsd:enumeration value="decimalEnclosedCircleChinese"/>
|
||||
// <xsd:enumeration value="ideographEnclosedCircle"/>
|
||||
// <xsd:enumeration value="ideographTraditional"/>
|
||||
// <xsd:enumeration value="ideographZodiac"/>
|
||||
// <xsd:enumeration value="ideographZodiacTraditional"/>
|
||||
// <xsd:enumeration value="taiwaneseCounting"/>
|
||||
// <xsd:enumeration value="ideographLegalTraditional"/>
|
||||
// <xsd:enumeration value="taiwaneseCountingThousand"/>
|
||||
// <xsd:enumeration value="taiwaneseDigital"/>
|
||||
// <xsd:enumeration value="chineseCounting"/>
|
||||
// <xsd:enumeration value="chineseLegalSimplified"/>
|
||||
// <xsd:enumeration value="chineseCountingThousand"/>
|
||||
// <xsd:enumeration value="koreanDigital"/>
|
||||
// <xsd:enumeration value="koreanCounting"/>
|
||||
// <xsd:enumeration value="koreanLegal"/>
|
||||
// <xsd:enumeration value="koreanDigital2"/>
|
||||
// <xsd:enumeration value="vietnameseCounting"/>
|
||||
// <xsd:enumeration value="russianLower"/>
|
||||
// <xsd:enumeration value="russianUpper"/>
|
||||
// <xsd:enumeration value="none"/>
|
||||
// <xsd:enumeration value="numberInDash"/>
|
||||
// <xsd:enumeration value="hebrew1"/>
|
||||
// <xsd:enumeration value="hebrew2"/>
|
||||
// <xsd:enumeration value="arabicAlpha"/>
|
||||
// <xsd:enumeration value="arabicAbjad"/>
|
||||
// <xsd:enumeration value="hindiVowels"/>
|
||||
// <xsd:enumeration value="hindiConsonants"/>
|
||||
// <xsd:enumeration value="hindiNumbers"/>
|
||||
// <xsd:enumeration value="hindiCounting"/>
|
||||
// <xsd:enumeration value="thaiLetters"/>
|
||||
// <xsd:enumeration value="thaiNumbers"/>
|
||||
// <xsd:enumeration value="thaiCounting"/>
|
||||
// <xsd:enumeration value="bahtText"/>
|
||||
// <xsd:enumeration value="dollarText"/>
|
||||
// <xsd:enumeration value="custom"/>
|
||||
// </xsd:restriction>
|
||||
// </xsd:simpleType>
|
||||
export enum LevelFormat {
|
||||
BULLET = "bullet",
|
||||
CARDINAL_TEXT = "cardinalText",
|
||||
CHICAGO = "chicago",
|
||||
DECIMAL = "decimal",
|
||||
UPPER_ROMAN = "upperRoman",
|
||||
LOWER_ROMAN = "lowerRoman",
|
||||
UPPER_LETTER = "upperLetter",
|
||||
LOWER_LETTER = "lowerLetter",
|
||||
ORDINAL = "ordinal",
|
||||
CARDINAL_TEXT = "cardinalText",
|
||||
ORDINAL_TEXT = "ordinalText",
|
||||
HEX = "hex",
|
||||
CHICAGO = "chicago",
|
||||
IDEOGRAPH__DIGITAL = "ideographDigital",
|
||||
JAPANESE_COUNTING = "japaneseCounting",
|
||||
AIUEO = "aiueo",
|
||||
IROHA = "iroha",
|
||||
DECIMAL_FULL_WIDTH = "decimalFullWidth",
|
||||
DECIMAL_HALF_WIDTH = "decimalHalfWidth",
|
||||
JAPANESE_LEGAL = "japaneseLegal",
|
||||
JAPANESE_DIGITAL_TEN_THOUSAND = "japaneseDigitalTenThousand",
|
||||
DECIMAL_ENCLOSED_CIRCLE = "decimalEnclosedCircle",
|
||||
DECIMAL_FULL_WIDTH2 = "decimalFullWidth2",
|
||||
AIUEO_FULL_WIDTH = "aiueoFullWidth",
|
||||
IROHA_FULL_WIDTH = "irohaFullWidth",
|
||||
DECIMAL_ZERO = "decimalZero",
|
||||
BULLET = "bullet",
|
||||
GANADA = "ganada",
|
||||
CHOSUNG = "chosung",
|
||||
DECIMAL_ENCLOSED_FULLSTOP = "decimalEnclosedFullstop",
|
||||
DECIMAL_ENCLOSED_PARENTHESES = "decimalEnclosedParen",
|
||||
DECIMAL_ZERO = "decimalZero",
|
||||
LOWER_LETTER = "lowerLetter",
|
||||
LOWER_ROMAN = "lowerRoman",
|
||||
DECIMAL_ENCLOSED_CIRCLE_CHINESE = "decimalEnclosedCircleChinese",
|
||||
IDEOGRAPH_ENCLOSED_CIRCLE = "ideographEnclosedCircle",
|
||||
IDEOGRAPH_TRADITIONAL = "ideographTraditional",
|
||||
IDEOGRAPH_ZODIAC = "ideographZodiac",
|
||||
IDEOGRAPH_ZODIAC_TRADITIONAL = "ideographZodiacTraditional",
|
||||
TAIWANESE_COUNTING = "taiwaneseCounting",
|
||||
IDEOGRAPH_LEGAL_TRADITIONAL = "ideographLegalTraditional",
|
||||
TAIWANESE_COUNTING_THOUSAND = "taiwaneseCountingThousand",
|
||||
TAIWANESE_DIGITAL = "taiwaneseDigital",
|
||||
CHINESE_COUNTING = "chineseCounting",
|
||||
CHINESE_LEGAL_SIMPLIFIED = "chineseLegalSimplified",
|
||||
CHINESE_COUNTING_THOUSAND = "chineseCountingThousand",
|
||||
KOREAN_DIGITAL = "koreanDigital",
|
||||
KOREAN_COUNTING = "koreanCounting",
|
||||
KOREAN_LEGAL = "koreanLegal",
|
||||
KOREAN_DIGITAL2 = "koreanDigital2",
|
||||
VIETNAMESE_COUNTING = "vietnameseCounting",
|
||||
RUSSIAN_LOWER = "russianLower",
|
||||
RUSSIAN_UPPER = "russianUpper",
|
||||
NONE = "none",
|
||||
ORDINAL_TEXT = "ordinalText",
|
||||
UPPER_LETTER = "upperLetter",
|
||||
UPPER_ROMAN = "upperRoman",
|
||||
NUMBER_IN_DASH = "numberInDash",
|
||||
HEBREW1 = "hebrew1",
|
||||
HEBREW2 = "hebrew2",
|
||||
ARABIC_ALPHA = "arabicAlpha",
|
||||
ARABIC_ABJAD = "arabicAbjad",
|
||||
HINDI_VOWELS = "hindiVowels",
|
||||
HINDI_CONSONANTS = "hindiConsonants",
|
||||
HINDI_NUMBERS = "hindiNumbers",
|
||||
HINDI_COUNTING = "hindiCounting",
|
||||
THAI_LETTERS = "thaiLetters",
|
||||
THAI_NUMBERS = "thaiNumbers",
|
||||
THAI_COUNTING = "thaiCounting",
|
||||
BAHT_TEXT = "bahtText",
|
||||
DOLLAR_TEXT = "dollarText",
|
||||
CUSTOM = "custom",
|
||||
}
|
||||
|
||||
class LevelAttributes extends XmlAttributeComponent<{
|
||||
|
@ -1,16 +1,51 @@
|
||||
// http://officeopenxml.com/WPalignment.php
|
||||
// http://officeopenxml.com/WPtableAlignment.php
|
||||
// http://www.datypic.com/sc/ooxml/t-w_ST_Jc.html
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
|
||||
// <xsd:simpleType name="ST_Jc">
|
||||
// <xsd:restriction base="xsd:string">
|
||||
// <xsd:enumeration value="start"/>
|
||||
// <xsd:enumeration value="center"/>
|
||||
// <xsd:enumeration value="end"/>
|
||||
// <xsd:enumeration value="both"/>
|
||||
// <xsd:enumeration value="mediumKashida"/>
|
||||
// <xsd:enumeration value="distribute"/>
|
||||
// <xsd:enumeration value="numTab"/>
|
||||
// <xsd:enumeration value="highKashida"/>
|
||||
// <xsd:enumeration value="lowKashida"/>
|
||||
// <xsd:enumeration value="thaiDistribute"/>
|
||||
// <xsd:enumeration value="left"/>
|
||||
// <xsd:enumeration value="right"/>
|
||||
// </xsd:restriction>
|
||||
// </xsd:simpleType>
|
||||
export enum AlignmentType {
|
||||
/** Align Start */
|
||||
START = "start",
|
||||
END = "end",
|
||||
/** Align Center */
|
||||
CENTER = "center",
|
||||
/** End */
|
||||
END = "end",
|
||||
/** Justified */
|
||||
BOTH = "both",
|
||||
JUSTIFIED = "both",
|
||||
/** Medium Kashida Length */
|
||||
MEDIUM_KASHIDA = "mediumKashida",
|
||||
/** Distribute All Characters Equally */
|
||||
DISTRIBUTE = "distribute",
|
||||
/** Align to List Tab */
|
||||
NUM_TAB = "numTab",
|
||||
/** Widest Kashida Length */
|
||||
HIGH_KASHIDA = "highKashida",
|
||||
/** Low Kashida Length */
|
||||
LOW_KASHIDA = "lowKashida",
|
||||
/** Thai Language Justification */
|
||||
THAI_DISTRIBUTE = "thaiDistribute",
|
||||
/** Align Left */
|
||||
LEFT = "left",
|
||||
/** Align Right */
|
||||
RIGHT = "right",
|
||||
/** Justified */
|
||||
JUSTIFIED = "both",
|
||||
}
|
||||
|
||||
export class AlignmentAttributes extends XmlAttributeComponent<{ readonly val: AlignmentType }> {
|
||||
|
@ -4,6 +4,7 @@ import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
export enum LineRuleType {
|
||||
AT_LEAST = "atLeast",
|
||||
EXACTLY = "exactly",
|
||||
EXACT = "exact",
|
||||
AUTO = "auto",
|
||||
}
|
||||
export interface ISpacingProperties {
|
||||
|
0
src/file/paragraph/formatting/width.ts
Normal file
0
src/file/paragraph/formatting/width.ts
Normal file
20
src/file/paragraph/formatting/word-wrap.spec.ts
Normal file
20
src/file/paragraph/formatting/word-wrap.spec.ts
Normal file
@ -0,0 +1,20 @@
|
||||
import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
|
||||
import { WordWrap } from "./word-wrap";
|
||||
|
||||
describe("WordWrap", () => {
|
||||
it("should create", () => {
|
||||
const wordWrap = new WordWrap();
|
||||
const tree = new Formatter().format(wordWrap);
|
||||
|
||||
expect(tree).to.deep.equal({
|
||||
"w:wordWrap": {
|
||||
_attr: {
|
||||
"w:val": 0,
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
14
src/file/paragraph/formatting/word-wrap.ts
Normal file
14
src/file/paragraph/formatting/word-wrap.ts
Normal file
@ -0,0 +1,14 @@
|
||||
// http://officeopenxml.com/WPalignment.php
|
||||
// http://officeopenxml.com/WPtableAlignment.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class WordWrapAttributes extends XmlAttributeComponent<{ readonly val: 0 }> {
|
||||
protected readonly xmlKeys = { val: "w:val" };
|
||||
}
|
||||
|
||||
export class WordWrap extends XmlComponent {
|
||||
public constructor() {
|
||||
super("w:wordWrap");
|
||||
this.root.push(new WordWrapAttributes({ val: 0 }));
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { TextAttributes } from "../run/text-attributes";
|
||||
|
@ -3,6 +3,7 @@ import { SinonStub, stub } from "sinon";
|
||||
|
||||
import * as convenienceFunctions from "@util/convenience-functions";
|
||||
|
||||
import { HorizontalPositionAlign, VerticalPositionAlign } from "@file/shared";
|
||||
import { Formatter } from "@export/formatter";
|
||||
import { BorderStyle } from "@file/border";
|
||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
||||
@ -10,7 +11,6 @@ import { EMPTY_OBJECT } from "@file/xml-components";
|
||||
import { IViewWrapper } from "../document-wrapper";
|
||||
import { File } from "../file";
|
||||
import { ShadingType } from "../shading";
|
||||
import { HorizontalPositionAlign, VerticalPositionAlign } from "../shared";
|
||||
import { AlignmentType, HeadingLevel, LeaderType, PageBreak, TabStopPosition, TabStopType } from "./formatting";
|
||||
import { FrameAnchorType } from "./frame";
|
||||
import { Bookmark, ExternalHyperlink } from "./links";
|
||||
@ -25,6 +25,7 @@ describe("Paragraph", () => {
|
||||
|
||||
after(() => {
|
||||
(convenienceFunctions.uniqueId as SinonStub).restore();
|
||||
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||
});
|
||||
|
||||
describe("#constructor()", () => {
|
||||
|
@ -123,5 +123,24 @@ describe("ParagraphProperties", () => {
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("should create with the wordWrap property", () => {
|
||||
const properties = new ParagraphProperties({
|
||||
wordWrap: true,
|
||||
});
|
||||
const tree = new Formatter().format(properties);
|
||||
|
||||
expect(tree).to.deep.equal({
|
||||
"w:pPr": [
|
||||
{
|
||||
"w:wordWrap": {
|
||||
_attr: {
|
||||
"w:val": 0,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -11,6 +11,7 @@ import { ISpacingProperties, Spacing } from "./formatting/spacing";
|
||||
import { HeadingLevel, Style } from "./formatting/style";
|
||||
import { TabStop, TabStopDefinition, TabStopType } from "./formatting/tab-stop";
|
||||
import { NumberProperties } from "./formatting/unordered-list";
|
||||
import { WordWrap } from "./formatting/word-wrap";
|
||||
import { FrameProperties, IFrameOptions } from "./frame/frame-properties";
|
||||
import { OutlineLevel } from "./links";
|
||||
|
||||
@ -50,6 +51,8 @@ export interface IParagraphPropertiesOptions extends IParagraphStylePropertiesOp
|
||||
readonly widowControl?: boolean;
|
||||
readonly frame?: IFrameOptions;
|
||||
readonly suppressLineNumbers?: boolean;
|
||||
readonly wordWrap?: boolean;
|
||||
readonly scale?: number;
|
||||
}
|
||||
|
||||
export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
|
||||
@ -128,6 +131,10 @@ export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
|
||||
this.push(new Shading(options.shading));
|
||||
}
|
||||
|
||||
if (options.wordWrap) {
|
||||
this.push(new WordWrap());
|
||||
}
|
||||
|
||||
/**
|
||||
* FIX: Multitab support for Libre Writer
|
||||
* Ensure there is only one w:tabs tag with multiple w:tab
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { expect } from "chai";
|
||||
import * as sinon from "sinon";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
import { Comment, CommentRangeEnd, CommentRangeStart, CommentReference, Comments } from "./comment-run";
|
||||
@ -40,6 +41,17 @@ describe("CommentReference", () => {
|
||||
});
|
||||
|
||||
describe("Comment", () => {
|
||||
let clock: sinon.SinonFakeTimers;
|
||||
|
||||
beforeEach(() => {
|
||||
const now = new Date(1999, 0, 1);
|
||||
clock = sinon.useFakeTimers(now.getTime());
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
clock.restore();
|
||||
});
|
||||
|
||||
describe("#constructor()", () => {
|
||||
it("should create", () => {
|
||||
const component = new Comment({
|
||||
@ -72,6 +84,37 @@ describe("Comment", () => {
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("should create by using default date", () => {
|
||||
const component = new Comment({
|
||||
id: 0,
|
||||
text: "test-comment",
|
||||
});
|
||||
const tree = new Formatter().format(component);
|
||||
expect(tree).to.deep.equal({
|
||||
"w:comment": [
|
||||
{ _attr: { "w:id": 0, "w:date": "1999-01-01T00:00:00.000Z" } },
|
||||
{
|
||||
"w:p": [
|
||||
{
|
||||
"w:r": [
|
||||
{
|
||||
"w:t": [
|
||||
{
|
||||
_attr: {
|
||||
"xml:space": "preserve",
|
||||
},
|
||||
},
|
||||
"test-comment",
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -11,10 +11,12 @@ import { ImageRun } from "./image-run";
|
||||
describe("ImageRun", () => {
|
||||
before(() => {
|
||||
stub(convenienceFunctions, "uniqueId").callsFake(() => "test-unique-id");
|
||||
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||
});
|
||||
|
||||
after(() => {
|
||||
(convenienceFunctions.uniqueId as SinonStub).restore();
|
||||
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||
});
|
||||
|
||||
describe("#constructor()", () => {
|
||||
@ -125,6 +127,7 @@ describe("ImageRun", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -375,6 +378,7 @@ describe("ImageRun", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -629,6 +633,7 @@ describe("ImageRun", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -886,6 +891,7 @@ describe("ImageRun", () => {
|
||||
descr: "",
|
||||
id: 0,
|
||||
name: "",
|
||||
title: "",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { uniqueId } from "@util/convenience-functions";
|
||||
|
||||
import { IContext, IXmlableObject } from "@file/xml-components";
|
||||
import { DocPropertiesOptions } from "@file/drawing/doc-properties/doc-properties";
|
||||
|
||||
import { Drawing, IFloating } from "../../drawing";
|
||||
import { IMediaTransformation } from "../../media";
|
||||
@ -11,6 +12,7 @@ export interface IImageOptions {
|
||||
readonly data: Buffer | string | Uint8Array | ArrayBuffer;
|
||||
readonly transformation: IMediaTransformation;
|
||||
readonly floating?: IFloating;
|
||||
readonly altText?: DocPropertiesOptions;
|
||||
}
|
||||
|
||||
export class ImageRun extends Run {
|
||||
@ -37,7 +39,7 @@ export class ImageRun extends Run {
|
||||
rotation: options.transformation.rotation ? options.transformation.rotation * 60000 : undefined,
|
||||
},
|
||||
};
|
||||
const drawing = new Drawing(this.imageData, { floating: options.floating });
|
||||
const drawing = new Drawing(this.imageData, { floating: options.floating, docProperties: options.altText });
|
||||
|
||||
this.root.push(drawing);
|
||||
}
|
||||
@ -49,15 +51,16 @@ export class ImageRun extends Run {
|
||||
}
|
||||
|
||||
private convertDataURIToBinary(dataURI: string): Uint8Array {
|
||||
// https://gist.github.com/borismus/1032746
|
||||
// https://github.com/mafintosh/base64-to-uint8array
|
||||
const BASE64_MARKER = ";base64,";
|
||||
|
||||
const base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
|
||||
|
||||
if (typeof atob === "function") {
|
||||
// https://gist.github.com/borismus/1032746
|
||||
// https://github.com/mafintosh/base64-to-uint8array
|
||||
const BASE64_MARKER = ";base64,";
|
||||
const base64Index = dataURI.indexOf(BASE64_MARKER);
|
||||
|
||||
const base64IndexWithOffset = base64Index === -1 ? 0 : base64Index + BASE64_MARKER.length;
|
||||
|
||||
return new Uint8Array(
|
||||
atob(dataURI.substring(base64Index))
|
||||
atob(dataURI.substring(base64IndexWithOffset))
|
||||
.split("")
|
||||
.map((c) => c.charCodeAt(0)),
|
||||
);
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { TextAttributes } from "./text-attributes";
|
||||
|
@ -1,8 +1,14 @@
|
||||
import { BorderElement, IBorderOptions } from "@file/border";
|
||||
import { IShadingAttributesProperties, Shading } from "@file/shading";
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { ChangeAttributes, IChangedAttributesProperties } from "@file/track-revision/track-revision";
|
||||
import { HpsMeasureElement, IgnoreIfEmptyXmlComponent, OnOffElement, StringValueElement, XmlComponent } from "@file/xml-components";
|
||||
import {
|
||||
HpsMeasureElement,
|
||||
IgnoreIfEmptyXmlComponent,
|
||||
NumberValueElement,
|
||||
OnOffElement,
|
||||
StringValueElement,
|
||||
XmlComponent,
|
||||
} from "@file/xml-components";
|
||||
|
||||
import { EmphasisMark, EmphasisMarkType } from "./emphasis-mark";
|
||||
import { CharacterSpacing, Color, Highlight, HighlightComplexScript } from "./formatting";
|
||||
@ -46,7 +52,9 @@ export interface IRunStylePropertiesOptions {
|
||||
readonly imprint?: boolean;
|
||||
readonly revision?: IRunPropertiesChangeOptions;
|
||||
readonly border?: IBorderOptions;
|
||||
readonly space?: SpaceType;
|
||||
readonly vanish?: boolean;
|
||||
readonly specVanish?: boolean;
|
||||
readonly scale?: number;
|
||||
}
|
||||
|
||||
export interface IRunPropertiesOptions extends IRunStylePropertiesOptions {
|
||||
@ -217,6 +225,21 @@ export class RunProperties extends IgnoreIfEmptyXmlComponent {
|
||||
if (options.border) {
|
||||
this.push(new BorderElement("w:bdr", options.border));
|
||||
}
|
||||
|
||||
if (options.vanish) {
|
||||
// https://c-rex.net/projects/samples/ooxml/e1/Part4/OOXML_P4_DOCX_vanish_topic_ID0E6W3O.html
|
||||
// http://www.datypic.com/sc/ooxml/e-w_vanish-1.html
|
||||
this.push(new OnOffElement("w:vanish", options.vanish));
|
||||
}
|
||||
|
||||
if (options.specVanish) {
|
||||
// https://c-rex.net/projects/samples/ooxml/e1/Part4/OOXML_P4_DOCX_specVanish_topic_ID0EIE1O.html
|
||||
this.push(new OnOffElement("w:specVanish", options.vanish));
|
||||
}
|
||||
|
||||
if (options.scale !== undefined) {
|
||||
this.push(new NumberValueElement("w:w", options.scale));
|
||||
}
|
||||
}
|
||||
|
||||
public push(item: XmlComponent): void {
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
import { SpaceType } from "@file/shared";
|
||||
|
||||
import { Text } from "./text";
|
||||
|
||||
@ -13,5 +14,26 @@ describe("Text", () => {
|
||||
"w:t": [{ _attr: { "xml:space": "preserve" } }, " this is\n text"],
|
||||
});
|
||||
});
|
||||
|
||||
it("adds the passed in text to the component with options", () => {
|
||||
const t = new Text({
|
||||
text: " this is\n text",
|
||||
space: SpaceType.PRESERVE,
|
||||
});
|
||||
const f = new Formatter().format(t);
|
||||
expect(f).to.deep.equal({
|
||||
"w:t": [{ _attr: { "xml:space": "preserve" } }, " this is\n text"],
|
||||
});
|
||||
});
|
||||
|
||||
it("adds the passed in text to the component with options and sets default space type", () => {
|
||||
const t = new Text({
|
||||
text: " this is\n text",
|
||||
});
|
||||
const f = new Formatter().format(t);
|
||||
expect(f).to.deep.equal({
|
||||
"w:t": [{ _attr: { "xml:space": "default" } }, " this is\n text"],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,13 +1,33 @@
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { TextAttributes } from "../text-attributes";
|
||||
|
||||
export class Text extends XmlComponent {
|
||||
public constructor(text: string) {
|
||||
super("w:t");
|
||||
this.root.push(new TextAttributes({ space: SpaceType.PRESERVE }));
|
||||
// <xsd:complexType name="CT_Text">
|
||||
// <xsd:simpleContent>
|
||||
// <xsd:extension base="s:ST_String">
|
||||
// <xsd:attribute ref="xml:space" use="optional" />
|
||||
// </xsd:extension>
|
||||
// </xsd:simpleContent>
|
||||
// </xsd:complexType>
|
||||
|
||||
this.root.push(text);
|
||||
interface ITextOptions {
|
||||
readonly space?: SpaceType;
|
||||
readonly text?: string;
|
||||
}
|
||||
|
||||
export class Text extends XmlComponent {
|
||||
public constructor(options: string | ITextOptions) {
|
||||
super("w:t");
|
||||
|
||||
if (typeof options === "string") {
|
||||
this.root.push(new TextAttributes({ space: SpaceType.PRESERVE }));
|
||||
this.root.push(options);
|
||||
return this;
|
||||
} else {
|
||||
this.root.push(new TextAttributes({ space: options.space ?? SpaceType.DEFAULT }));
|
||||
this.root.push(options.text);
|
||||
return this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ import { expect } from "chai";
|
||||
import { Formatter } from "@export/formatter";
|
||||
import { BorderStyle } from "@file/border";
|
||||
import { ShadingType } from "@file/shading";
|
||||
import { SpaceType } from "@file/space-type";
|
||||
|
||||
import { EmphasisMarkType } from "./emphasis-mark";
|
||||
import { PageNumber, Run } from "./run";
|
||||
@ -521,18 +520,64 @@ describe("Run", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("#space", () => {
|
||||
it("should correctly set the border", () => {
|
||||
describe("#vanish and #specVanish", () => {
|
||||
it("should correctly set vanish", () => {
|
||||
const run = new Run({
|
||||
space: SpaceType.PRESERVE,
|
||||
vanish: true,
|
||||
});
|
||||
const tree = new Formatter().format(run);
|
||||
expect(tree).to.deep.equal({
|
||||
"w:r": {
|
||||
_attr: {
|
||||
"xml:space": "preserve",
|
||||
"w:r": [
|
||||
{
|
||||
"w:rPr": [
|
||||
{
|
||||
"w:vanish": {},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("should correctly set specVanish", () => {
|
||||
const run = new Run({
|
||||
specVanish: true,
|
||||
});
|
||||
const tree = new Formatter().format(run);
|
||||
expect(tree).to.deep.equal({
|
||||
"w:r": [
|
||||
{
|
||||
"w:rPr": [
|
||||
{
|
||||
"w:specVanish": {},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
describe("#scale", () => {
|
||||
it("should correctly set the border", () => {
|
||||
const run = new Run({
|
||||
scale: 200,
|
||||
});
|
||||
const tree = new Formatter().format(run);
|
||||
expect(tree).to.deep.equal({
|
||||
"w:r": [
|
||||
{
|
||||
"w:rPr": [
|
||||
{
|
||||
"w:w": {
|
||||
_attr: {
|
||||
"w:val": 200,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -9,10 +9,10 @@ import { Begin, End, Separate } from "./field";
|
||||
import { NumberOfPages, NumberOfPagesSection, Page } from "./page-number";
|
||||
import { IRunPropertiesOptions, RunProperties } from "./properties";
|
||||
import { Text } from "./run-components/text";
|
||||
import { TextAttributes } from "./text-attributes";
|
||||
import { Tab } from "./tab";
|
||||
|
||||
export interface IRunOptions extends IRunPropertiesOptions {
|
||||
readonly children?: readonly (Begin | FieldInstruction | Separate | End | PageNumber | FootnoteReferenceRun | string)[];
|
||||
readonly children?: readonly (Begin | FieldInstruction | Separate | End | PageNumber | FootnoteReferenceRun | Tab | string)[];
|
||||
readonly break?: number;
|
||||
readonly text?: string;
|
||||
}
|
||||
@ -37,10 +37,6 @@ export class Run extends XmlComponent {
|
||||
}
|
||||
}
|
||||
|
||||
if (options.space) {
|
||||
this.root.push(new TextAttributes({ space: options.space }));
|
||||
}
|
||||
|
||||
if (options.children) {
|
||||
for (const child of options.children) {
|
||||
if (typeof child === "string") {
|
||||
|
@ -1,5 +1,5 @@
|
||||
// http://officeopenxml.com/WPfieldInstructions.php
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { TextAttributes } from "./text-attributes";
|
||||
|
@ -11,7 +11,7 @@ export class SymbolRun extends Run {
|
||||
if (typeof options === "string") {
|
||||
super({});
|
||||
this.root.push(new Symbol(options));
|
||||
return;
|
||||
return this;
|
||||
}
|
||||
|
||||
super(options);
|
||||
|
@ -1,3 +1,4 @@
|
||||
// https://c-rex.net/projects/samples/ooxml/e1/Part4/OOXML_P4_DOCX_tab_topic_ID0EM6AO.html
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
// <xsd:group name="EG_RunInnerContent">
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlAttributeComponent } from "@file/xml-components";
|
||||
|
||||
export class TextAttributes extends XmlAttributeComponent<{ readonly space: SpaceType }> {
|
||||
|
@ -19,6 +19,7 @@ export enum UnderlineType {
|
||||
WAVE = "wave",
|
||||
WAVYHEAVY = "wavyHeavy",
|
||||
WAVYDOUBLE = "wavyDouble",
|
||||
NONE = "none",
|
||||
}
|
||||
|
||||
export class Underline extends XmlComponent {
|
||||
|
@ -1,7 +1,6 @@
|
||||
import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
||||
|
||||
import { Compatibility } from "./compatibility";
|
||||
|
||||
@ -11,7 +10,140 @@ describe("Compatibility", () => {
|
||||
const compatibility = new Compatibility({});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": EMPTY_OBJECT });
|
||||
expect(tree).to.deep.equal({ "w:compat": {} });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#version", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
version: 10,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({
|
||||
"w:compat": [
|
||||
{
|
||||
"w:compatSetting": {
|
||||
_attr: {
|
||||
"w:name": "compatibilityMode",
|
||||
"w:uri": "http://schemas.microsoft.com/office/word",
|
||||
"w:val": 10,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useSingleBorderforContiguousCells", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useSingleBorderforContiguousCells: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useSingleBorderforContiguousCells": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#wordPerfectJustification", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
wordPerfectJustification: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:wpJustification": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#noTabStopForHangingIndent", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
noTabStopForHangingIndent: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:noTabHangInd": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#noLeading", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
noLeading: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:noLeading": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#spaceForUnderline", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
spaceForUnderline: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:spaceForUL": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#noColumnBalance", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
noColumnBalance: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:noColumnBalance": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#balanceSingleByteDoubleByteWidth", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
balanceSingleByteDoubleByteWidth: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:balanceSingleByteDoubleByteWidth": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#noExtraLineSpacing", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
noExtraLineSpacing: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:noExtraLineSpacing": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotLeaveBackslashAlone", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotLeaveBackslashAlone: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotLeaveBackslashAlone": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#underlineTrailingSpaces", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
underlineTrailingSpaces: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:ulTrailSpace": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
@ -22,7 +154,601 @@ describe("Compatibility", () => {
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotExpandShiftReturn": EMPTY_OBJECT }] });
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotExpandShiftReturn": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#spacingInWholePoints", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
spacingInWholePoints: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:spacingInWholePoints": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#lineWrapLikeWord6", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
lineWrapLikeWord6: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:lineWrapLikeWord6": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#printBodyTextBeforeHeader", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
printBodyTextBeforeHeader: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:printBodyTextBeforeHeader": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#printColorsBlack", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
printColorsBlack: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:printColBlack": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#spaceWidth", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
spaceWidth: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:wpSpaceWidth": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#showBreaksInFrames", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
showBreaksInFrames: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:showBreaksInFrames": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#subFontBySize", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
subFontBySize: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:subFontBySize": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#suppressBottomSpacing", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
suppressBottomSpacing: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:suppressBottomSpacing": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#suppressTopSpacing", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
suppressTopSpacing: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:suppressTopSpacing": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#suppressSpacingAtTopOfPage", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
suppressSpacingAtTopOfPage: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:suppressSpacingAtTopOfPage": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#suppressTopSpacingWP", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
suppressTopSpacingWP: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:suppressTopSpacingWP": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#suppressSpBfAfterPgBrk", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
suppressSpBfAfterPgBrk: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:suppressSpBfAfterPgBrk": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#swapBordersFacingPages", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
swapBordersFacingPages: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:swapBordersFacingPages": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#convertMailMergeEsc", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
convertMailMergeEsc: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:convMailMergeEsc": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#truncateFontHeightsLikeWP6", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
truncateFontHeightsLikeWP6: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:truncateFontHeightsLikeWP6": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#macWordSmallCaps", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
macWordSmallCaps: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:mwSmallCaps": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#usePrinterMetrics", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
usePrinterMetrics: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:usePrinterMetrics": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotSuppressParagraphBorders", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotSuppressParagraphBorders: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotSuppressParagraphBorders": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#wrapTrailSpaces", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
wrapTrailSpaces: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:wrapTrailSpaces": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#footnoteLayoutLikeWW8", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
footnoteLayoutLikeWW8: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:footnoteLayoutLikeWW8": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#shapeLayoutLikeWW8", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
shapeLayoutLikeWW8: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:shapeLayoutLikeWW8": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#alignTablesRowByRow", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
alignTablesRowByRow: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:alignTablesRowByRow": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#forgetLastTabAlignment", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
forgetLastTabAlignment: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:forgetLastTabAlignment": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#adjustLineHeightInTable", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
adjustLineHeightInTable: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:adjustLineHeightInTable": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#autoSpaceLikeWord95", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
autoSpaceLikeWord95: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:autoSpaceLikeWord95": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#noSpaceRaiseLower", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
noSpaceRaiseLower: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:noSpaceRaiseLower": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotUseHTMLParagraphAutoSpacing", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotUseHTMLParagraphAutoSpacing: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotUseHTMLParagraphAutoSpacing": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#layoutRawTableWidth", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
layoutRawTableWidth: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:layoutRawTableWidth": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#layoutTableRowsApart", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
layoutTableRowsApart: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:layoutTableRowsApart": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useWord97LineBreakRules", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useWord97LineBreakRules: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useWord97LineBreakRules": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotBreakWrappedTables", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotBreakWrappedTables: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotBreakWrappedTables": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotSnapToGridInCell", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotSnapToGridInCell: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotSnapToGridInCell": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#selectFieldWithFirstOrLastCharacter", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
selectFieldWithFirstOrLastCharacter: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:selectFldWithFirstOrLastChar": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#applyBreakingRules", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
applyBreakingRules: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:applyBreakingRules": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotWrapTextWithPunctuation", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotWrapTextWithPunctuation: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotWrapTextWithPunct": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotUseEastAsianBreakRules", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotUseEastAsianBreakRules: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotUseEastAsianBreakRules": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useWord2002TableStyleRules", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useWord2002TableStyleRules: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useWord2002TableStyleRules": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#growAutofit", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
growAutofit: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:growAutofit": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useFELayout", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useFELayout: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useFELayout": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useNormalStyleForList", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useNormalStyleForList: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useNormalStyleForList": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotUseIndentAsNumberingTabStop", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotUseIndentAsNumberingTabStop: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotUseIndentAsNumberingTabStop": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useAlternateEastAsianLineBreakRules", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useAlternateEastAsianLineBreakRules: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useAltKinsokuLineBreakRules": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#allowSpaceOfSameStyleInTable", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
allowSpaceOfSameStyleInTable: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:allowSpaceOfSameStyleInTable": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotSuppressIndentation", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotSuppressIndentation: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotSuppressIndentation": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotAutofitConstrainedTables", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotAutofitConstrainedTables: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotAutofitConstrainedTables": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#autofitToFirstFixedWidthCell", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
autofitToFirstFixedWidthCell: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:autofitToFirstFixedWidthCell": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#underlineTabInNumberingList", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
underlineTabInNumberingList: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:underlineTabInNumList": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#displayHangulFixedWidth", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
displayHangulFixedWidth: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:displayHangulFixedWidth": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#splitPgBreakAndParaMark", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
splitPgBreakAndParaMark: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:splitPgBreakAndParaMark": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotVerticallyAlignCellWithSp", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotVerticallyAlignCellWithSp: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotVertAlignCellWithSp": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#doNotBreakConstrainedForcedTable", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
doNotBreakConstrainedForcedTable: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotBreakConstrainedForcedTable": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#ignoreVerticalAlignmentInTextboxes", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
ignoreVerticalAlignmentInTextboxes: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:doNotVertAlignInTxbx": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#useAnsiKerningPairs", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
useAnsiKerningPairs: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:useAnsiKerningPairs": {} }] });
|
||||
});
|
||||
});
|
||||
|
||||
describe("#cachedColumnBalance", () => {
|
||||
it("should create a setting for not justifying lines ending in soft line break", () => {
|
||||
const compatibility = new Compatibility({
|
||||
cachedColumnBalance: true,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(compatibility);
|
||||
expect(tree).to.deep.equal({ "w:compat": [{ "w:cachedColBalance": {} }] });
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,3 +1,4 @@
|
||||
// http://www.datypic.com/sc/ooxml/e-w_compat-1.html
|
||||
import { OnOffElement, XmlComponent } from "@file/xml-components";
|
||||
import { CompatibilitySetting } from "./compatibility-setting/compatibility-setting";
|
||||
|
||||
@ -74,21 +75,405 @@ import { CompatibilitySetting } from "./compatibility-setting/compatibility-sett
|
||||
// </xsd:complexType>
|
||||
|
||||
export interface ICompatibilityOptions {
|
||||
readonly doNotExpandShiftReturn?: boolean;
|
||||
readonly version?: number;
|
||||
/** Use Simplified Rules For Table Border Conflicts */
|
||||
readonly useSingleBorderforContiguousCells?: boolean;
|
||||
/** Emulate WordPerfect 6.x Paragraph Justification */
|
||||
readonly wordPerfectJustification?: boolean;
|
||||
/** Do Not Create Custom Tab Stop for Hanging Indent */
|
||||
readonly noTabStopForHangingIndent?: boolean;
|
||||
/** Do Not Add Leading Between Lines of Text */
|
||||
readonly noLeading?: boolean;
|
||||
/** Add Additional Space Below Baseline For Underlined East Asian Text */
|
||||
readonly spaceForUnderline?: boolean;
|
||||
/** Do Not Balance Text Columns within a Section */
|
||||
readonly noColumnBalance?: boolean;
|
||||
/** Balance Single Byte and Double Byte Characters */
|
||||
readonly balanceSingleByteDoubleByteWidth?: boolean;
|
||||
/** Do Not Center Content on Lines With Exact Line Height */
|
||||
readonly noExtraLineSpacing?: boolean;
|
||||
/** Convert Backslash To Yen Sign When Entered */
|
||||
readonly doNotLeaveBackslashAlone?: boolean;
|
||||
/** Underline All Trailing Spaces */
|
||||
readonly underlineTrailingSpaces?: boolean;
|
||||
/** Don't Justify Lines Ending in Soft Line Break */
|
||||
readonly doNotExpandShiftReturn?: boolean;
|
||||
/** Only Expand/Condense Text By Whole Points */
|
||||
readonly spacingInWholePoints?: boolean;
|
||||
/** Emulate Word 6.0 Line Wrapping for East Asian Text */
|
||||
readonly lineWrapLikeWord6?: boolean;
|
||||
/** Print Body Text before Header/Footer Contents */
|
||||
readonly printBodyTextBeforeHeader?: boolean;
|
||||
/** Print Colors as Black And White without Dithering */
|
||||
readonly printColorsBlack?: boolean;
|
||||
/** Space width */
|
||||
readonly spaceWidth?: boolean;
|
||||
/** Display Page/Column Breaks Present in Frames */
|
||||
readonly showBreaksInFrames?: boolean;
|
||||
/** Increase Priority Of Font Size During Font Substitution */
|
||||
readonly subFontBySize?: boolean;
|
||||
/** Ignore Exact Line Height for Last Line on Page */
|
||||
readonly suppressBottomSpacing?: boolean;
|
||||
/** Ignore Minimum and Exact Line Height for First Line on Page */
|
||||
readonly suppressTopSpacing?: boolean;
|
||||
/** Ignore Minimum Line Height for First Line on Page */
|
||||
readonly suppressSpacingAtTopOfPage?: boolean;
|
||||
/** Emulate WordPerfect 5.x Line Spacing */
|
||||
readonly suppressTopSpacingWP?: boolean;
|
||||
/** Do Not Use Space Before On First Line After a Page Break */
|
||||
readonly suppressSpBfAfterPgBrk?: boolean;
|
||||
/** Swap Paragraph Borders on Odd Numbered Pages */
|
||||
readonly swapBordersFacingPages?: boolean;
|
||||
/** Treat Backslash Quotation Delimiter as Two Quotation Marks */
|
||||
readonly convertMailMergeEsc?: boolean;
|
||||
/** Emulate WordPerfect 6.x Font Height Calculation */
|
||||
readonly truncateFontHeightsLikeWP6?: boolean;
|
||||
/** Emulate Word 5.x for the Macintosh Small Caps Formatting */
|
||||
readonly macWordSmallCaps?: boolean;
|
||||
/** Use Printer Metrics To Display Documents */
|
||||
readonly usePrinterMetrics?: boolean;
|
||||
/** Do Not Suppress Paragraph Borders Next To Frames */
|
||||
readonly doNotSuppressParagraphBorders?: boolean;
|
||||
/** Line Wrap Trailing Spaces */
|
||||
readonly wrapTrailSpaces?: boolean;
|
||||
/** Emulate Word 6.x/95/97 Footnote Placement */
|
||||
readonly footnoteLayoutLikeWW8?: boolean;
|
||||
/** Emulate Word 97 Text Wrapping Around Floating Objects */
|
||||
readonly shapeLayoutLikeWW8?: boolean;
|
||||
/** Align Table Rows Independently */
|
||||
readonly alignTablesRowByRow?: boolean;
|
||||
/** Ignore Width of Last Tab Stop When Aligning Paragraph If It Is Not Left Aligned */
|
||||
readonly forgetLastTabAlignment?: boolean;
|
||||
/** Add Document Grid Line Pitch To Lines in Table Cells */
|
||||
readonly adjustLineHeightInTable?: boolean;
|
||||
/** Emulate Word 95 Full-Width Character Spacing */
|
||||
readonly autoSpaceLikeWord95?: boolean;
|
||||
/** Do Not Increase Line Height for Raised/Lowered Text */
|
||||
readonly noSpaceRaiseLower?: boolean;
|
||||
/** Use Fixed Paragraph Spacing for HTML Auto Setting */
|
||||
readonly doNotUseHTMLParagraphAutoSpacing?: boolean;
|
||||
/** Ignore Space Before Table When Deciding If Table Should Wrap Floating Object */
|
||||
readonly layoutRawTableWidth?: boolean;
|
||||
/** Allow Table Rows to Wrap Inline Objects Independently */
|
||||
readonly layoutTableRowsApart?: boolean;
|
||||
/** Emulate Word 97 East Asian Line Breaking */
|
||||
readonly useWord97LineBreakRules?: boolean;
|
||||
/** Do Not Allow Floating Tables To Break Across Pages */
|
||||
readonly doNotBreakWrappedTables?: boolean;
|
||||
/** Do Not Snap to Document Grid in Table Cells with Objects */
|
||||
readonly doNotSnapToGridInCell?: boolean;
|
||||
/** Select Field When First or Last Character Is Selected */
|
||||
readonly selectFieldWithFirstOrLastCharacter?: boolean;
|
||||
/** Use Legacy Ethiopic and Amharic Line Breaking Rules */
|
||||
readonly applyBreakingRules?: boolean;
|
||||
/** Do Not Allow Hanging Punctuation With Character Grid */
|
||||
readonly doNotWrapTextWithPunctuation?: boolean;
|
||||
/** Do Not Compress Compressible Characters When Using Document Grid */
|
||||
readonly doNotUseEastAsianBreakRules?: boolean;
|
||||
/** Emulate Word 2002 Table Style Rules */
|
||||
readonly useWord2002TableStyleRules?: boolean;
|
||||
/** Allow Tables to AutoFit Into Page Margins */
|
||||
readonly growAutofit?: boolean;
|
||||
/** Do Not Bypass East Asian/Complex Script Layout Code */
|
||||
readonly useFELayout?: boolean;
|
||||
/** Do Not Automatically Apply List Paragraph Style To Bulleted/Numbered Text */
|
||||
readonly useNormalStyleForList?: boolean;
|
||||
/** Ignore Hanging Indent When Creating Tab Stop After Numbering */
|
||||
readonly doNotUseIndentAsNumberingTabStop?: boolean;
|
||||
/** Use Alternate Set of East Asian Line Breaking Rules */
|
||||
readonly useAlternateEastAsianLineBreakRules?: boolean;
|
||||
/** Allow Contextual Spacing of Paragraphs in Tables */
|
||||
readonly allowSpaceOfSameStyleInTable?: boolean;
|
||||
/** Do Not Ignore Floating Objects When Calculating Paragraph Indentation */
|
||||
readonly doNotSuppressIndentation?: boolean;
|
||||
/** Do Not AutoFit Tables To Fit Next To Wrapped Objects */
|
||||
readonly doNotAutofitConstrainedTables?: boolean;
|
||||
/** Allow Table Columns To Exceed Preferred Widths of Constituent Cells */
|
||||
readonly autofitToFirstFixedWidthCell?: boolean;
|
||||
/** Underline Following Character Following Numbering */
|
||||
readonly underlineTabInNumberingList?: boolean;
|
||||
/** Always Use Fixed Width for Hangul Characters */
|
||||
readonly displayHangulFixedWidth?: boolean;
|
||||
/** Always Move Paragraph Mark to Page after a Page Break */
|
||||
readonly splitPgBreakAndParaMark?: boolean;
|
||||
/** Don't Vertically Align Cells Containing Floating Objects */
|
||||
readonly doNotVerticallyAlignCellWithSp?: boolean;
|
||||
/** Don't Break Table Rows Around Floating Tables */
|
||||
readonly doNotBreakConstrainedForcedTable?: boolean;
|
||||
/** Ignore Vertical Alignment in Textboxes */
|
||||
readonly ignoreVerticalAlignmentInTextboxes?: boolean;
|
||||
/** Use ANSI Kerning Pairs from Fonts */
|
||||
readonly useAnsiKerningPairs?: boolean;
|
||||
/** Use Cached Paragraph Information for Column Balancing */
|
||||
readonly cachedColumnBalance?: boolean;
|
||||
}
|
||||
|
||||
export class Compatibility extends XmlComponent {
|
||||
public constructor(options: ICompatibilityOptions) {
|
||||
super("w:compat");
|
||||
|
||||
// Don't justify lines ending in soft line break setting
|
||||
if (options.doNotExpandShiftReturn !== undefined) {
|
||||
this.root.push(new OnOffElement("w:doNotExpandShiftReturn", options.doNotExpandShiftReturn));
|
||||
}
|
||||
|
||||
if (options.version) {
|
||||
this.root.push(new CompatibilitySetting(options.version));
|
||||
}
|
||||
|
||||
if (options.useSingleBorderforContiguousCells) {
|
||||
this.root.push(new OnOffElement("w:useSingleBorderforContiguousCells", options.useSingleBorderforContiguousCells));
|
||||
}
|
||||
|
||||
if (options.wordPerfectJustification) {
|
||||
this.root.push(new OnOffElement("w:wpJustification", options.wordPerfectJustification));
|
||||
}
|
||||
|
||||
if (options.noTabStopForHangingIndent) {
|
||||
this.root.push(new OnOffElement("w:noTabHangInd", options.noTabStopForHangingIndent));
|
||||
}
|
||||
|
||||
if (options.noLeading) {
|
||||
this.root.push(new OnOffElement("w:noLeading", options.noLeading));
|
||||
}
|
||||
|
||||
if (options.spaceForUnderline) {
|
||||
this.root.push(new OnOffElement("w:spaceForUL", options.spaceForUnderline));
|
||||
}
|
||||
|
||||
if (options.noColumnBalance) {
|
||||
this.root.push(new OnOffElement("w:noColumnBalance", options.noColumnBalance));
|
||||
}
|
||||
|
||||
if (options.balanceSingleByteDoubleByteWidth) {
|
||||
this.root.push(new OnOffElement("w:balanceSingleByteDoubleByteWidth", options.balanceSingleByteDoubleByteWidth));
|
||||
}
|
||||
|
||||
if (options.noExtraLineSpacing) {
|
||||
this.root.push(new OnOffElement("w:noExtraLineSpacing", options.noExtraLineSpacing));
|
||||
}
|
||||
|
||||
if (options.doNotLeaveBackslashAlone) {
|
||||
this.root.push(new OnOffElement("w:doNotLeaveBackslashAlone", options.doNotLeaveBackslashAlone));
|
||||
}
|
||||
|
||||
if (options.underlineTrailingSpaces) {
|
||||
this.root.push(new OnOffElement("w:ulTrailSpace", options.underlineTrailingSpaces));
|
||||
}
|
||||
|
||||
if (options.doNotExpandShiftReturn) {
|
||||
this.root.push(new OnOffElement("w:doNotExpandShiftReturn", options.doNotExpandShiftReturn));
|
||||
}
|
||||
|
||||
if (options.spacingInWholePoints) {
|
||||
this.root.push(new OnOffElement("w:spacingInWholePoints", options.spacingInWholePoints));
|
||||
}
|
||||
|
||||
if (options.lineWrapLikeWord6) {
|
||||
this.root.push(new OnOffElement("w:lineWrapLikeWord6", options.lineWrapLikeWord6));
|
||||
}
|
||||
|
||||
if (options.printBodyTextBeforeHeader) {
|
||||
this.root.push(new OnOffElement("w:printBodyTextBeforeHeader", options.printBodyTextBeforeHeader));
|
||||
}
|
||||
|
||||
if (options.printColorsBlack) {
|
||||
this.root.push(new OnOffElement("w:printColBlack", options.printColorsBlack));
|
||||
}
|
||||
|
||||
if (options.spaceWidth) {
|
||||
this.root.push(new OnOffElement("w:wpSpaceWidth", options.spaceWidth));
|
||||
}
|
||||
|
||||
if (options.showBreaksInFrames) {
|
||||
this.root.push(new OnOffElement("w:showBreaksInFrames", options.showBreaksInFrames));
|
||||
}
|
||||
|
||||
if (options.subFontBySize) {
|
||||
this.root.push(new OnOffElement("w:subFontBySize", options.subFontBySize));
|
||||
}
|
||||
|
||||
if (options.suppressBottomSpacing) {
|
||||
this.root.push(new OnOffElement("w:suppressBottomSpacing", options.suppressBottomSpacing));
|
||||
}
|
||||
|
||||
if (options.suppressTopSpacing) {
|
||||
this.root.push(new OnOffElement("w:suppressTopSpacing", options.suppressTopSpacing));
|
||||
}
|
||||
|
||||
if (options.suppressSpacingAtTopOfPage) {
|
||||
this.root.push(new OnOffElement("w:suppressSpacingAtTopOfPage", options.suppressSpacingAtTopOfPage));
|
||||
}
|
||||
|
||||
if (options.suppressTopSpacingWP) {
|
||||
this.root.push(new OnOffElement("w:suppressTopSpacingWP", options.suppressTopSpacingWP));
|
||||
}
|
||||
|
||||
if (options.suppressSpBfAfterPgBrk) {
|
||||
this.root.push(new OnOffElement("w:suppressSpBfAfterPgBrk", options.suppressSpBfAfterPgBrk));
|
||||
}
|
||||
|
||||
if (options.swapBordersFacingPages) {
|
||||
this.root.push(new OnOffElement("w:swapBordersFacingPages", options.swapBordersFacingPages));
|
||||
}
|
||||
|
||||
if (options.convertMailMergeEsc) {
|
||||
this.root.push(new OnOffElement("w:convMailMergeEsc", options.convertMailMergeEsc));
|
||||
}
|
||||
|
||||
if (options.truncateFontHeightsLikeWP6) {
|
||||
this.root.push(new OnOffElement("w:truncateFontHeightsLikeWP6", options.truncateFontHeightsLikeWP6));
|
||||
}
|
||||
|
||||
if (options.macWordSmallCaps) {
|
||||
this.root.push(new OnOffElement("w:mwSmallCaps", options.macWordSmallCaps));
|
||||
}
|
||||
|
||||
if (options.usePrinterMetrics) {
|
||||
this.root.push(new OnOffElement("w:usePrinterMetrics", options.usePrinterMetrics));
|
||||
}
|
||||
|
||||
if (options.doNotSuppressParagraphBorders) {
|
||||
this.root.push(new OnOffElement("w:doNotSuppressParagraphBorders", options.doNotSuppressParagraphBorders));
|
||||
}
|
||||
|
||||
if (options.wrapTrailSpaces) {
|
||||
this.root.push(new OnOffElement("w:wrapTrailSpaces", options.wrapTrailSpaces));
|
||||
}
|
||||
|
||||
if (options.footnoteLayoutLikeWW8) {
|
||||
this.root.push(new OnOffElement("w:footnoteLayoutLikeWW8", options.footnoteLayoutLikeWW8));
|
||||
}
|
||||
|
||||
if (options.shapeLayoutLikeWW8) {
|
||||
this.root.push(new OnOffElement("w:shapeLayoutLikeWW8", options.shapeLayoutLikeWW8));
|
||||
}
|
||||
|
||||
if (options.alignTablesRowByRow) {
|
||||
this.root.push(new OnOffElement("w:alignTablesRowByRow", options.alignTablesRowByRow));
|
||||
}
|
||||
|
||||
if (options.forgetLastTabAlignment) {
|
||||
this.root.push(new OnOffElement("w:forgetLastTabAlignment", options.forgetLastTabAlignment));
|
||||
}
|
||||
|
||||
if (options.adjustLineHeightInTable) {
|
||||
this.root.push(new OnOffElement("w:adjustLineHeightInTable", options.adjustLineHeightInTable));
|
||||
}
|
||||
|
||||
if (options.autoSpaceLikeWord95) {
|
||||
this.root.push(new OnOffElement("w:autoSpaceLikeWord95", options.autoSpaceLikeWord95));
|
||||
}
|
||||
|
||||
if (options.noSpaceRaiseLower) {
|
||||
this.root.push(new OnOffElement("w:noSpaceRaiseLower", options.noSpaceRaiseLower));
|
||||
}
|
||||
|
||||
if (options.doNotUseHTMLParagraphAutoSpacing) {
|
||||
this.root.push(new OnOffElement("w:doNotUseHTMLParagraphAutoSpacing", options.doNotUseHTMLParagraphAutoSpacing));
|
||||
}
|
||||
|
||||
if (options.layoutRawTableWidth) {
|
||||
this.root.push(new OnOffElement("w:layoutRawTableWidth", options.layoutRawTableWidth));
|
||||
}
|
||||
|
||||
if (options.layoutTableRowsApart) {
|
||||
this.root.push(new OnOffElement("w:layoutTableRowsApart", options.layoutTableRowsApart));
|
||||
}
|
||||
|
||||
if (options.useWord97LineBreakRules) {
|
||||
this.root.push(new OnOffElement("w:useWord97LineBreakRules", options.useWord97LineBreakRules));
|
||||
}
|
||||
|
||||
if (options.doNotBreakWrappedTables) {
|
||||
this.root.push(new OnOffElement("w:doNotBreakWrappedTables", options.doNotBreakWrappedTables));
|
||||
}
|
||||
|
||||
if (options.doNotSnapToGridInCell) {
|
||||
this.root.push(new OnOffElement("w:doNotSnapToGridInCell", options.doNotSnapToGridInCell));
|
||||
}
|
||||
|
||||
if (options.selectFieldWithFirstOrLastCharacter) {
|
||||
this.root.push(new OnOffElement("w:selectFldWithFirstOrLastChar", options.selectFieldWithFirstOrLastCharacter));
|
||||
}
|
||||
|
||||
if (options.applyBreakingRules) {
|
||||
this.root.push(new OnOffElement("w:applyBreakingRules", options.applyBreakingRules));
|
||||
}
|
||||
|
||||
if (options.doNotWrapTextWithPunctuation) {
|
||||
this.root.push(new OnOffElement("w:doNotWrapTextWithPunct", options.doNotWrapTextWithPunctuation));
|
||||
}
|
||||
|
||||
if (options.doNotUseEastAsianBreakRules) {
|
||||
this.root.push(new OnOffElement("w:doNotUseEastAsianBreakRules", options.doNotUseEastAsianBreakRules));
|
||||
}
|
||||
|
||||
if (options.useWord2002TableStyleRules) {
|
||||
this.root.push(new OnOffElement("w:useWord2002TableStyleRules", options.useWord2002TableStyleRules));
|
||||
}
|
||||
|
||||
if (options.growAutofit) {
|
||||
this.root.push(new OnOffElement("w:growAutofit", options.growAutofit));
|
||||
}
|
||||
|
||||
if (options.useFELayout) {
|
||||
this.root.push(new OnOffElement("w:useFELayout", options.useFELayout));
|
||||
}
|
||||
|
||||
if (options.useNormalStyleForList) {
|
||||
this.root.push(new OnOffElement("w:useNormalStyleForList", options.useNormalStyleForList));
|
||||
}
|
||||
|
||||
if (options.doNotUseIndentAsNumberingTabStop) {
|
||||
this.root.push(new OnOffElement("w:doNotUseIndentAsNumberingTabStop", options.doNotUseIndentAsNumberingTabStop));
|
||||
}
|
||||
|
||||
if (options.useAlternateEastAsianLineBreakRules) {
|
||||
this.root.push(new OnOffElement("w:useAltKinsokuLineBreakRules", options.useAlternateEastAsianLineBreakRules));
|
||||
}
|
||||
|
||||
if (options.allowSpaceOfSameStyleInTable) {
|
||||
this.root.push(new OnOffElement("w:allowSpaceOfSameStyleInTable", options.allowSpaceOfSameStyleInTable));
|
||||
}
|
||||
|
||||
if (options.doNotSuppressIndentation) {
|
||||
this.root.push(new OnOffElement("w:doNotSuppressIndentation", options.doNotSuppressIndentation));
|
||||
}
|
||||
|
||||
if (options.doNotAutofitConstrainedTables) {
|
||||
this.root.push(new OnOffElement("w:doNotAutofitConstrainedTables", options.doNotAutofitConstrainedTables));
|
||||
}
|
||||
|
||||
if (options.autofitToFirstFixedWidthCell) {
|
||||
this.root.push(new OnOffElement("w:autofitToFirstFixedWidthCell", options.autofitToFirstFixedWidthCell));
|
||||
}
|
||||
|
||||
if (options.underlineTabInNumberingList) {
|
||||
this.root.push(new OnOffElement("w:underlineTabInNumList", options.underlineTabInNumberingList));
|
||||
}
|
||||
|
||||
if (options.displayHangulFixedWidth) {
|
||||
this.root.push(new OnOffElement("w:displayHangulFixedWidth", options.displayHangulFixedWidth));
|
||||
}
|
||||
|
||||
if (options.splitPgBreakAndParaMark) {
|
||||
this.root.push(new OnOffElement("w:splitPgBreakAndParaMark", options.splitPgBreakAndParaMark));
|
||||
}
|
||||
|
||||
if (options.doNotVerticallyAlignCellWithSp) {
|
||||
this.root.push(new OnOffElement("w:doNotVertAlignCellWithSp", options.doNotVerticallyAlignCellWithSp));
|
||||
}
|
||||
|
||||
if (options.doNotBreakConstrainedForcedTable) {
|
||||
this.root.push(new OnOffElement("w:doNotBreakConstrainedForcedTable", options.doNotBreakConstrainedForcedTable));
|
||||
}
|
||||
|
||||
if (options.ignoreVerticalAlignmentInTextboxes) {
|
||||
this.root.push(new OnOffElement("w:doNotVertAlignInTxbx", options.ignoreVerticalAlignmentInTextboxes));
|
||||
}
|
||||
|
||||
if (options.useAnsiKerningPairs) {
|
||||
this.root.push(new OnOffElement("w:useAnsiKerningPairs", options.useAnsiKerningPairs));
|
||||
}
|
||||
|
||||
if (options.cachedColumnBalance) {
|
||||
this.root.push(new OnOffElement("w:cachedColBalance", options.cachedColumnBalance));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,5 +61,80 @@ describe("Settings", () => {
|
||||
"w:trackRevisions": {},
|
||||
});
|
||||
});
|
||||
|
||||
it("should add compatibility setting with default compatability version", () => {
|
||||
const settings = new Settings({
|
||||
compatibility: {},
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(settings);
|
||||
expect(Object.keys(tree)).has.length(1);
|
||||
expect(tree["w:settings"]).to.be.an("array");
|
||||
|
||||
expect(tree["w:settings"]).to.deep.include({
|
||||
"w:compat": [
|
||||
{
|
||||
"w:compatSetting": {
|
||||
_attr: {
|
||||
"w:name": "compatibilityMode",
|
||||
"w:uri": "http://schemas.microsoft.com/office/word",
|
||||
"w:val": 15,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("should add compatibility setting with version", () => {
|
||||
const settings = new Settings({
|
||||
compatibility: {
|
||||
version: 99,
|
||||
},
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(settings);
|
||||
expect(Object.keys(tree)).has.length(1);
|
||||
expect(tree["w:settings"]).to.be.an("array");
|
||||
|
||||
expect(tree["w:settings"]).to.deep.include({
|
||||
"w:compat": [
|
||||
{
|
||||
"w:compatSetting": {
|
||||
_attr: {
|
||||
"w:name": "compatibilityMode",
|
||||
"w:uri": "http://schemas.microsoft.com/office/word",
|
||||
"w:val": 99,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
// TODO: Remove when deprecating compatibilityModeVersion
|
||||
it("should add compatibility setting with legacy version", () => {
|
||||
const settings = new Settings({
|
||||
compatibilityModeVersion: 99,
|
||||
});
|
||||
|
||||
const tree = new Formatter().format(settings);
|
||||
expect(Object.keys(tree)).has.length(1);
|
||||
expect(tree["w:settings"]).to.be.an("array");
|
||||
|
||||
expect(tree["w:settings"]).to.deep.include({
|
||||
"w:compat": [
|
||||
{
|
||||
"w:compatSetting": {
|
||||
_attr: {
|
||||
"w:name": "compatibilityMode",
|
||||
"w:uri": "http://schemas.microsoft.com/office/word",
|
||||
"w:val": 99,
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { OnOffElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { Compatibility } from "./compatibility";
|
||||
import { Compatibility, ICompatibilityOptions } from "./compatibility";
|
||||
|
||||
export class SettingsAttributes extends XmlAttributeComponent<{
|
||||
readonly wpc?: string;
|
||||
@ -147,10 +147,11 @@ export class SettingsAttributes extends XmlAttributeComponent<{
|
||||
// </xsd:complexType>
|
||||
|
||||
export interface ISettingsOptions {
|
||||
readonly compatabilityModeVersion?: number;
|
||||
readonly compatibilityModeVersion?: number;
|
||||
readonly evenAndOddHeaders?: boolean;
|
||||
readonly trackRevisions?: boolean;
|
||||
readonly updateFields?: boolean;
|
||||
readonly compatibility?: ICompatibilityOptions;
|
||||
}
|
||||
|
||||
export class Settings extends XmlComponent {
|
||||
@ -199,7 +200,8 @@ export class Settings extends XmlComponent {
|
||||
|
||||
this.root.push(
|
||||
new Compatibility({
|
||||
version: options.compatabilityModeVersion || 15,
|
||||
...(options.compatibility ?? {}),
|
||||
version: options.compatibility?.version ?? options.compatibilityModeVersion ?? 15,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
@ -1,2 +1,3 @@
|
||||
export * from "./alignment";
|
||||
export * from "./number-format";
|
||||
export * from "./space-type";
|
||||
|
@ -1,12 +0,0 @@
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
|
||||
class AliasAttributes extends XmlAttributeComponent<{ readonly alias: string }> {
|
||||
protected readonly xmlKeys = { alias: "w:val" };
|
||||
}
|
||||
|
||||
export class Alias extends XmlComponent {
|
||||
public constructor(alias: string) {
|
||||
super("w:alias");
|
||||
this.root.push(new AliasAttributes({ alias }));
|
||||
}
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
// http://officeopenxml.com/WPfieldInstructions.php
|
||||
import { TextAttributes } from "@file/paragraph/run/text-attributes";
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
import { ITableOfContentsOptions } from "./table-of-contents-properties";
|
||||
|
@ -1,10 +1,9 @@
|
||||
// http://www.datypic.com/sc/ooxml/e-w_sdtPr-1.html
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
import { Alias } from "./alias";
|
||||
import { StringValueElement, XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class StructuredDocumentTagProperties extends XmlComponent {
|
||||
public constructor(alias: string) {
|
||||
super("w:sdtPr");
|
||||
this.root.push(new Alias(alias));
|
||||
this.root.push(new StringValueElement("w:alias", alias));
|
||||
}
|
||||
}
|
||||
|
@ -2,4 +2,3 @@ export * from "./table-properties";
|
||||
export * from "./table-float-properties";
|
||||
export * from "./table-layout";
|
||||
export * from "./table-borders";
|
||||
export * from "./table-overlap";
|
||||
|
@ -2,8 +2,13 @@ import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
|
||||
import { RelativeHorizontalPosition, RelativeVerticalPosition, TableAnchorType, TableFloatProperties } from "./table-float-properties";
|
||||
import { OverlapType } from "./table-overlap";
|
||||
import {
|
||||
OverlapType,
|
||||
RelativeHorizontalPosition,
|
||||
RelativeVerticalPosition,
|
||||
TableAnchorType,
|
||||
TableFloatProperties,
|
||||
} from "./table-float-properties";
|
||||
|
||||
describe("Table Float Properties", () => {
|
||||
describe("#constructor", () => {
|
||||
|
@ -1,8 +1,6 @@
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
import { StringEnumValueElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
import { signedTwipsMeasureValue, twipsMeasureValue } from "@util/values";
|
||||
|
||||
import { OverlapType, TableOverlap } from "./table-overlap";
|
||||
|
||||
export enum TableAnchorType {
|
||||
MARGIN = "margin",
|
||||
PAGE = "page",
|
||||
@ -26,6 +24,17 @@ export enum RelativeVerticalPosition {
|
||||
TOP = "top",
|
||||
}
|
||||
|
||||
// <xsd:simpleType name="ST_TblOverlap">
|
||||
// <xsd:restriction base="xsd:string">
|
||||
// <xsd:enumeration value="never"/>
|
||||
// <xsd:enumeration value="overlap"/>
|
||||
// </xsd:restriction>
|
||||
// </xsd:simpleType>
|
||||
export enum OverlapType {
|
||||
NEVER = "never",
|
||||
OVERLAP = "overlap",
|
||||
}
|
||||
|
||||
export interface ITableFloatOptions {
|
||||
/* cSpell:disable */
|
||||
/**
|
||||
@ -171,7 +180,10 @@ export class TableFloatProperties extends XmlComponent {
|
||||
);
|
||||
|
||||
if (options.overlap) {
|
||||
this.root.push(new TableOverlap(options.overlap));
|
||||
// <xsd:complexType name="CT_TblOverlap">
|
||||
// <xsd:attribute name="val" type="ST_TblOverlap" use="required"/>
|
||||
// </xsd:complexType>
|
||||
this.root.push(new StringEnumValueElement<OverlapType>("w:tblOverlap", options.overlap));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "@export/formatter";
|
||||
|
||||
import { OverlapType, TableOverlap } from "./table-overlap";
|
||||
|
||||
describe("TableOverlap", () => {
|
||||
describe("#constructor", () => {
|
||||
it("sets the width attribute to the value given", () => {
|
||||
const tableOverlap = new TableOverlap(OverlapType.OVERLAP);
|
||||
const tree = new Formatter().format(tableOverlap);
|
||||
|
||||
expect(tree).to.deep.equal({
|
||||
"w:tblOverlap": {
|
||||
_attr: {
|
||||
"w:val": "overlap",
|
||||
},
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
@ -1,26 +0,0 @@
|
||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||
|
||||
// <xsd:simpleType name="ST_TblOverlap">
|
||||
// <xsd:restriction base="xsd:string">
|
||||
// <xsd:enumeration value="never"/>
|
||||
// <xsd:enumeration value="overlap"/>
|
||||
// </xsd:restriction>
|
||||
// </xsd:simpleType>
|
||||
export enum OverlapType {
|
||||
NEVER = "never",
|
||||
OVERLAP = "overlap",
|
||||
}
|
||||
|
||||
// <xsd:complexType name="CT_TblOverlap">
|
||||
// <xsd:attribute name="val" type="ST_TblOverlap" use="required"/>
|
||||
// </xsd:complexType>
|
||||
class TableOverlapAttributes extends XmlAttributeComponent<{ readonly val: OverlapType }> {
|
||||
protected readonly xmlKeys = { val: "w:val" };
|
||||
}
|
||||
|
||||
export class TableOverlap extends XmlComponent {
|
||||
public constructor(type: OverlapType) {
|
||||
super("w:tblOverlap");
|
||||
this.root.push(new TableOverlapAttributes({ val: type }));
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
import { TextAttributes } from "@file/paragraph/run/text-attributes";
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class DeletedPage extends XmlComponent {
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { TextAttributes } from "@file/paragraph/run/text-attributes";
|
||||
import { SpaceType } from "@file/space-type";
|
||||
import { SpaceType } from "@file/shared";
|
||||
import { XmlComponent } from "@file/xml-components";
|
||||
|
||||
export class DeletedText extends XmlComponent {
|
||||
|
@ -3,7 +3,7 @@ import { Element, xml2js } from "xml-js";
|
||||
|
||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
||||
|
||||
import { convertToXmlComponent, ImportedXmlComponent } from "./imported-xml-component";
|
||||
import { convertToXmlComponent, ImportedRootElementAttributes, ImportedXmlComponent } from "./imported-xml-component";
|
||||
import { IContext } from "./base";
|
||||
|
||||
const xmlString = `
|
||||
@ -90,5 +90,29 @@ describe("ImportedXmlComponent", () => {
|
||||
const converted = convertToXmlComponent(xmlObj);
|
||||
expect(converted).to.deep.equal(convertedXmlElement);
|
||||
});
|
||||
|
||||
it("should return undefined if xml type is invalid", () => {
|
||||
const xmlObj = { type: "invalid" } as Element;
|
||||
const converted = convertToXmlComponent(xmlObj);
|
||||
expect(converted).to.equal(undefined);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("ImportedRootElementAttributes", () => {
|
||||
let attributes: ImportedRootElementAttributes;
|
||||
|
||||
beforeEach(() => {
|
||||
attributes = new ImportedRootElementAttributes({});
|
||||
});
|
||||
|
||||
describe("#prepForXml()", () => {
|
||||
it("should work", () => {
|
||||
// tslint:disable-next-line: no-object-literal-type-assertion
|
||||
const converted = attributes.prepForXml({} as IContext);
|
||||
expect(converted).to.deep.equal({
|
||||
_attr: {},
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -53,6 +53,13 @@ export class NumberValueElement extends XmlComponent {
|
||||
}
|
||||
}
|
||||
|
||||
export class StringEnumValueElement<T extends string> extends XmlComponent {
|
||||
public constructor(name: string, val: T) {
|
||||
super(name);
|
||||
this.root.push(new Attributes({ val }));
|
||||
}
|
||||
}
|
||||
|
||||
// Simple nodes containing text.
|
||||
//
|
||||
// new StringContainer("hello", "world")
|
||||
|
@ -16,7 +16,8 @@
|
||||
"paths": {
|
||||
"@util/*": ["./util/*"],
|
||||
"@export/*": ["./export/*"],
|
||||
"@file/*": ["./file/*"]
|
||||
"@file/*": ["./file/*"],
|
||||
"@shared": ["./shared/index.ts"]
|
||||
}
|
||||
},
|
||||
"include": ["src"]
|
||||
|
@ -12,7 +12,7 @@ const configuration = {
|
||||
filename: "index.js",
|
||||
libraryTarget: "umd",
|
||||
library: "docx",
|
||||
globalObject: "this",
|
||||
globalObject: "globalThis",
|
||||
},
|
||||
|
||||
resolve: {
|
||||
|
Reference in New Issue
Block a user