59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const { detachNodeFromParent } = require('../lib/xast.js');
 | |
| const { elemsGroups } = require('./_collections.js');
 | |
| 
 | |
| exports.type = 'visitor';
 | |
| exports.name = 'removeEmptyContainers';
 | |
| exports.active = true;
 | |
| exports.description = 'removes empty container elements';
 | |
| 
 | |
| /**
 | |
|  * Remove empty containers.
 | |
|  *
 | |
|  * @see https://www.w3.org/TR/SVG11/intro.html#TermContainerElement
 | |
|  *
 | |
|  * @example
 | |
|  * <defs/>
 | |
|  *
 | |
|  * @example
 | |
|  * <g><marker><a/></marker></g>
 | |
|  *
 | |
|  * @author Kir Belevich
 | |
|  *
 | |
|  * @type {import('../lib/types').Plugin<void>}
 | |
|  */
 | |
| exports.fn = () => {
 | |
|   return {
 | |
|     element: {
 | |
|       exit: (node, parentNode) => {
 | |
|         // remove only empty non-svg containers
 | |
|         if (
 | |
|           node.name === 'svg' ||
 | |
|           elemsGroups.container.includes(node.name) === false ||
 | |
|           node.children.length !== 0
 | |
|         ) {
 | |
|           return;
 | |
|         }
 | |
|         // empty patterns may contain reusable configuration
 | |
|         if (
 | |
|           node.name === 'pattern' &&
 | |
|           Object.keys(node.attributes).length !== 0
 | |
|         ) {
 | |
|           return;
 | |
|         }
 | |
|         // The <g> may not have content, but the filter may cause a rectangle
 | |
|         // to be created and filled with pattern.
 | |
|         if (node.name === 'g' && node.attributes.filter != null) {
 | |
|           return;
 | |
|         }
 | |
|         // empty <mask> hides masked element
 | |
|         if (node.name === 'mask' && node.attributes.id != null) {
 | |
|           return;
 | |
|         }
 | |
|         detachNodeFromParent(node, parentNode);
 | |
|       },
 | |
|     },
 | |
|   };
 | |
| };
 |