70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
export default class BaseOutputBuilder{
|
|
constructor(){
|
|
// this.attributes = {};
|
|
}
|
|
|
|
addAttribute(name, value){
|
|
if(this.options.onAttribute){
|
|
//TODO: better to pass tag path
|
|
const v = this.options.onAttribute(name, value, this.tagName);
|
|
if(v) this.attributes[v.name] = v.value;
|
|
}else{
|
|
name = this.options.attributes.prefix + name + this.options.attributes.suffix;
|
|
this.attributes[name] = this.parseValue(value, this.options.attributes.valueParsers);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* parse value by chain of parsers
|
|
* @param {string} val
|
|
* @returns {any} parsed value if matching parser found
|
|
*/
|
|
parseValue = function(val, valParsers){
|
|
for (let i = 0; i < valParsers.length; i++) {
|
|
let valParser = valParsers[i];
|
|
if(typeof valParser === "string"){
|
|
valParser = this.registeredParsers[valParser];
|
|
}
|
|
if(valParser){
|
|
val = valParser.parse(val);
|
|
}
|
|
}
|
|
return val;
|
|
}
|
|
|
|
/**
|
|
* To add a nested empty tag.
|
|
* @param {string} key
|
|
* @param {any} val
|
|
*/
|
|
_addChild(key, val){}
|
|
|
|
/**
|
|
* skip the comment if property is not set
|
|
*/
|
|
addComment(text){
|
|
if(this.options.nameFor.comment)
|
|
this._addChild(this.options.nameFor.comment, text);
|
|
}
|
|
|
|
//store CDATA separately if property is set
|
|
//otherwise add to tag's value
|
|
addCdata(text){
|
|
if (this.options.nameFor.cdata) {
|
|
this._addChild(this.options.nameFor.cdata, text);
|
|
} else {
|
|
this.addRawValue(text || "");
|
|
}
|
|
}
|
|
|
|
addRawValue = text => this.addValue(text);
|
|
|
|
addDeclaration(){
|
|
if(!this.options.declaration){
|
|
}else{
|
|
this.addPi("?xml");
|
|
}
|
|
this.attributes = {}
|
|
}
|
|
}
|