-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
Bug Report
Description of the problem
When using doc.list() to print list items, the process fails if one list item contains a line break (newline or return carriage characters both affected).
This is due to the internal flatten() of the text mixin calculates the amount of levels based on the number of list items given here:
Lines 124 to 142 in 6338314
| var flatten = function(list) { | |
| let n = 1; | |
| for (let i = 0; i < list.length; i++) { | |
| const item = list[i]; | |
| if (Array.isArray(item)) { | |
| level++; | |
| flatten(item); | |
| level--; | |
| } else { | |
| items.push(item); | |
| levels.push(level); | |
| if (listType !== 'bullet') { | |
| numbers.push(n++); | |
| } | |
| } | |
| } | |
| }; | |
| flatten(list); |
But the firstLine event is emitted per actual line, causing the event handler to access an undefined level item here:
https://github.com/foliojs/pdfkit/blob/6338314daf44f7f188e4cc6cb4d70fc2f2698fca/lib/mixins/text.js#L179-182
Which then results in diff being NaN and the consecutive variables this.x and wrapper.lineWidth as well.
From my knowledge of the library, I can't tell whether flatten() should produce the levels based on the actual lines or the firstLine event should only be emitted once per list item.
Code sample
With any PDFKit document, call
doc.list(['Foo\nBar']);Your environment
- pdfkit version: 0.14.0
- Node version: 20.10.0
- Browser version (if applicable): -
- Operating System: macOS 14.1.2