diff --git a/client/src/app/core/pdf-services/html-to-pdf.service.ts b/client/src/app/core/pdf-services/html-to-pdf.service.ts index 12ef46a65..e62542228 100644 --- a/client/src/app/core/pdf-services/html-to-pdf.service.ts +++ b/client/src/app/core/pdf-services/html-to-pdf.service.ts @@ -32,11 +32,6 @@ export class HtmlToPdfService { */ private lineNumberingMode: LineNumberingMode; - /** - * Space between list elements - */ - private LI_MARGIN_BOTTOM = 8; - /** * Normal line height for paragraphs */ @@ -192,6 +187,8 @@ export class HtmlToPdfService { */ public parseElement(element: Element, styles?: string[]): any { const nodeName = element.nodeName.toLowerCase(); + const childNodes = Array.from(element.childNodes) as Element[]; + const directChildIsCrNode = childNodes.some(child => this.isCrElement(child)); let classes = []; let newParagraph: any; @@ -237,7 +234,12 @@ export class HtmlToPdfService { case 'div': { const children = this.parseChildren(element, styles); - if (this.lineNumberingMode === LineNumberingMode.Outside && !classes.includes('insert')) { + if ( + this.lineNumberingMode === LineNumberingMode.Outside && + !classes.includes('insert') && + !(nodeName === 'li' && directChildIsCrNode) + ) { + // newParagraph = this.create('stack'); newParagraph.stack = children; } else { @@ -367,7 +369,7 @@ export class HtmlToPdfService { // if this is a "fake list" lower put it close to the element above if (this.isFakeList(element)) { - listCol.margin[3] = -this.LI_MARGIN_BOTTOM; + listCol.margin[3] = -this.P_MARGIN_BOTTOM; } for (const line of lines) { @@ -501,7 +503,7 @@ export class HtmlToPdfService { children[i].remove(); } - if (children[i].childNodes.length > 0) { + if (children[i]?.childNodes.length > 0) { const cleanChildren = this.cleanLineNumbers(children[i] as Element); elementCopy.replaceChild(cleanChildren, children[i]); } @@ -689,6 +691,16 @@ export class HtmlToPdfService { return styleObject; } + /** + * Detect if the given element is a cr exclusive node + * @param child + */ + private isCrElement(element: Element): boolean { + const nodeName = element.nodeName.toLowerCase(); + const crNodeNames = ['ins', 'del']; + return crNodeNames.includes(nodeName); + } + /** * Returns the color in a hex format (e.g. #12ff00). * Also tries to convert RGB colors into hex values