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
			| 
								 
											3 years ago
										 
									 | 
							
								/* 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;
							 |