88 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
exports.name = 'addAttributesToSVGElement';
 | 
						|
exports.type = 'visitor';
 | 
						|
exports.active = false;
 | 
						|
exports.description = 'adds attributes to an outer <svg> element';
 | 
						|
 | 
						|
var ENOCLS = `Error in plugin "addAttributesToSVGElement": absent parameters.
 | 
						|
It should have a list of "attributes" or one "attribute".
 | 
						|
Config example:
 | 
						|
 | 
						|
plugins: [
 | 
						|
  {
 | 
						|
    name: 'addAttributesToSVGElement',
 | 
						|
    params: {
 | 
						|
      attribute: "mySvg"
 | 
						|
    }
 | 
						|
  }
 | 
						|
]
 | 
						|
 | 
						|
plugins: [
 | 
						|
  {
 | 
						|
    name: 'addAttributesToSVGElement',
 | 
						|
    params: {
 | 
						|
      attributes: ["mySvg", "size-big"]
 | 
						|
    }
 | 
						|
  }
 | 
						|
]
 | 
						|
 | 
						|
plugins: [
 | 
						|
  {
 | 
						|
    name: 'addAttributesToSVGElement',
 | 
						|
    params: {
 | 
						|
      attributes: [
 | 
						|
        {
 | 
						|
          focusable: false
 | 
						|
        },
 | 
						|
        {
 | 
						|
          'data-image': icon
 | 
						|
        }
 | 
						|
      ]
 | 
						|
    }
 | 
						|
  }
 | 
						|
]
 | 
						|
`;
 | 
						|
 | 
						|
/**
 | 
						|
 * Add attributes to an outer <svg> element. Example config:
 | 
						|
 *
 | 
						|
 * @author April Arcus
 | 
						|
 *
 | 
						|
 * @type {import('../lib/types').Plugin<{
 | 
						|
 *   attribute?: string | Record<string, null | string>,
 | 
						|
 *   attributes?: Array<string | Record<string, null | string>>
 | 
						|
 * }>}
 | 
						|
 */
 | 
						|
exports.fn = (root, params) => {
 | 
						|
  if (!Array.isArray(params.attributes) && !params.attribute) {
 | 
						|
    console.error(ENOCLS);
 | 
						|
    return null;
 | 
						|
  }
 | 
						|
  const attributes = params.attributes || [params.attribute];
 | 
						|
  return {
 | 
						|
    element: {
 | 
						|
      enter: (node, parentNode) => {
 | 
						|
        if (node.name === 'svg' && parentNode.type === 'root') {
 | 
						|
          for (const attribute of attributes) {
 | 
						|
            if (typeof attribute === 'string') {
 | 
						|
              if (node.attributes[attribute] == null) {
 | 
						|
                // @ts-ignore disallow explicit nullable attribute value
 | 
						|
                node.attributes[attribute] = undefined;
 | 
						|
              }
 | 
						|
            }
 | 
						|
            if (typeof attribute === 'object') {
 | 
						|
              for (const key of Object.keys(attribute)) {
 | 
						|
                if (node.attributes[key] == null) {
 | 
						|
                  // @ts-ignore disallow explicit nullable attribute value
 | 
						|
                  node.attributes[key] = attribute[key];
 | 
						|
                }
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      },
 | 
						|
    },
 | 
						|
  };
 | 
						|
};
 |