Merge branch 'master' into importDotx
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
// http://officeopenxml.com/WPspacing.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "file/xml-components";
|
||||
import { Attributes, XmlAttributeComponent, XmlComponent } from "file/xml-components";
|
||||
|
||||
export interface ISpacingProperties {
|
||||
after?: number;
|
||||
@ -23,3 +23,14 @@ export class Spacing extends XmlComponent {
|
||||
this.root.push(new SpacingAttributes(opts));
|
||||
}
|
||||
}
|
||||
|
||||
export class ContextualSpacing extends XmlComponent {
|
||||
constructor(value: boolean) {
|
||||
super("w:contextualSpacing");
|
||||
this.root.push(
|
||||
new Attributes({
|
||||
val: value === false ? 0 : 1,
|
||||
}),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -10,13 +10,13 @@ import { Border, ThematicBreak } from "./formatting/border";
|
||||
import { IIndentAttributesProperties, Indent } from "./formatting/indent";
|
||||
import { KeepLines, KeepNext } from "./formatting/keep";
|
||||
import { PageBreak, PageBreakBefore } from "./formatting/page-break";
|
||||
import { ISpacingProperties, Spacing } from "./formatting/spacing";
|
||||
import { ContextualSpacing, ISpacingProperties, Spacing } from "./formatting/spacing";
|
||||
import { Style } from "./formatting/style";
|
||||
import { CenterTabStop, LeaderType, LeftTabStop, MaxRightTabStop, RightTabStop } from "./formatting/tab-stop";
|
||||
import { NumberProperties } from "./formatting/unordered-list";
|
||||
import { Bookmark, Hyperlink } from "./links";
|
||||
import { ParagraphProperties } from "./properties";
|
||||
import { PictureRun, Run, TextRun } from "./run";
|
||||
import { PictureRun, Run, SequentialIdentifier, TextRun } from "./run";
|
||||
|
||||
export class Paragraph extends XmlComponent {
|
||||
private readonly properties: ParagraphProperties;
|
||||
@ -211,6 +211,11 @@ export class Paragraph extends XmlComponent {
|
||||
return this;
|
||||
}
|
||||
|
||||
public contextualSpacing(value: boolean): Paragraph {
|
||||
this.properties.push(new ContextualSpacing(value));
|
||||
return this;
|
||||
}
|
||||
|
||||
public keepNext(): Paragraph {
|
||||
this.properties.push(new KeepNext());
|
||||
return this;
|
||||
@ -240,4 +245,9 @@ export class Paragraph extends XmlComponent {
|
||||
this.root.splice(1, 0, run);
|
||||
return this;
|
||||
}
|
||||
|
||||
public addSequentialIdentifier(identifier: string): Paragraph {
|
||||
this.root.push(new SequentialIdentifier(identifier));
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
export * from "./run";
|
||||
export * from "./text-run";
|
||||
export * from "./picture-run";
|
||||
export * from "./sequential-identifier";
|
||||
|
19
src/file/paragraph/run/sequential-identifier-instruction.ts
Normal file
19
src/file/paragraph/run/sequential-identifier-instruction.ts
Normal file
@ -0,0 +1,19 @@
|
||||
// http://officeopenxml.com/WPfieldInstructions.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "file/xml-components";
|
||||
|
||||
enum SpaceType {
|
||||
DEFAULT = "default",
|
||||
PRESERVE = "preserve",
|
||||
}
|
||||
|
||||
class TextAttributes extends XmlAttributeComponent<{ space: SpaceType }> {
|
||||
protected xmlKeys = { space: "xml:space" };
|
||||
}
|
||||
|
||||
export class SequentialIdentifierInstruction extends XmlComponent {
|
||||
constructor(identifier: string) {
|
||||
super("w:instrText");
|
||||
this.root.push(new TextAttributes({ space: SpaceType.PRESERVE }));
|
||||
this.root.push(`SEQ ${identifier}`);
|
||||
}
|
||||
}
|
60
src/file/paragraph/run/sequential-identifier.spec.ts
Normal file
60
src/file/paragraph/run/sequential-identifier.spec.ts
Normal file
@ -0,0 +1,60 @@
|
||||
import { expect } from "chai";
|
||||
|
||||
import { Formatter } from "../../../export/formatter";
|
||||
import { SequentialIdentifier } from "./sequential-identifier";
|
||||
|
||||
describe("Sequential Identifier", () => {
|
||||
describe("#constructor", () => {
|
||||
it("should construct a SEQ without options", () => {
|
||||
const seq = new SequentialIdentifier("Figure");
|
||||
const tree = new Formatter().format(seq);
|
||||
expect(tree).to.be.deep.equal(DEFAULT_SEQ);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const DEFAULT_SEQ = {
|
||||
"w:r": [
|
||||
{
|
||||
"w:rPr": [],
|
||||
},
|
||||
{
|
||||
"w:fldChar": [
|
||||
{
|
||||
_attr: {
|
||||
"w:fldCharType": "begin",
|
||||
"w:dirty": true,
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"w:instrText": [
|
||||
{
|
||||
_attr: {
|
||||
"xml:space": "preserve",
|
||||
},
|
||||
},
|
||||
"SEQ Figure",
|
||||
],
|
||||
},
|
||||
{
|
||||
"w:fldChar": [
|
||||
{
|
||||
_attr: {
|
||||
"w:fldCharType": "separate",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
"w:fldChar": [
|
||||
{
|
||||
_attr: {
|
||||
"w:fldCharType": "end",
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
13
src/file/paragraph/run/sequential-identifier.ts
Normal file
13
src/file/paragraph/run/sequential-identifier.ts
Normal file
@ -0,0 +1,13 @@
|
||||
import { Run } from "file/paragraph/run";
|
||||
import { Begin, End, Separate } from "file/paragraph/run/field";
|
||||
import { SequentialIdentifierInstruction } from "./sequential-identifier-instruction";
|
||||
|
||||
export class SequentialIdentifier extends Run {
|
||||
constructor(identifier: string) {
|
||||
super();
|
||||
this.root.push(new Begin(true));
|
||||
this.root.push(new SequentialIdentifierInstruction(identifier));
|
||||
this.root.push(new Separate());
|
||||
this.root.push(new End());
|
||||
}
|
||||
}
|
@ -1,3 +1,4 @@
|
||||
// http://officeopenxml.com/WPfieldInstructions.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "file/xml-components";
|
||||
import { ITableOfContentsOptions } from "./table-of-contents-properties";
|
||||
|
||||
@ -10,7 +11,7 @@ class TextAttributes extends XmlAttributeComponent<{ space: SpaceType }> {
|
||||
protected xmlKeys = { space: "xml:space" };
|
||||
}
|
||||
|
||||
export class TableOfContentsInstruction extends XmlComponent {
|
||||
export class FieldInstruction extends XmlComponent {
|
||||
private readonly properties: ITableOfContentsOptions;
|
||||
|
||||
constructor(properties: ITableOfContentsOptions = {}) {
|
||||
@ -40,19 +41,19 @@ export class TableOfContentsInstruction extends XmlComponent {
|
||||
instruction = `${instruction} \\h`;
|
||||
}
|
||||
if (this.properties.tcFieldLevelRange) {
|
||||
instruction = `${instruction} \\l "${this.properties.tcFieldLevelRange}`;
|
||||
instruction = `${instruction} \\l "${this.properties.tcFieldLevelRange}"`;
|
||||
}
|
||||
if (this.properties.pageNumbersEntryLevelsRange) {
|
||||
instruction = `${instruction} \\n "${this.properties.pageNumbersEntryLevelsRange}`;
|
||||
instruction = `${instruction} \\n "${this.properties.pageNumbersEntryLevelsRange}"`;
|
||||
}
|
||||
if (this.properties.headingStyleRange) {
|
||||
instruction = `${instruction} \\o "${this.properties.headingStyleRange}`;
|
||||
instruction = `${instruction} \\o "${this.properties.headingStyleRange}"`;
|
||||
}
|
||||
if (this.properties.entryAndPageNumberSeparator) {
|
||||
instruction = `${instruction} \\p "${this.properties.entryAndPageNumberSeparator}`;
|
||||
instruction = `${instruction} \\p "${this.properties.entryAndPageNumberSeparator}"`;
|
||||
}
|
||||
if (this.properties.seqFieldIdentifierForPrefix) {
|
||||
instruction = `${instruction} \\s "${this.properties.seqFieldIdentifierForPrefix}`;
|
||||
instruction = `${instruction} \\s "${this.properties.seqFieldIdentifierForPrefix}"`;
|
||||
}
|
||||
if (this.properties.stylesWithLevels && this.properties.stylesWithLevels.length) {
|
||||
const styles = this.properties.stylesWithLevels.map((sl) => `${sl.styleName},${sl.level}`).join(",");
|
@ -1,6 +1,6 @@
|
||||
import { XmlComponent } from "file/xml-components";
|
||||
|
||||
export class SdtContent extends XmlComponent {
|
||||
export class StructuredDocumentTagContent extends XmlComponent {
|
||||
constructor() {
|
||||
super("w:sdtContent");
|
||||
}
|
||||
|
@ -1,7 +1,8 @@
|
||||
// http://www.datypic.com/sc/ooxml/e-w_sdtPr-1.html
|
||||
import { XmlComponent } from "file/xml-components";
|
||||
import { Alias } from "./alias";
|
||||
|
||||
export class SdtProperties extends XmlComponent {
|
||||
export class StructuredDocumentTagProperties extends XmlComponent {
|
||||
constructor(alias: string) {
|
||||
super("w:sdtPr");
|
||||
this.root.push(new Alias(alias));
|
||||
|
@ -174,7 +174,7 @@ const COMPLETE_TOC = {
|
||||
"xml:space": "preserve",
|
||||
},
|
||||
},
|
||||
'TOC \\a "A" \\b "B" \\c "C" \\d "D" \\f "F" \\h \\l "L \\n "N \\o "O \\p "P \\s "S \\t "SL,1,SL,2" \\u \\w \\x \\z',
|
||||
'TOC \\a "A" \\b "B" \\c "C" \\d "D" \\f "F" \\h \\l "L" \\n "N" \\o "O" \\p "P" \\s "S" \\t "SL,1,SL,2" \\u \\w \\x \\z',
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@ -1,23 +1,25 @@
|
||||
// http://officeopenxml.com/WPtableOfContents.php
|
||||
// http://www.datypic.com/sc/ooxml/e-w_sdt-1.html
|
||||
import { Paragraph } from "file/paragraph";
|
||||
import { Run } from "file/paragraph/run";
|
||||
import { Begin, End, Separate } from "file/paragraph/run/field";
|
||||
import { XmlComponent } from "file/xml-components";
|
||||
import { SdtContent } from "./sdt-content";
|
||||
import { SdtProperties } from "./sdt-properties";
|
||||
import { TableOfContentsInstruction } from "./table-of-contents-instruction";
|
||||
import { FieldInstruction } from "./field-instruction";
|
||||
import { StructuredDocumentTagContent } from "./sdt-content";
|
||||
import { StructuredDocumentTagProperties } from "./sdt-properties";
|
||||
import { ITableOfContentsOptions } from "./table-of-contents-properties";
|
||||
|
||||
export class TableOfContents extends XmlComponent {
|
||||
constructor(alias: string = "Table of Contents", properties?: ITableOfContentsOptions) {
|
||||
super("w:sdt");
|
||||
this.root.push(new SdtProperties(alias));
|
||||
this.root.push(new StructuredDocumentTagProperties(alias));
|
||||
|
||||
const content = new SdtContent();
|
||||
const content = new StructuredDocumentTagContent();
|
||||
|
||||
const beginParagraph = new Paragraph();
|
||||
const beginRun = new Run();
|
||||
beginRun.addChildElement(new Begin(true));
|
||||
beginRun.addChildElement(new TableOfContentsInstruction(properties));
|
||||
beginRun.addChildElement(new FieldInstruction(properties));
|
||||
beginRun.addChildElement(new Separate());
|
||||
beginParagraph.addRun(beginRun);
|
||||
content.addChildElement(beginParagraph);
|
||||
|
@ -1,3 +1,4 @@
|
||||
// http://officeopenxml.com/WPtableGrid.php
|
||||
import { XmlAttributeComponent, XmlComponent } from "file/xml-components";
|
||||
|
||||
export class TableGrid extends XmlComponent {
|
||||
|
@ -1,3 +1,4 @@
|
||||
// http://officeopenxml.com/WPtableGrid.php
|
||||
import {
|
||||
GridSpan,
|
||||
TableCellBorders,
|
||||
@ -60,7 +61,13 @@ export class Table extends XmlComponent {
|
||||
}
|
||||
|
||||
public getRow(ix: number): TableRow {
|
||||
return this.rows[ix];
|
||||
const row = this.rows[ix];
|
||||
|
||||
if (!row) {
|
||||
throw Error("Index out of bounds when trying to get row on table");
|
||||
}
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
public getCell(row: number, col: number): TableCell {
|
||||
@ -93,17 +100,29 @@ export class TableRow extends XmlComponent {
|
||||
}
|
||||
|
||||
public getCell(ix: number): TableCell {
|
||||
return this.cells[ix];
|
||||
const cell = this.cells[ix];
|
||||
|
||||
if (!cell) {
|
||||
throw Error("Index out of bounds when trying to get cell on row");
|
||||
}
|
||||
|
||||
return cell;
|
||||
}
|
||||
|
||||
public addGridSpan(ix: number, cellSpan: number): TableCell {
|
||||
const remainCell = this.cells[ix];
|
||||
public addGridSpan(index: number, cellSpan: number): TableCell {
|
||||
const remainCell = this.cells[index];
|
||||
remainCell.CellProperties.addGridSpan(cellSpan);
|
||||
this.cells.splice(ix + 1, cellSpan - 1);
|
||||
this.root.splice(ix + 2, cellSpan - 1);
|
||||
this.cells.splice(index + 1, cellSpan - 1);
|
||||
this.root.splice(index + 2, cellSpan - 1);
|
||||
|
||||
return remainCell;
|
||||
}
|
||||
|
||||
public mergeCells(startIndex: number, endIndex: number): TableCell {
|
||||
const cellSpan = endIndex - startIndex + 1;
|
||||
|
||||
return this.addGridSpan(startIndex, cellSpan);
|
||||
}
|
||||
}
|
||||
|
||||
export class TableRowProperties extends XmlComponent {
|
||||
|
Reference in New Issue
Block a user