Files
docx-js/src/file/document/body/section-properties/section-properties.ts

197 lines
7.1 KiB
TypeScript
Raw Normal View History

2018-01-24 00:01:38 +00:00
// http://officeopenxml.com/WPsection.php
2021-03-19 20:53:56 +00:00
// tslint:disable: no-unnecessary-initializer
2018-10-26 01:04:07 +01:00
import { FooterWrapper } from "file/footer-wrapper";
import { HeaderWrapper } from "file/header-wrapper";
import { VerticalAlign, VerticalAlignElement } from "file/vertical-align";
import { OnOffElement, XmlComponent } from "file/xml-components";
import { HeaderFooterReference, HeaderFooterReferenceType, HeaderFooterType } from "./properties/header-footer-reference";
import { Columns, IColumnsAttributes } from "./properties/columns";
import { DocumentGrid, IDocGridAttributesProperties } from "./properties/doc-grid";
import { ILineNumberAttributes, LineNumberType } from "./properties/line-number";
import { IPageBordersOptions, PageBorders } from "./properties/page-borders";
import { IPageMarginAttributes, PageMargin } from "./properties/page-margin";
import { IPageNumberTypeAttributes, PageNumberType } from "./properties/page-number";
import { IPageSizeAttributes, PageOrientation, PageSize } from "./properties/page-size";
import { PageTextDirection, PageTextDirectionType } from "./properties/page-text-direction";
import { SectionType, Type } from "./properties/section-type";
2018-09-04 17:16:31 +03:00
2018-10-05 01:33:17 +01:00
export interface IHeaderFooterGroup<T> {
readonly default?: T;
readonly first?: T;
readonly even?: T;
2018-10-05 01:33:17 +01:00
}
2021-03-19 20:53:56 +00:00
export interface ISectionPropertiesOptions {
readonly page?: {
readonly size?: IPageSizeAttributes;
readonly margin?: IPageMarginAttributes;
readonly pageNumbers?: IPageNumberTypeAttributes;
readonly borders?: IPageBordersOptions;
readonly textDirection?: PageTextDirectionType;
2021-03-19 20:53:56 +00:00
};
readonly grid?: IDocGridAttributesProperties;
readonly headerWrapperGroup?: IHeaderFooterGroup<HeaderWrapper>;
readonly footerWrapperGroup?: IHeaderFooterGroup<FooterWrapper>;
readonly lineNumbers?: ILineNumberAttributes;
readonly titlePage?: boolean;
readonly verticalAlign?: VerticalAlign;
readonly column?: IColumnsAttributes;
2021-03-19 20:53:56 +00:00
readonly type?: SectionType;
}
// <xsd:complexType name="CT_SectPr">
// <xsd:sequence>
// <xsd:group ref="EG_HdrFtrReferences" minOccurs="0" maxOccurs="6"/>
// <xsd:group ref="EG_SectPrContents" minOccurs="0"/>
// <xsd:element name="sectPrChange" type="CT_SectPrChange" minOccurs="0"/>
// </xsd:sequence>
// <xsd:attributeGroup ref="AG_SectPrAttributes"/>
// </xsd:complexType>
// <xsd:group name="EG_SectPrContents">
// <xsd:sequence>
// <xsd:element name="footnotePr" type="CT_FtnProps" minOccurs="0"/>
// <xsd:element name="endnotePr" type="CT_EdnProps" minOccurs="0"/>
// <xsd:element name="type" type="CT_SectType" minOccurs="0"/>
// <xsd:element name="pgSz" type="CT_PageSz" minOccurs="0"/>
// <xsd:element name="pgMar" type="CT_PageMar" minOccurs="0"/>
// <xsd:element name="paperSrc" type="CT_PaperSource" minOccurs="0"/>
// <xsd:element name="pgBorders" type="CT_PageBorders" minOccurs="0"/>
// <xsd:element name="lnNumType" type="CT_LineNumber" minOccurs="0"/>
// <xsd:element name="pgNumType" type="CT_PageNumber" minOccurs="0"/>
// <xsd:element name="cols" type="CT_Columns" minOccurs="0"/>
// <xsd:element name="formProt" type="CT_OnOff" minOccurs="0"/>
// <xsd:element name="vAlign" type="CT_VerticalJc" minOccurs="0"/>
// <xsd:element name="noEndnote" type="CT_OnOff" minOccurs="0"/>
// <xsd:element name="titlePg" type="CT_OnOff" minOccurs="0"/>
// <xsd:element name="textDirection" type="CT_TextDirection" minOccurs="0"/>
// <xsd:element name="bidi" type="CT_OnOff" minOccurs="0"/>
// <xsd:element name="rtlGutter" type="CT_OnOff" minOccurs="0"/>
// <xsd:element name="docGrid" type="CT_DocGrid" minOccurs="0"/>
// <xsd:element name="printerSettings" type="CT_Rel" minOccurs="0"/>
// </xsd:sequence>
// </xsd:group>
export const sectionMarginDefaults = {
TOP: "1in",
RIGHT: "1in",
BOTTOM: "1in",
LEFT: "1in",
HEADER: 708,
FOOTER: 708,
GUTTER: 0,
};
export const sectionPageSizeDefaults = {
WIDTH: 11906,
HEIGHT: 16838,
ORIENTATION: PageOrientation.PORTRAIT,
};
2018-01-24 00:01:38 +00:00
export class SectionProperties extends XmlComponent {
2021-03-19 20:53:56 +00:00
constructor({
page: {
size: {
width = sectionPageSizeDefaults.WIDTH,
height = sectionPageSizeDefaults.HEIGHT,
orientation = sectionPageSizeDefaults.ORIENTATION,
} = {},
2021-03-19 20:53:56 +00:00
margin: {
top = sectionMarginDefaults.TOP,
right = sectionMarginDefaults.RIGHT,
bottom = sectionMarginDefaults.BOTTOM,
left = sectionMarginDefaults.LEFT,
header = sectionMarginDefaults.HEADER,
footer = sectionMarginDefaults.FOOTER,
gutter = sectionMarginDefaults.GUTTER,
2021-03-19 20:53:56 +00:00
} = {},
2021-05-23 07:33:43 +03:00
pageNumbers = {},
borders,
textDirection,
2021-03-19 20:53:56 +00:00
} = {},
grid: { linePitch = 360, charSpace, type: gridType } = {},
2021-03-19 20:53:56 +00:00
headerWrapperGroup = {},
footerWrapperGroup = {},
2021-05-23 07:33:43 +03:00
lineNumbers,
titlePage,
2021-03-19 20:53:56 +00:00
verticalAlign,
column,
2021-03-19 20:53:56 +00:00
type,
}: ISectionPropertiesOptions = {}) {
super("w:sectPr");
this.addHeaderFooterGroup(HeaderFooterType.HEADER, headerWrapperGroup);
this.addHeaderFooterGroup(HeaderFooterType.FOOTER, footerWrapperGroup);
2018-09-07 21:48:59 +01:00
if (type) {
this.root.push(new Type(type));
2019-02-04 18:49:12 +05:30
}
this.root.push(new PageSize(width, height, orientation));
this.root.push(new PageMargin(top, right, bottom, left, header, footer, gutter));
2021-05-23 07:33:43 +03:00
if (borders) {
this.root.push(new PageBorders(borders));
}
2021-05-23 07:33:43 +03:00
if (lineNumbers) {
this.root.push(new LineNumberType(lineNumbers));
2018-09-04 17:16:31 +03:00
}
2021-05-23 07:33:43 +03:00
this.root.push(new PageNumberType(pageNumbers));
if (column) {
this.root.push(new Columns(column));
}
2019-10-31 13:54:53 +02:00
if (verticalAlign) {
this.root.push(new VerticalAlignElement(verticalAlign));
}
2021-02-22 21:04:02 +00:00
if (titlePage !== undefined) {
this.root.push(new OnOffElement("w:titlePg", titlePage));
2021-02-22 21:04:02 +00:00
}
if (textDirection) {
this.root.push(new PageTextDirection(textDirection));
}
this.root.push(new DocumentGrid(linePitch, charSpace, gridType));
2018-10-05 01:33:17 +01:00
}
2018-09-04 17:16:31 +03:00
private addHeaderFooterGroup(
type: HeaderFooterType,
group: IHeaderFooterGroup<HeaderWrapper> | IHeaderFooterGroup<FooterWrapper>,
): void {
if (group.default) {
2021-03-19 20:53:56 +00:00
this.root.push(
new HeaderFooterReference(type, {
type: HeaderFooterReferenceType.DEFAULT,
id: group.default.View.ReferenceId,
2021-03-19 20:53:56 +00:00
}),
);
}
if (group.first) {
2021-03-19 20:53:56 +00:00
this.root.push(
new HeaderFooterReference(type, {
type: HeaderFooterReferenceType.FIRST,
id: group.first.View.ReferenceId,
2021-03-19 20:53:56 +00:00
}),
);
}
if (group.even) {
2021-03-19 20:53:56 +00:00
this.root.push(
new HeaderFooterReference(type, {
type: HeaderFooterReferenceType.EVEN,
id: group.even.View.ReferenceId,
2021-03-19 20:53:56 +00:00
}),
);
2018-10-05 01:33:17 +01:00
}
}
2018-01-24 00:01:38 +00:00
}