const { renderer } = require('posthtml-svg-mode'); const { getRoot, getHash } = require('./utils'); const defaultFactory = require('./symbol-factory'); const FileRequest = require('./request'); const clone = require('clone'); class SpriteSymbol { constructor({ id, tree, request }) { this.id = id; this._tree = tree; this.request = request; } /** * @param {Object} options * @param {string} options.id * @param {string} options.content * @param {string|FileRequest} options.request * @param {Function>} [options.factory] * @return {Promise} */ static create(options) { const { content, factory = defaultFactory } = options; const request = typeof options.request === 'string' ? new FileRequest(options.request) : options.request; const id = typeof options.id === 'undefined' ? getHash(`${request.toString()}_${content}`) : options.id; return factory({ content, request, id }) .then(({ tree }) => new SpriteSymbol({ id, request, tree })); } /** * @return {string} */ get viewBox() { const root = getRoot(this.tree); return root.attrs ? root.attrs.viewBox : null; } get tree() { return clone(this._tree); } /** * @return {string} */ get useId() { return `${this.id}-usage`; } /** * @return {string} */ render() { return renderer(this.tree); } } module.exports = SpriteSymbol;