From e67ed8a6715942beed2c90423d81119c200aa2ec Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 9 Apr 2013 21:45:36 +0100 Subject: Avoid repeated iterations through the zip file --- lib/docx-reader.js | 56 +++++++++++++++++++++++++----------------------------- 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" -- cgit v1.2.3