mirror of
https://github.com/feathericons/feather.git
synced 2023-08-10 21:13:24 +03:00
feat: Add SVG sprite support (#319)
This commit is contained in:
14
bin/__tests__/__snapshots__/build-sprite-string.test.js.snap
Normal file
14
bin/__tests__/__snapshots__/build-sprite-string.test.js.snap
Normal file
@@ -0,0 +1,14 @@
|
||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||
|
||||
exports[`builds sprite correctly 1`] = `
|
||||
"<svg xmlns=\\"http://www.w3.org/2000/svg\\">
|
||||
<defs>
|
||||
<symbol id=\\"icon1\\" viewBox=\\"0 0 24 24\\">
|
||||
<line x1=\\"23\\" y1=\\"1\\" x2=\\"1\\" y2=\\"23\\"></line><line x1=\\"1\\" y1=\\"1\\" x2=\\"23\\" y2=\\"23\\"></line>
|
||||
</symbol>
|
||||
<symbol id=\\"icon2\\" viewBox=\\"0 0 24 24\\">
|
||||
<circle cx=\\"12\\" cy=\\"12\\" r=\\"11\\"></circle>
|
||||
</symbol>
|
||||
</defs>
|
||||
</svg>"
|
||||
`;
|
||||
12
bin/__tests__/build-sprite-string.test.js
Normal file
12
bin/__tests__/build-sprite-string.test.js
Normal file
@@ -0,0 +1,12 @@
|
||||
/* eslint-env jest */
|
||||
import buildSpriteString from '../build-sprite-string';
|
||||
|
||||
const icons = {
|
||||
icon1:
|
||||
'<line x1="23" y1="1" x2="1" y2="23"></line><line x1="1" y1="1" x2="23" y2="23"></line>',
|
||||
icon2: '<circle cx="12" cy="12" r="11"></circle>',
|
||||
};
|
||||
|
||||
test('builds sprite correctly', () => {
|
||||
expect(buildSpriteString(icons)).toMatchSnapshot();
|
||||
});
|
||||
30
bin/build-sprite-string.js
Normal file
30
bin/build-sprite-string.js
Normal file
@@ -0,0 +1,30 @@
|
||||
import defaultAttrs from '../src/default-attrs.json';
|
||||
|
||||
const svgStartTag = `<svg xmlns="${defaultAttrs.xmlns}">\n<defs>\n`;
|
||||
const svgEndTag = '</defs>\n</svg>';
|
||||
|
||||
/**
|
||||
* Renders the inner sprites as SVG Symbols
|
||||
* @param {object} icons the icons object
|
||||
* @returns {string} the rendered string with SVG symbols
|
||||
*/
|
||||
function buildSpriteString(icons) {
|
||||
const symbols = Object.keys(icons)
|
||||
.map(icon => toSvgSymbol(icon, icons[icon]))
|
||||
.join('');
|
||||
|
||||
return svgStartTag + symbols + svgEndTag;
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a SVG symbol tag
|
||||
* @param {string} name The name of the icon
|
||||
* @param {string} contents The contents of the icon
|
||||
* @returns {string} the rendered SVG symbol
|
||||
*/
|
||||
function toSvgSymbol(name, contents) {
|
||||
return `<symbol id="${name}" viewBox="${defaultAttrs.viewBox}">
|
||||
${contents}\n</symbol>\n`;
|
||||
}
|
||||
|
||||
export default buildSpriteString;
|
||||
14
bin/build-sprite.js
Normal file
14
bin/build-sprite.js
Normal file
@@ -0,0 +1,14 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
import icons from '../dist/icons.json';
|
||||
import buildSpriteString from './build-sprite-string';
|
||||
|
||||
const sprite = buildSpriteString(icons);
|
||||
|
||||
const OUT_FILE = path.resolve(__dirname, '../dist/feather-sprite.svg');
|
||||
|
||||
console.log(`Building ${OUT_FILE}`); // eslint-disable-line no-console
|
||||
|
||||
fs.writeFile(OUT_FILE, sprite, err => {
|
||||
if (err) throw err;
|
||||
});
|
||||
@@ -5,6 +5,7 @@
|
||||
./node_modules/.bin/rimraf dist
|
||||
mkdir dist
|
||||
./node_modules/.bin/babel-node bin/build-icons-json.js
|
||||
./node_modules/.bin/babel-node bin/build-sprite.js
|
||||
|
||||
./node_modules/.bin/rimraf dist/icons
|
||||
mkdir dist/icons
|
||||
|
||||
Reference in New Issue
Block a user