Compare commits
146 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 | |||
7e5e2baf92 | |||
53c70e6cd1 | |||
4bfb87ea74 | |||
86e12c7d40 | |||
eb5449adf8 | |||
19eeec9fc8 | |||
449f5f5be3 | |||
bc5a1b52b7 | |||
fc7f37767f | |||
38dbdd02ae | |||
7bb3fa74ce | |||
a33660d32c | |||
ef842d1f3f | |||
e5c2a0a87b | |||
817ffe8fd0 | |||
5b582d45ba | |||
6a303532f4 | |||
c75abb7cb9 | |||
8282d76b87 | |||
79f3866c4c | |||
6dcf3f25e9 | |||
e80acea63f | |||
640639264d | |||
3ccdd2585c | |||
2c4b55c692 | |||
70a3b25d54 | |||
d053baef03 | |||
629c586014 | |||
e4b03b3f71 | |||
9ab6df99b1 | |||
51519a55ef | |||
059455929b | |||
8a1df4438e | |||
cbf6e46e35 | |||
727b1bd63b | |||
363b8d74ae | |||
b31ecd6583 | |||
563914a0ef | |||
1e8adbb240 | |||
4b1f89a561 | |||
1a4a0ea5b8 | |||
f781028b08 | |||
56e8ad4f17 | |||
62c34ae612 | |||
26123b0a93 | |||
4023464a13 | |||
0c92f354c5 | |||
676723c8bd | |||
2f4d5afaea | |||
d0abceb08d | |||
8b165e93e1 | |||
321969eb85 | |||
85ec90849e | |||
96451bc5b7 | |||
311cbf55ef | |||
0258b256f2 | |||
c615de97c4 | |||
e29a7bf146 | |||
b665c243f0 | |||
bea1c9ed61 | |||
0e6bdaa9c9 | |||
7925689618 | |||
791441ec86 |
27
.github/workflows/demos.yml
vendored
27
.github/workflows/demos.yml
vendored
@ -689,3 +689,30 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
xml-file: build/extracted-doc/word/document.xml
|
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,
|
"check-coverage": true,
|
||||||
"statements": 99.72,
|
"statements": 99.79,
|
||||||
"branches": 97.95,
|
"branches": 98.41,
|
||||||
"functions": 99.82,
|
"functions": 100,
|
||||||
"lines": 99.71,
|
"lines": 99.73,
|
||||||
"include": [
|
"include": [
|
||||||
"src/**/*.ts"
|
"src/**/*.ts"
|
||||||
],
|
],
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Simple example to add text to a document
|
// Simple example to add text to a document
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||||
|
|
||||||
const doc = new Document({
|
const doc = new Document({
|
||||||
sections: [
|
sections: [
|
||||||
@ -16,7 +16,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Generate a CV
|
// Generate a CV
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
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
|
// tslint:disable:no-shadowed-variable
|
||||||
|
|
||||||
@ -284,7 +284,7 @@ class DocumentCreator {
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: `\t${dateText}`,
|
children: [new Tab(), dateText],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Export to base64 string - Useful in a browser environment.
|
// Export to base64 string - Useful in a browser environment.
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||||
|
|
||||||
const doc = new Document({
|
const doc = new Document({
|
||||||
sections: [
|
sections: [
|
||||||
@ -15,7 +15,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tBar",
|
children: [new Tab(), "Bar"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -82,6 +82,32 @@ const doc = new Document({
|
|||||||
spacing: { line: 276, before: 20 * 72 * 0.1, after: 20 * 72 * 0.05 },
|
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: {
|
numbering: {
|
||||||
@ -169,6 +195,14 @@ const doc = new Document({
|
|||||||
new TextRun({
|
new TextRun({
|
||||||
text: "and back to normal.",
|
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({
|
new Paragraph({
|
||||||
@ -182,6 +216,40 @@ const doc = new Document({
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
style: "strikeUnderline",
|
||||||
|
children: [
|
||||||
|
new TextRun({
|
||||||
|
text: "Underline and Strike",
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
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
|
// Example of making content of section vertically aligned
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
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({
|
const doc = new Document({
|
||||||
sections: [
|
sections: [
|
||||||
@ -18,7 +18,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -25,6 +25,11 @@ const doc = new Document({
|
|||||||
width: 100,
|
width: 100,
|
||||||
height: 100,
|
height: 100,
|
||||||
},
|
},
|
||||||
|
altText: {
|
||||||
|
title: "This is an ultimate title",
|
||||||
|
description: "This is an ultimate image",
|
||||||
|
name: "My Ultimate Image",
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
@ -16,6 +16,7 @@ import {
|
|||||||
MathSubScript,
|
MathSubScript,
|
||||||
MathSubSuperScript,
|
MathSubSuperScript,
|
||||||
MathSum,
|
MathSum,
|
||||||
|
MathIntegral,
|
||||||
MathSuperScript,
|
MathSuperScript,
|
||||||
Packer,
|
Packer,
|
||||||
Paragraph,
|
Paragraph,
|
||||||
@ -90,6 +91,35 @@ const doc = new Document({
|
|||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
children: [
|
||||||
|
new Math({
|
||||||
|
children: [
|
||||||
|
new MathIntegral({
|
||||||
|
children: [new MathRun("test")],
|
||||||
|
}),
|
||||||
|
new MathIntegral({
|
||||||
|
children: [
|
||||||
|
new MathSuperScript({
|
||||||
|
children: [new MathRun("e")],
|
||||||
|
superScript: [new MathRun("2")],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
subScript: [new MathRun("i")],
|
||||||
|
}),
|
||||||
|
new MathIntegral({
|
||||||
|
children: [
|
||||||
|
new MathRadical({
|
||||||
|
children: [new MathRun("i")],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
subScript: [new MathRun("i")],
|
||||||
|
superScript: [new MathRun("10")],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
new Paragraph({
|
new Paragraph({
|
||||||
children: [
|
children: [
|
||||||
new Math({
|
new Math({
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Change background colour of whole document
|
// Change background colour of whole document
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||||
|
|
||||||
const doc = new Document({
|
const doc = new Document({
|
||||||
background: {
|
background: {
|
||||||
@ -19,7 +19,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Example of how to change page borders
|
// Example of how to change page borders
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
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({
|
const doc = new Document({
|
||||||
sections: [
|
sections: [
|
||||||
@ -25,7 +25,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -12,6 +12,7 @@ import {
|
|||||||
PageNumber,
|
PageNumber,
|
||||||
Paragraph,
|
Paragraph,
|
||||||
ShadingType,
|
ShadingType,
|
||||||
|
Tab,
|
||||||
TextRun,
|
TextRun,
|
||||||
} from "../build";
|
} from "../build";
|
||||||
|
|
||||||
@ -111,7 +112,7 @@ const doc = new Document({
|
|||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
bold: true,
|
bold: true,
|
||||||
children: ["\tuse Inserted and Deleted TextRuns.", new FootnoteReferenceRun(1)],
|
children: [new Tab(), "use Inserted and Deleted TextRuns.", new FootnoteReferenceRun(1)],
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
bold: true,
|
bold: true,
|
||||||
|
@ -8,6 +8,7 @@ import {
|
|||||||
HorizontalPositionAlign,
|
HorizontalPositionAlign,
|
||||||
Packer,
|
Packer,
|
||||||
Paragraph,
|
Paragraph,
|
||||||
|
Tab,
|
||||||
TextRun,
|
TextRun,
|
||||||
VerticalPositionAlign,
|
VerticalPositionAlign,
|
||||||
} from "../build";
|
} from "../build";
|
||||||
@ -67,7 +68,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -7,12 +7,31 @@ const doc = new Document({
|
|||||||
sections: [
|
sections: [
|
||||||
{
|
{
|
||||||
children: [
|
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({
|
new Paragraph({
|
||||||
children: [
|
children: [
|
||||||
new TextRun("我今天遛狗去公园"),
|
new TextRun("我今天遛狗去公园"),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||||
space: SpaceType.PRESERVE,
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
@ -23,7 +42,6 @@ const doc = new Document({
|
|||||||
),
|
),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
text: "456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345456435234523456435564745673456345",
|
||||||
space: SpaceType.PRESERVE,
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// Exporting the document as a stream
|
// Exporting the document as a stream
|
||||||
// Import from 'docx' rather than '../build' if you install from npm
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import { Document, Packer, Paragraph, TextRun } from "../build";
|
import { Document, Packer, Paragraph, Tab, TextRun } from "../build";
|
||||||
|
|
||||||
const doc = new Document({
|
const doc = new Document({
|
||||||
sections: [
|
sections: [
|
||||||
@ -16,7 +16,7 @@ const doc = new Document({
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new TextRun({
|
new TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
80
demo/75-tab-stops.ts
Normal file
80
demo/75-tab-stops.ts
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
// Exporting the document as a stream
|
||||||
|
// Import from 'docx' rather than '../build' if you install from npm
|
||||||
|
import * as fs from "fs";
|
||||||
|
import { Document, HeadingLevel, Packer, Paragraph, TabStopPosition, TabStopType, TextRun } from "../build";
|
||||||
|
|
||||||
|
const columnWidth = TabStopPosition.MAX / 4;
|
||||||
|
const receiptTabStops = [
|
||||||
|
// no need to define first left tab column
|
||||||
|
// the right aligned tab column position should point to the end of column
|
||||||
|
// i.e. in this case
|
||||||
|
// (end position of 1st) + (end position of current)
|
||||||
|
// columnWidth + columnWidth = columnWidth * 2
|
||||||
|
|
||||||
|
{ type: TabStopType.RIGHT, position: columnWidth * 2 },
|
||||||
|
{ type: TabStopType.RIGHT, position: columnWidth * 3 },
|
||||||
|
{ type: TabStopType.RIGHT, position: TabStopPosition.MAX },
|
||||||
|
],
|
||||||
|
twoTabStops = [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }];
|
||||||
|
|
||||||
|
const doc = new Document({
|
||||||
|
sections: [
|
||||||
|
{
|
||||||
|
properties: {},
|
||||||
|
children: [
|
||||||
|
new Paragraph({
|
||||||
|
heading: HeadingLevel.HEADING_1,
|
||||||
|
children: [new TextRun("Receipt 001")],
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: twoTabStops,
|
||||||
|
children: [
|
||||||
|
new TextRun({
|
||||||
|
text: "To Bob.\tBy Alice.",
|
||||||
|
bold: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: twoTabStops,
|
||||||
|
children: [new TextRun("Foo Inc\tBar Inc")],
|
||||||
|
}),
|
||||||
|
new Paragraph({ text: "" }),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: receiptTabStops,
|
||||||
|
|
||||||
|
children: [
|
||||||
|
new TextRun({
|
||||||
|
text: "Item\tPrice\tQuantity\tSub-total",
|
||||||
|
bold: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: receiptTabStops,
|
||||||
|
text: "Item 3\t10\t5\t50",
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: receiptTabStops,
|
||||||
|
text: "Item 3\t10\t5\t50",
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: receiptTabStops,
|
||||||
|
text: "Item 3\t10\t5\t50",
|
||||||
|
}),
|
||||||
|
new Paragraph({
|
||||||
|
tabStops: receiptTabStops,
|
||||||
|
children: [
|
||||||
|
new TextRun({
|
||||||
|
text: "\t\t\tTotal: 200",
|
||||||
|
bold: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
const stream = Packer.toStream(doc);
|
||||||
|
stream.pipe(fs.createWriteStream("My Document.docx"));
|
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"));
|
@ -24,7 +24,7 @@
|
|||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
new docx.TextRun({
|
new docx.TextRun({
|
||||||
text: "\tGithub is the best",
|
children: [new docx.Tab(), "Github is the best"],
|
||||||
bold: true,
|
bold: true,
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
|
@ -22,20 +22,19 @@ const doc = new docx.Document({
|
|||||||
|
|
||||||
### Full list of options:
|
### Full list of options:
|
||||||
|
|
||||||
|
- creator
|
||||||
* creator
|
- description
|
||||||
* description
|
- title
|
||||||
* title
|
- subject
|
||||||
* subject
|
- keywords
|
||||||
* keywords
|
- lastModifiedBy
|
||||||
* lastModifiedBy
|
- revision
|
||||||
* revision
|
- externalStyles
|
||||||
* externalStyles
|
- styles
|
||||||
* styles
|
- numbering
|
||||||
* numbering
|
- footnotes
|
||||||
* footnotes
|
- hyperlinks
|
||||||
* hyperlinks
|
- background
|
||||||
* background
|
|
||||||
|
|
||||||
### Change background color of Document
|
### 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.
|
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.
|
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
|
## Examples
|
||||||
|
|
||||||
### Add image to the document
|
### Add image to the document
|
||||||
|
|
||||||
Importing Images from file system path
|
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_
|
_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 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_
|
_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 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_
|
_Source: https://github.com/dolanmiu/docx/blob/master/demo/38-text-wrapping.ts_
|
||||||
|
@ -86,3 +86,34 @@ topLevelP.setNumbering(concrete, 0);
|
|||||||
subP.setNumbering(concrete, 1);
|
subP.setNumbering(concrete, 1);
|
||||||
subSubP.setNumbering(concrete, 2);
|
subSubP.setNumbering(concrete, 2);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Unindent numbering
|
||||||
|
|
||||||
|
Default:1. test
|
||||||
|
|
||||||
|
After:1.test
|
||||||
|
|
||||||
|
Use default numbering have indent,If you want unindent numbering
|
||||||
|
|
||||||
|
How to custom number see the demo:
|
||||||
|
https://runkit.com/dolanmiu/docx-demo3
|
||||||
|
|
||||||
|
```ts
|
||||||
|
|
||||||
|
enum LevelSuffix {
|
||||||
|
NOTHING = "nothing",
|
||||||
|
SPACE = "space",
|
||||||
|
TAB = "tab"
|
||||||
|
}
|
||||||
|
|
||||||
|
// custom numbering
|
||||||
|
const levels=[
|
||||||
|
{
|
||||||
|
level: 0,
|
||||||
|
format: "decimal",
|
||||||
|
text: "%1.",
|
||||||
|
alignment: AlignmentType.START,
|
||||||
|
suffix: LevelSuffix.NOTHING, // Cancel intent
|
||||||
|
}]
|
||||||
|
|
||||||
|
```
|
||||||
|
@ -111,7 +111,7 @@ const paragraph = new Paragraph({
|
|||||||
|
|
||||||
## Border
|
## Border
|
||||||
|
|
||||||
Add borders to a `Paragraph`. Good for making the `Paragraph` stand out
|
Add borders to a `Paragraph`. Good for making the `Paragraph` stand out. Border top and border bottom can be used as a horizontal rule (also known as horizontal line).
|
||||||
|
|
||||||
#### IBorderPropertyOptions
|
#### IBorderPropertyOptions
|
||||||
|
|
||||||
|
@ -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
|
## Break
|
||||||
|
|
||||||
Sometimes you would want to put text underneath another line of text but inside the same paragraph.
|
Sometimes you would want to put text underneath another line of text but inside the same paragraph.
|
||||||
|
3366
package-lock.json
generated
3366
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
10
package.json
10
package.json
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "docx",
|
"name": "docx",
|
||||||
"version": "7.5.0",
|
"version": "7.7.0",
|
||||||
"description": "Easily generate .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.",
|
"description": "Easily generate .docx files with JS/TS with a nice declarative API. Works for Node and on the Browser.",
|
||||||
"main": "build/index.js",
|
"main": "build/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -65,7 +65,7 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.2.15",
|
"@types/chai": "^4.2.15",
|
||||||
"@types/glob": "^8.0.0",
|
"@types/glob": "^8.0.0",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^10.0.0",
|
||||||
"@types/prompt": "^1.1.1",
|
"@types/prompt": "^1.1.1",
|
||||||
"@types/request-promise": "^4.1.42",
|
"@types/request-promise": "^4.1.42",
|
||||||
"@types/shelljs": "^0.8.9",
|
"@types/shelljs": "^0.8.9",
|
||||||
@ -75,7 +75,7 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
"@typescript-eslint/eslint-plugin": "^5.36.1",
|
||||||
"@typescript-eslint/parser": "^5.36.1",
|
"@typescript-eslint/parser": "^5.36.1",
|
||||||
"buffer": "^6.0.3",
|
"buffer": "^6.0.3",
|
||||||
"chai": "^3.5.0",
|
"chai": "^4.3.6",
|
||||||
"cspell": "^6.2.2",
|
"cspell": "^6.2.2",
|
||||||
"docsify-cli": "^4.3.0",
|
"docsify-cli": "^4.3.0",
|
||||||
"eslint": "^8.23.0",
|
"eslint": "^8.23.0",
|
||||||
@ -84,7 +84,7 @@
|
|||||||
"eslint-plugin-jsdoc": "^39.3.6",
|
"eslint-plugin-jsdoc": "^39.3.6",
|
||||||
"eslint-plugin-no-null": "^1.0.2",
|
"eslint-plugin-no-null": "^1.0.2",
|
||||||
"eslint-plugin-prefer-arrow": "^1.2.3",
|
"eslint-plugin-prefer-arrow": "^1.2.3",
|
||||||
"eslint-plugin-unicorn": "^43.0.2",
|
"eslint-plugin-unicorn": "^44.0.0",
|
||||||
"glob": "^8.0.1",
|
"glob": "^8.0.1",
|
||||||
"jszip": "^3.1.5",
|
"jszip": "^3.1.5",
|
||||||
"mocha": "^10.0.0",
|
"mocha": "^10.0.0",
|
||||||
@ -105,7 +105,7 @@
|
|||||||
"tsconfig-paths": "^4.0.0",
|
"tsconfig-paths": "^4.0.0",
|
||||||
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
"tsconfig-paths-webpack-plugin": "^4.0.0",
|
||||||
"typedoc": "^0.23.2",
|
"typedoc": "^0.23.2",
|
||||||
"typescript": "4.7.4",
|
"typescript": "4.8.4",
|
||||||
"unzipper": "^0.10.11",
|
"unzipper": "^0.10.11",
|
||||||
"webpack": "^5.28.0",
|
"webpack": "^5.28.0",
|
||||||
"webpack-cli": "^4.6.0"
|
"webpack-cli": "^4.6.0"
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { ICommentsOptions } from "@file/paragraph/run/comment-run";
|
import { ICommentsOptions } from "@file/paragraph/run/comment-run";
|
||||||
|
import { ICompatibilityOptions } from "@file/settings/compatibility";
|
||||||
import { StringContainer, XmlComponent } from "@file/xml-components";
|
import { StringContainer, XmlComponent } from "@file/xml-components";
|
||||||
import { dateTimeValue } from "@util/values";
|
import { dateTimeValue } from "@util/values";
|
||||||
|
|
||||||
@ -35,6 +36,7 @@ export interface IPropertiesOptions {
|
|||||||
readonly updateFields?: boolean;
|
readonly updateFields?: boolean;
|
||||||
};
|
};
|
||||||
readonly compatabilityModeVersion?: number;
|
readonly compatabilityModeVersion?: number;
|
||||||
|
readonly compatibility?: ICompatibilityOptions;
|
||||||
readonly customProperties?: readonly ICustomPropertyOptions[];
|
readonly customProperties?: readonly ICustomPropertyOptions[];
|
||||||
readonly evenAndOddHeaderAndFooters?: boolean;
|
readonly evenAndOddHeaderAndFooters?: boolean;
|
||||||
}
|
}
|
||||||
|
@ -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";
|
import { Utility } from "tests/utility";
|
||||||
|
|
||||||
@ -36,6 +40,14 @@ const createAnchor = (drawingOptions: IDrawingOptions): Anchor =>
|
|||||||
);
|
);
|
||||||
|
|
||||||
describe("Anchor", () => {
|
describe("Anchor", () => {
|
||||||
|
before(() => {
|
||||||
|
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||||
|
});
|
||||||
|
|
||||||
let anchor: Anchor;
|
let anchor: Anchor;
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
@ -362,5 +374,236 @@ describe("Anchor", () => {
|
|||||||
relativeHeight: 120,
|
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 WrapNone());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.root.push(new DocProperties());
|
this.root.push(new DocProperties(drawingOptions.docProperties));
|
||||||
this.root.push(new GraphicFrameProperties());
|
this.root.push(new GraphicFrameProperties());
|
||||||
this.root.push(new Graphic(mediaData, transform));
|
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 { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||||
import { DocPropertiesAttributes } from "./doc-properties-attributes";
|
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 {
|
export class DocProperties extends XmlComponent {
|
||||||
public constructor() {
|
public constructor({ name, description, title }: DocPropertiesOptions = { name: "", description: "", title: "" }) {
|
||||||
super("wp:docPr");
|
super("wp:docPr");
|
||||||
|
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new DocPropertiesAttributes({
|
new DocPropertiesAttributes({
|
||||||
id: 0,
|
id: uniqueNumericId(),
|
||||||
name: "",
|
name,
|
||||||
descr: "",
|
description,
|
||||||
|
title,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { expect } from "chai";
|
import { expect } from "chai";
|
||||||
|
import { SinonStub, stub } from "sinon";
|
||||||
|
|
||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
|
import * as convenienceFunctions from "@util/convenience-functions";
|
||||||
|
|
||||||
import { Drawing, IDrawingOptions } from "./drawing";
|
import { Drawing, IDrawingOptions } from "./drawing";
|
||||||
|
|
||||||
@ -26,6 +28,14 @@ const createDrawing = (drawingOptions?: IDrawingOptions): Drawing =>
|
|||||||
);
|
);
|
||||||
|
|
||||||
describe("Drawing", () => {
|
describe("Drawing", () => {
|
||||||
|
before(() => {
|
||||||
|
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||||
|
});
|
||||||
|
|
||||||
|
after(() => {
|
||||||
|
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||||
|
});
|
||||||
|
|
||||||
let currentBreak: Drawing;
|
let currentBreak: Drawing;
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
@ -68,6 +78,7 @@ describe("Drawing", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -298,6 +309,7 @@ describe("Drawing", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
import { IMediaData } from "@file/media";
|
import { IMediaData } from "@file/media";
|
||||||
import { XmlComponent } from "@file/xml-components";
|
import { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { Anchor } from "./anchor";
|
import { Anchor } from "./anchor";
|
||||||
|
import { DocPropertiesOptions } from "./doc-properties/doc-properties";
|
||||||
import { IFloating } from "./floating";
|
import { IFloating } from "./floating";
|
||||||
import { Inline } from "./inline";
|
import { Inline } from "./inline";
|
||||||
|
|
||||||
@ -13,6 +15,7 @@ export interface IDistance {
|
|||||||
|
|
||||||
export interface IDrawingOptions {
|
export interface IDrawingOptions {
|
||||||
readonly floating?: IFloating;
|
readonly floating?: IFloating;
|
||||||
|
readonly docProperties?: DocPropertiesOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <xsd:complexType name="CT_Drawing">
|
// <xsd:complexType name="CT_Drawing">
|
||||||
@ -29,7 +32,11 @@ export class Drawing extends XmlComponent {
|
|||||||
super("w:drawing");
|
super("w:drawing");
|
||||||
|
|
||||||
if (!drawingOptions.floating) {
|
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);
|
this.root.push(this.inline);
|
||||||
} else {
|
} else {
|
||||||
this.root.push(new Anchor(imageData, imageData.transformation, drawingOptions));
|
this.root.push(new Anchor(imageData, imageData.transformation, drawingOptions));
|
||||||
|
@ -1,13 +1,19 @@
|
|||||||
// http://officeopenxml.com/drwPicInline.php
|
// http://officeopenxml.com/drwPicInline.php
|
||||||
import { IMediaData, IMediaDataTransformation } from "@file/media";
|
import { IMediaData, IMediaDataTransformation } from "@file/media";
|
||||||
import { XmlComponent } from "@file/xml-components";
|
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 { EffectExtent } from "./../effect-extent/effect-extent";
|
||||||
import { Extent } from "./../extent/extent";
|
import { Extent } from "./../extent/extent";
|
||||||
import { GraphicFrameProperties } from "./../graphic-frame/graphic-frame-properties";
|
import { GraphicFrameProperties } from "./../graphic-frame/graphic-frame-properties";
|
||||||
import { Graphic } from "./../inline/graphic";
|
import { Graphic } from "./../inline/graphic";
|
||||||
import { InlineAttributes } from "./inline-attributes";
|
import { InlineAttributes } from "./inline-attributes";
|
||||||
|
|
||||||
|
interface InlineOptions {
|
||||||
|
readonly mediaData: IMediaData;
|
||||||
|
readonly transform: IMediaDataTransformation;
|
||||||
|
readonly docProperties?: DocPropertiesOptions;
|
||||||
|
}
|
||||||
|
|
||||||
// <xsd:complexType name="CT_Inline">
|
// <xsd:complexType name="CT_Inline">
|
||||||
// <xsd:sequence>
|
// <xsd:sequence>
|
||||||
// <xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
// <xsd:element name="extent" type="a:CT_PositiveSize2D"/>
|
||||||
@ -26,7 +32,7 @@ export class Inline extends XmlComponent {
|
|||||||
private readonly extent: Extent;
|
private readonly extent: Extent;
|
||||||
private readonly graphic: Graphic;
|
private readonly graphic: Graphic;
|
||||||
|
|
||||||
public constructor(mediaData: IMediaData, transform: IMediaDataTransformation) {
|
public constructor({ mediaData, transform, docProperties }: InlineOptions) {
|
||||||
super("wp:inline");
|
super("wp:inline");
|
||||||
|
|
||||||
this.root.push(
|
this.root.push(
|
||||||
@ -43,7 +49,7 @@ export class Inline extends XmlComponent {
|
|||||||
|
|
||||||
this.root.push(this.extent);
|
this.root.push(this.extent);
|
||||||
this.root.push(new EffectExtent());
|
this.root.push(new EffectExtent());
|
||||||
this.root.push(new DocProperties());
|
this.root.push(new DocProperties(docProperties));
|
||||||
this.root.push(new GraphicFrameProperties());
|
this.root.push(new GraphicFrameProperties());
|
||||||
this.root.push(this.graphic);
|
this.root.push(this.graphic);
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,8 @@ export class File {
|
|||||||
this.contentTypes = new ContentTypes();
|
this.contentTypes = new ContentTypes();
|
||||||
this.documentWrapper = new DocumentWrapper({ background: options.background || {} });
|
this.documentWrapper = new DocumentWrapper({ background: options.background || {} });
|
||||||
this.settings = new Settings({
|
this.settings = new Settings({
|
||||||
compatabilityModeVersion: options.compatabilityModeVersion,
|
compatibilityModeVersion: options.compatabilityModeVersion,
|
||||||
|
compatibility: options.compatibility,
|
||||||
evenAndOddHeaders: options.evenAndOddHeaderAndFooters ? true : false,
|
evenAndOddHeaders: options.evenAndOddHeaderAndFooters ? true : false,
|
||||||
trackRevisions: options.features?.trackRevisions,
|
trackRevisions: options.features?.trackRevisions,
|
||||||
updateFields: options.features?.updateFields,
|
updateFields: options.features?.updateFields,
|
||||||
|
@ -18,4 +18,3 @@ export * from "./track-revision";
|
|||||||
export * from "./shared";
|
export * from "./shared";
|
||||||
export * from "./border";
|
export * from "./border";
|
||||||
export * from "./vertical-align";
|
export * from "./vertical-align";
|
||||||
export * from "./space-type";
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -56,7 +56,21 @@ describe("ConcreteNumbering", () => {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
const tree = new Formatter().format(concreteNumbering);
|
const tree = new Formatter().format(concreteNumbering);
|
||||||
expect(tree["w:num"]).to.include({
|
expect(tree).to.deep.equal({
|
||||||
|
"w:num": [
|
||||||
|
{
|
||||||
|
_attr: {
|
||||||
|
"w:numId": 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"w:abstractNumId": {
|
||||||
|
_attr: {
|
||||||
|
"w:val": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
"w:lvlOverride": [
|
"w:lvlOverride": [
|
||||||
{
|
{
|
||||||
_attr: {
|
_attr: {
|
||||||
@ -71,6 +85,8 @@ describe("ConcreteNumbering", () => {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ describe("LeftTabStop", () => {
|
|||||||
let tabStop: TabStop;
|
let tabStop: TabStop;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
tabStop = new TabStop(TabStopType.LEFT, 100);
|
tabStop = new TabStop([{ type: TabStopType.LEFT, position: 100 }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
@ -32,7 +32,7 @@ describe("RightTabStop", () => {
|
|||||||
let tabStop: TabStop;
|
let tabStop: TabStop;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
tabStop = new TabStop(TabStopType.RIGHT, 100, LeaderType.DOT);
|
tabStop = new TabStop([{ type: TabStopType.RIGHT, position: 100, leader: LeaderType.DOT }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
|
@ -1,10 +1,19 @@
|
|||||||
// http://officeopenxml.com/WPtab.php
|
// http://officeopenxml.com/WPtab.php
|
||||||
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
import { XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
|
export interface TabStopDefinition {
|
||||||
|
readonly type: TabStopType;
|
||||||
|
readonly position: number | TabStopPosition;
|
||||||
|
readonly leader?: LeaderType;
|
||||||
|
}
|
||||||
|
|
||||||
export class TabStop extends XmlComponent {
|
export class TabStop extends XmlComponent {
|
||||||
public constructor(type: TabStopType, position: number, leader?: LeaderType) {
|
public constructor(tabDefinitions: readonly TabStopDefinition[]) {
|
||||||
super("w:tabs");
|
super("w:tabs");
|
||||||
this.root.push(new TabStopItem(type, position, leader));
|
|
||||||
|
for (const tabDefinition of tabDefinitions) {
|
||||||
|
this.root.push(new TabStopItem(tabDefinition));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,13 +50,13 @@ export class TabAttributes extends XmlAttributeComponent<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class TabStopItem extends XmlComponent {
|
export class TabStopItem extends XmlComponent {
|
||||||
public constructor(value: TabStopType, position: string | number, leader?: LeaderType) {
|
public constructor({ type, position, leader }: TabStopDefinition) {
|
||||||
super("w:tab");
|
super("w:tab");
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new TabAttributes({
|
new TabAttributes({
|
||||||
val: value,
|
val: type,
|
||||||
pos: position,
|
pos: position,
|
||||||
leader,
|
leader: leader,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
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 { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { TextAttributes } from "../run/text-attributes";
|
import { TextAttributes } from "../run/text-attributes";
|
||||||
|
@ -2,7 +2,7 @@ import { MathAngledBrackets, MathCurlyBrackets, MathRoundBrackets, MathSquareBra
|
|||||||
import { MathFraction } from "./fraction";
|
import { MathFraction } from "./fraction";
|
||||||
import { MathFunction } from "./function";
|
import { MathFunction } from "./function";
|
||||||
import { MathRun } from "./math-run";
|
import { MathRun } from "./math-run";
|
||||||
import { MathSum } from "./n-ary";
|
import { MathSum, MathIntegral } from "./n-ary";
|
||||||
import { MathRadical } from "./radical";
|
import { MathRadical } from "./radical";
|
||||||
import { MathSubScript, MathSubSuperScript, MathSuperScript } from "./script";
|
import { MathSubScript, MathSubSuperScript, MathSuperScript } from "./script";
|
||||||
|
|
||||||
@ -10,6 +10,7 @@ export type MathComponent =
|
|||||||
| MathRun
|
| MathRun
|
||||||
| MathFraction
|
| MathFraction
|
||||||
| MathSum
|
| MathSum
|
||||||
|
| MathIntegral
|
||||||
| MathSuperScript
|
| MathSuperScript
|
||||||
| MathSubScript
|
| MathSubScript
|
||||||
| MathSubSuperScript
|
| MathSubSuperScript
|
||||||
|
@ -4,4 +4,5 @@ export * from "./math-limit-location";
|
|||||||
export * from "./math-n-ary-properties";
|
export * from "./math-n-ary-properties";
|
||||||
export * from "./math-sub-script";
|
export * from "./math-sub-script";
|
||||||
export * from "./math-sum";
|
export * from "./math-sum";
|
||||||
|
export * from "./math-integral";
|
||||||
export * from "./math-super-script";
|
export * from "./math-super-script";
|
||||||
|
116
src/file/paragraph/math/n-ary/math-integral.spec.ts
Normal file
116
src/file/paragraph/math/n-ary/math-integral.spec.ts
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
import { expect } from "chai";
|
||||||
|
|
||||||
|
import { Formatter } from "@export/formatter";
|
||||||
|
|
||||||
|
import { MathRun } from "../math-run";
|
||||||
|
import { MathIntegral } from "./math-integral";
|
||||||
|
|
||||||
|
describe("MathIntegral", () => {
|
||||||
|
describe("#constructor()", () => {
|
||||||
|
it("should create a MathIntegral with correct root key", () => {
|
||||||
|
const mathIntegral = new MathIntegral({
|
||||||
|
children: [new MathRun("1")],
|
||||||
|
subScript: [new MathRun("2")],
|
||||||
|
superScript: [new MathRun("3")],
|
||||||
|
});
|
||||||
|
|
||||||
|
const tree = new Formatter().format(mathIntegral);
|
||||||
|
expect(tree).to.deep.equal({
|
||||||
|
"m:nary": [
|
||||||
|
{
|
||||||
|
"m:naryPr": [
|
||||||
|
{
|
||||||
|
"m:limLoc": {
|
||||||
|
_attr: {
|
||||||
|
"m:val": "undOvr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:sub": [
|
||||||
|
{
|
||||||
|
"m:r": [
|
||||||
|
{
|
||||||
|
"m:t": ["2"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:sup": [
|
||||||
|
{
|
||||||
|
"m:r": [
|
||||||
|
{
|
||||||
|
"m:t": ["3"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:e": [
|
||||||
|
{
|
||||||
|
"m:r": [
|
||||||
|
{
|
||||||
|
"m:t": ["1"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should create a MathIntegral with correct root key without sub-script and super-scripts", () => {
|
||||||
|
const mathIntegral = new MathIntegral({
|
||||||
|
children: [new MathRun("1")],
|
||||||
|
});
|
||||||
|
|
||||||
|
const tree = new Formatter().format(mathIntegral);
|
||||||
|
expect(tree).to.deep.equal({
|
||||||
|
"m:nary": [
|
||||||
|
{
|
||||||
|
"m:naryPr": [
|
||||||
|
{
|
||||||
|
"m:limLoc": {
|
||||||
|
_attr: {
|
||||||
|
"m:val": "undOvr",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:supHide": {
|
||||||
|
_attr: {
|
||||||
|
"m:val": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:subHide": {
|
||||||
|
_attr: {
|
||||||
|
"m:val": 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m:e": [
|
||||||
|
{
|
||||||
|
"m:r": [
|
||||||
|
{
|
||||||
|
"m:t": ["1"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
31
src/file/paragraph/math/n-ary/math-integral.ts
Normal file
31
src/file/paragraph/math/n-ary/math-integral.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
|
import { MathComponent } from "../math-component";
|
||||||
|
import { MathBase } from "./math-base";
|
||||||
|
import { MathNAryProperties } from "./math-n-ary-properties";
|
||||||
|
import { MathSubScriptElement } from "./math-sub-script";
|
||||||
|
import { MathSuperScriptElement } from "./math-super-script";
|
||||||
|
|
||||||
|
export interface IMathIntegralOptions {
|
||||||
|
readonly children: readonly MathComponent[];
|
||||||
|
readonly subScript?: readonly MathComponent[];
|
||||||
|
readonly superScript?: readonly MathComponent[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MathIntegral extends XmlComponent {
|
||||||
|
public constructor(options: IMathIntegralOptions) {
|
||||||
|
super("m:nary");
|
||||||
|
|
||||||
|
this.root.push(new MathNAryProperties("", !!options.superScript, !!options.subScript));
|
||||||
|
|
||||||
|
if (!!options.subScript) {
|
||||||
|
this.root.push(new MathSubScriptElement(options.subScript));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!!options.superScript) {
|
||||||
|
this.root.push(new MathSuperScriptElement(options.superScript));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.root.push(new MathBase(options.children));
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,9 @@ export class MathNAryProperties extends XmlComponent {
|
|||||||
public constructor(accent: string, hasSuperScript: boolean, hasSubScript: boolean) {
|
public constructor(accent: string, hasSuperScript: boolean, hasSubScript: boolean) {
|
||||||
super("m:naryPr");
|
super("m:naryPr");
|
||||||
|
|
||||||
|
if (!!accent) {
|
||||||
this.root.push(new MathAccentCharacter(accent));
|
this.root.push(new MathAccentCharacter(accent));
|
||||||
|
}
|
||||||
this.root.push(new MathLimitLocation());
|
this.root.push(new MathLimitLocation());
|
||||||
|
|
||||||
if (!hasSuperScript) {
|
if (!hasSuperScript) {
|
||||||
|
@ -3,6 +3,7 @@ import { SinonStub, stub } from "sinon";
|
|||||||
|
|
||||||
import * as convenienceFunctions from "@util/convenience-functions";
|
import * as convenienceFunctions from "@util/convenience-functions";
|
||||||
|
|
||||||
|
import { HorizontalPositionAlign, VerticalPositionAlign } from "@file/shared";
|
||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
import { BorderStyle } from "@file/border";
|
import { BorderStyle } from "@file/border";
|
||||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
import { EMPTY_OBJECT } from "@file/xml-components";
|
||||||
@ -10,7 +11,6 @@ import { EMPTY_OBJECT } from "@file/xml-components";
|
|||||||
import { IViewWrapper } from "../document-wrapper";
|
import { IViewWrapper } from "../document-wrapper";
|
||||||
import { File } from "../file";
|
import { File } from "../file";
|
||||||
import { ShadingType } from "../shading";
|
import { ShadingType } from "../shading";
|
||||||
import { HorizontalPositionAlign, VerticalPositionAlign } from "../shared";
|
|
||||||
import { AlignmentType, HeadingLevel, LeaderType, PageBreak, TabStopPosition, TabStopType } from "./formatting";
|
import { AlignmentType, HeadingLevel, LeaderType, PageBreak, TabStopPosition, TabStopType } from "./formatting";
|
||||||
import { FrameAnchorType } from "./frame";
|
import { FrameAnchorType } from "./frame";
|
||||||
import { Bookmark, ExternalHyperlink } from "./links";
|
import { Bookmark, ExternalHyperlink } from "./links";
|
||||||
@ -25,6 +25,7 @@ describe("Paragraph", () => {
|
|||||||
|
|
||||||
after(() => {
|
after(() => {
|
||||||
(convenienceFunctions.uniqueId as SinonStub).restore();
|
(convenienceFunctions.uniqueId as SinonStub).restore();
|
||||||
|
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
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,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -9,8 +9,9 @@ import { PageBreakBefore } from "./formatting/break";
|
|||||||
import { IIndentAttributesProperties, Indent } from "./formatting/indent";
|
import { IIndentAttributesProperties, Indent } from "./formatting/indent";
|
||||||
import { ISpacingProperties, Spacing } from "./formatting/spacing";
|
import { ISpacingProperties, Spacing } from "./formatting/spacing";
|
||||||
import { HeadingLevel, Style } from "./formatting/style";
|
import { HeadingLevel, Style } from "./formatting/style";
|
||||||
import { LeaderType, TabStop, TabStopPosition, TabStopType } from "./formatting/tab-stop";
|
import { TabStop, TabStopDefinition, TabStopType } from "./formatting/tab-stop";
|
||||||
import { NumberProperties } from "./formatting/unordered-list";
|
import { NumberProperties } from "./formatting/unordered-list";
|
||||||
|
import { WordWrap } from "./formatting/word-wrap";
|
||||||
import { FrameProperties, IFrameOptions } from "./frame/frame-properties";
|
import { FrameProperties, IFrameOptions } from "./frame/frame-properties";
|
||||||
import { OutlineLevel } from "./links";
|
import { OutlineLevel } from "./links";
|
||||||
|
|
||||||
@ -41,11 +42,7 @@ export interface IParagraphPropertiesOptions extends IParagraphStylePropertiesOp
|
|||||||
readonly heading?: HeadingLevel;
|
readonly heading?: HeadingLevel;
|
||||||
readonly bidirectional?: boolean;
|
readonly bidirectional?: boolean;
|
||||||
readonly pageBreakBefore?: boolean;
|
readonly pageBreakBefore?: boolean;
|
||||||
readonly tabStops?: readonly {
|
readonly tabStops?: readonly TabStopDefinition[];
|
||||||
readonly position: number | TabStopPosition;
|
|
||||||
readonly type: TabStopType;
|
|
||||||
readonly leader?: LeaderType;
|
|
||||||
}[];
|
|
||||||
readonly style?: string;
|
readonly style?: string;
|
||||||
readonly bullet?: {
|
readonly bullet?: {
|
||||||
readonly level: number;
|
readonly level: number;
|
||||||
@ -54,6 +51,8 @@ export interface IParagraphPropertiesOptions extends IParagraphStylePropertiesOp
|
|||||||
readonly widowControl?: boolean;
|
readonly widowControl?: boolean;
|
||||||
readonly frame?: IFrameOptions;
|
readonly frame?: IFrameOptions;
|
||||||
readonly suppressLineNumbers?: boolean;
|
readonly suppressLineNumbers?: boolean;
|
||||||
|
readonly wordWrap?: boolean;
|
||||||
|
readonly scale?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
|
export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
|
||||||
@ -132,19 +131,26 @@ export class ParagraphProperties extends IgnoreIfEmptyXmlComponent {
|
|||||||
this.push(new Shading(options.shading));
|
this.push(new Shading(options.shading));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.rightTabStop) {
|
if (options.wordWrap) {
|
||||||
this.push(new TabStop(TabStopType.RIGHT, options.rightTabStop));
|
this.push(new WordWrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.tabStops) {
|
/**
|
||||||
for (const tabStop of options.tabStops) {
|
* FIX: Multitab support for Libre Writer
|
||||||
this.push(new TabStop(tabStop.type, tabStop.position, tabStop.leader));
|
* Ensure there is only one w:tabs tag with multiple w:tab
|
||||||
}
|
*/
|
||||||
}
|
const tabDefinitions: readonly TabStopDefinition[] = [
|
||||||
|
...(options.rightTabStop ? [{ type: TabStopType.RIGHT, position: options.rightTabStop }] : []),
|
||||||
|
...(options.tabStops ? options.tabStops : []),
|
||||||
|
...(options.leftTabStop ? [{ type: TabStopType.LEFT, position: options.leftTabStop }] : []),
|
||||||
|
];
|
||||||
|
|
||||||
if (options.leftTabStop) {
|
if (tabDefinitions.length > 0) {
|
||||||
this.push(new TabStop(TabStopType.LEFT, options.leftTabStop));
|
this.push(new TabStop(tabDefinitions));
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* FIX - END
|
||||||
|
*/
|
||||||
|
|
||||||
if (options.bidirectional !== undefined) {
|
if (options.bidirectional !== undefined) {
|
||||||
this.push(new OnOffElement("w:bidi", options.bidirectional));
|
this.push(new OnOffElement("w:bidi", options.bidirectional));
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { expect } from "chai";
|
import { expect } from "chai";
|
||||||
|
import * as sinon from "sinon";
|
||||||
|
|
||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
import { Comment, CommentRangeEnd, CommentRangeStart, CommentReference, Comments } from "./comment-run";
|
import { Comment, CommentRangeEnd, CommentRangeStart, CommentReference, Comments } from "./comment-run";
|
||||||
@ -40,6 +41,17 @@ describe("CommentReference", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("Comment", () => {
|
describe("Comment", () => {
|
||||||
|
let clock: sinon.SinonFakeTimers;
|
||||||
|
|
||||||
|
beforeEach(() => {
|
||||||
|
const now = new Date(1999, 0, 1);
|
||||||
|
clock = sinon.useFakeTimers(now.getTime());
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
clock.restore();
|
||||||
|
});
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
it("should create", () => {
|
it("should create", () => {
|
||||||
const component = new Comment({
|
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", () => {
|
describe("ImageRun", () => {
|
||||||
before(() => {
|
before(() => {
|
||||||
stub(convenienceFunctions, "uniqueId").callsFake(() => "test-unique-id");
|
stub(convenienceFunctions, "uniqueId").callsFake(() => "test-unique-id");
|
||||||
|
stub(convenienceFunctions, "uniqueNumericId").callsFake(() => 0);
|
||||||
});
|
});
|
||||||
|
|
||||||
after(() => {
|
after(() => {
|
||||||
(convenienceFunctions.uniqueId as SinonStub).restore();
|
(convenienceFunctions.uniqueId as SinonStub).restore();
|
||||||
|
(convenienceFunctions.uniqueNumericId as SinonStub).restore();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#constructor()", () => {
|
describe("#constructor()", () => {
|
||||||
@ -125,6 +127,7 @@ describe("ImageRun", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -375,6 +378,7 @@ describe("ImageRun", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -629,6 +633,7 @@ describe("ImageRun", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -886,6 +891,7 @@ describe("ImageRun", () => {
|
|||||||
descr: "",
|
descr: "",
|
||||||
id: 0,
|
id: 0,
|
||||||
name: "",
|
name: "",
|
||||||
|
title: "",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import { uniqueId } from "@util/convenience-functions";
|
import { uniqueId } from "@util/convenience-functions";
|
||||||
|
|
||||||
import { IContext, IXmlableObject } from "@file/xml-components";
|
import { IContext, IXmlableObject } from "@file/xml-components";
|
||||||
|
import { DocPropertiesOptions } from "@file/drawing/doc-properties/doc-properties";
|
||||||
|
|
||||||
import { Drawing, IFloating } from "../../drawing";
|
import { Drawing, IFloating } from "../../drawing";
|
||||||
import { IMediaTransformation } from "../../media";
|
import { IMediaTransformation } from "../../media";
|
||||||
@ -11,6 +12,7 @@ export interface IImageOptions {
|
|||||||
readonly data: Buffer | string | Uint8Array | ArrayBuffer;
|
readonly data: Buffer | string | Uint8Array | ArrayBuffer;
|
||||||
readonly transformation: IMediaTransformation;
|
readonly transformation: IMediaTransformation;
|
||||||
readonly floating?: IFloating;
|
readonly floating?: IFloating;
|
||||||
|
readonly altText?: DocPropertiesOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class ImageRun extends Run {
|
export class ImageRun extends Run {
|
||||||
@ -37,7 +39,7 @@ export class ImageRun extends Run {
|
|||||||
rotation: options.transformation.rotation ? options.transformation.rotation * 60000 : undefined,
|
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);
|
this.root.push(drawing);
|
||||||
}
|
}
|
||||||
@ -49,15 +51,16 @@ export class ImageRun extends Run {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private convertDataURIToBinary(dataURI: string): Uint8Array {
|
private convertDataURIToBinary(dataURI: string): Uint8Array {
|
||||||
|
if (typeof atob === "function") {
|
||||||
// https://gist.github.com/borismus/1032746
|
// https://gist.github.com/borismus/1032746
|
||||||
// https://github.com/mafintosh/base64-to-uint8array
|
// https://github.com/mafintosh/base64-to-uint8array
|
||||||
const BASE64_MARKER = ";base64,";
|
const BASE64_MARKER = ";base64,";
|
||||||
|
const base64Index = dataURI.indexOf(BASE64_MARKER);
|
||||||
|
|
||||||
const base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
|
const base64IndexWithOffset = base64Index === -1 ? 0 : base64Index + BASE64_MARKER.length;
|
||||||
|
|
||||||
if (typeof atob === "function") {
|
|
||||||
return new Uint8Array(
|
return new Uint8Array(
|
||||||
atob(dataURI.substring(base64Index))
|
atob(dataURI.substring(base64IndexWithOffset))
|
||||||
.split("")
|
.split("")
|
||||||
.map((c) => c.charCodeAt(0)),
|
.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 { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { TextAttributes } from "./text-attributes";
|
import { TextAttributes } from "./text-attributes";
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
import { BorderElement, IBorderOptions } from "@file/border";
|
import { BorderElement, IBorderOptions } from "@file/border";
|
||||||
import { IShadingAttributesProperties, Shading } from "@file/shading";
|
import { IShadingAttributesProperties, Shading } from "@file/shading";
|
||||||
import { SpaceType } from "@file/space-type";
|
|
||||||
import { ChangeAttributes, IChangedAttributesProperties } from "@file/track-revision/track-revision";
|
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 { EmphasisMark, EmphasisMarkType } from "./emphasis-mark";
|
||||||
import { CharacterSpacing, Color, Highlight, HighlightComplexScript } from "./formatting";
|
import { CharacterSpacing, Color, Highlight, HighlightComplexScript } from "./formatting";
|
||||||
@ -46,7 +52,9 @@ export interface IRunStylePropertiesOptions {
|
|||||||
readonly imprint?: boolean;
|
readonly imprint?: boolean;
|
||||||
readonly revision?: IRunPropertiesChangeOptions;
|
readonly revision?: IRunPropertiesChangeOptions;
|
||||||
readonly border?: IBorderOptions;
|
readonly border?: IBorderOptions;
|
||||||
readonly space?: SpaceType;
|
readonly vanish?: boolean;
|
||||||
|
readonly specVanish?: boolean;
|
||||||
|
readonly scale?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IRunPropertiesOptions extends IRunStylePropertiesOptions {
|
export interface IRunPropertiesOptions extends IRunStylePropertiesOptions {
|
||||||
@ -217,6 +225,21 @@ export class RunProperties extends IgnoreIfEmptyXmlComponent {
|
|||||||
if (options.border) {
|
if (options.border) {
|
||||||
this.push(new BorderElement("w:bdr", 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 {
|
public push(item: XmlComponent): void {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { SpaceType } from "@file/space-type";
|
import { SpaceType } from "@file/shared";
|
||||||
import { XmlComponent } from "@file/xml-components";
|
import { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { TextAttributes } from "../text-attributes";
|
import { TextAttributes } from "../text-attributes";
|
||||||
|
@ -3,7 +3,6 @@ import { expect } from "chai";
|
|||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
import { BorderStyle } from "@file/border";
|
import { BorderStyle } from "@file/border";
|
||||||
import { ShadingType } from "@file/shading";
|
import { ShadingType } from "@file/shading";
|
||||||
import { SpaceType } from "@file/space-type";
|
|
||||||
|
|
||||||
import { EmphasisMarkType } from "./emphasis-mark";
|
import { EmphasisMarkType } from "./emphasis-mark";
|
||||||
import { PageNumber, Run } from "./run";
|
import { PageNumber, Run } from "./run";
|
||||||
@ -521,18 +520,64 @@ describe("Run", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("#space", () => {
|
describe("#vanish and #specVanish", () => {
|
||||||
it("should correctly set the border", () => {
|
it("should correctly set vanish", () => {
|
||||||
const run = new Run({
|
const run = new Run({
|
||||||
space: SpaceType.PRESERVE,
|
vanish: true,
|
||||||
});
|
});
|
||||||
const tree = new Formatter().format(run);
|
const tree = new Formatter().format(run);
|
||||||
expect(tree).to.deep.equal({
|
expect(tree).to.deep.equal({
|
||||||
"w:r": {
|
"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: {
|
_attr: {
|
||||||
"xml:space": "preserve",
|
"w:val": 200,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -9,10 +9,10 @@ import { Begin, End, Separate } from "./field";
|
|||||||
import { NumberOfPages, NumberOfPagesSection, Page } from "./page-number";
|
import { NumberOfPages, NumberOfPagesSection, Page } from "./page-number";
|
||||||
import { IRunPropertiesOptions, RunProperties } from "./properties";
|
import { IRunPropertiesOptions, RunProperties } from "./properties";
|
||||||
import { Text } from "./run-components/text";
|
import { Text } from "./run-components/text";
|
||||||
import { TextAttributes } from "./text-attributes";
|
import { Tab } from "./tab";
|
||||||
|
|
||||||
export interface IRunOptions extends IRunPropertiesOptions {
|
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 break?: number;
|
||||||
readonly text?: string;
|
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) {
|
if (options.children) {
|
||||||
for (const child of options.children) {
|
for (const child of options.children) {
|
||||||
if (typeof child === "string") {
|
if (typeof child === "string") {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// http://officeopenxml.com/WPfieldInstructions.php
|
// http://officeopenxml.com/WPfieldInstructions.php
|
||||||
import { SpaceType } from "@file/space-type";
|
import { SpaceType } from "@file/shared";
|
||||||
import { XmlComponent } from "@file/xml-components";
|
import { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { TextAttributes } from "./text-attributes";
|
import { TextAttributes } from "./text-attributes";
|
||||||
|
@ -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";
|
import { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
// <xsd:group name="EG_RunInnerContent">
|
// <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";
|
import { XmlAttributeComponent } from "@file/xml-components";
|
||||||
|
|
||||||
export class TextAttributes extends XmlAttributeComponent<{ readonly space: SpaceType }> {
|
export class TextAttributes extends XmlAttributeComponent<{ readonly space: SpaceType }> {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import { expect } from "chai";
|
import { expect } from "chai";
|
||||||
|
|
||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
|
||||||
|
|
||||||
import { Compatibility } from "./compatibility";
|
import { Compatibility } from "./compatibility";
|
||||||
|
|
||||||
@ -11,7 +10,140 @@ describe("Compatibility", () => {
|
|||||||
const compatibility = new Compatibility({});
|
const compatibility = new Compatibility({});
|
||||||
|
|
||||||
const tree = new Formatter().format(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);
|
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 { OnOffElement, XmlComponent } from "@file/xml-components";
|
||||||
import { CompatibilitySetting } from "./compatibility-setting/compatibility-setting";
|
import { CompatibilitySetting } from "./compatibility-setting/compatibility-setting";
|
||||||
|
|
||||||
@ -74,21 +75,405 @@ import { CompatibilitySetting } from "./compatibility-setting/compatibility-sett
|
|||||||
// </xsd:complexType>
|
// </xsd:complexType>
|
||||||
|
|
||||||
export interface ICompatibilityOptions {
|
export interface ICompatibilityOptions {
|
||||||
readonly doNotExpandShiftReturn?: boolean;
|
|
||||||
readonly version?: number;
|
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 {
|
export class Compatibility extends XmlComponent {
|
||||||
public constructor(options: ICompatibilityOptions) {
|
public constructor(options: ICompatibilityOptions) {
|
||||||
super("w:compat");
|
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) {
|
if (options.version) {
|
||||||
this.root.push(new CompatibilitySetting(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": {},
|
"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 { OnOffElement, XmlAttributeComponent, XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { Compatibility } from "./compatibility";
|
import { Compatibility, ICompatibilityOptions } from "./compatibility";
|
||||||
|
|
||||||
export class SettingsAttributes extends XmlAttributeComponent<{
|
export class SettingsAttributes extends XmlAttributeComponent<{
|
||||||
readonly wpc?: string;
|
readonly wpc?: string;
|
||||||
@ -147,10 +147,11 @@ export class SettingsAttributes extends XmlAttributeComponent<{
|
|||||||
// </xsd:complexType>
|
// </xsd:complexType>
|
||||||
|
|
||||||
export interface ISettingsOptions {
|
export interface ISettingsOptions {
|
||||||
readonly compatabilityModeVersion?: number;
|
readonly compatibilityModeVersion?: number;
|
||||||
readonly evenAndOddHeaders?: boolean;
|
readonly evenAndOddHeaders?: boolean;
|
||||||
readonly trackRevisions?: boolean;
|
readonly trackRevisions?: boolean;
|
||||||
readonly updateFields?: boolean;
|
readonly updateFields?: boolean;
|
||||||
|
readonly compatibility?: ICompatibilityOptions;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Settings extends XmlComponent {
|
export class Settings extends XmlComponent {
|
||||||
@ -199,7 +200,8 @@ export class Settings extends XmlComponent {
|
|||||||
|
|
||||||
this.root.push(
|
this.root.push(
|
||||||
new Compatibility({
|
new Compatibility({
|
||||||
version: options.compatabilityModeVersion || 15,
|
...(options.compatibility ?? {}),
|
||||||
|
version: options.compatibility?.version ?? options.compatibilityModeVersion ?? 15,
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
export * from "./alignment";
|
export * from "./alignment";
|
||||||
export * from "./number-format";
|
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
|
// http://officeopenxml.com/WPfieldInstructions.php
|
||||||
import { TextAttributes } from "@file/paragraph/run/text-attributes";
|
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 { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
import { ITableOfContentsOptions } from "./table-of-contents-properties";
|
import { ITableOfContentsOptions } from "./table-of-contents-properties";
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
// http://www.datypic.com/sc/ooxml/e-w_sdtPr-1.html
|
// http://www.datypic.com/sc/ooxml/e-w_sdtPr-1.html
|
||||||
import { XmlComponent } from "@file/xml-components";
|
import { StringValueElement, XmlComponent } from "@file/xml-components";
|
||||||
import { Alias } from "./alias";
|
|
||||||
|
|
||||||
export class StructuredDocumentTagProperties extends XmlComponent {
|
export class StructuredDocumentTagProperties extends XmlComponent {
|
||||||
public constructor(alias: string) {
|
public constructor(alias: string) {
|
||||||
super("w:sdtPr");
|
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-float-properties";
|
||||||
export * from "./table-layout";
|
export * from "./table-layout";
|
||||||
export * from "./table-borders";
|
export * from "./table-borders";
|
||||||
export * from "./table-overlap";
|
|
||||||
|
@ -2,8 +2,13 @@ import { expect } from "chai";
|
|||||||
|
|
||||||
import { Formatter } from "@export/formatter";
|
import { Formatter } from "@export/formatter";
|
||||||
|
|
||||||
import { RelativeHorizontalPosition, RelativeVerticalPosition, TableAnchorType, TableFloatProperties } from "./table-float-properties";
|
import {
|
||||||
import { OverlapType } from "./table-overlap";
|
OverlapType,
|
||||||
|
RelativeHorizontalPosition,
|
||||||
|
RelativeVerticalPosition,
|
||||||
|
TableAnchorType,
|
||||||
|
TableFloatProperties,
|
||||||
|
} from "./table-float-properties";
|
||||||
|
|
||||||
describe("Table Float Properties", () => {
|
describe("Table Float Properties", () => {
|
||||||
describe("#constructor", () => {
|
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 { signedTwipsMeasureValue, twipsMeasureValue } from "@util/values";
|
||||||
|
|
||||||
import { OverlapType, TableOverlap } from "./table-overlap";
|
|
||||||
|
|
||||||
export enum TableAnchorType {
|
export enum TableAnchorType {
|
||||||
MARGIN = "margin",
|
MARGIN = "margin",
|
||||||
PAGE = "page",
|
PAGE = "page",
|
||||||
@ -26,6 +24,17 @@ export enum RelativeVerticalPosition {
|
|||||||
TOP = "top",
|
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 {
|
export interface ITableFloatOptions {
|
||||||
/* cSpell:disable */
|
/* cSpell:disable */
|
||||||
/**
|
/**
|
||||||
@ -171,7 +180,10 @@ export class TableFloatProperties extends XmlComponent {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (options.overlap) {
|
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 { 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 { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
export class DeletedPage extends XmlComponent {
|
export class DeletedPage extends XmlComponent {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { TextAttributes } from "@file/paragraph/run/text-attributes";
|
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 { XmlComponent } from "@file/xml-components";
|
||||||
|
|
||||||
export class DeletedText extends XmlComponent {
|
export class DeletedText extends XmlComponent {
|
||||||
|
@ -3,7 +3,7 @@ import { Element, xml2js } from "xml-js";
|
|||||||
|
|
||||||
import { EMPTY_OBJECT } from "@file/xml-components";
|
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";
|
import { IContext } from "./base";
|
||||||
|
|
||||||
const xmlString = `
|
const xmlString = `
|
||||||
@ -90,5 +90,29 @@ describe("ImportedXmlComponent", () => {
|
|||||||
const converted = convertToXmlComponent(xmlObj);
|
const converted = convertToXmlComponent(xmlObj);
|
||||||
expect(converted).to.deep.equal(convertedXmlElement);
|
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.
|
// Simple nodes containing text.
|
||||||
//
|
//
|
||||||
// new StringContainer("hello", "world")
|
// new StringContainer("hello", "world")
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
"paths": {
|
"paths": {
|
||||||
"@util/*": ["./util/*"],
|
"@util/*": ["./util/*"],
|
||||||
"@export/*": ["./export/*"],
|
"@export/*": ["./export/*"],
|
||||||
"@file/*": ["./file/*"]
|
"@file/*": ["./file/*"],
|
||||||
|
"@shared": ["./shared/index.ts"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["src"]
|
"include": ["src"]
|
||||||
|
@ -12,7 +12,7 @@ const configuration = {
|
|||||||
filename: "index.js",
|
filename: "index.js",
|
||||||
libraryTarget: "umd",
|
libraryTarget: "umd",
|
||||||
library: "docx",
|
library: "docx",
|
||||||
globalObject: "this",
|
globalObject: "globalThis",
|
||||||
},
|
},
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
|
Reference in New Issue
Block a user