From c7a2e1e986ee2dcb643723a88325e978d6cbe6af Mon Sep 17 00:00:00 2001 From: jellenberger Date: Fri, 11 May 2018 14:41:03 -0500 Subject: [PATCH 1/2] Allow recursive custom formatters * Resolves https://github.com/werk85/node-html-to-text/issues/147 * When format functions are called internally within formatter.js it is not possible to override the custom logic. This changes that functionality and allows users to choose whether they want the default formatter to be used internally or their own formatters supplied in the options object. --- lib/formatter.js | 8 ++++---- test/html-to-text.js | 17 +++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/formatter.js b/lib/formatter.js index ef2e82d..94a18b7 100644 --- a/lib/formatter.js +++ b/lib/formatter.js @@ -98,7 +98,7 @@ function formatAnchor(elem, fn, options) { options.lineCharCount = storedCharCount; - return formatText({ data: result || href, trimLeadingSpace: elem.trimLeadingSpace }, options); + return Object.assign({}, exports, options.format).text({ data: result || href, trimLeadingSpace: elem.trimLeadingSpace }, options); } function formatHorizontalLine(elem, fn, options) { @@ -128,7 +128,7 @@ function formatUnorderedList(elem, fn, options) { return child.type !== 'text' || !whiteSpaceRegex.test(child.data); }); nonWhiteSpaceChildren.forEach(function(elem) { - result += formatListItem(prefix, elem, fn, options); + result += Object.assign({}, exports, options.format).listItem(prefix, elem, fn, options); }); return result + '\n'; } @@ -163,7 +163,7 @@ function formatOrderedList(elem, fn, options) { // Calculate the needed spacing for nice indentation. var spacing = maxLength - index.toString().length; var prefix = ' ' + index + '. ' + ' '.repeat(spacing); - result += formatListItem(prefix, elem, fn, options); + result += Object.assign({}, exports, options.format).listItem(prefix, elem, fn, options); }); } return result + '\n'; @@ -220,7 +220,7 @@ function formatTable(elem, fn, options) { if (elem.type === 'tag') { switch (elem.name.toLowerCase()) { case 'th': - tokens = formatHeading(elem, fn, options).split('\n'); + tokens = Object.assign({}, exports, options.format).heading(elem, fn, options).split('\n'); rows.push(compact(tokens)); break; diff --git a/test/html-to-text.js b/test/html-to-text.js index af7f7aa..62c631e 100644 --- a/test/html-to-text.js +++ b/test/html-to-text.js @@ -377,6 +377,23 @@ describe('html-to-text', function() { }); expect(result).to.equal('====\ntest\n===='); }); + + it('should use custom formatting functions when nested elements are being parsed', function () { + var result = htmlToText.fromString('', { + format: { + listItem: function (prefix, elem, fn, options) { + options = Object.assign({}, options); + if (options.wordwrap) { + options.wordwrap -= prefix.length; + } + var text = fn(elem.children, options); + text = text.replace(/\n/g, '\n' + ' '.repeat(prefix.length)); + return prefix + text.toUpperCase() + '\n'; + } + } + }); + expect(result).to.equal(' * ONE\n * TWO'); + }); }); describe('Base element', function () { From 58df506267484d3a058b071a66a5a3c476b9f2a8 Mon Sep 17 00:00:00 2001 From: jellenberger Date: Fri, 11 May 2018 15:09:34 -0500 Subject: [PATCH 2/2] fixup - reduce line length --- lib/formatter.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/formatter.js b/lib/formatter.js index 94a18b7..f60efdc 100644 --- a/lib/formatter.js +++ b/lib/formatter.js @@ -98,7 +98,10 @@ function formatAnchor(elem, fn, options) { options.lineCharCount = storedCharCount; - return Object.assign({}, exports, options.format).text({ data: result || href, trimLeadingSpace: elem.trimLeadingSpace }, options); + return Object.assign({}, exports, options.format).text({ + data: result || href, + trimLeadingSpace: elem.trimLeadingSpace + }, options); } function formatHorizontalLine(elem, fn, options) {