1
0
mirror of https://github.com/svg/svgo.git synced 2025-12-03 21:11:14 +03:00
Files
svgo/lib/js2svg.js
deepsweet 13af2ed95e go!
2012-09-27 14:06:28 +03:00

230 lines
5.4 KiB
JavaScript

var INHERIT = require('inherit');
/**
* Convert SVG-as-JS object to SVG (XML) string.
*
* @param {Object} data svg-as-js data object
* @param {Class} [converter] custom converter class
* @return {Converter} Converter instance
*/
module.exports = function(data, converter) {
return new (converter || Converter)(data).run(data);
};
/**
* @class Converter
*/
var Converter = exports.Converter = INHERIT(
/**
* @lends Nodes.prototype
*/
{
/**
* @constructs
* @private
*/
__constructor: function() {
/**
* Converter options.
*
* @type {Object}
*/
this.options = {
doctypeStart: '<!DOCTYPE',
doctypeEnd: '>',
procInstStart: '<?',
procInstEnd: '?>',
tagOpenStart: '<',
tagOpenEnd: '>',
tagCloseStart: '</',
tagCloseEnd: '>',
tagShortStart: '<',
tagShortEnd: '/>',
attrStart: '="',
attrEnd: '"',
commentStart: '<!--',
commentEnd: '-->',
cdataStart: '<![CDATA[',
cdataEnd: ']]>'
};
},
/**
* Start conversion.
*
* @param {Object} svg-as-js data object
* @return {String}
*/
run: function(data) {
var svg = '';
if (data.content) {
data.content.forEach(function(item) {
if (item.isElem()) {
svg += this.createElem(item);
} else if (item.isText()) {
svg += item.text;
} else if (item.isDoctype()) {
svg += this.createDoctype(item.doctype);
} else if (item.isProcInst()) {
svg += this.createProcInst(item.processinginstruction);
} else if (item.isComment()) {
svg += this.createComment(item.comment);
} else if (item.isCDATA()) {
svg += this.createCDATA(item.cdata);
}
}, this);
}
return svg;
},
/**
* Create doctype tag.
*
* @param {String} doctype doctype body string
* @return {String}
*/
createDoctype: function(doctype) {
return this.options.doctypeStart +
doctype +
this.options.doctypeEnd;
},
/**
* Create XML Processing Instruction tag.
*
* @param {Object} instruction instruction object
* @return {String}
*/
createProcInst: function(instruction) {
return this.options.procInstStart +
instruction.name +
' ' +
instruction.body +
this.options.procInstEnd;
},
/**
* Create comment tag.
*
* @param {String} comment comment body
* @return {String}
*/
createComment: function(comment) {
return this.options.commentStart +
comment +
this.options.commentEnd;
},
/**
* Create CDATA section.
*
* @param {String} cdata CDATA body
* @return {String}
*/
createCDATA: function(cdata) {
return this.options.cdataStart +
cdata +
this.options.cdataEnd;
},
/**
* Create element tag.
*
* @param {Object} data element object
* @return {String}
*/
createElem: function(data) {
// empty element and short tag
if (data.isEmpty()) {
return this.options.tagShortStart +
data.elem +
this.createAttrs(data) +
this.options.tagShortEnd;
// non-empty element
} else {
return this.options.tagOpenStart +
data.elem +
this.createAttrs(data) +
this.options.tagOpenEnd +
this.run(data) +
this.options.tagCloseStart +
data.elem +
this.options.tagCloseEnd;
}
},
/**
* Create element attributes.
*
* @param {Object} elem attributes object
* @return {String}
*/
createAttrs: function(elem) {
var self = this,
attrs = '';
if (elem.hasAttr()) {
elem.eachAttr(function(attr) {
attrs += ' ' +
attr.name +
self.options.attrStart +
attr.value +
self.options.attrEnd;
});
}
return attrs;
}
}
);
/*
var MyConv = INHERIT(Converter, {
__constructor: function(options) {
this.__base();
}
});
*/