Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

parse "true","false" to boolean fix #41

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,5 @@ node_modules
*.log
.DS_Store
dist
lib
coverage
.idea/
.idea/
22 changes: 13 additions & 9 deletions bin/svg-icon-generate.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@ const path = require('path');
const configureGenerator = require('../lib/configureGenerator');

const argv = require('yargs')
.default('reactPureRender', true)
.default('radium', true)
.default('native', false)
.default('keepFillColor', false)
.default('template', path.join(__dirname, '..', 'template', 'icon.nunjucks'))
.options({
reactPureRender: { type: "boolean", default: true },
radium: { type: "boolean", default: true },
native: { type: "boolean", default: false },
keepFillColor: { type: "boolean", default: false },
template: { type: "string", default: path.join(__dirname, '..', 'template', 'icon-tsx.nunjucks') },
verbose: { type: "boolean", default: false },
})
.usage('Usage: \n$0 --svgDir [./assets/svgs] --destination [./src/components/Icon.jsx]')
.demandOption(['svgDir','destination'])
.argv;
.demandOption(['svgDir', 'destination'])
.argv

console.log('Running SVG Icon generator with the following options:');
console.log(JSON.stringify(argv, null, 2));
if (argv.verbose) {
console.table(argv);
}

configureGenerator(argv)();
89 changes: 89 additions & 0 deletions lib/configureGenerator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
'use strict';

exports.__esModule = true;
exports['default'] = configureGenerator;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _fs = require('fs');

var _fs2 = _interopRequireDefault(_fs);

var _helpersGetSvgsInDir = require('./helpers/getSvgsInDir');

var _helpersGetSvgsInDir2 = _interopRequireDefault(_helpersGetSvgsInDir);

var _helpersMinifySvg = require('./helpers/minifySvg');

var _helpersMinifySvg2 = _interopRequireDefault(_helpersMinifySvg);

var _nunjucks = require('nunjucks');

var _nunjucks2 = _interopRequireDefault(_nunjucks);

var _path = require('path');

var _path2 = _interopRequireDefault(_path);

var _helpersCleanup = require('./helpers/cleanup');

_nunjucks2['default'].configure({ autoescape: false });

var defaultComment = 'Generated by gulp svg-icon - do not modify manually';
var defaultComponentName = 'Icon';

function configureGenerator(config) {
return function () {
var componentName = config.componentName || defaultComponentName;
var defaultTemplate = config.native ? _path2['default'].join(__dirname, '..', 'template', 'icon_native.nunjucks') : _path2['default'].join(__dirname, '..', 'template', 'icon-tsx.nunjucks');
var template = config.template || defaultTemplate;
var templateFile = _path2['default'].isAbsolute(template) ? template : _path2['default'].join(process.cwd(), template);
var templateContent = _fs2['default'].readFileSync(templateFile).toString();

var svgDir = _path2['default'].isAbsolute(config.svgDir) ? config.svgDir : _path2['default'].join(process.cwd(), config.svgDir);

console.log('Looking for SVGs in:', svgDir); // eslint-disable-line no-console

console.log('Using ' + componentName + ' template from:', templateFile); // eslint-disable-line no-console

var svgs = _helpersGetSvgsInDir2['default'](svgDir);

var iconDestination = config.destination || _path2['default'].join(process.cwd(), 'Icon.react.js');

var comment = config.comment || defaultComment;
var reactPureRender = config.reactPureRender;
var cleanupHelper = config.native ? _helpersCleanup.cleanupNativeSvg : _helpersCleanup.cleanupSvg;

var svgPromises = svgs.map(function (file) {
return _helpersMinifySvg2['default'](file, _fs2['default'].readFileSync(file).toString());
});
Promise.all(svgPromises).then(function (results) {
var icons = results.map(function (result) {
return {
name: _helpersCleanup.cleanupName(result.name),
svg: cleanupHelper(result.svg.data, config.keepFillColor)
};
}).sort(function (a, b) {
return a.name.localeCompare(b.name);
});

_fs2['default'].writeFileSync(iconDestination, _nunjucks2['default'].renderString(templateContent, {
icons: icons,
comment: comment,
reactPureRender: reactPureRender,
radium: config.radium,
useColorProp: !config.keepFillColor,
componentName: componentName
}));

console.log('Generated ' + componentName + ' component to:', iconDestination); // eslint-disable-line no-console
console.log(icons.map(function (icon) {
return '<' + componentName + ' kind="' + icon.name + '" />';
}).join('\n')); // eslint-disable-line no-console
})['catch'](function (error) {
return console.error(error);
}); // eslint-disable-line no-console
};
}

module.exports = exports['default'];
35 changes: 35 additions & 0 deletions lib/helpers/cleanup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
'use strict';

exports.__esModule = true;
exports.cleanupName = cleanupName;
exports.cleanupSvg = cleanupSvg;
exports.cleanupNativeSvg = cleanupNativeSvg;
function _camelCase(string) {
return string.replace(/^.|-./g, function (letter, index) {
return index === 0 ? letter.toLowerCase() : letter.substr(1).toUpperCase();
});
}

function _basicCleanup(svg) {
return svg.replace(/width="\S+"/, '').replace(/height="\S+"/, '').replace(/xmlns="(\S*)"/, '').replace(/data-name="(.*?)"/, '').replace(/([\w-]+)="/g, function (match) {
return _camelCase(match);
}).replace(/\s{2,}/g, ' ').replace(/xlink\:href="(\S*)"/g, 'xlinkHref="$1"').replace(/xmlns\:xlink="(\S*)"/g, 'xmlnsXlink="$1"').replace(/<style>(.*?)<\/style>/g, '');
}

function cleanupName(name) {
return name.replace(/u[A-Z0-9]{4}-/, '');
}

function cleanupSvg(svg, keepFillColor) {
var cleanedSvg = _basicCleanup(svg).replace(/viewBox/, '{...rest} height={height || size} width={width || size} onClick={onClick} style={style} className={className} viewBox');

return keepFillColor ? cleanedSvg : cleanedSvg.replace(/fill="#?\w+"/g, '').replace(/viewBox/, 'fill={color} viewBox').replace(/\s{2,}/g, ' ').replace(/ \>/g, '>');
}

function cleanupNativeSvg(svg, keepFillColor) {
var cleanedSvg = _basicCleanup(svg).replace(/viewBox/, '{...rest} height={height || size} width={width || size} style={style} viewBox').replace(/\<[a-z]|\<\/[a-z]/g, function (match) {
return match.toUpperCase();
});

return keepFillColor ? cleanedSvg : cleanedSvg.replace(/fill="#?\w+"/g, '').replace(/\<Path/g, '<Path fill={color}').replace(/\s{2,}/g, ' ').replace(/ \>/g, '>');
}
38 changes: 38 additions & 0 deletions lib/helpers/getSvgsInDir.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
'use strict';

exports.__esModule = true;
exports['default'] = getSvgsInDir;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _fs = require('fs');

var _fs2 = _interopRequireDefault(_fs);

var _path = require('path');

var _path2 = _interopRequireDefault(_path);

function getSvgsInDir(dir) {
if (!_fs2['default'].existsSync(dir)) {
return null;
}

return [].concat.apply([], _fs2['default'].readdirSync(dir).map(function (file) {
var absolutePath = _path2['default'].join(dir, file);

if (_fs2['default'].lstatSync(absolutePath).isDirectory()) {
return getSvgsInDir(dir, file);
}

if (!absolutePath.match(/\.svg$/)) {
return null;
}

return absolutePath;
})).filter(function (filePath) {
return filePath !== null;
});
}

module.exports = exports['default'];
31 changes: 31 additions & 0 deletions lib/helpers/minifySvg.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
'use strict';

exports.__esModule = true;
exports['default'] = minifySvg;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _path = require('path');

var _path2 = _interopRequireDefault(_path);

var _bluebird = require('bluebird');

var _bluebird2 = _interopRequireDefault(_bluebird);

var _svgo = require('./svgo');

var _svgo2 = _interopRequireDefault(_svgo);

function minifySvg(file, content) {
return new _bluebird2['default'](function (resolve) {
return _svgo2['default'].optimize(content, function (result) {
return resolve({
name: _path2['default'].basename(file, '.svg'),
svg: result
});
});
});
}

module.exports = exports['default'];
34 changes: 34 additions & 0 deletions lib/helpers/minifySvgBrowser.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
'use strict';

exports.__esModule = true;
exports['default'] = minifySvg;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _path = require('path');

var _path2 = _interopRequireDefault(_path);

var _bluebird = require('bluebird');

var _bluebird2 = _interopRequireDefault(_bluebird);

var _svgoBrowser = require('./svgoBrowser');

var _svgoBrowser2 = _interopRequireDefault(_svgoBrowser);

var svgo = new _svgoBrowser2['default']();

function minifySvg(file, content) {
return new _bluebird2['default'](function (resolve) {
return svgo.optimize(content, function (result) {
return resolve({
filename: file,
name: _path2['default'].basename(file, '.svg'),
svg: result
});
});
});
}

module.exports = exports['default'];
20 changes: 20 additions & 0 deletions lib/helpers/svgo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
'use strict';

exports.__esModule = true;

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }

var _svgo = require('svgo');

var _svgo2 = _interopRequireDefault(_svgo);

var svgo = new _svgo2['default']({
plugins: ['removeDoctype', 'removeXMLProcInst', 'removeComments', 'removeMetadata', 'removeEditorsNSData', 'cleanupAttrs', 'convertStyleToAttrs', { 'cleanupIDs': false }, 'removeRasterImages', 'removeUselessDefs', 'cleanupNumericValues', 'cleanupListOfValues', 'convertColors', 'removeUnknownsAndDefaults', 'removeNonInheritableGroupAttrs', 'removeUselessStrokeAndFill', 'removeViewBox', 'cleanupEnableBackground', 'removeHiddenElems', 'removeEmptyText', 'convertShapeToPath', 'moveElemsAttrsToGroup', 'moveGroupAttrsToElems', 'collapseGroups', 'convertPathData', 'convertTransform', 'removeEmptyAttrs', 'removeEmptyContainers', 'mergePaths', 'removeUnusedNS', 'transformsWithOnePath', 'sortAttrs', 'removeTitle', 'removeDesc', 'removeDimensions', 'addClassesToSVGElement', 'removeStyleElement', {
removeAttrs: {
attrs: 'class'
}
}]
});

exports['default'] = svgo;
module.exports = exports['default'];
Loading