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