You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.7 KiB
120 lines
2.7 KiB
/* eslint-disable max-classes-per-file */
|
|
const utils = require('../../utils/utils');
|
|
const RelType = require('../../xlsx/rel-type');
|
|
|
|
class HyperlinksProxy {
|
|
constructor(sheetRelsWriter) {
|
|
this.writer = sheetRelsWriter;
|
|
}
|
|
|
|
push(hyperlink) {
|
|
this.writer.addHyperlink(hyperlink);
|
|
}
|
|
}
|
|
|
|
class SheetRelsWriter {
|
|
constructor(options) {
|
|
// in a workbook, each sheet will have a number
|
|
this.id = options.id;
|
|
|
|
// count of all relationships
|
|
this.count = 0;
|
|
|
|
// keep record of all hyperlinks
|
|
this._hyperlinks = [];
|
|
|
|
this._workbook = options.workbook;
|
|
}
|
|
|
|
get stream() {
|
|
if (!this._stream) {
|
|
// eslint-disable-next-line no-underscore-dangle
|
|
this._stream = this._workbook._openStream(`/xl/worksheets/_rels/sheet${this.id}.xml.rels`);
|
|
}
|
|
return this._stream;
|
|
}
|
|
|
|
get length() {
|
|
return this._hyperlinks.length;
|
|
}
|
|
|
|
each(fn) {
|
|
return this._hyperlinks.forEach(fn);
|
|
}
|
|
|
|
get hyperlinksProxy() {
|
|
return this._hyperlinksProxy || (this._hyperlinksProxy = new HyperlinksProxy(this));
|
|
}
|
|
|
|
addHyperlink(hyperlink) {
|
|
// Write to stream
|
|
const relationship = {
|
|
Target: hyperlink.target,
|
|
Type: RelType.Hyperlink,
|
|
TargetMode: 'External',
|
|
};
|
|
const rId = this._writeRelationship(relationship);
|
|
|
|
// store sheet stuff for later
|
|
this._hyperlinks.push({
|
|
rId,
|
|
address: hyperlink.address,
|
|
});
|
|
}
|
|
|
|
addMedia(media) {
|
|
return this._writeRelationship(media);
|
|
}
|
|
|
|
addRelationship(rel) {
|
|
return this._writeRelationship(rel);
|
|
}
|
|
|
|
commit() {
|
|
if (this.count) {
|
|
// write xml utro
|
|
this._writeClose();
|
|
// and close stream
|
|
this.stream.end();
|
|
}
|
|
}
|
|
|
|
// ================================================================================
|
|
_writeOpen() {
|
|
this.stream.write(
|
|
`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
|
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">`
|
|
);
|
|
}
|
|
|
|
_writeRelationship(relationship) {
|
|
if (!this.count) {
|
|
this._writeOpen();
|
|
}
|
|
|
|
const rId = `rId${++this.count}`;
|
|
|
|
if (relationship.TargetMode) {
|
|
this.stream.write(
|
|
`<Relationship Id="${rId}"` +
|
|
` Type="${relationship.Type}"` +
|
|
` Target="${utils.xmlEncode(relationship.Target)}"` +
|
|
` TargetMode="${relationship.TargetMode}"` +
|
|
'/>'
|
|
);
|
|
} else {
|
|
this.stream.write(
|
|
`<Relationship Id="${rId}" Type="${relationship.Type}" Target="${relationship.Target}"/>`
|
|
);
|
|
}
|
|
|
|
return rId;
|
|
}
|
|
|
|
_writeClose() {
|
|
this.stream.write('</Relationships>');
|
|
}
|
|
}
|
|
|
|
module.exports = SheetRelsWriter;
|