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