Skip to content

Commit 76d562e

Browse files
committed
fix: render empty list entries (#2893)
1 parent df298c4 commit 76d562e

5 files changed

Lines changed: 52 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## Unreleased
44

55
- Update Roboto font (version 3.014)
6+
- Fixed render empty list entries
67

78
## 0.2.20 - 2025-05-09
89

examples/lists.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,23 @@ var docDefinition = {
395395
{ text: 'item 3', listType: 'circle' }
396396
]
397397
},
398+
{ text: '\n\nOrdered list with an empty item:', style: 'header' },
399+
{
400+
ol: [
401+
'First item',
402+
'Second item',
403+
'',
404+
'Fourth item'
405+
]
406+
},
407+
{ text: '\n\nUnordered list with an empty item:', style: 'header' },
408+
{
409+
ul: [
410+
'First bullet',
411+
'',
412+
'Third bullet'
413+
]
414+
},
398415
],
399416
styles: {
400417
header: {

src/layoutBuilder.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,17 @@ LayoutBuilder.prototype.layoutDocument = function (docStructure, fontProvider, s
6666
return false;
6767
}
6868

69-
linearNodeList = linearNodeList.filter(function (node) {
70-
return node.positions.length > 0;
71-
});
69+
const hasRenderableContent = node => {
70+
if (!node || node.positions.length === 0) {
71+
return false;
72+
}
73+
if (node.text === '' && !node.listMarker) {
74+
return false;
75+
}
76+
return true;
77+
};
78+
79+
linearNodeList = linearNodeList.filter(hasRenderableContent);
7280

7381
linearNodeList.forEach(function (node) {
7482
var nodeInfo = {};

src/textTools.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,13 +120,25 @@ TextTools.prototype.widthOfString = function (text, font, fontSize, characterSpa
120120

121121
function splitWords(text, noWrap) {
122122
var results = [];
123+
124+
if (text === undefined || text === null) {
125+
text = '';
126+
} else {
127+
text = String(text);
128+
}
129+
123130
text = text.replace(/\t/g, ' ');
124131

125132
if (noWrap) {
126133
results.push({ text: text });
127134
return results;
128135
}
129136

137+
if (text.length === 0) {
138+
results.push({ text: '' });
139+
return results;
140+
}
141+
130142
var breaker = new LineBreaker(text);
131143
var last = 0;
132144
var bk;

tests/textTools.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -241,13 +241,17 @@ describe('TextTools', function () {
241241
it('should support cast to text', function () {
242242
var node = docPreprocessor.preprocessNode(mixedTextArrayWithVariousTypes);
243243
var result = TextTools.__get__('normalizeTextArray')(node.stack, styleStack);
244-
assert.equal(result.length, 6);
245-
assert.equal(result[0].text, '2016');
246-
assert.equal(result[1].text, 'true');
247-
assert.equal(result[2].text, 'false');
248-
assert.equal(result[3].text, '2016');
249-
assert.equal(result[4].text, 'true');
250-
assert.equal(result[5].text, 'false');
244+
assert.equal(result.length, 10);
245+
assert.equal(result[0].text, '');
246+
assert.equal(result[1].text, '');
247+
assert.equal(result[2].text, '2016');
248+
assert.equal(result[3].text, 'true');
249+
assert.equal(result[4].text, 'false');
250+
assert.equal(result[5].text, '');
251+
assert.equal(result[6].text, '');
252+
assert.equal(result[7].text, '2016');
253+
assert.equal(result[8].text, 'true');
254+
assert.equal(result[9].text, 'false');
251255
});
252256

253257
it('should support keep noWrap from style', function () {

0 commit comments

Comments
 (0)