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.
		
		
		
		
		
			
		
			
				
					
					
						
							57 lines
						
					
					
						
							1.3 KiB
						
					
					
				
			
		
		
	
	
							57 lines
						
					
					
						
							1.3 KiB
						
					
					
				const BaseXform = require('./base-xform');
 | 
						|
 | 
						|
/* 'virtual' methods used as a form of documentation */
 | 
						|
/* eslint-disable class-methods-use-this */
 | 
						|
 | 
						|
// base class for xforms that are composed of other xforms
 | 
						|
// offers some default implementations
 | 
						|
class CompositeXform extends BaseXform {
 | 
						|
  createNewModel(node) {
 | 
						|
    return {};
 | 
						|
  }
 | 
						|
 | 
						|
  parseOpen(node) {
 | 
						|
    // Typical pattern for composite xform
 | 
						|
    this.parser = this.parser || this.map[node.name];
 | 
						|
    if (this.parser) {
 | 
						|
      this.parser.parseOpen(node);
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    if (node.name === this.tag) {
 | 
						|
      this.model = this.createNewModel(node);
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  parseText(text) {
 | 
						|
    // Default implementation. Send text to child parser
 | 
						|
    if (this.parser) {
 | 
						|
      this.parser.parseText(text);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  onParserClose(name, parser) {
 | 
						|
    // parseClose has seen a child parser close
 | 
						|
    // now need to incorporate into this.model somehow
 | 
						|
    this.model[name] = parser.model;
 | 
						|
  }
 | 
						|
 | 
						|
  parseClose(name) {
 | 
						|
    // Default implementation
 | 
						|
    if (this.parser) {
 | 
						|
      if (!this.parser.parseClose(name)) {
 | 
						|
        this.onParserClose(name, this.parser);
 | 
						|
        this.parser = undefined;
 | 
						|
      }
 | 
						|
      return true;
 | 
						|
    }
 | 
						|
 | 
						|
    return name !== this.tag;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = CompositeXform;
 |