From 671dbb6ae5738d6bf8f97d13dd08bfc0a23e0b04 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 26 Sep 2026 21:57:10 +0100 Subject: Handle paragraphs and runs that have been moved and tracked as a revision --- NEWS | 2 ++ lib/docx/body-reader.js | 6 ++++++ test/docx/body-reader.tests.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/NEWS b/NEWS index 3a5ce10..3d9324a 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,8 @@ * Read the children of w:customXml elements. +* Handle paragraphs and runs that have been moved and tracked as a revision. + # 1.12.3 * Avoid excessive backtracking when parsing an unterminated string with many diff --git a/lib/docx/body-reader.js b/lib/docx/body-reader.js index f9ab168..ddc4fce 100644 --- a/lib/docx/body-reader.js +++ b/lib/docx/body-reader.js @@ -445,6 +445,11 @@ function BodyReader(options) { "w:customXml": readChildElements, "w:ins": readChildElements, + "w:moveFromRangeEnd": readChildElements, + "w:moveFromRangeStart": readChildElements, + "w:moveTo": readChildElements, + "w:moveToRangeEnd": readChildElements, + "w:moveToRangeStart": readChildElements, "w:object": readChildElements, "w:smartTag": readChildElements, "w:drawing": readChildElements, @@ -724,6 +729,7 @@ var ignoreElements = { "w:del": true, "w:footnoteRef": true, "w:endnoteRef": true, + "w:moveFrom": true, "w:pPr": true, "w:rPr": true, "w:tblPr": true, diff --git a/test/docx/body-reader.tests.js b/test/docx/body-reader.tests.js index 197f19d..a8b9c7c 100644 --- a/test/docx/body-reader.tests.js +++ b/test/docx/body-reader.tests.js @@ -1758,6 +1758,26 @@ test("children of w:ins are converted normally", function() { assertChildrenAreConvertedNormally("w:ins"); }); +test("children of w:moveFromRangeEnd are converted normally", function() { + assertChildrenAreConvertedNormally("w:moveFromRangeEnd"); +}); + +test("children of w:moveFromRangeStart are converted normally", function() { + assertChildrenAreConvertedNormally("w:moveFromRangeStart"); +}); + +test("children of w:moveTo are converted normally", function() { + assertChildrenAreConvertedNormally("w:moveTo"); +}); + +test("children of w:moveToRangeEnd are converted normally", function() { + assertChildrenAreConvertedNormally("w:moveToRangeEnd"); +}); + +test("children of w:moveToRangeStart are converted normally", function() { + assertChildrenAreConvertedNormally("w:moveToRangeStart"); +}); + test("children of w:object are converted normally", function() { assertChildrenAreConvertedNormally("w:object"); }); @@ -1978,6 +1998,19 @@ test("text nodes are ignored when reading children", function() { assert.deepEqual(run, new documents.Run([])); }); +test("w:moveFrom elements are ignored", function() { + assertElementIsIgnored("w:moveFrom"); +}); + +function assertElementIsIgnored(tagName) { + var runXml = new XmlElement("w:r", {}, [ + xml.element("w:t", {}, [xml.text("Blackdown")]) + ]); + var result = readXmlElement(new XmlElement(tagName, {}, [runXml])); + assert.deepEqual(result.messages, []); + assert.deepEqual(result.value, []); +} + function paragraphWithStyleId(styleId) { return new XmlElement("w:p", {}, [ new XmlElement("w:pPr", {}, [ -- cgit v1.2.3