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