diff options
| author | Michael Williamson <mike@zwobble.org> | 2013-04-09 21:45:36 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2013-04-09 21:45:36 +0100 |
| commit | e67ed8a6715942beed2c90423d81119c200aa2ec (patch) | |
| tree | 0f6380ea6c291fd5adaf73f19b4f542a1b43fa07 | |
| parent | 3ccbee6d6f5c61458209da23a5aea6322726b7cd (diff) | |
Avoid repeated iterations through the zip file
| -rw-r--r-- | lib/docx-reader.js | 56 | ||||
| -rw-r--r-- | package.json | 3 |
2 files changed, 28 insertions, 31 deletions
diff --git a/lib/docx-reader.js b/lib/docx-reader.js index 0027a0a..35f1627 100644 --- a/lib/docx-reader.js +++ b/lib/docx-reader.js @@ -5,6 +5,7 @@ var _ = require("underscore"); var unzip = require("unzip"); var path = require("path"); var fs = require("fs"); +var Buffers = require("buffers"); var xmlreader = require("./xmlreader"); var documents = require("./documents"); @@ -33,12 +34,13 @@ function read(docxFile) { function openZip(zipPath) { var deferred = q.defer(); var names = []; + var files = {}; fs.createReadStream(zipPath) .pipe(unzip.Parse()) .on("entry", function(entry) { names.push(entry.path); - entry.autodrain(); + files[entry.path] = readEntry(entry); }) .on("close", function() { deferred.resolve(zipFile); @@ -50,40 +52,34 @@ function openZip(zipPath) { var exists = function(path) { return names.indexOf(path) !== -1; } + + function readEntry(entry) { + var readDeferred = q.defer(); + var buffers = new Buffers(); + + entry + .on("data", function(data) { + buffers.push(data); + }) + .on("end", function() { + readDeferred.resolve(buffers); + }) + .on("error", readDeferred.reject.bind(readDeferred)) + + return readDeferred.promise; + } var zipFile = { read: function(path, encoding) { if (!exists(path)) { return q.reject(new Error("No file in zip: " + path)); } - var readDeferred = q.defer(); - - var readStream = fs.createReadStream(zipPath) - .pipe(unzip.Parse()) - .on("entry", function(entry) { - if (entry.path === path) { - readEntry(entry); - } else { - entry.autodrain(); - } - }) - .on("error", readDeferred.reject.bind(readDeferred)); - - function readEntry(entry) { - entry.setEncoding(encoding); - - var fragments = []; - - entry - .on("data", function(data) { - fragments.push(data); - }) - .on("end", function() { - readDeferred.resolve(fragments.join("")); - }) - .on("error", readDeferred.reject.bind(readDeferred)) - } - - return readDeferred.promise; + return files[path].then(function(buffer) { + if (encoding) { + return buffer.toString(encoding); + } else { + return buffer; + } + }); }, exists: exists }; diff --git a/package.json b/package.json index cb9a44b..e67bbf8 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "optimist": "~0.3.5", "connect": "~2.7.3", "dustjs-linkedin": "~1.2.1", - "async": "0.2.6" + "async": "~0.2.6", + "buffers": "~0.1.1" }, "devDependencies": { "mocha": "~1.8" |
