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.
		
		
		
		
		
			
		
			
				
					
					
						
							84 lines
						
					
					
						
							2.2 KiB
						
					
					
				
			
		
		
	
	
							84 lines
						
					
					
						
							2.2 KiB
						
					
					
				| const {EventEmitter} = require('events');
 | |
| const parseSax = require('../../utils/parse-sax');
 | |
| 
 | |
| const Enums = require('../../doc/enums');
 | |
| const RelType = require('../../xlsx/rel-type');
 | |
| 
 | |
| class HyperlinkReader extends EventEmitter {
 | |
|   constructor({workbook, id, iterator, options}) {
 | |
|     super();
 | |
| 
 | |
|     this.workbook = workbook;
 | |
|     this.id = id;
 | |
|     this.iterator = iterator;
 | |
|     this.options = options;
 | |
|   }
 | |
| 
 | |
|   get count() {
 | |
|     return (this.hyperlinks && this.hyperlinks.length) || 0;
 | |
|   }
 | |
| 
 | |
|   each(fn) {
 | |
|     return this.hyperlinks.forEach(fn);
 | |
|   }
 | |
| 
 | |
|   async read() {
 | |
|     const {iterator, options} = this;
 | |
|     let emitHyperlinks = false;
 | |
|     let hyperlinks = null;
 | |
|     switch (options.hyperlinks) {
 | |
|       case 'emit':
 | |
|         emitHyperlinks = true;
 | |
|         break;
 | |
|       case 'cache':
 | |
|         this.hyperlinks = hyperlinks = {};
 | |
|         break;
 | |
|       default:
 | |
|         break;
 | |
|     }
 | |
| 
 | |
|     if (!emitHyperlinks && !hyperlinks) {
 | |
|       this.emit('finished');
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     try {
 | |
|       for await (const events of parseSax(iterator)) {
 | |
|         for (const {eventType, value} of events) {
 | |
|           if (eventType === 'opentag') {
 | |
|             const node = value;
 | |
|             if (node.name === 'Relationship') {
 | |
|               const rId = node.attributes.Id;
 | |
|               switch (node.attributes.Type) {
 | |
|                 case RelType.Hyperlink:
 | |
|                   {
 | |
|                     const relationship = {
 | |
|                       type: Enums.RelationshipType.Styles,
 | |
|                       rId,
 | |
|                       target: node.attributes.Target,
 | |
|                       targetMode: node.attributes.TargetMode,
 | |
|                     };
 | |
|                     if (emitHyperlinks) {
 | |
|                       this.emit('hyperlink', relationship);
 | |
|                     } else {
 | |
|                       hyperlinks[relationship.rId] = relationship;
 | |
|                     }
 | |
|                   }
 | |
|                   break;
 | |
| 
 | |
|                 default:
 | |
|                   break;
 | |
|               }
 | |
|             }
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|       this.emit('finished');
 | |
|     } catch (error) {
 | |
|       this.emit('error', error);
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| module.exports = HyperlinkReader;
 |