| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- /* 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;
|