From 9a59b9c968c2cbd676e0ccc19aad31b1b70111a1 Mon Sep 17 00:00:00 2001 From: "Kyle E. Mitchell" Date: Tue, 16 Jan 2018 18:04:25 -0800 Subject: [PATCH] Optionally resolve references to nearest headings --- README.md | 2 ++ index.js | 15 +++++++++++++-- templates/document.js | 21 ++++++++++++++++++--- templates/paragraph.js | 16 ++++++++++++++-- templates/run.js | 6 +++++- test.js | 34 ++++++++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index f3dcd37..10b0ffc 100644 --- a/README.md +++ b/README.md @@ -20,4 +20,6 @@ It may contain: 4. A `markFilled` property whose value is `true` or `false` +5. A `nearestHeadings` property whose value is `true` or `false` + The function returns a [JSZip](https://npmjs.com/packages/jszip) Object primed with `.docx` document data. diff --git a/index.js b/index.js index 816ee69..0f0bfd9 100644 --- a/index.js +++ b/index.js @@ -30,10 +30,21 @@ module.exports = function (form, values, options) { ? {text: options.blanks} : options.blanks var markFilled = !!options.markFilled + var nearestHeadings = !!options.nearestHeadings var scaffold = require('./data/scaffold.json') scaffold.word['document.xml'] = doc( - form, values, title, edition, hash, - centerTitle, numberStyle, indentMargins, after, blanks, markFilled + form, + values, + title, + edition, + hash, + centerTitle, + numberStyle, + indentMargins, + after, + blanks, + markFilled, + nearestHeadings ) var zip = new JSZip() zipObject(zip, scaffold) diff --git a/templates/document.js b/templates/document.js index 820632f..0a487ad 100644 --- a/templates/document.js +++ b/templates/document.js @@ -36,13 +36,28 @@ var SECTION = ( ) module.exports = function ( - form, values, title, edition, hash, - centerTitle, numberStyle, indentMargins, after, blanks, markFilled + form, + values, + title, + edition, + hash, + centerTitle, + numberStyle, + indentMargins, + after, + blanks, + markFilled, + nearestHeadings ) { var paragraphs = flatten(form, values) .map(function (element) { return paragraph( - element, numberStyle, indentMargins, blanks, markFilled + element, + numberStyle, + indentMargins, + blanks, + markFilled, + nearestHeadings ) }) .join('') diff --git a/templates/paragraph.js b/templates/paragraph.js index a293ccb..f076325 100644 --- a/templates/paragraph.js +++ b/templates/paragraph.js @@ -39,7 +39,12 @@ var properties = function (o, number, indentMargins) { var TAB = '' module.exports = function ( - element, numberStyle, indentMargins, blanks, markFilled + element, + numberStyle, + indentMargins, + blanks, + markFilled, + nearestHeadings ) { if (!element.hasOwnProperty('alignment')) { element.alignment = 'justify' @@ -69,6 +74,13 @@ module.exports = function ( .join('') ) function makeRun (element, conspicuous) { - return run(element, numberStyle, conspicuous, blanks, markFilled) + return run( + element, + numberStyle, + conspicuous, + blanks, + markFilled, + nearestHeadings + ) } } diff --git a/templates/run.js b/templates/run.js index 133dfec..ac6e68c 100644 --- a/templates/run.js +++ b/templates/run.js @@ -52,7 +52,7 @@ var runText = function (text) { } module.exports = function run ( - element, numberStyle, conspicuous, blanks, markFilled + element, numberStyle, conspicuous, blanks, markFilled, nearestHeadings ) { var properties = merge(true, defaults) if (conspicuous === true) { @@ -95,6 +95,10 @@ module.exports = function run ( text = element.use } else if (element.hasOwnProperty('heading')) { var numbering = element.numbering + if (nearestHeadings && element.hasOwnProperty('nearest')) { + numbering = element.nearest + delete element.ambiguous + } var heading = element.heading if ( element.hasOwnProperty('broken') || diff --git a/test.js b/test.js index a4e4eeb..467f3b3 100644 --- a/test.js +++ b/test.js @@ -85,6 +85,40 @@ tape('renders broken references', function (test) { }) }) +tape('renders nearest references', function (test) { + var form = { + content: [ + { + heading: 'A', + form: {content: ['some text']} + }, + { + form: { + content: [ + { + heading: 'A', + form: {content: ['some text']} + }, + {reference: 'A'} + ] + } + } + ] + } + var options = { + nearestHeadings: true, + numbering: decimal + } + textOf(render(form, [], options), function (error, text) { + test.ifError(error, 'no error') + test.assert( + text.indexOf('(A)') > -1, + 'reference appears in output' + ) + test.end() + }) +}) + tape('fills blanks', function (test) { textOf( render(