diff --git a/demo/demo28.ts b/demo/demo28.ts index cfaf82f12f..84c4e5cc49 100644 --- a/demo/demo28.ts +++ b/demo/demo28.ts @@ -1,5 +1,5 @@ import * as fs from "fs"; -import { ImportDocx, Packer, Paragraph, TemplatedDocument } from "../build"; +import { ImportDocx, Packer, Paragraph, Document } from "../build"; const importDocx = new ImportDocx(); const filePath = "./demo/dotx/template.dotx"; @@ -15,7 +15,9 @@ fs.readFile(filePath, (err, data) => { titlePage: true, } as any; - const doc = new TemplatedDocument(templateDocument, undefined, sectionProps); + const doc = new Document(undefined, sectionProps, { + template: templateDocument + }); const paragraph = new Paragraph("Hello World"); doc.addParagraph(paragraph); diff --git a/src/file/base-file.ts b/src/file/base-file.ts deleted file mode 100644 index 1f1b65c85e..0000000000 --- a/src/file/base-file.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { AppProperties } from "./app-properties/app-properties"; -import { ContentTypes } from "./content-types/content-types"; -import { CoreProperties, IPropertiesOptions } from "./core-properties"; -import { Document } from "./document"; -import { FooterReferenceType, HeaderReference, HeaderReferenceType, SectionPropertiesOptions } from "./document/body/section-properties"; -import { FooterWrapper, IDocumentFooter } from "./footer-wrapper"; -import { FootNotes } from "./footnotes"; -import { HeaderWrapper, IDocumentHeader } from "./header-wrapper"; -import { Image, Media } from "./media"; -import { Numbering } from "./numbering"; -import { Bookmark, Hyperlink, Paragraph } from "./paragraph"; -import { Relationships } from "./relationships"; -import { Styles } from "./styles"; -import { ExternalStylesFactory } from "./styles/external-styles-factory"; -import { DefaultStylesFactory } from "./styles/factory"; -import { Table } from "./table"; - -export abstract class BaseFile { - protected currentRelationshipId: number = 1; - - protected document: Document; - protected headers: IDocumentHeader[] = []; - protected footers: IDocumentFooter[] = []; - protected docRelationships: Relationships; - protected styles: Styles; - protected coreProperties: CoreProperties; - protected numbering: Numbering; - protected media: Media; - protected fileRelationships: Relationships; - protected footNotes: FootNotes; - protected contentTypes: ContentTypes; - protected appProperties: AppProperties; - - constructor(options: IPropertiesOptions) { - this.coreProperties = new CoreProperties(options); - this.numbering = new Numbering(); - this.docRelationships = new Relationships(); - this.media = new Media(); - this.fileRelationships = new Relationships(); - this.appProperties = new AppProperties(); - this.footNotes = new FootNotes(); - this.contentTypes = new ContentTypes(); - - if (options.externalStyles) { - const stylesFactory = new ExternalStylesFactory(); - this.styles = stylesFactory.newInstance(options.externalStyles); - } else { - const stylesFactory = new DefaultStylesFactory(); - this.styles = stylesFactory.newInstance(); - } - } - - public addParagraph(paragraph: Paragraph): BaseFile { - this.document.addParagraph(paragraph); - return this; - } - - public createParagraph(text?: string): Paragraph { - return this.document.createParagraph(text); - } - - public addTable(table: Table): void { - return this.document.addTable(table); - } - - public createTable(rows: number, cols: number): Table { - return this.document.createTable(rows, cols); - } - - public addImage(image: Image): BaseFile { - this.document.addParagraph(image.Paragraph); - return this; - } - - public createImage(buffer: Buffer | string | Uint8Array | ArrayBuffer, width?: number, height?: number): Image { - const image = Media.addImage(this, buffer, width, height); - this.document.addParagraph(image.Paragraph); - - return image; - } - - public createHyperlink(link: string, text?: string): Hyperlink { - text = text === undefined ? link : text; - const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount); - this.docRelationships.createRelationship( - hyperlink.linkId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", - link, - "External", - ); - return hyperlink; - } - - public createInternalHyperLink(anchor: string, text?: string): Hyperlink { - text = text === undefined ? anchor : text; - const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount, anchor); - // NOTE: unlike File#createHyperlink(), since the link is to an internal bookmark - // we don't need to create a new relationship. - return hyperlink; - } - - public createBookmark(name: string, text?: string): Bookmark { - text = text === undefined ? name : text; - const bookmark = new Bookmark(name, text, this.docRelationships.RelationshipCount); - return bookmark; - } - - public addSection(sectionPropertiesOptions: SectionPropertiesOptions): void { - this.document.Body.addSection(sectionPropertiesOptions); - } - - public createFootnote(paragraph: Paragraph): void { - this.footNotes.createFootNote(paragraph); - } - - public createHeader(): HeaderWrapper { - const header = new HeaderWrapper(this.currentRelationshipId++); - this.addHeaderToDocument(header); - return header; - } - - public createFooter(): FooterWrapper { - const footer = new FooterWrapper(this.currentRelationshipId++); - this.addFooterToDocument(footer); - return footer; - } - - public createFirstPageHeader(): HeaderWrapper { - const headerWrapper = this.createHeader(); - - this.document.Body.DefaultSection.addChildElement( - new HeaderReference({ - headerType: HeaderReferenceType.FIRST, - headerId: headerWrapper.Header.ReferenceId, - }), - ); - - return headerWrapper; - } - - public getFooterByReferenceNumber(refId: number): FooterWrapper { - const entry = this.footers.map((item) => item.footer).find((h) => h.Footer.ReferenceId === refId); - if (entry) { - return entry; - } - throw new Error(`There is no footer with given reference id ${refId}`); - } - - public getHeaderByReferenceNumber(refId: number): HeaderWrapper { - const entry = this.headers.map((item) => item.header).find((h) => h.Header.ReferenceId === refId); - if (entry) { - return entry; - } - throw new Error(`There is no header with given reference id ${refId}`); - } - - protected addHeaderToDocument(header: HeaderWrapper, type: HeaderReferenceType = HeaderReferenceType.DEFAULT): void { - this.headers.push({ header, type }); - this.docRelationships.createRelationship( - header.Header.ReferenceId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", - `header${this.headers.length}.xml`, - ); - this.contentTypes.addHeader(this.headers.length); - } - - protected addFooterToDocument(footer: FooterWrapper, type: FooterReferenceType = FooterReferenceType.DEFAULT): void { - this.footers.push({ footer, type }); - this.docRelationships.createRelationship( - footer.Footer.ReferenceId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", - `footer${this.footers.length}.xml`, - ); - this.contentTypes.addFooter(this.footers.length); - } - - protected addDefaultRelationships(): void { - this.fileRelationships.createRelationship( - 1, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", - "word/document.xml", - ); - this.fileRelationships.createRelationship( - 2, - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", - "docProps/core.xml", - ); - this.fileRelationships.createRelationship( - 3, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", - "docProps/app.xml", - ); - } - - public get Document(): Document { - return this.document; - } - - public get Styles(): Styles { - return this.styles; - } - - public set Styles(styles: Styles) { - this.styles = styles; - } - - public get CoreProperties(): CoreProperties { - return this.coreProperties; - } - - public get Numbering(): Numbering { - return this.numbering; - } - - public get Media(): Media { - return this.media; - } - - public get DocumentRelationships(): Relationships { - return this.docRelationships; - } - - public get FileRelationships(): Relationships { - return this.fileRelationships; - } - - public get Header(): HeaderWrapper { - return this.headers[0].header; - } - - public get Headers(): HeaderWrapper[] { - return this.headers.map((item) => item.header); - } - - public get Footer(): FooterWrapper { - return this.footers[0].footer; - } - - public get Footers(): FooterWrapper[] { - return this.footers.map((item) => item.footer); - } - - public get ContentTypes(): ContentTypes { - return this.contentTypes; - } - - public get AppProperties(): AppProperties { - return this.appProperties; - } - - public get FootNotes(): FootNotes { - return this.footNotes; - } -} diff --git a/src/file/file-properties.ts b/src/file/file-properties.ts new file mode 100644 index 0000000000..edf49af0ee --- /dev/null +++ b/src/file/file-properties.ts @@ -0,0 +1,11 @@ +import { IDocumentTemplate } from "importDocx"; + +export interface IFileProperties { + template?: IDocumentTemplate; +} + +// Needed because of: https://github.com/s-panferov/awesome-typescript-loader/issues/432 +/** + * @ignore + */ +export const WORKAROUND = ""; diff --git a/src/file/file.ts b/src/file/file.ts index 765ea19313..cbf60944c4 100644 --- a/src/file/file.ts +++ b/src/file/file.ts @@ -1,9 +1,37 @@ -import { BaseFile } from "./base-file"; -import { IPropertiesOptions } from "./core-properties"; +import { AppProperties } from "./app-properties/app-properties"; +import { ContentTypes } from "./content-types/content-types"; +import { CoreProperties, IPropertiesOptions } from "./core-properties"; import { Document } from "./document"; -import { SectionPropertiesOptions } from "./document/body/section-properties"; +import { FooterReferenceType, HeaderReference, HeaderReferenceType, SectionPropertiesOptions } from "./document/body/section-properties"; +import { IFileProperties } from "./file-properties"; +import { FooterWrapper, IDocumentFooter } from "./footer-wrapper"; +import { FootNotes } from "./footnotes"; +import { HeaderWrapper, IDocumentHeader } from "./header-wrapper"; +import { Image, Media } from "./media"; +import { Numbering } from "./numbering"; +import { Bookmark, Hyperlink, Paragraph } from "./paragraph"; +import { Relationships } from "./relationships"; +import { Styles } from "./styles"; +import { ExternalStylesFactory } from "./styles/external-styles-factory"; +import { DefaultStylesFactory } from "./styles/factory"; +import { Table } from "./table"; + +export class File { + private currentRelationshipId: number = 1; + + private readonly document: Document; + private readonly headers: IDocumentHeader[] = []; + private readonly footers: IDocumentFooter[] = []; + private readonly docRelationships: Relationships; + private readonly coreProperties: CoreProperties; + private readonly numbering: Numbering; + private readonly media: Media; + private readonly fileRelationships: Relationships; + private readonly footNotes: FootNotes; + private readonly contentTypes: ContentTypes; + private readonly appProperties: AppProperties; + private styles: Styles; -export class File extends BaseFile { constructor( options: IPropertiesOptions = { creator: "Un-named", @@ -11,12 +39,46 @@ export class File extends BaseFile { lastModifiedBy: "Un-named", }, sectionPropertiesOptions: SectionPropertiesOptions = {}, + fileProperties: IFileProperties = {}, ) { - super(options); + this.coreProperties = new CoreProperties(options); + this.numbering = new Numbering(); + this.docRelationships = new Relationships(); + this.media = new Media(); + this.fileRelationships = new Relationships(); + this.appProperties = new AppProperties(); + this.footNotes = new FootNotes(); + this.contentTypes = new ContentTypes(); + + if (options.externalStyles) { + const stylesFactory = new ExternalStylesFactory(); + this.styles = stylesFactory.newInstance(options.externalStyles); + } else { + const stylesFactory = new DefaultStylesFactory(); + this.styles = stylesFactory.newInstance(); + } this.addDefaultRelationships(); - this.createHeader(); - this.createFooter(); + + if (fileProperties.template) { + this.currentRelationshipId = fileProperties.template.currentRelationshipId + 1; + } + + if (fileProperties.template && fileProperties.template.headers) { + for (const templateHeader of fileProperties.template.headers) { + this.addHeaderToDocument(templateHeader.header, templateHeader.type); + } + } else { + this.createHeader(); + } + + if (fileProperties.template && fileProperties.template.footers) { + for (const templateFooter of fileProperties.template.footers) { + this.addFooterToDocument(templateFooter.footer, templateFooter.type); + } + } else { + this.createFooter(); + } sectionPropertiesOptions = { ...sectionPropertiesOptions, @@ -32,4 +94,206 @@ export class File extends BaseFile { this.document = new Document(sectionPropertiesOptions); } + + public addParagraph(paragraph: Paragraph): File { + this.document.addParagraph(paragraph); + return this; + } + + public createParagraph(text?: string): Paragraph { + return this.document.createParagraph(text); + } + + public addTable(table: Table): void { + return this.document.addTable(table); + } + + public createTable(rows: number, cols: number): Table { + return this.document.createTable(rows, cols); + } + + public addImage(image: Image): File { + this.document.addParagraph(image.Paragraph); + return this; + } + + public createImage(buffer: Buffer | string | Uint8Array | ArrayBuffer, width?: number, height?: number): Image { + const image = Media.addImage(this, buffer, width, height); + this.document.addParagraph(image.Paragraph); + + return image; + } + + public createHyperlink(link: string, text?: string): Hyperlink { + text = text === undefined ? link : text; + const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount); + this.docRelationships.createRelationship( + hyperlink.linkId, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", + link, + "External", + ); + return hyperlink; + } + + public createInternalHyperLink(anchor: string, text?: string): Hyperlink { + text = text === undefined ? anchor : text; + const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount, anchor); + // NOTE: unlike File#createHyperlink(), since the link is to an internal bookmark + // we don't need to create a new relationship. + return hyperlink; + } + + public createBookmark(name: string, text?: string): Bookmark { + text = text === undefined ? name : text; + const bookmark = new Bookmark(name, text, this.docRelationships.RelationshipCount); + return bookmark; + } + + public addSection(sectionPropertiesOptions: SectionPropertiesOptions): void { + this.document.Body.addSection(sectionPropertiesOptions); + } + + public createFootnote(paragraph: Paragraph): void { + this.footNotes.createFootNote(paragraph); + } + + public createHeader(): HeaderWrapper { + const header = new HeaderWrapper(this.currentRelationshipId++); + this.addHeaderToDocument(header); + return header; + } + + public createFooter(): FooterWrapper { + const footer = new FooterWrapper(this.currentRelationshipId++); + this.addFooterToDocument(footer); + return footer; + } + + public createFirstPageHeader(): HeaderWrapper { + const headerWrapper = this.createHeader(); + + this.document.Body.DefaultSection.addChildElement( + new HeaderReference({ + headerType: HeaderReferenceType.FIRST, + headerId: headerWrapper.Header.ReferenceId, + }), + ); + + return headerWrapper; + } + + public getFooterByReferenceNumber(refId: number): FooterWrapper { + const entry = this.footers.map((item) => item.footer).find((h) => h.Footer.ReferenceId === refId); + if (entry) { + return entry; + } + throw new Error(`There is no footer with given reference id ${refId}`); + } + + public getHeaderByReferenceNumber(refId: number): HeaderWrapper { + const entry = this.headers.map((item) => item.header).find((h) => h.Header.ReferenceId === refId); + if (entry) { + return entry; + } + throw new Error(`There is no header with given reference id ${refId}`); + } + + protected addHeaderToDocument(header: HeaderWrapper, type: HeaderReferenceType = HeaderReferenceType.DEFAULT): void { + this.headers.push({ header, type }); + this.docRelationships.createRelationship( + header.Header.ReferenceId, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", + `header${this.headers.length}.xml`, + ); + this.contentTypes.addHeader(this.headers.length); + } + + protected addFooterToDocument(footer: FooterWrapper, type: FooterReferenceType = FooterReferenceType.DEFAULT): void { + this.footers.push({ footer, type }); + this.docRelationships.createRelationship( + footer.Footer.ReferenceId, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", + `footer${this.footers.length}.xml`, + ); + this.contentTypes.addFooter(this.footers.length); + } + + protected addDefaultRelationships(): void { + this.fileRelationships.createRelationship( + 1, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", + "word/document.xml", + ); + this.fileRelationships.createRelationship( + 2, + "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", + "docProps/core.xml", + ); + this.fileRelationships.createRelationship( + 3, + "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", + "docProps/app.xml", + ); + } + + public get Document(): Document { + return this.document; + } + + public get Styles(): Styles { + return this.styles; + } + + public set Styles(styles: Styles) { + this.styles = styles; + } + + public get CoreProperties(): CoreProperties { + return this.coreProperties; + } + + public get Numbering(): Numbering { + return this.numbering; + } + + public get Media(): Media { + return this.media; + } + + public get DocumentRelationships(): Relationships { + return this.docRelationships; + } + + public get FileRelationships(): Relationships { + return this.fileRelationships; + } + + public get Header(): HeaderWrapper { + return this.headers[0].header; + } + + public get Headers(): HeaderWrapper[] { + return this.headers.map((item) => item.header); + } + + public get Footer(): FooterWrapper { + return this.footers[0].footer; + } + + public get Footers(): FooterWrapper[] { + return this.footers.map((item) => item.footer); + } + + public get ContentTypes(): ContentTypes { + return this.contentTypes; + } + + public get AppProperties(): AppProperties { + return this.appProperties; + } + + public get FootNotes(): FootNotes { + return this.footNotes; + } } diff --git a/src/file/file.ts.orig b/src/file/file.ts.orig deleted file mode 100644 index d7aa8213c5..0000000000 --- a/src/file/file.ts.orig +++ /dev/null @@ -1,304 +0,0 @@ -import { BaseFile } from "./base-file"; -import { IPropertiesOptions } from "./core-properties"; -import { Document } from "./document"; -import { SectionPropertiesOptions } from "./document/body/section-properties"; - -export class File extends BaseFile { - constructor( - options: IPropertiesOptions = { - creator: "Un-named", - revision: "1", - lastModifiedBy: "Un-named", - }, - sectionPropertiesOptions: SectionPropertiesOptions = {}, - ) { - super(options); - - this.addDefaultRelationships(); - this.createHeader(); - this.createFooter(); - - sectionPropertiesOptions = { - ...sectionPropertiesOptions, - headers: this.headers.map((header) => ({ - headerId: header.header.Header.ReferenceId, - headerType: header.type, - })), - footers: this.footers.map((footer) => ({ - footerId: footer.footer.Footer.ReferenceId, - footerType: footer.type, - })), - }; - -<<<<<<< HEAD - this.document = new Document(sectionPropertiesOptions); - } -======= -export class File { - private readonly document: Document; - private styles: Styles; - private readonly coreProperties: CoreProperties; - private readonly numbering: Numbering; - private readonly media: Media; - private readonly docRelationships: Relationships; - private readonly fileRelationships: Relationships; - private readonly headerWrapper: HeaderWrapper[] = []; - private readonly footerWrapper: FooterWrapper[] = []; - private readonly footNotes: FootNotes; - - private readonly contentTypes: ContentTypes; - private readonly appProperties: AppProperties; - - private currentRelationshipId: number = 1; - - constructor(options?: IPropertiesOptions, sectionPropertiesOptions?: SectionPropertiesOptions) { - if (!options) { - options = { - creator: "Un-named", - revision: "1", - lastModifiedBy: "Un-named", - }; - } - - if (options.externalStyles) { - const stylesFactory = new ExternalStylesFactory(); - this.styles = stylesFactory.newInstance(options.externalStyles); - } else { - const stylesFactory = new DefaultStylesFactory(); - this.styles = stylesFactory.newInstance(); - } - - this.coreProperties = new CoreProperties(options); - this.numbering = new Numbering(); - this.docRelationships = new Relationships(); - this.docRelationships.createRelationship( - this.currentRelationshipId++, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles", - "styles.xml", - ); - this.docRelationships.createRelationship( - this.currentRelationshipId++, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering", - "numbering.xml", - ); - this.contentTypes = new ContentTypes(); - - this.docRelationships.createRelationship( - this.currentRelationshipId++, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes", - "footnotes.xml", - ); - this.media = new Media(); - - const header = this.createHeader(); - const footer = this.createFooter(); - - this.fileRelationships = new Relationships(); - this.fileRelationships.createRelationship( - 1, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument", - "word/document.xml", - ); - this.fileRelationships.createRelationship( - 2, - "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties", - "docProps/core.xml", - ); - this.fileRelationships.createRelationship( - 3, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties", - "docProps/app.xml", - ); - this.appProperties = new AppProperties(); - - this.footNotes = new FootNotes(); - if (!sectionPropertiesOptions) { - sectionPropertiesOptions = { - footerType: FooterReferenceType.DEFAULT, - headerType: HeaderReferenceType.DEFAULT, - headerId: header.Header.ReferenceId, - footerId: footer.Footer.ReferenceId, - }; - } else { - sectionPropertiesOptions.headerId = header.Header.ReferenceId; - sectionPropertiesOptions.footerId = footer.Footer.ReferenceId; - } - this.document = new Document(sectionPropertiesOptions); - } - - public addParagraph(paragraph: Paragraph): void { - this.document.addParagraph(paragraph); - } - - public createParagraph(text?: string): Paragraph { - return this.document.createParagraph(text); - } - - public addTable(table: Table): void { - return this.document.addTable(table); - } - - public createTable(rows: number, cols: number): Table { - return this.document.createTable(rows, cols); - } - - public addImage(image: Image): File { - this.document.addParagraph(image.Paragraph); - return this; - } - - public createImage(buffer: Buffer | string | Uint8Array | ArrayBuffer, width?: number, height?: number): Image { - const image = Media.addImage(this, buffer, width, height); - this.document.addParagraph(image.Paragraph); - - return image; - } - - public createHyperlink(link: string, text?: string): Hyperlink { - text = text === undefined ? link : text; - const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount); - this.docRelationships.createRelationship( - hyperlink.linkId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink", - link, - "External", - ); - return hyperlink; - } - - public createInternalHyperLink(anchor: string, text?: string): Hyperlink { - text = text === undefined ? anchor : text; - const hyperlink = new Hyperlink(text, this.docRelationships.RelationshipCount, anchor); - // NOTE: unlike File#createHyperlink(), since the link is to an internal bookmark - // we don't need to create a new relationship. - return hyperlink; - } - - public createBookmark(name: string, text?: string): Bookmark { - text = text === undefined ? name : text; - const bookmark = new Bookmark(name, text, this.docRelationships.RelationshipCount); - return bookmark; - } - - public addSection(sectionPropertiesOptions: SectionPropertiesOptions): void { - this.document.Body.addSection(sectionPropertiesOptions); - } - - public createFootnote(paragraph: Paragraph): void { - this.footNotes.createFootNote(paragraph); - } - - public createHeader(): HeaderWrapper { - const header = new HeaderWrapper(this.media, this.currentRelationshipId++); - this.headerWrapper.push(header); - this.docRelationships.createRelationship( - header.Header.ReferenceId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/header", - `header${this.headerWrapper.length}.xml`, - ); - this.contentTypes.addHeader(this.headerWrapper.length); - return header; - } - - public createFooter(): FooterWrapper { - const footer = new FooterWrapper(this.media, this.currentRelationshipId++); - this.footerWrapper.push(footer); - this.docRelationships.createRelationship( - footer.Footer.ReferenceId, - "http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer", - `footer${this.footerWrapper.length}.xml`, - ); - this.contentTypes.addFooter(this.footerWrapper.length); - return footer; - } - - public createFirstPageHeader(): HeaderWrapper { - const headerWrapper = this.createHeader(); - - this.document.Body.DefaultSection.addChildElement( - new HeaderReference({ - headerType: HeaderReferenceType.FIRST, - headerId: headerWrapper.Header.ReferenceId, - }), - ); - - return headerWrapper; - } - - public get Document(): Document { - return this.document; - } - - public get Styles(): Styles { - return this.styles; - } - - public set Styles(styles: Styles) { - this.styles = styles; - } - - public get CoreProperties(): CoreProperties { - return this.coreProperties; - } - - public get Numbering(): Numbering { - return this.numbering; - } - - public get Media(): Media { - return this.media; - } - - public get DocumentRelationships(): Relationships { - return this.docRelationships; - } - - public get FileRelationships(): Relationships { - return this.fileRelationships; - } - - public get Header(): HeaderWrapper { - return this.headerWrapper[0]; - } - - public get Headers(): HeaderWrapper[] { - return this.headerWrapper; - } - - public HeaderByRefNumber(refId: number): HeaderWrapper { - const entry = this.headerWrapper.find((h) => h.Header.ReferenceId === refId); - if (entry) { - return entry; - } - throw new Error(`There is no header with given reference id ${refId}`); - } - - public get Footer(): FooterWrapper { - return this.footerWrapper[0]; - } - - public get Footers(): FooterWrapper[] { - return this.footerWrapper; - } - - public FooterByRefNumber(refId: number): FooterWrapper { - const entry = this.footerWrapper.find((h) => h.Footer.ReferenceId === refId); - if (entry) { - return entry; - } - throw new Error(`There is no footer with given reference id ${refId}`); - } - - public get ContentTypes(): ContentTypes { - return this.contentTypes; - } - - public get AppProperties(): AppProperties { - return this.appProperties; - } - - public get FootNotes(): FootNotes { - return this.footNotes; - } ->>>>>>> 877aa325bb5e60d05846d4013e208a045004d4a1 -} diff --git a/src/file/index.ts b/src/file/index.ts index 094b94f20d..d1e04ffcf7 100644 --- a/src/file/index.ts +++ b/src/file/index.ts @@ -7,4 +7,3 @@ export * from "./drawing"; export * from "./document"; export * from "./styles"; export * from "./xml-components"; -export * from "./templated-file"; diff --git a/src/file/templated-file.ts b/src/file/templated-file.ts deleted file mode 100644 index 6f53bbaca1..0000000000 --- a/src/file/templated-file.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { ITemplateDocument } from "../importDocx"; -import { BaseFile } from "./base-file"; -import { IPropertiesOptions } from "./core-properties"; -import { Document, SectionPropertiesOptions } from "./document"; - -export class TemplatedFile extends BaseFile { - constructor( - templateDocument: ITemplateDocument, - options: IPropertiesOptions = { - creator: "Un-named", - revision: "1", - lastModifiedBy: "Un-named", - }, - sectionPropertiesOptions: SectionPropertiesOptions = {}, - ) { - super(options); - - this.currentRelationshipId = templateDocument.currentRelationshipId + 1; - - this.addDefaultRelationships(); - - if (templateDocument.headers) { - for (const templateHeader of templateDocument.headers) { - this.addHeaderToDocument(templateHeader.header, templateHeader.type); - } - } else { - this.createHeader(); - } - - if (templateDocument.footers) { - for (const templateFooter of templateDocument.footers) { - this.addFooterToDocument(templateFooter.footer, templateFooter.type); - } - } else { - this.createFooter(); - } - - sectionPropertiesOptions = { - ...sectionPropertiesOptions, - headers: this.headers.map((header) => ({ - headerId: header.header.Header.ReferenceId, - headerType: header.type, - })), - footers: this.footers.map((footer) => ({ - footerId: footer.footer.Footer.ReferenceId, - footerType: footer.type, - })), - }; - - this.document = new Document(sectionPropertiesOptions); - } -} diff --git a/src/importDocx/importDocx.ts b/src/importDocx/importDocx.ts index 6f41750f83..e92ce3b894 100644 --- a/src/importDocx/importDocx.ts +++ b/src/importDocx/importDocx.ts @@ -30,7 +30,9 @@ interface IRelationshipFileInfo { type: "header" | "footer" | "image"; } -export interface ITemplateDocument { +// Document Template +// https://fileinfo.com/extension/dotx +export interface IDocumentTemplate { currentRelationshipId: number; headers: IDocumentHeader[]; footers: IDocumentFooter[]; @@ -43,7 +45,7 @@ export class ImportDocx { this.currentRelationshipId = 1; } - public async extract(data: Buffer): Promise { + public async extract(data: Buffer): Promise { const zipContent = await JSZip.loadAsync(data); const documentContent = zipContent.files["word/document.xml"]; @@ -86,7 +88,7 @@ export class ImportDocx { footers.push({ type: footerRef.type, footer }); } - const templateDocument: ITemplateDocument = { headers, footers, currentRelationshipId: this.currentRelationshipId }; + const templateDocument: IDocumentTemplate = { headers, footers, currentRelationshipId: this.currentRelationshipId }; return templateDocument; } diff --git a/src/index.ts b/src/index.ts index 4fa01de9f4..5a2e7d56cd 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,6 +1,6 @@ // Internally, the wrapper is a 'File', but export to the end user as a 'Document' // Use of 'File' also works -export { File as Document, TemplatedFile as TemplatedDocument } from "./file"; +export { File as Document } from "./file"; export * from "./file"; export * from "./export"; export * from "./importDocx";