exceljs
Version:
Excel Workbook Manager - Read and Write xlsx and csv Files.
87 lines (75 loc) • 2.27 kB
JavaScript
/**
* Copyright (c) 2015-2017 Guyon Roche
* LICENCE: MIT - please refer to LICENCE file included with this module
* or https://github.com/guyonroche/exceljs/blob/master/LICENSE
*/
;
var events = require('events');
var Sax = require('sax');
var utils = require('../../utils/utils');
var Enums = require('../../doc/enums');
var RelType = require('../../xlsx/rel-type');
var HyperlinkReader = module.exports = function (workbook, id) {
// in a workbook, each sheet will have a number
this.id = id;
this._workbook = workbook;
};
utils.inherits(HyperlinkReader, events.EventEmitter, {
get count() {
return this.hyperlinks && this.hyperlinks.length || 0;
},
each: function each(fn) {
return this.hyperlinks.forEach(fn);
},
read: function read(entry, options) {
var self = this;
var emitHyperlinks = false;
var hyperlinks = null;
switch (options.hyperlinks) {
case 'emit':
emitHyperlinks = true;
break;
case 'cache':
this.hyperlinks = hyperlinks = {};
break;
default:
break;
}
if (!emitHyperlinks && !hyperlinks) {
entry.autodrain();
self.emit('finished');
return;
}
var parser = Sax.createStream(true, {});
parser.on('opentag', function (node) {
if (node.name === 'Relationship') {
var rId = node.attributes.Id;
switch (node.attributes.Type) {
case RelType.Hyperlink:
var relationship = {
type: Enums.RelationshipType.Styles,
rId: rId,
target: node.attributes.Target,
targetMode: node.attributes.TargetMode
};
if (emitHyperlinks) {
self.emit('hyperlink', relationship);
} else {
hyperlinks[relationship.rId] = relationship;
}
break;
default:
break;
}
}
});
parser.on('end', function () {
self.emit('finished');
});
// create a down-stream flow-control to regulate the stream
var flowControl = this.workbook.flowControl.createChild();
flowControl.pipe(parser, { sync: true });
entry.pipe(flowControl);
}
});
//# sourceMappingURL=hyperlink-reader.js.map