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