summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2013-04-09 21:45:36 +0100
committerMichael Williamson <mike@zwobble.org>2013-04-09 21:45:36 +0100
commite67ed8a6715942beed2c90423d81119c200aa2ec (patch)
tree0f6380ea6c291fd5adaf73f19b4f542a1b43fa07
parent3ccbee6d6f5c61458209da23a5aea6322726b7cd (diff)
Avoid repeated iterations through the zip file
-rw-r--r--lib/docx-reader.js56
-rw-r--r--package.json3
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"