From b4e617af3d447f7addd2901d9abaaceb1f9b1d9a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 11 Jun 2014 14:48:39 +0100 Subject: Add uniquifier to footnote IDs --- lib/document-to-html.js | 13 +++++++++++-- tests/document-to-html.tests.js | 14 +++++++++----- tests/mammoth.tests.js | 11 +++++++---- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/document-to-html.js b/lib/document-to-html.js index bec48b0..d7b6a86 100644 --- a/lib/document-to-html.js +++ b/lib/document-to-html.js @@ -31,6 +31,11 @@ function DocumentConversion(options) { var footnoteIds = []; options = options || {}; + var generateUniquifier = options.generateUniquifier || function() { + return Math.floor(Math.random() * 1000000000000000); + }; + var uniquifier = generateUniquifier(); + var defaultParagraphStyle = htmlPaths.topLevelElement("p"); var styleMap = options.styleMap || []; @@ -128,6 +133,10 @@ function DocumentConversion(options) { }).fail(callback); } + function footnoteUid(id) { + return uniquifier + "-" + id; + } + var elementConverters = { "document": function(document, html, messages, callback) { convertElements(document.children, html, messages, function(error) { @@ -173,7 +182,7 @@ function DocumentConversion(options) { }, "footnoteReference": function(element, html, messages, callback) { html.open(htmlPaths.element("sup")); - html.open(htmlPaths.element("a", {href: "#footnote-" + element.footnoteId})); + html.open(htmlPaths.element("a", {href: "#footnote-" + footnoteUid(element.footnoteId)})); footnoteIds.push(element.footnoteId); html.text("[" + (footnoteNumber++) + "]"); html.close(); @@ -181,7 +190,7 @@ function DocumentConversion(options) { callback(); }, "footnote": function(element, html, messages, callback) { - html.open(htmlPaths.element("li", {id: "footnote-" + element.id})); + html.open(htmlPaths.element("li", {id: "footnote-" + footnoteUid(element.id)})); var footnoteHtml = new HtmlGenerator(); convertElements(element.body, footnoteHtml, messages, function(err) { if (err) { diff --git a/tests/document-to-html.tests.js b/tests/document-to-html.tests.js index a8cf0ab..51ee625 100644 --- a/tests/document-to-html.tests.js +++ b/tests/document-to-html.tests.js @@ -202,9 +202,11 @@ describe('DocumentConverter', function() { footnoteId: "4", body: paragraphOfText("Who's there?") }); - var converter = new DocumentConverter(); + var converter = new DocumentConverter({ + generateUniquifier: function() { return 42; } + }); return converter.convertToHtml(footnoteReference).then(function(result) { - assert.equal(result.value, '[1]'); + assert.equal(result.value, '[1]'); }); }); @@ -227,10 +229,12 @@ describe('DocumentConverter', function() { } ); - var converter = new DocumentConverter(); + var converter = new DocumentConverter({ + generateUniquifier: function() { return 42; } + }); return converter.convertToHtml(document).then(function(result) { - var expectedOutput = '

Knock knock[1]

' + - '
  1. Who\'s there?

'; + var expectedOutput = '

Knock knock[1]

' + + '
  1. Who\'s there?

'; assert.equal(result.value, expectedOutput); }); }); diff --git a/tests/mammoth.tests.js b/tests/mammoth.tests.js index 30fba34..b1bb04e 100644 --- a/tests/mammoth.tests.js +++ b/tests/mammoth.tests.js @@ -93,10 +93,13 @@ describe('mammoth', function() { // TODO: generate links back to main body // TODO: don't duplicate footnotes with multiple references var docxPath = path.join(__dirname, "test-data/footnotes.docx"); - return mammoth.convertToHtml({path: docxPath}).then(function(result) { - var expectedOutput = '

Ouch[1].[2]

' + - '
  1. A tachyon walks into a bar.

  2. ' + - '
  3. Fin.

' + var options = { + generateUniquifier: function() { return 42; } + }; + return mammoth.convertToHtml({path: docxPath}, options).then(function(result) { + var expectedOutput = '

Ouch[1].[2]

' + + '
  1. A tachyon walks into a bar.

  2. ' + + '
  3. Fin.

' assert.equal(result.value, expectedOutput); // TODO: get rid of warnings //~ assert.deepEqual(result.messages, []); -- cgit v1.2.3