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.
		
		
		
		
		
			
		
			
				
					122 lines
				
				3.8 KiB
			
		
		
			
		
	
	
					122 lines
				
				3.8 KiB
			| 
											2 years ago
										 | const XmlStream = require('../../utils/xml-stream'); | ||
|  | const RelType = require('../../xlsx/rel-type'); | ||
|  | const colCache = require('../../utils/col-cache'); | ||
|  | const CommentXform = require('../../xlsx/xform/comment/comment-xform'); | ||
|  | const VmlShapeXform = require('../../xlsx/xform/comment/vml-shape-xform'); | ||
|  | 
 | ||
|  | class SheetCommentsWriter { | ||
|  |   constructor(worksheet, sheetRelsWriter, options) { | ||
|  |     // in a workbook, each sheet will have a number
 | ||
|  |     this.id = options.id; | ||
|  |     this.count = 0; | ||
|  |     this._worksheet = worksheet; | ||
|  |     this._workbook = options.workbook; | ||
|  |     this._sheetRelsWriter = sheetRelsWriter; | ||
|  |   } | ||
|  | 
 | ||
|  |   get commentsStream() { | ||
|  |     if (!this._commentsStream) { | ||
|  |       // eslint-disable-next-line no-underscore-dangle
 | ||
|  |       this._commentsStream = this._workbook._openStream(`/xl/comments${this.id}.xml`); | ||
|  |     } | ||
|  |     return this._commentsStream; | ||
|  |   } | ||
|  | 
 | ||
|  |   get vmlStream() { | ||
|  |     if (!this._vmlStream) { | ||
|  |       // eslint-disable-next-line no-underscore-dangle
 | ||
|  |       this._vmlStream = this._workbook._openStream(`xl/drawings/vmlDrawing${this.id}.vml`); | ||
|  |     } | ||
|  |     return this._vmlStream; | ||
|  |   } | ||
|  | 
 | ||
|  |   _addRelationships() { | ||
|  |     const commentRel = { | ||
|  |       Type: RelType.Comments, | ||
|  |       Target: `../comments${this.id}.xml`, | ||
|  |     }; | ||
|  |     this._sheetRelsWriter.addRelationship(commentRel); | ||
|  | 
 | ||
|  |     const vmlDrawingRel = { | ||
|  |       Type: RelType.VmlDrawing, | ||
|  |       Target: `../drawings/vmlDrawing${this.id}.vml`, | ||
|  |     }; | ||
|  |     this.vmlRelId = this._sheetRelsWriter.addRelationship(vmlDrawingRel); | ||
|  |   } | ||
|  | 
 | ||
|  |   _addCommentRefs() { | ||
|  |     this._workbook.commentRefs.push({ | ||
|  |       commentName: `comments${this.id}`, | ||
|  |       vmlDrawing: `vmlDrawing${this.id}`, | ||
|  |     }); | ||
|  |   } | ||
|  | 
 | ||
|  |   _writeOpen() { | ||
|  |     this.commentsStream.write( | ||
|  |       '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>' + | ||
|  |         '<comments xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">' + | ||
|  |         '<authors><author>Author</author></authors>' + | ||
|  |         '<commentList>' | ||
|  |     ); | ||
|  |     this.vmlStream.write( | ||
|  |       '<?xml version="1.0" encoding="UTF-8"?>' + | ||
|  |         '<xml xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:x="urn:schemas-microsoft-com:office:excel">' + | ||
|  |         '<o:shapelayout v:ext="edit">' + | ||
|  |         '<o:idmap v:ext="edit" data="1" />' + | ||
|  |         '</o:shapelayout>' + | ||
|  |         '<v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe">' + | ||
|  |         '<v:stroke joinstyle="miter" />' + | ||
|  |         '<v:path gradientshapeok="t" o:connecttype="rect" />' + | ||
|  |         '</v:shapetype>' | ||
|  |     ); | ||
|  |   } | ||
|  | 
 | ||
|  |   _writeComment(comment, index) { | ||
|  |     const commentXform = new CommentXform(); | ||
|  |     const commentsXmlStream = new XmlStream(); | ||
|  |     commentXform.render(commentsXmlStream, comment); | ||
|  |     this.commentsStream.write(commentsXmlStream.xml); | ||
|  | 
 | ||
|  |     const vmlShapeXform = new VmlShapeXform(); | ||
|  |     const vmlXmlStream = new XmlStream(); | ||
|  |     vmlShapeXform.render(vmlXmlStream, comment, index); | ||
|  |     this.vmlStream.write(vmlXmlStream.xml); | ||
|  |   } | ||
|  | 
 | ||
|  |   _writeClose() { | ||
|  |     this.commentsStream.write('</commentList></comments>'); | ||
|  |     this.vmlStream.write('</xml>'); | ||
|  |   } | ||
|  | 
 | ||
|  |   addComments(comments) { | ||
|  |     if (comments && comments.length) { | ||
|  |       if (!this.startedData) { | ||
|  |         this._worksheet.comments = []; | ||
|  |         this._writeOpen(); | ||
|  |         this._addRelationships(); | ||
|  |         this._addCommentRefs(); | ||
|  |         this.startedData = true; | ||
|  |       } | ||
|  | 
 | ||
|  |       comments.forEach(item => { | ||
|  |         item.refAddress = colCache.decodeAddress(item.ref); | ||
|  |       }); | ||
|  | 
 | ||
|  |       comments.forEach(comment => { | ||
|  |         this._writeComment(comment, this.count); | ||
|  |         this.count += 1; | ||
|  |       }); | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   commit() { | ||
|  |     if (this.count) { | ||
|  |       this._writeClose(); | ||
|  |       this.commentsStream.end(); | ||
|  |       this.vmlStream.end(); | ||
|  |     } | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = SheetCommentsWriter; |