| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 | const merge = require('merge-options');const processor = require('posthtml-svg-mode');const extractNamespacesToRoot = require('./transformations/extract-namespaces-to-root');const moveFromSymbolToRoot = require('./transformations/move-from-symbol-to-root');const { svg, xlink } = require('../namespaces');const defaultConfig = {  attrs: {    [svg.name]: svg.uri,    [xlink.name]: xlink.uri  },  styles: `    .sprite-symbol-usage {display: none;}    .sprite-symbol-usage:target {display: inline;}  `,  usages: true,  symbols: []};/** * TODO simplify * @param {Object} [config] {@see defaultConfig} * @return {Function} PostHTML plugin */function createSprite(config = {}) {  const cfg = merge(defaultConfig, config);  const symbols = cfg.symbols;  const trees = symbols.map(s => s.tree);  let usages = [];  if (cfg.usages) {    usages = symbols.map((symbol) => {      const { id, useId } = symbol;      return {        tag: 'use',        attrs: {          id: useId,          'xlink:href': `#${id}`,          class: 'sprite-symbol-usage'        }      };    });  }  let defsContent = [];  if (cfg.styles !== false) {    defsContent.push({      tag: 'style',      content: cfg.styles    });  }  defsContent = defsContent.concat(trees);  return (tree) => {    tree[0] = {      tag: 'svg',      attrs: cfg.attrs,      content: [{        tag: 'defs',        content: defsContent      }].concat(usages)    };    return tree;  };}/** * @param {Object} options {@see defaultConfig} * @return {Promise<PostHTMLProcessingResult>} */function spriteFactory(options) {  const plugins = [    createSprite(options),    extractNamespacesToRoot(),    moveFromSymbolToRoot()  ];  return processor(plugins).process('');}module.exports = spriteFactory;module.exports.createSprite = createSprite;
 |