UNPKG

1.46 kBJavaScriptView Raw
1const { renderer } = require('posthtml-svg-mode');
2const { getRoot, getHash } = require('./utils');
3const defaultFactory = require('./symbol-factory');
4const FileRequest = require('./request');
5const clone = require('clone');
6
7class SpriteSymbol {
8 constructor({ id, tree, request }) {
9 this.id = id;
10 this._tree = tree;
11 this.request = request;
12 }
13
14 /**
15 * @param {Object} options
16 * @param {string} options.id
17 * @param {string} options.content
18 * @param {string|FileRequest} options.request
19 * @param {Function<Promise<PostHTMLProcessingResult>>} [options.factory]
20 * @return {Promise<SpriteSymbol>}
21 */
22 static create(options) {
23 const { content, factory = defaultFactory } = options;
24 const request = typeof options.request === 'string' ? new FileRequest(options.request) : options.request;
25 const id = typeof options.id === 'undefined' ? getHash(`${request.toString()}_${content}`) : options.id;
26
27 return factory({ content, request, id })
28 .then(({ tree }) => new SpriteSymbol({ id, request, tree }));
29 }
30
31 /**
32 * @return {string}
33 */
34 get viewBox() {
35 const root = getRoot(this.tree);
36 return root.attrs ? root.attrs.viewBox : null;
37 }
38
39 get tree() {
40 return clone(this._tree);
41 }
42
43 /**
44 * @return {string}
45 */
46 get useId() {
47 return `${this.id}-usage`;
48 }
49
50 /**
51 * @return {string}
52 */
53 render() {
54 return renderer(this.tree);
55 }
56}
57
58module.exports = SpriteSymbol;