diff --git a/packages/markdown-cli/test/data/acceptance/omitted-acceptance-of-delivery.xml b/packages/markdown-cli/test/data/acceptance/omitted-acceptance-of-delivery.xml
index 43be0550..9708a0ed 100644
--- a/packages/markdown-cli/test/data/acceptance/omitted-acceptance-of-delivery.xml
+++ b/packages/markdown-cli/test/data/acceptance/omitted-acceptance-of-delivery.xml
@@ -42,6 +42,13 @@
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
+
+
+
+
+
+
+
@@ -510,6 +517,9 @@
+
+
+
diff --git a/packages/markdown-docx/src/ToCiceroMarkVisitor.js b/packages/markdown-docx/src/ToCiceroMarkVisitor.js
index 99437c53..871cea40 100644
--- a/packages/markdown-docx/src/ToCiceroMarkVisitor.js
+++ b/packages/markdown-docx/src/ToCiceroMarkVisitor.js
@@ -83,6 +83,25 @@ class ToCiceroMarkVisitor {
}
}
+ /**
+ * Gets the node type based on the color property.
+ *
+ * @param {Array} properties the variable elements
+ * @returns {string} the type of the node
+ */
+ getNodeType(properties) {
+ let nodeType = TRANSFORMED_NODES.variable;
+ for (const property of properties) {
+ if (property.name === 'w15:color') {
+ // eg. "Shipper1 | org.accordproject.organization.Organization"
+ if (property.attributes['w:val'] === '99CCFF') {
+ nodeType = TRANSFORMED_NODES.clause;
+ }
+ }
+ }
+ return nodeType;
+ }
+
/**
* Checks if the node is a thematic break or not
*
@@ -202,9 +221,11 @@ class ToCiceroMarkVisitor {
/**
* Generates all nodes present in a block element( paragraph, heading ).
*
- * @param {object} rootNode Block node like paragraph, heading, etc.
+ * @param {object} rootNode Block node like paragraph, heading, etc.
+ * @param {boolean} returnConstructedNode return the constructed node if true else appends it to nodes array
+ * @returns {*} Node if returnConstructedNode else None
*/
- generateNodes(rootNode) {
+ generateNodes(rootNode, returnConstructedNode = false) {
if (this.JSONXML.length > 0) {
let constructedNode;
constructedNode = this.constructCiceroMarkNodeJSON(this.JSONXML[0]);
@@ -250,7 +271,11 @@ class ToCiceroMarkVisitor {
}
}
this.JSONXML = [];
- this.nodes = [...this.nodes, rootNode];
+ if (returnConstructedNode) {
+ return rootNode;
+ } else {
+ this.nodes = [...this.nodes, rootNode];
+ }
}
}
@@ -313,9 +338,12 @@ class ToCiceroMarkVisitor {
* Traverses the JSON object of XML elements in DFS approach.
*
* @param {object} node Node object to be traversed
- * @param {object} parent Parent node name
+ * @param {string} parent Parent node name
+ * @returns {*} GeneratedNode if parent is of type clause else none
*/
traverseElements(node, parent = '') {
+ // Contains node present in a codeblock or blockquote, etc.
+ let blockNodes = [];
for (const subNode of node) {
if (subNode.name === 'w:p') {
if (!subNode.elements) {
@@ -349,8 +377,12 @@ class ToCiceroMarkVisitor {
const thematicBreakNode = {
$class: TRANSFORMED_NODES.thematicBreak,
};
- this.nodes = [...this.nodes, thematicBreakNode];
- continue;
+ if (parent === TRANSFORMED_NODES.clause) {
+ blockNodes = [...blockNodes, thematicBreakNode];
+ } else {
+ this.nodes = [...this.nodes, thematicBreakNode];
+ continue;
+ }
}
this.traverseElements(subNode.elements);
@@ -361,13 +393,21 @@ class ToCiceroMarkVisitor {
level,
nodes: [],
};
- this.generateNodes(headingNode);
+ if (parent === TRANSFORMED_NODES.clause) {
+ blockNodes = [...blockNodes, this.generateNodes(headingNode, true)];
+ } else {
+ this.generateNodes(headingNode);
+ }
} else {
let paragraphNode = {
$class: TRANSFORMED_NODES.paragraph,
nodes: [],
};
- this.generateNodes(paragraphNode);
+ if (parent === TRANSFORMED_NODES.clause) {
+ blockNodes = [...blockNodes, this.generateNodes(paragraphNode, true)];
+ } else {
+ this.generateNodes(paragraphNode);
+ }
}
} else if (subNode.name === 'w:sdt') {
// denotes the whole template if parent is body
@@ -376,7 +416,6 @@ class ToCiceroMarkVisitor {
} else {
let nodeInformation = {
properties: [],
- value: '',
nodeType: TRANSFORMED_NODES.variable,
name: null,
elementType: null,
@@ -385,11 +424,23 @@ class ToCiceroMarkVisitor {
if (variableSubNodes.name === 'w:sdtPr') {
nodeInformation.name = this.getName(variableSubNodes.elements);
nodeInformation.elementType = this.getElementType(variableSubNodes.elements);
+ nodeInformation.nodeType = this.getNodeType(variableSubNodes.elements);
}
if (variableSubNodes.name === 'w:sdtContent') {
- for (const variableContentNodes of variableSubNodes.elements) {
- if (variableContentNodes.name === 'w:r') {
- this.fetchFormattingProperties(variableContentNodes, nodeInformation);
+ if (nodeInformation.nodeType === TRANSFORMED_NODES.clause) {
+ const nodes = this.traverseElements(variableSubNodes.elements, TRANSFORMED_NODES.clause);
+ const clauseNode = {
+ $class: TRANSFORMED_NODES.clause,
+ elementType: nodeInformation.elementType,
+ name: nodeInformation.name,
+ nodes,
+ };
+ this.nodes = [...this.nodes, clauseNode];
+ } else {
+ for (const variableContentNodes of variableSubNodes.elements) {
+ if (variableContentNodes.name === 'w:r') {
+ this.fetchFormattingProperties(variableContentNodes, nodeInformation);
+ }
}
}
}
@@ -400,6 +451,7 @@ class ToCiceroMarkVisitor {
this.fetchFormattingProperties(subNode, nodeInformation);
}
}
+ return blockNodes;
}
/**
diff --git a/packages/markdown-docx/src/ToOOXMLVisitor/helpers.js b/packages/markdown-docx/src/ToOOXMLVisitor/helpers.js
index 05ca8eec..ace57bd4 100644
--- a/packages/markdown-docx/src/ToOOXMLVisitor/helpers.js
+++ b/packages/markdown-docx/src/ToOOXMLVisitor/helpers.js
@@ -35,6 +35,26 @@ function titleGenerator(title, type) {
return `${title} | ${type}`;
}
+/**
+ * Wraps the OOXML in locked w:sdt tags to prevent content editing.
+ *
+ * @param {string} ooxml OOXML string to be wrapped
+ * @returns {string} OOXML wrapped in locked content controls
+ */
+function wrapAroundLockedContentControls(ooxml) {
+ return `
+
+
+
+
+
+
+ ${ooxml}
+
+
+ `;
+}
+
/**
* Wraps OOXML in docx headers.
*
@@ -42,7 +62,6 @@ function titleGenerator(title, type) {
* @returns {string} OOXML wraped in docx headers
*/
function wrapAroundDefaultDocxTags(ooxml) {
-
const HEADING_STYLE_SPEC = `
@@ -264,4 +283,4 @@ function wrapAroundDefaultDocxTags(ooxml) {
return ooxml;
}
-module.exports = { sanitizeHtmlChars, titleGenerator, wrapAroundDefaultDocxTags };
+module.exports = { sanitizeHtmlChars, titleGenerator, wrapAroundDefaultDocxTags, wrapAroundLockedContentControls };
diff --git a/packages/markdown-docx/src/ToOOXMLVisitor/index.js b/packages/markdown-docx/src/ToOOXMLVisitor/index.js
index 1f4d80d7..fbdd2b6c 100644
--- a/packages/markdown-docx/src/ToOOXMLVisitor/index.js
+++ b/packages/markdown-docx/src/ToOOXMLVisitor/index.js
@@ -28,8 +28,9 @@ const {
THEMATICBREAK_RULE,
CODEBLOCK_PROPERTIES_RULE,
CODEBLOCK_FONTPROPERTIES_RULE,
+ CLAUSE_RULE,
} = require('./rules');
-const { wrapAroundDefaultDocxTags } = require('./helpers');
+const { wrapAroundDefaultDocxTags, wrapAroundLockedContentControls } = require('./helpers');
const { TRANSFORMED_NODES } = require('../constants');
/**
@@ -140,6 +141,60 @@ class ToOOXMLVisitor {
this.tags = [...this.tags, SOFTBREAK_RULE()];
} else if (this.getClass(subNode) === TRANSFORMED_NODES.thematicBreak) {
this.globalOOXML += THEMATICBREAK_RULE();
+ } else if (this.getClass(subNode) === TRANSFORMED_NODES.clause) {
+ let clauseOOXML = '';
+ if (subNode.nodes) {
+ for (const deepNode of subNode.nodes) {
+ if (this.getClass(deepNode) === TRANSFORMED_NODES.paragraph) {
+ this.traverseNodes(deepNode.nodes, properties);
+ let ooxml = '';
+ for (let xmlTag of this.tags) {
+ ooxml += xmlTag;
+ }
+ ooxml = PARAGRAPH_RULE(ooxml);
+ clauseOOXML += ooxml;
+
+ // Clear all the tags as all nodes of paragraph have been traversed.
+ this.tags = [];
+ } else if (this.getClass(deepNode) === TRANSFORMED_NODES.heading) {
+ this.traverseNodes(deepNode.nodes, properties);
+ let ooxml = '';
+ for (let xmlTag of this.tags) {
+ let headingPropertiesTag = '';
+ headingPropertiesTag = HEADING_PROPERTIES_RULE(deepNode.level);
+ ooxml += headingPropertiesTag;
+ ooxml += xmlTag;
+ }
+
+ // in DOCX heading is a paragraph with some styling tags present
+ ooxml = PARAGRAPH_RULE(ooxml);
+ clauseOOXML += ooxml;
+
+ this.tags = [];
+ } else {
+ let newProperties = [...properties, deepNode.$class];
+ this.traverseNodes(deepNode.nodes, newProperties);
+ }
+ }
+ const tag = subNode.name;
+ const type = subNode.elementType;
+ if (Object.prototype.hasOwnProperty.call(this.counter, tag)) {
+ this.counter = {
+ ...this.counter,
+ [tag]: {
+ ...this.counter[tag],
+ count: ++this.counter[tag].count,
+ },
+ };
+ } else {
+ this.counter[tag] = {
+ count: 1,
+ type,
+ };
+ }
+ const title = `${tag.toUpperCase()[0]}${tag.substring(1)}${this.counter[tag].count}`;
+ this.globalOOXML += CLAUSE_RULE(title, tag, type, clauseOOXML);
+ }
} else {
if (subNode.nodes) {
if (this.getClass(subNode) === TRANSFORMED_NODES.paragraph) {
@@ -186,6 +241,7 @@ class ToOOXMLVisitor {
*/
toOOXML(ciceromark) {
this.traverseNodes(ciceromark, []);
+ this.globalOOXML = wrapAroundLockedContentControls(this.globalOOXML);
this.globalOOXML = wrapAroundDefaultDocxTags(this.globalOOXML);
return this.globalOOXML;
diff --git a/packages/markdown-docx/src/ToOOXMLVisitor/rules.js b/packages/markdown-docx/src/ToOOXMLVisitor/rules.js
index 4f4ccd10..49ae6fae 100644
--- a/packages/markdown-docx/src/ToOOXMLVisitor/rules.js
+++ b/packages/markdown-docx/src/ToOOXMLVisitor/rules.js
@@ -204,6 +204,31 @@ const THEMATICBREAK_RULE = () => {
`;
};
+/**
+ * Inserts a clause object in OOXML syntax
+ *
+ * @param {string} title Title of the clause
+ * @param {string} tag Tag of the clause
+ * @param {string} type Type of the clause
+ * @param {string} content Content of the clause
+ * @returns {string} OOXML for the clause
+ */
+const CLAUSE_RULE = (title, tag, type, content) => {
+ return `
+
+
+
+
+
+
+
+
+ ${content}
+
+
+ `;
+};
+
module.exports = {
TEXT_RULE,
EMPHASIS_RULE,
@@ -218,4 +243,5 @@ module.exports = {
CODEBLOCK_PROPERTIES_RULE,
CODEBLOCK_FONTPROPERTIES_RULE,
THEMATICBREAK_RULE,
+ CLAUSE_RULE,
};
diff --git a/packages/markdown-docx/src/constants.js b/packages/markdown-docx/src/constants.js
index 035bed7e..3853561a 100644
--- a/packages/markdown-docx/src/constants.js
+++ b/packages/markdown-docx/src/constants.js
@@ -31,6 +31,7 @@ const TRANSFORMED_NODES = {
text: `${NS_PREFIX_CommonMarkModel}Text`,
thematicBreak: `${NS_PREFIX_CommonMarkModel}ThematicBreak`,
variable: `${NS_PREFIX_CiceroMarkModel}Variable`,
+ clause:`${NS_PREFIX_CiceroMarkModel}Clause`
};
module.exports = { TRANSFORMED_NODES };
diff --git a/packages/markdown-docx/test/data/ciceroMark/clause.json b/packages/markdown-docx/test/data/ciceroMark/clause.json
new file mode 100644
index 00000000..b8247545
--- /dev/null
+++ b/packages/markdown-docx/test/data/ciceroMark/clause.json
@@ -0,0 +1 @@
+{"$class":"org.accordproject.commonmark.Document","xmlns":"http://commonmark.org/xml/1.0","nodes":[{"$class":"org.accordproject.commonmark.Heading","level":"1","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Heading"}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"And below is a "},{"$class":"org.accordproject.commonmark.Strong","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"clause"}]},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.ciceromark.Clause","name":"deliveryClause","elementType":"org.accordproject.acceptanceofdelivery.AcceptanceOfDeliveryClause","nodes":[{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Acceptance of Delivery."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" will be deemed to have completed its delivery obligations"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"if in "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":"'s opinion, the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":" satisfies the"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"Acceptance Criteria, and "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" notifies "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" in writing"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"that it is accepting the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Inspection and Notice."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" will have "},{"$class":"org.accordproject.ciceromark.Variable","value":"10","name":"businessDays","elementType":"Long"},{"$class":"org.accordproject.commonmark.Text","text":" Business Days to inspect and"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"evaluate the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":" on the delivery date before notifying"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" that it is either accepting or rejecting the"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Acceptance Criteria."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"The \"Acceptance Criteria\" are the specifications the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"must meet for the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" to comply with its requirements and"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"obligations under this agreement, detailed in "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Attachment X\"","name":"attachment","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":", attached"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"to this agreement."}]}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"More text"}]}]}
\ No newline at end of file
diff --git a/packages/markdown-docx/test/data/ciceroMark/multi-clause.json b/packages/markdown-docx/test/data/ciceroMark/multi-clause.json
new file mode 100644
index 00000000..f859853f
--- /dev/null
+++ b/packages/markdown-docx/test/data/ciceroMark/multi-clause.json
@@ -0,0 +1 @@
+{"$class":"org.accordproject.commonmark.Document","xmlns":"http://commonmark.org/xml/1.0","nodes":[{"$class":"org.accordproject.commonmark.Heading","level":"1","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Heading"}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"And below is a "},{"$class":"org.accordproject.commonmark.Strong","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"clause"}]},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.ciceromark.Clause","name":"deliveryClause","elementType":"org.accordproject.acceptanceofdelivery.AcceptanceOfDeliveryClause","nodes":[{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Acceptance of Delivery."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" will be deemed to have completed its delivery obligations"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"if in "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":"'s opinion, the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":" satisfies the"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"Acceptance Criteria, and "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" notifies "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" in writing"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"that it is accepting the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Inspection and Notice."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party B\"","name":"receiver","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" will have "},{"$class":"org.accordproject.ciceromark.Variable","value":"10","name":"businessDays","elementType":"Long"},{"$class":"org.accordproject.commonmark.Text","text":" Business Days to inspect and"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"evaluate the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":" on the delivery date before notifying"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" that it is either accepting or rejecting the"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":"."}]},{"$class":"org.accordproject.commonmark.Heading","level":"2","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Acceptance Criteria."}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"The \"Acceptance Criteria\" are the specifications the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Widgets\"","name":"deliverable","elementType":"String"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"must meet for the "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Party A\"","name":"shipper","elementType":"org.accordproject.organization.Organization"},{"$class":"org.accordproject.commonmark.Text","text":" to comply with its requirements and"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"obligations under this agreement, detailed in "},{"$class":"org.accordproject.ciceromark.Variable","value":"\"Attachment X\"","name":"attachment","elementType":"String"},{"$class":"org.accordproject.commonmark.Text","text":", attached"},{"$class":"org.accordproject.commonmark.Softbreak"},{"$class":"org.accordproject.commonmark.Text","text":"to this agreement."}]}]},{"$class":"org.accordproject.ciceromark.Clause","name":"anotherClause","elementType":"org.accordproject.copyrightlicense.PaymentClause","nodes":[{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"This is a "},{"$class":"org.accordproject.commonmark.Strong","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"Second"}]},{"$class":"org.accordproject.commonmark.Text","text":" clause. Just for testing if it is possible for multiple "},{"$class":"org.accordproject.commonmark.Emph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"clauses"}]},{"$class":"org.accordproject.commonmark.Text","text":" to exist."}]}]},{"$class":"org.accordproject.commonmark.Paragraph","nodes":[{"$class":"org.accordproject.commonmark.Text","text":"More text"}]}]}
\ No newline at end of file
diff --git a/packages/markdown-transform/test/data/acceptance/omitted-acceptance-of-delivery.xml b/packages/markdown-transform/test/data/acceptance/omitted-acceptance-of-delivery.xml
index 43be0550..9708a0ed 100644
--- a/packages/markdown-transform/test/data/acceptance/omitted-acceptance-of-delivery.xml
+++ b/packages/markdown-transform/test/data/acceptance/omitted-acceptance-of-delivery.xml
@@ -42,6 +42,13 @@
xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se w16cid wp14">
+
+
+
+
+
+
+
@@ -510,6 +517,9 @@
+
+
+