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