From 4599091d570fff7364ed84058c9d61c10a48c8e7 Mon Sep 17 00:00:00 2001 From: Sean Engelhardt Date: Tue, 19 Nov 2019 16:11:33 +0100 Subject: [PATCH] Add nested PDF lists with line numbering Adds support for nested PDF lists in motions with line numbering Numbers and lines can be slightly of in extrem cases. Lists are supposed to be relatively short lists and are not(!) a replacement for paragraphs. Chaning that would require me to create our own implementation of PDFMake-Lists --- .../core/pdf-services/html-to-pdf.service.ts | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) 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 4777121db..7a5173a85 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 @@ -129,7 +129,7 @@ export class HtmlToPdfService { return this.P_MARGIN_BOTTOM; } case 'li': { - return this.LI_MARGIN_BOTTOM; + return this.P_MARGIN_BOTTOM; } default: { return this.P_MARGIN_BOTTOM; @@ -234,12 +234,7 @@ export class HtmlToPdfService { case 'div': { const children = this.parseChildren(element, styles); - // this introduces a bug with rendering sub-lists in PDF - if ( - this.lineNumberingMode === LineNumberingMode.Outside && - !this.isInsideAList(element) && - !classes.includes('insert') - ) { + if (this.lineNumberingMode === LineNumberingMode.Outside && !classes.includes('insert')) { newParagraph = this.create('stack'); newParagraph.stack = children; } else { @@ -268,7 +263,7 @@ export class HtmlToPdfService { } // if the list ends (usually due to a new insert cr) prevent margins - if (classes.includes('os-split-after')) { + if (classes.includes('os-split-after') || this.withSublist(element)) { newParagraph.margin[3] = 0; } @@ -324,7 +319,10 @@ export class HtmlToPdfService { break; } case 'br': { - if (this.lineNumberingMode === LineNumberingMode.None && classes.includes('os-line-break')) { + if ( + (this.lineNumberingMode === LineNumberingMode.None && classes.includes('os-line-break')) || + (this.lineNumberingMode === LineNumberingMode.Outside && this.isInsideAList(element)) + ) { break; } else { newParagraph = this.create('text'); @@ -347,7 +345,7 @@ export class HtmlToPdfService { } // in case of line numbers and only of the list is not nested in another list. - if (this.lineNumberingMode === LineNumberingMode.Outside && !this.isInsideAList(element)) { + if (this.lineNumberingMode === LineNumberingMode.Outside) { const lines = this.extractLineNumbers(element); const cleanedChildDom = this.cleanLineNumbers(element); @@ -474,6 +472,17 @@ export class HtmlToPdfService { }; } + /** + * Checks if a given LI has a sublist + */ + private withSublist(element: Element): boolean { + if (element.nodeName.toLowerCase() === 'li') { + const hasUl = Array.from(element.children).some(child => child.nodeName.toLowerCase() === 'ul'); + return hasUl; + } + return false; + } + /** * Cleans the elements children from line-number spans * @@ -534,6 +543,8 @@ export class HtmlToPdfService { // If this is an list item, add some space to the lineNumbers: if (childrenLineNumbers.length && element.nodeName === 'LI') { childrenLineNumbers[childrenLineNumbers.length - 1].marginBottom = this.LI_MARGIN_BOTTOM; + } else if (childrenLineNumbers.length && element.parentNode.nodeName === 'LI') { + childrenLineNumbers[childrenLineNumbers.length - 1].marginBottom = this.P_MARGIN_BOTTOM; } foundLineNumbers = foundLineNumbers.concat(childrenLineNumbers);