svg-spritemap-webpack-plugin
Version:
Generates symbol-based SVG spritemap from all .svg files in a directory
58 lines (57 loc) • 1.92 kB
JavaScript
import { groupBy, uniq, uniqBy } from 'lodash-es';
// Constants
import { VAR_NAMESPACE, VAR_NAMESPACE_REGEX, VAR_NAMESPACE_VALUE, VAR_REGEX } from '../constants.js';
const matchToVariable = (match) => {
return {
/* eslint-disable unicorn/prefer-at */
name: match[1],
attribute: match[2] || match[1],
value: match[3]
/* eslint-enable unicorn/prefer-at */
};
};
export const findVariables = (content) => {
const variables = [];
if (!content) {
return variables;
}
return [...content.matchAll(VAR_REGEX)].map((match) => {
return matchToVariable(match);
});
};
export const findUniqueVariables = (content) => {
return uniqBy(findVariables(content), 'name');
};
export const findDefaultVariableValueMismatches = (content) => {
return Object.entries(groupBy(findVariables(content), 'name')).filter(([, variables]) => {
return uniq(variables.map((variable) => {
return variable.value;
})).length > 1;
}).map(([name, variables]) => {
return {
name,
values: variables.map((variable) => {
return variable.value;
})
};
});
};
export const rewriteVariables = (content, rewriter) => {
return content.replace(VAR_REGEX, (...match) => {
return rewriter(matchToVariable(match));
}).replace(VAR_NAMESPACE_REGEX, '');
};
export const stripVariables = (content) => {
return rewriteVariables(content, (variable) => {
return `${variable.attribute}="${variable.value}"`;
});
};
export const hasVariables = (content) => {
return !!findVariables([content].flat().join('\n')).length;
};
export const addVariablesNamespace = (content) => {
if (VAR_NAMESPACE_REGEX.test(content)) {
return content;
}
return content.replace(/<svg/i, `<svg xmlns:${VAR_NAMESPACE}="${VAR_NAMESPACE_VALUE}"`);
};