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 @@ + + +