Merge pull request #1823 from anti-the-social/overrideLevels-impl

Override levels impl
This commit is contained in:
Dolan
2022-12-10 23:15:39 +00:00
committed by GitHub
6 changed files with 207 additions and 26 deletions

2
package-lock.json generated
View File

@ -11,7 +11,7 @@
"dependencies": { "dependencies": {
"@types/node": "^18.0.0", "@types/node": "^18.0.0",
"jszip": "^3.1.5", "jszip": "^3.1.5",
"nanoid": "^3.1.20", "nanoid": "^3.3.4",
"xml": "^1.0.1", "xml": "^1.0.1",
"xml-js": "^1.6.8" "xml-js": "^1.6.8"
}, },

View File

@ -52,7 +52,7 @@
"dependencies": { "dependencies": {
"@types/node": "^18.0.0", "@types/node": "^18.0.0",
"jszip": "^3.1.5", "jszip": "^3.1.5",
"nanoid": "^3.1.20", "nanoid": "^3.3.4",
"xml": "^1.0.1", "xml": "^1.0.1",
"xml-js": "^1.6.8" "xml-js": "^1.6.8"
}, },

View File

@ -12,9 +12,11 @@ describe("ConcreteNumbering", () => {
abstractNumId: 1, abstractNumId: 1,
reference: "1", reference: "1",
instance: 0, instance: 0,
overrideLevel: { overrideLevels: [
num: 3, {
}, num: 3,
},
],
}); });
const tree = new Formatter().format(concreteNumbering); const tree = new Formatter().format(concreteNumbering);
@ -44,16 +46,61 @@ describe("ConcreteNumbering", () => {
}); });
}); });
it("sets a new override level for two different level numbers", () => {
const concreteNumbering = new ConcreteNumbering({
numId: 0,
abstractNumId: 1,
reference: "1",
instance: 0,
overrideLevels: [{ num: 3 }, { num: 5 }],
});
const tree = new Formatter().format(concreteNumbering);
expect(tree).to.deep.equal({
"w:num": [
{
_attr: {
"w:numId": 0,
},
},
{
"w:abstractNumId": {
_attr: {
"w:val": 1,
},
},
},
{
"w:lvlOverride": {
_attr: {
"w:ilvl": 3,
},
},
},
{
"w:lvlOverride": {
_attr: {
"w:ilvl": 5,
},
},
},
],
});
});
it("sets the startOverride element if start is given", () => { it("sets the startOverride element if start is given", () => {
const concreteNumbering = new ConcreteNumbering({ const concreteNumbering = new ConcreteNumbering({
numId: 0, numId: 0,
abstractNumId: 1, abstractNumId: 1,
reference: "1", reference: "1",
instance: 0, instance: 0,
overrideLevel: { overrideLevels: [
num: 1, {
start: 9, num: 1,
}, start: 9,
},
],
}); });
const tree = new Formatter().format(concreteNumbering); const tree = new Formatter().format(concreteNumbering);
expect(tree).to.deep.equal({ expect(tree).to.deep.equal({
@ -90,15 +137,143 @@ describe("ConcreteNumbering", () => {
}); });
}); });
it("sets the startOverride element for several levels if start is given", () => {
const concreteNumbering = new ConcreteNumbering({
numId: 0,
abstractNumId: 1,
reference: "1",
instance: 0,
overrideLevels: [
{
num: 1,
start: 9,
},
{
num: 3,
start: 10,
},
],
});
const tree = new Formatter().format(concreteNumbering);
expect(tree).to.deep.equal({
"w:num": [
{
_attr: {
"w:numId": 0,
},
},
{
"w:abstractNumId": {
_attr: {
"w:val": 1,
},
},
},
{
"w:lvlOverride": [
{
_attr: {
"w:ilvl": 1,
},
},
{
"w:startOverride": {
_attr: {
"w:val": 9,
},
},
},
],
},
{
"w:lvlOverride": [
{
_attr: {
"w:ilvl": 3,
},
},
{
"w:startOverride": {
_attr: {
"w:val": 10,
},
},
},
],
},
],
});
});
it("Mix of overrideLevels with start and without", () => {
const concreteNumbering = new ConcreteNumbering({
numId: 0,
abstractNumId: 1,
reference: "1",
instance: 0,
overrideLevels: [
{
num: 1,
start: 9,
},
{
num: 3,
},
],
});
const tree = new Formatter().format(concreteNumbering);
expect(tree).to.deep.equal({
"w:num": [
{
_attr: {
"w:numId": 0,
},
},
{
"w:abstractNumId": {
_attr: {
"w:val": 1,
},
},
},
{
"w:lvlOverride": [
{
_attr: {
"w:ilvl": 1,
},
},
{
"w:startOverride": {
_attr: {
"w:val": 9,
},
},
},
],
},
{
"w:lvlOverride": {
_attr: {
"w:ilvl": 3,
},
},
},
],
});
});
it("sets the lvl element if overrideLevel.Level is accessed", () => { it("sets the lvl element if overrideLevel.Level is accessed", () => {
const concreteNumbering = new ConcreteNumbering({ const concreteNumbering = new ConcreteNumbering({
numId: 0, numId: 0,
abstractNumId: 1, abstractNumId: 1,
reference: "1", reference: "1",
instance: 0, instance: 0,
overrideLevel: { overrideLevels: [
num: 1, {
}, num: 1,
},
],
}); });
const tree = new Formatter().format(concreteNumbering); const tree = new Formatter().format(concreteNumbering);
expect(tree).to.deep.equal({ expect(tree).to.deep.equal({

View File

@ -18,15 +18,17 @@ class NumAttributes extends XmlAttributeComponent<{
protected readonly xmlKeys = { numId: "w:numId" }; protected readonly xmlKeys = { numId: "w:numId" };
} }
interface IOverrideLevel {
readonly num: number;
readonly start?: number;
}
export interface IConcreteNumberingOptions { export interface IConcreteNumberingOptions {
readonly numId: number; readonly numId: number;
readonly abstractNumId: number; readonly abstractNumId: number;
readonly reference: string; readonly reference: string;
readonly instance: number; readonly instance: number;
readonly overrideLevel?: { readonly overrideLevels?: readonly IOverrideLevel[];
readonly num: number;
readonly start?: number;
};
} }
// <xsd:complexType name="CT_Numbering"> // <xsd:complexType name="CT_Numbering">
@ -60,8 +62,10 @@ export class ConcreteNumbering extends XmlComponent {
this.root.push(new AbstractNumId(decimalNumber(options.abstractNumId))); this.root.push(new AbstractNumId(decimalNumber(options.abstractNumId)));
if (options.overrideLevel) { if (options.overrideLevels && options.overrideLevels.length) {
this.root.push(new LevelOverride(options.overrideLevel.num, options.overrideLevel.start)); for (const level of options.overrideLevels) {
this.root.push(new LevelOverride(level.num, level.start));
}
} }
} }
} }

View File

@ -164,10 +164,12 @@ export class Numbering extends XmlComponent {
abstractNumId: abstractNumbering.id, abstractNumId: abstractNumbering.id,
reference: "default-bullet-numbering", reference: "default-bullet-numbering",
instance: 0, instance: 0,
overrideLevel: { overrideLevels: [
num: 0, {
start: 1, num: 0,
}, start: 1,
},
],
}), }),
); );

View File

@ -44,7 +44,7 @@ describe("Comment", () => {
let clock: sinon.SinonFakeTimers; let clock: sinon.SinonFakeTimers;
beforeEach(() => { beforeEach(() => {
const now = new Date(1999, 0, 1); const now = new Date("1999-01-01T00:00:00.000Z");
clock = sinon.useFakeTimers(now.getTime()); clock = sinon.useFakeTimers(now.getTime());
}); });
@ -57,7 +57,7 @@ describe("Comment", () => {
const component = new Comment({ const component = new Comment({
id: 0, id: 0,
text: "test-comment", text: "test-comment",
date: new Date(1999, 0, 1), date: new Date("1999-01-01T00:00:00.000Z"),
}); });
const tree = new Formatter().format(component); const tree = new Formatter().format(component);
expect(tree).to.deep.equal({ expect(tree).to.deep.equal({
@ -126,12 +126,12 @@ describe("Comments", () => {
{ {
id: 0, id: 0,
text: "test-comment", text: "test-comment",
date: new Date(1999, 0, 1), date: new Date("1999-01-01T00:00:00.000Z"),
}, },
{ {
id: 1, id: 1,
text: "test-comment-2", text: "test-comment-2",
date: new Date(1999, 0, 1), date: new Date("1999-01-01T00:00:00.000Z"),
}, },
], ],
}); });