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