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
			| 
											2 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; |