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.
		
		
		
		
		
			
		
			
				
					
					
						
							65 lines
						
					
					
						
							1.5 KiB
						
					
					
				
			
		
		
	
	
							65 lines
						
					
					
						
							1.5 KiB
						
					
					
				const BaseXform = require('./base-xform');
 | 
						|
const XmlStream = require('../../utils/xml-stream');
 | 
						|
 | 
						|
// const model = {
 | 
						|
//   tag: 'name',
 | 
						|
//   $: {attr: 'value'},
 | 
						|
//   c: [
 | 
						|
//     { tag: 'child' }
 | 
						|
//   ],
 | 
						|
//   t: 'some text'
 | 
						|
// };
 | 
						|
 | 
						|
function build(xmlStream, model) {
 | 
						|
  xmlStream.openNode(model.tag, model.$);
 | 
						|
  if (model.c) {
 | 
						|
    model.c.forEach(child => {
 | 
						|
      build(xmlStream, child);
 | 
						|
    });
 | 
						|
  }
 | 
						|
  if (model.t) {
 | 
						|
    xmlStream.writeText(model.t);
 | 
						|
  }
 | 
						|
  xmlStream.closeNode();
 | 
						|
}
 | 
						|
 | 
						|
class StaticXform extends BaseXform {
 | 
						|
  constructor(model) {
 | 
						|
    super();
 | 
						|
 | 
						|
    // This class is an optimisation for static (unimportant and unchanging) xml
 | 
						|
    // It is stateless - apart from its static model and so can be used as a singleton
 | 
						|
    // Being stateless - it will only track entry to and exit from it's root xml tag during parsing and nothing else
 | 
						|
    // Known issues:
 | 
						|
    //    since stateless - parseOpen always returns true. Parent xform must know when to start using this xform
 | 
						|
    //    if the root tag is recursive, the parsing will behave unpredictably
 | 
						|
    this._model = model;
 | 
						|
  }
 | 
						|
 | 
						|
  render(xmlStream) {
 | 
						|
    if (!this._xml) {
 | 
						|
      const stream = new XmlStream();
 | 
						|
      build(stream, this._model);
 | 
						|
      this._xml = stream.xml;
 | 
						|
    }
 | 
						|
    xmlStream.writeXml(this._xml);
 | 
						|
  }
 | 
						|
 | 
						|
  parseOpen() {
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
 | 
						|
  parseText() {}
 | 
						|
 | 
						|
  parseClose(name) {
 | 
						|
    switch (name) {
 | 
						|
      case this._model.tag:
 | 
						|
        return false;
 | 
						|
      default:
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
module.exports = StaticXform;
 |