Skip to content

Commit b5d0ea1

Browse files
jordonbiondoMalte Legenhausen
authored andcommitted
customizable ul li item prefix (html-to-text#140)
1 parent 1dbebe1 commit b5d0ea1

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

lib/formatter.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,12 @@ var whiteSpaceRegex = /^\s*$/;
118118

119119
function formatUnorderedList(elem, fn, options) {
120120
var result = '';
121+
var prefix = options.unorderedListItemPrefix;
121122
var nonWhiteSpaceChildren = (elem.children || []).filter(function(child) {
122123
return child.type !== 'text' || !whiteSpaceRegex.test(child.data);
123124
});
124125
_.each(nonWhiteSpaceChildren, function(elem) {
125-
result += formatListItem(' * ', elem, fn, options);
126+
result += formatListItem(prefix, elem, fn, options);
126127
});
127128
return result + '\n';
128129
}

lib/html-to-text.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ function htmlToText(html, options) {
3636
longWordSplit: {
3737
wrapCharacters: [],
3838
forceWrapOnLimit: false
39-
}
39+
},
40+
unorderedListItemPrefix: ' * '
4041
});
4142

4243
var handler = new htmlparser.DefaultHandler(function (error, dom) {
@@ -53,7 +54,7 @@ function htmlToText(html, options) {
5354
for (var idx = 0; idx < baseElements.length; ++idx) {
5455
result += walk(filterBody(handler.dom, options, baseElements[idx]), options);
5556
}
56-
return _s.strip(result);
57+
return _s.rtrim(result);
5758
}
5859

5960
function filterBody(dom, options, baseElement) {

test/html-to-text.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,13 @@ describe('html-to-text', function() {
231231

232232
it('should handle an unordered list with multiple elements', function() {
233233
var testString = '<ul><li>foo</li><li>bar</li></ul>';
234-
expect(htmlToText.fromString(testString)).to.equal('* foo\n * bar');
234+
expect(htmlToText.fromString(testString)).to.equal(' * foo\n * bar');
235+
});
236+
237+
it('should handle an unordered list prefix option', function() {
238+
var testString = '<ul><li>foo</li><li>bar</li></ul>';
239+
var options = {unorderedListItemPrefix: ' test '};
240+
expect(htmlToText.fromString(testString, options)).to.equal(' test foo\n test bar');
235241
});
236242
});
237243

@@ -243,46 +249,46 @@ describe('html-to-text', function() {
243249

244250
it('should handle an ordered list with multiple elements', function() {
245251
var testString = '<ol><li>foo</li><li>bar</li></ol>';
246-
expect(htmlToText.fromString(testString)).to.equal('1. foo\n 2. bar');
252+
expect(htmlToText.fromString(testString)).to.equal(' 1. foo\n 2. bar');
247253
});
248254

249255
it('should support the ordered list type="1" attribute', function() {
250256
var testString = '<ol type="1"><li>foo</li><li>bar</li></ol>';
251-
expect(htmlToText.fromString(testString)).to.equal('1. foo\n 2. bar');
257+
expect(htmlToText.fromString(testString)).to.equal(' 1. foo\n 2. bar');
252258
});
253259

254260
it('should fallback to type="!" behavior if type attribute is invalid', function() {
255261
var testString = '<ol type="1"><li>foo</li><li>bar</li></ol>';
256-
expect(htmlToText.fromString(testString)).to.equal('1. foo\n 2. bar');
262+
expect(htmlToText.fromString(testString)).to.equal(' 1. foo\n 2. bar');
257263
});
258264

259265
it('should support the ordered list type="a" attribute', function() {
260266
var testString = '<ol type="a"><li>foo</li><li>bar</li></ol>';
261-
expect(htmlToText.fromString(testString)).to.equal('a. foo\n b. bar');
267+
expect(htmlToText.fromString(testString)).to.equal(' a. foo\n b. bar');
262268
});
263269

264270
it('should support the ordered list type="A" attribute', function() {
265271
var testString = '<ol type="A"><li>foo</li><li>bar</li></ol>';
266-
expect(htmlToText.fromString(testString)).to.equal('A. foo\n B. bar');
272+
expect(htmlToText.fromString(testString)).to.equal(' A. foo\n B. bar');
267273
});
268274

269275
it('should support the ordered list type="i" attribute by falling back to type="1"', function() {
270276
var testString = '<ol type="i"><li>foo</li><li>bar</li></ol>';
271277
// TODO Implement lowercase roman numerals
272278
// expect(htmlToText.fromString(testString)).to.equal('i. foo\nii. bar');
273-
expect(htmlToText.fromString(testString)).to.equal('1. foo\n 2. bar');
279+
expect(htmlToText.fromString(testString)).to.equal(' 1. foo\n 2. bar');
274280
});
275281

276282
it('should support the ordered list type="I" attribute by falling back to type="1"', function() {
277283
var testString = '<ol type="I"><li>foo</li><li>bar</li></ol>';
278284
// TODO Implement uppercase roman numerals
279285
// expect(htmlToText.fromString(testString)).to.equal('I. foo\nII. bar');
280-
expect(htmlToText.fromString(testString)).to.equal('1. foo\n 2. bar');
286+
expect(htmlToText.fromString(testString)).to.equal(' 1. foo\n 2. bar');
281287
});
282288

283289
it('should support the ordered list start attribute', function() {
284290
var testString = '<ol start="2"><li>foo</li><li>bar</li></ol>';
285-
expect(htmlToText.fromString(testString)).to.equal('2. foo\n 3. bar');
291+
expect(htmlToText.fromString(testString)).to.equal(' 2. foo\n 3. bar');
286292
});
287293

288294
/*

0 commit comments

Comments
 (0)