From 2f693566b23e24933492574aea5be2be1fd6706c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 20 Mar 2024 19:05:26 +0000 Subject: Prefer numbering properties to numbering from paragraph style --- NEWS | 4 ++++ lib/docx/body-reader.js | 14 +++++++------- test/docx/body-reader.tests.js | 20 ++++++++++++++++++-- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/NEWS b/NEWS index cb1ab7d..69b2d21 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,10 @@ * Handle numbering level definitions without an explicit format. +* Switch the precedence of numbering properties in paragraph properties and the + numbering in paragraph styles so that the numbering properties in paragraph + properties takes precedence. + # 1.7.0 * Support attributes in HTML paths in style mappings. diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js index b9bdb57..7a00164 100644 --- a/lib/docx/body-reader.js +++ b/lib/docx/body-reader.js @@ -553,6 +553,12 @@ function BodyReader(options) { function readNumberingProperties(styleId, element, numbering) { + var level = element.firstOrEmpty("w:ilvl").attributes["w:val"]; + var numId = element.firstOrEmpty("w:numId").attributes["w:val"]; + if (level !== undefined && numId !== undefined) { + return numbering.findLevel(numId, level); + } + if (styleId != null) { var levelByStyleId = numbering.findLevelByParagraphStyleId(styleId); if (levelByStyleId != null) { @@ -560,13 +566,7 @@ function readNumberingProperties(styleId, element, numbering) { } } - var level = element.firstOrEmpty("w:ilvl").attributes["w:val"]; - var numId = element.firstOrEmpty("w:numId").attributes["w:val"]; - if (level === undefined || numId === undefined) { - return null; - } else { - return numbering.findLevel(numId, level); - } + return null; } var supportedImageTypes = { diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js index da9501d..5623f66 100644 --- a/test/docx/body-reader.tests.js +++ b/test/docx/body-reader.tests.js @@ -171,7 +171,22 @@ test("paragraph has numbering properties from paragraph properties if present", assert.deepEqual(paragraph.numbering, {level: "1", isOrdered: true}); }); -test("numbering on paragraph style takes precedence over numPr", function() { +test("paragraph has numbering from paragraph style if present", function() { + var propertiesXml = new XmlElement("w:pPr", {}, [ + new XmlElement("w:pStyle", {"w:val": "List"}) + ]); + var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); + + var numbering = new NumberingMap({ + findLevelByParagraphStyleId: {"List": {isOrdered: true, level: "1"}} + }); + var styles = new Styles({"List": {name: "List"}}, {}); + + var paragraph = readXmlElementValue(paragraphXml, {numbering: numbering, styles: styles}); + assert.deepEqual(paragraph.numbering, {level: "1", isOrdered: true}); +}); + +test("numbering properties in paragraph properties takes precedence over numbering in paragraph style", function() { var numberingPropertiesXml = new XmlElement("w:numPr", {}, [ new XmlElement("w:ilvl", {"w:val": "1"}), new XmlElement("w:numId", {"w:val": "42"}) @@ -183,7 +198,8 @@ test("numbering on paragraph style takes precedence over numPr", function() { var paragraphXml = new XmlElement("w:p", {}, [propertiesXml]); var numbering = new NumberingMap({ - findLevelByParagraphStyleId: {"List": {isOrdered: true, level: "1"}} + findLevel: {"42": {"1": {isOrdered: true, level: "1"}}}, + findLevelByParagraphStyleId: {"List": {isOrdered: true, level: "2"}} }); var styles = new Styles({"List": {name: "List"}}, {}); -- cgit v1.2.3